diff --git a/autoload/vimlparser.vim b/autoload/vimlparser.vim index 2bf0f9c..7e82044 100644 --- a/autoload/vimlparser.vim +++ b/autoload/vimlparser.vim @@ -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 @@ -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 ==# '' @@ -1534,11 +1538,15 @@ function! s:VimLParser.parse_heredoc() abort if self.reader.peek() ==# '' 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()) @@ -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) diff --git a/js/vimlparser.js b/js/vimlparser.js index c8f2b93..608ee9f 100644 --- a/js/vimlparser.js +++ b/js/vimlparser.js @@ -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; @@ -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 == "") { @@ -1829,11 +1833,15 @@ VimLParser.prototype.parse_heredoc = function() { if (this.reader.peek() == "") { 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()); @@ -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); diff --git a/py/vimlparser.py b/py/vimlparser.py index abe3330..b192204 100644 --- a/py/vimlparser.py +++ b/py/vimlparser.py @@ -1488,6 +1488,7 @@ def parse_heredoc(self): node.body = [] while TRUE: self.reader.skip_white() + pos = self.reader.getpos() key = self.reader.read_word() if key == "": break @@ -1495,17 +1496,24 @@ def parse_heredoc(self): 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() == "": 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())) @@ -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)