Skip to content

Commit 2b5e08a

Browse files
committed
Fix heredoc
1 parent b1c1402 commit 2b5e08a

File tree

4 files changed

+40
-29
lines changed

4 files changed

+40
-29
lines changed

autoload/vimlparser.vim

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,7 @@ endfunction
409409
" CURLYNAMEPART .value
410410
" CURLYNAMEEXPR .value
411411
" LAMBDA .rlist .left
412-
" HEREDOC .rlist .op .str
412+
" HEREDOC .rlist .op .body
413413
function! s:Node(type)
414414
return {'type': a:type}
415415
endfunction
@@ -1491,7 +1491,7 @@ function! s:VimLParser.parse_heredoc()
14911491
let node.pos = self.ea.cmdpos
14921492
let node.op = ''
14931493
let node.rlist = []
1494-
let node.str = ''
1494+
let node.body = []
14951495

14961496
let words = []
14971497
while s:TRUE
@@ -1500,25 +1500,27 @@ function! s:VimLParser.parse_heredoc()
15001500
if key == ''
15011501
break
15021502
endif
1503-
if key == 'trim'
1504-
call add(words, key)
1505-
else
1503+
if key !~# '^[a-z]'
15061504
let node.op = key
1505+
break
1506+
else
1507+
call add(words, key)
15071508
endif
15081509
endwhile
1510+
if node.op ==# ''
1511+
return s:NIL
1512+
endif
15091513
let node.rlist = words
1510-
let lines = []
15111514
call self.parse_trail()
15121515
while s:TRUE
15131516
if self.reader.peek() ==# '<EOF>'
15141517
break
15151518
endif
15161519
let line = self.reader.getn(-1)
15171520
if line ==# node.op
1518-
let node.str = join(lines, "\n") . "\n"
15191521
return node
15201522
endif
1521-
call add(lines, line)
1523+
call add(node.body, line)
15221524
call self.reader.get()
15231525
endwhile
15241526
return s:NIL
@@ -4895,7 +4897,9 @@ function! s:Compiler.compile_lambda(node)
48954897
endfunction
48964898

48974899
function! s:Compiler.compile_heredoc(node)
4898-
return printf('(heredoc (%s) %s %s))', join(a:node.rlist, ' '), self.escape_string(a:node.op), self.escape_string(a:node.str))
4900+
let rlist = map(a:node.rlist, 'self.escape_string(v:val)')
4901+
let body = map(a:node.body, 'self.escape_string(v:val)')
4902+
return printf('(heredoc (list %s) %s (list %s))', join(rlist, ' '), self.escape_string(a:node.op), join(body, ' '))
48994903
endfunction
49004904

49014905
" TODO: under construction

js/vimlparser.js

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -582,7 +582,7 @@ function ExArg() {
582582
// CURLYNAMEPART .value
583583
// CURLYNAMEEXPR .value
584584
// LAMBDA .rlist .left
585-
// HEREDOC .rlist .op .str
585+
// HEREDOC .rlist .op .body
586586
function Node(type) {
587587
return {"type":type};
588588
}
@@ -1778,34 +1778,36 @@ VimLParser.prototype.parse_heredoc = function() {
17781778
node.pos = this.ea.cmdpos;
17791779
node.op = "";
17801780
node.rlist = [];
1781-
node.str = "";
1781+
node.body = [];
17821782
var words = [];
17831783
while (TRUE) {
17841784
this.reader.skip_white();
17851785
var key = this.reader.read_alpha();
17861786
if (key == "") {
17871787
break;
17881788
}
1789-
if (key == "trim") {
1790-
viml_add(words, key);
1789+
if (!viml_eqregh(key, "^[a-z]")) {
1790+
node.op = key;
1791+
break;
17911792
}
17921793
else {
1793-
node.op = key;
1794+
viml_add(words, key);
17941795
}
17951796
}
1797+
if (node.op == "") {
1798+
return NIL;
1799+
}
17961800
node.rlist = words;
1797-
var lines = [];
17981801
this.parse_trail();
17991802
while (TRUE) {
18001803
if (this.reader.peek() == "<EOF>") {
18011804
break;
18021805
}
18031806
var line = this.reader.getn(-1);
18041807
if (line == node.op) {
1805-
node.str = viml_join(lines, "\n") + "\n";
18061808
return node;
18071809
}
1808-
viml_add(lines, line);
1810+
viml_add(node.body, line);
18091811
this.reader.get();
18101812
}
18111813
return NIL;
@@ -4882,7 +4884,9 @@ Compiler.prototype.compile_lambda = function(node) {
48824884
}
48834885

48844886
Compiler.prototype.compile_heredoc = function(node) {
4885-
return viml_printf("(heredoc (%s) %s %s))", viml_join(node.rlist, " "), this.escape_string(node.op), this.escape_string(node.str));
4887+
var rlist = node.rlist.map((function(vval) { return this.escape_string(vval); }).bind(this));
4888+
var body = node.body.map((function(vval) { return this.escape_string(vval); }).bind(this));
4889+
return viml_printf("(heredoc (list %s) %s (list %s))", viml_join(rlist, " "), this.escape_string(node.op), viml_join(body, " "));
48864890
}
48874891

48884892
// TODO: under construction

py/vimlparser.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ def ExArg():
522522
# CURLYNAMEPART .value
523523
# CURLYNAMEEXPR .value
524524
# LAMBDA .rlist .left
525-
# HEREDOC .rlist .op .str
525+
# HEREDOC .rlist .op .body
526526
def Node(type):
527527
return AttributeDict({"type":type})
528528

@@ -1409,28 +1409,29 @@ def parse_heredoc(self):
14091409
node.pos = self.ea.cmdpos
14101410
node.op = ""
14111411
node.rlist = []
1412-
node.str = ""
1412+
node.body = []
14131413
words = []
14141414
while TRUE:
14151415
self.reader.skip_white()
14161416
key = self.reader.read_alpha()
14171417
if key == "":
14181418
break
1419-
if key == "trim":
1420-
viml_add(words, key)
1421-
else:
1419+
if not viml_eqregh(key, "^[a-z]"):
14221420
node.op = key
1421+
break
1422+
else:
1423+
viml_add(words, key)
1424+
if node.op == "":
1425+
return NIL
14231426
node.rlist = words
1424-
lines = []
14251427
self.parse_trail()
14261428
while TRUE:
14271429
if self.reader.peek() == "<EOF>":
14281430
break
14291431
line = self.reader.getn(-1)
14301432
if line == node.op:
1431-
node.str = viml_join(lines, "\n") + "\n"
14321433
return node
1433-
viml_add(lines, line)
1434+
viml_add(node.body, line)
14341435
self.reader.get()
14351436
return NIL
14361437

@@ -3824,7 +3825,9 @@ def compile_lambda(self, node):
38243825
return viml_printf("(lambda (%s) %s)", viml_join(rlist, " "), self.compile(node.left))
38253826

38263827
def compile_heredoc(self, node):
3827-
return viml_printf("(heredoc (%s) %s %s))", viml_join(node.rlist, " "), self.escape_string(node.op), self.escape_string(node.str))
3828+
rlist = [self.escape_string(vval) for vval in node.rlist]
3829+
body = [self.escape_string(vval) for vval in node.body]
3830+
return viml_printf("(heredoc (list %s) %s (list %s))", viml_join(rlist, " "), self.escape_string(node.op), viml_join(body, " "))
38283831

38293832
# TODO: under construction
38303833
class RegexpParser:

test/test_heredoc.ok

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
(let =<< a (heredoc () "EOS" "hello\n world\n")))
2-
(let =<< a (heredoc (trim) "EOS" "\thello\nworld\n")))
1+
(let =<< a (heredoc (list ) "EOS" (list "hello" " world")))
2+
(let =<< a (heredoc (list "trim") "EOS" (list "\thello" "world")))

0 commit comments

Comments
 (0)