Skip to content

Commit 5dddf85

Browse files
authored
Merge pull request #177 from itchyny/fix-heredoc-rlist-nodes
Fix heredoc rlist and body: the type should be s:Node not string
2 parents a465602 + 4537127 commit 5dddf85

File tree

3 files changed

+36
-12
lines changed

3 files changed

+36
-12
lines changed

autoload/vimlparser.vim

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1515,6 +1515,7 @@ function! s:VimLParser.parse_heredoc() abort
15151515

15161516
while s:TRUE
15171517
call self.reader.skip_white()
1518+
let pos = self.reader.getpos()
15181519
let key = self.reader.read_word()
15191520
if key ==# ''
15201521
break
@@ -1523,7 +1524,10 @@ function! s:VimLParser.parse_heredoc() abort
15231524
let node.op = key
15241525
break
15251526
else
1526-
call add(node.rlist, key)
1527+
let keynode = s:Node(s:NODE_STRING)
1528+
let keynode.pos = pos
1529+
let keynode.value = key
1530+
call add(node.rlist, keynode)
15271531
endif
15281532
endwhile
15291533
if node.op ==# ''
@@ -1534,11 +1538,15 @@ function! s:VimLParser.parse_heredoc() abort
15341538
if self.reader.peek() ==# '<EOF>'
15351539
break
15361540
endif
1541+
let pos = self.reader.getpos()
15371542
let line = self.reader.getn(-1)
15381543
if line ==# node.op
15391544
return node
15401545
endif
1541-
call add(node.body, line)
1546+
let linenode = s:Node(s:NODE_STRING)
1547+
let linenode.pos = pos
1548+
let linenode.value = line
1549+
call add(node.body, linenode)
15421550
call self.reader.get()
15431551
endwhile
15441552
throw s:Err(printf("E990: Missing end marker '%s'", node.op), self.reader.getpos())
@@ -5590,12 +5598,12 @@ function! s:Compiler.compile_heredoc(node) abort
55905598
if empty(a:node.rlist)
55915599
let rlist = '(list)'
55925600
else
5593-
let rlist = '(list ' . join(map(a:node.rlist, 'self.escape_string(v:val)'), ' ') . ')'
5601+
let rlist = '(list ' . join(map(a:node.rlist, 'self.escape_string(v:val.value)'), ' ') . ')'
55945602
endif
55955603
if empty(a:node.body)
55965604
let body = '(list)'
55975605
else
5598-
let body = '(list ' . join(map(a:node.body, 'self.escape_string(v:val)'), ' ') . ')'
5606+
let body = '(list ' . join(map(a:node.body, 'self.escape_string(v:val.value)'), ' ') . ')'
55995607
endif
56005608
let op = self.escape_string(a:node.op)
56015609
return printf('(heredoc %s %s %s)', rlist, op, body)

js/vimlparser.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1809,6 +1809,7 @@ VimLParser.prototype.parse_heredoc = function() {
18091809
node.body = [];
18101810
while (TRUE) {
18111811
this.reader.skip_white();
1812+
var pos = this.reader.getpos();
18121813
var key = this.reader.read_word();
18131814
if (key == "") {
18141815
break;
@@ -1818,7 +1819,10 @@ VimLParser.prototype.parse_heredoc = function() {
18181819
break;
18191820
}
18201821
else {
1821-
viml_add(node.rlist, key);
1822+
var keynode = Node(NODE_STRING);
1823+
keynode.pos = pos;
1824+
keynode.value = key;
1825+
viml_add(node.rlist, keynode);
18221826
}
18231827
}
18241828
if (node.op == "") {
@@ -1829,11 +1833,15 @@ VimLParser.prototype.parse_heredoc = function() {
18291833
if (this.reader.peek() == "<EOF>") {
18301834
break;
18311835
}
1836+
var pos = this.reader.getpos();
18321837
var line = this.reader.getn(-1);
18331838
if (line == node.op) {
18341839
return node;
18351840
}
1836-
viml_add(node.body, line);
1841+
var linenode = Node(NODE_STRING);
1842+
linenode.pos = pos;
1843+
linenode.value = line;
1844+
viml_add(node.body, linenode);
18371845
this.reader.get();
18381846
}
18391847
throw Err(viml_printf("E990: Missing end marker '%s'", node.op), this.reader.getpos());
@@ -5094,13 +5102,13 @@ Compiler.prototype.compile_heredoc = function(node) {
50945102
var rlist = "(list)";
50955103
}
50965104
else {
5097-
var rlist = "(list " + viml_join(node.rlist.map((function(vval) { return this.escape_string(vval); }).bind(this)), " ") + ")";
5105+
var rlist = "(list " + viml_join(node.rlist.map((function(vval) { return this.escape_string(vval.value); }).bind(this)), " ") + ")";
50985106
}
50995107
if (viml_empty(node.body)) {
51005108
var body = "(list)";
51015109
}
51025110
else {
5103-
var body = "(list " + viml_join(node.body.map((function(vval) { return this.escape_string(vval); }).bind(this)), " ") + ")";
5111+
var body = "(list " + viml_join(node.body.map((function(vval) { return this.escape_string(vval.value); }).bind(this)), " ") + ")";
51045112
}
51055113
var op = this.escape_string(node.op);
51065114
return viml_printf("(heredoc %s %s %s)", rlist, op, body);

py/vimlparser.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1488,24 +1488,32 @@ def parse_heredoc(self):
14881488
node.body = []
14891489
while TRUE:
14901490
self.reader.skip_white()
1491+
pos = self.reader.getpos()
14911492
key = self.reader.read_word()
14921493
if key == "":
14931494
break
14941495
if not islower(key[0]):
14951496
node.op = key
14961497
break
14971498
else:
1498-
viml_add(node.rlist, key)
1499+
keynode = Node(NODE_STRING)
1500+
keynode.pos = pos
1501+
keynode.value = key
1502+
viml_add(node.rlist, keynode)
14991503
if node.op == "":
15001504
raise VimLParserException(Err("E172: Missing marker", self.reader.getpos()))
15011505
self.parse_trail()
15021506
while TRUE:
15031507
if self.reader.peek() == "<EOF>":
15041508
break
1509+
pos = self.reader.getpos()
15051510
line = self.reader.getn(-1)
15061511
if line == node.op:
15071512
return node
1508-
viml_add(node.body, line)
1513+
linenode = Node(NODE_STRING)
1514+
linenode.pos = pos
1515+
linenode.value = line
1516+
viml_add(node.body, linenode)
15091517
self.reader.get()
15101518
raise VimLParserException(Err(viml_printf("E990: Missing end marker '%s'", node.op), self.reader.getpos()))
15111519

@@ -4054,11 +4062,11 @@ def compile_heredoc(self, node):
40544062
if viml_empty(node.rlist):
40554063
rlist = "(list)"
40564064
else:
4057-
rlist = "(list " + viml_join([self.escape_string(vval) for vval in node.rlist], " ") + ")"
4065+
rlist = "(list " + viml_join([self.escape_string(vval.value) for vval in node.rlist], " ") + ")"
40584066
if viml_empty(node.body):
40594067
body = "(list)"
40604068
else:
4061-
body = "(list " + viml_join([self.escape_string(vval) for vval in node.body], " ") + ")"
4069+
body = "(list " + viml_join([self.escape_string(vval.value) for vval in node.body], " ") + ")"
40624070
op = self.escape_string(node.op)
40634071
return viml_printf("(heredoc %s %s %s)", rlist, op, body)
40644072

0 commit comments

Comments
 (0)