Skip to content

Fix heredoc rlist and body: the type should be s:Node not string #177

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Dec 5, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions autoload/vimlparser.vim
Original file line number Diff line number Diff line change
Expand Up @@ -1515,6 +1515,7 @@ function! s:VimLParser.parse_heredoc() abort

while s:TRUE
call self.reader.skip_white()
let pos = self.reader.getpos()
let key = self.reader.read_word()
if key == ''
break
Expand All @@ -1523,7 +1524,10 @@ function! s:VimLParser.parse_heredoc() abort
let node.op = key
break
else
call add(node.rlist, key)
let keynode = s:Node(s:NODE_STRING)
let keynode.pos = pos
let keynode.value = key
call add(node.rlist, keynode)
endif
endwhile
if node.op ==# ''
Expand All @@ -1534,11 +1538,15 @@ function! s:VimLParser.parse_heredoc() abort
if self.reader.peek() ==# '<EOF>'
break
endif
let pos = self.reader.getpos()
let line = self.reader.getn(-1)
if line ==# node.op
return node
endif
call add(node.body, line)
let linenode = s:Node(s:NODE_STRING)
let linenode.pos = pos
let linenode.value = line
call add(node.body, linenode)
call self.reader.get()
endwhile
throw s:Err(printf("E990: Missing end marker '%s'", node.op), self.reader.getpos())
Expand Down Expand Up @@ -5590,12 +5598,12 @@ function! s:Compiler.compile_heredoc(node) abort
if empty(a:node.rlist)
let rlist = '(list)'
else
let rlist = '(list ' . join(map(a:node.rlist, 'self.escape_string(v:val)'), ' ') . ')'
let rlist = '(list ' . join(map(a:node.rlist, 'self.escape_string(v:val.value)'), ' ') . ')'
endif
if empty(a:node.body)
let body = '(list)'
else
let body = '(list ' . join(map(a:node.body, 'self.escape_string(v:val)'), ' ') . ')'
let body = '(list ' . join(map(a:node.body, 'self.escape_string(v:val.value)'), ' ') . ')'
endif
let op = self.escape_string(a:node.op)
return printf('(heredoc %s %s %s)', rlist, op, body)
Expand Down
16 changes: 12 additions & 4 deletions js/vimlparser.js
Original file line number Diff line number Diff line change
Expand Up @@ -1809,6 +1809,7 @@ VimLParser.prototype.parse_heredoc = function() {
node.body = [];
while (TRUE) {
this.reader.skip_white();
var pos = this.reader.getpos();
var key = this.reader.read_word();
if (key == "") {
break;
Expand All @@ -1818,7 +1819,10 @@ VimLParser.prototype.parse_heredoc = function() {
break;
}
else {
viml_add(node.rlist, key);
var keynode = Node(NODE_STRING);
keynode.pos = pos;
keynode.value = key;
viml_add(node.rlist, keynode);
}
}
if (node.op == "") {
Expand All @@ -1829,11 +1833,15 @@ VimLParser.prototype.parse_heredoc = function() {
if (this.reader.peek() == "<EOF>") {
break;
}
var pos = this.reader.getpos();
var line = this.reader.getn(-1);
if (line == node.op) {
return node;
}
viml_add(node.body, line);
var linenode = Node(NODE_STRING);
linenode.pos = pos;
linenode.value = line;
viml_add(node.body, linenode);
this.reader.get();
}
throw Err(viml_printf("E990: Missing end marker '%s'", node.op), this.reader.getpos());
Expand Down Expand Up @@ -5094,13 +5102,13 @@ Compiler.prototype.compile_heredoc = function(node) {
var rlist = "(list)";
}
else {
var rlist = "(list " + viml_join(node.rlist.map((function(vval) { return this.escape_string(vval); }).bind(this)), " ") + ")";
var rlist = "(list " + viml_join(node.rlist.map((function(vval) { return this.escape_string(vval.value); }).bind(this)), " ") + ")";
}
if (viml_empty(node.body)) {
var body = "(list)";
}
else {
var body = "(list " + viml_join(node.body.map((function(vval) { return this.escape_string(vval); }).bind(this)), " ") + ")";
var body = "(list " + viml_join(node.body.map((function(vval) { return this.escape_string(vval.value); }).bind(this)), " ") + ")";
}
var op = this.escape_string(node.op);
return viml_printf("(heredoc %s %s %s)", rlist, op, body);
Expand Down
16 changes: 12 additions & 4 deletions py/vimlparser.py
Original file line number Diff line number Diff line change
Expand Up @@ -1488,24 +1488,32 @@ def parse_heredoc(self):
node.body = []
while TRUE:
self.reader.skip_white()
pos = self.reader.getpos()
key = self.reader.read_word()
if key == "":
break
if not islower(key[0]):
node.op = key
break
else:
viml_add(node.rlist, key)
keynode = Node(NODE_STRING)
keynode.pos = pos
keynode.value = key
viml_add(node.rlist, keynode)
if node.op == "":
raise VimLParserException(Err("E172: Missing marker", self.reader.getpos()))
self.parse_trail()
while TRUE:
if self.reader.peek() == "<EOF>":
break
pos = self.reader.getpos()
line = self.reader.getn(-1)
if line == node.op:
return node
viml_add(node.body, line)
linenode = Node(NODE_STRING)
linenode.pos = pos
linenode.value = line
viml_add(node.body, linenode)
self.reader.get()
raise VimLParserException(Err(viml_printf("E990: Missing end marker '%s'", node.op), self.reader.getpos()))

Expand Down Expand Up @@ -4054,11 +4062,11 @@ def compile_heredoc(self, node):
if viml_empty(node.rlist):
rlist = "(list)"
else:
rlist = "(list " + viml_join([self.escape_string(vval) for vval in node.rlist], " ") + ")"
rlist = "(list " + viml_join([self.escape_string(vval.value) for vval in node.rlist], " ") + ")"
if viml_empty(node.body):
body = "(list)"
else:
body = "(list " + viml_join([self.escape_string(vval) for vval in node.body], " ") + ")"
body = "(list " + viml_join([self.escape_string(vval.value) for vval in node.body], " ") + ")"
op = self.escape_string(node.op)
return viml_printf("(heredoc %s %s %s)", rlist, op, body)

Expand Down