Skip to content

Commit a5159db

Browse files
committed
Handle words correctly, Implement escape_string
1 parent e99ee95 commit a5159db

File tree

4 files changed

+59
-51
lines changed

4 files changed

+59
-51
lines changed

autoload/vimlparser.vim

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1506,11 +1506,6 @@ function! s:VimLParser.parse_heredoc()
15061506
let node.op = key
15071507
endif
15081508
endwhile
1509-
if empty(words)
1510-
call self.reader.seek_set(pos)
1511-
call self.parse_cmd_common()
1512-
return
1513-
endif
15141509
let node.rlist = words
15151510
let lines = []
15161511
call self.parse_trail()
@@ -1573,7 +1568,7 @@ function! s:VimLParser.parse_cmd_let()
15731568
elseif s2 ==# '=<<'
15741569
call self.reader.getn(len(s2))
15751570
call self.reader.skip_white()
1576-
let node.op = '='
1571+
let node.op = s2
15771572
let node.right = self.parse_heredoc()
15781573
call self.add_node(node)
15791574
return
@@ -4879,21 +4874,28 @@ function! s:Compiler.compile_curlynameexpr(node)
48794874
return '{' . self.compile(a:node.value) . '}'
48804875
endfunction
48814876

4877+
function! s:Compiler.escape_string(str)
4878+
let m = {"\n": '\n', "\t": '\t', "\r": '\r'}
4879+
let out = '"'
4880+
for i in range(len(a:str))
4881+
let c = a:str[i]
4882+
if has_key(m, c)
4883+
let out .= m[c]
4884+
else
4885+
let out .= c
4886+
endif
4887+
endfor
4888+
let out .= '"'
4889+
return out
4890+
endfunction
4891+
48824892
function! s:Compiler.compile_lambda(node)
48834893
let rlist = map(a:node.rlist, 'self.compile(v:val)')
48844894
return printf('(lambda (%s) %s)', join(rlist, ' '), self.compile(a:node.left))
48854895
endfunction
48864896

4887-
function! s:escape_string(str)
4888-
let str = '"' . escape(a:str, '\"') . '"'
4889-
let str = substitute(str, "\r", '\\r', 'g')
4890-
let str = substitute(str, "\n", '\\n', 'g')
4891-
let str = substitute(str, "\t", '\\t', 'g')
4892-
return str
4893-
endfunction
4894-
48954897
function! s:Compiler.compile_heredoc(node)
4896-
return printf('(heredoc (%s) "%s" %s))', join(a:node.rlist, ' '), a:node.op, s:escape_string(a:node.str))
4898+
return printf('(heredoc (%s) "%s" %s))', join(a:node.rlist, ' '), a:node.op, self.escape_string(a:node.str))
48974899
endfunction
48984900

48994901
" TODO: under construction

js/vimlparser.js

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1793,11 +1793,6 @@ VimLParser.prototype.parse_heredoc = function() {
17931793
node.op = key;
17941794
}
17951795
}
1796-
if (viml_empty(words)) {
1797-
this.reader.seek_set(pos);
1798-
this.parse_cmd_common();
1799-
return;
1800-
}
18011796
node.rlist = words;
18021797
var lines = [];
18031798
this.parse_trail();
@@ -1858,7 +1853,7 @@ VimLParser.prototype.parse_cmd_let = function() {
18581853
else if (s2 == "=<<") {
18591854
this.reader.getn(viml_len(s2));
18601855
this.reader.skip_white();
1861-
node.op = "=";
1856+
node.op = s2;
18621857
node.right = this.parse_heredoc();
18631858
this.add_node(node);
18641859
return;
@@ -4863,21 +4858,31 @@ Compiler.prototype.compile_curlynameexpr = function(node) {
48634858
return "{" + this.compile(node.value) + "}";
48644859
}
48654860

4861+
Compiler.prototype.escape_string = function(str) {
4862+
var m = {"\n":"\\n", "\t":"\\t", "\r":"\\r"};
4863+
var out = "\"";
4864+
var __c13 = viml_range(viml_len(str));
4865+
for (var __i13 = 0; __i13 < __c13.length; ++__i13) {
4866+
var i = __c13[__i13];
4867+
var c = str[i];
4868+
if (viml_has_key(m, c)) {
4869+
out += m[c];
4870+
}
4871+
else {
4872+
out += c;
4873+
}
4874+
}
4875+
out += "\"";
4876+
return out;
4877+
}
4878+
48664879
Compiler.prototype.compile_lambda = function(node) {
48674880
var rlist = node.rlist.map((function(vval) { return this.compile(vval); }).bind(this));
48684881
return viml_printf("(lambda (%s) %s)", viml_join(rlist, " "), this.compile(node.left));
48694882
}
48704883

4871-
function escape_string(str) {
4872-
var str = "\"" + viml_escape(str, "\\\"") + "\"";
4873-
var str = viml_substitute(str, "\r", "\\\\r", "g");
4874-
var str = viml_substitute(str, "\n", "\\\\n", "g");
4875-
var str = viml_substitute(str, "\t", "\\\\t", "g");
4876-
return str;
4877-
}
4878-
48794884
Compiler.prototype.compile_heredoc = function(node) {
4880-
return viml_printf("(heredoc (%s) \"%s\" %s))", viml_join(node.rlist, " "), node.op, escape_string(node.str));
4885+
return viml_printf("(heredoc (%s) \"%s\" %s))", viml_join(node.rlist, " "), node.op, this.escape_string(node.str));
48814886
}
48824887

48834888
// TODO: under construction
@@ -5560,9 +5565,9 @@ RegexpParser.prototype.get_token_sq_char_class = function() {
55605565
var r = this.reader.read_alpha();
55615566
if (this.reader.p(0) == ":" && this.reader.p(1) == "]") {
55625567
this.reader.seek_cur(2);
5563-
var __c13 = class_names;
5564-
for (var __i13 = 0; __i13 < __c13.length; ++__i13) {
5565-
var name = __c13[__i13];
5568+
var __c14 = class_names;
5569+
for (var __i14 = 0; __i14 < __c14.length; ++__i14) {
5570+
var name = __c14[__i14];
55665571
if (r == name) {
55675572
return "[:" + name + ":]";
55685573
}
@@ -5695,9 +5700,9 @@ RegexpParser.prototype.getoctchrs = function() {
56955700

56965701
RegexpParser.prototype.gethexchrs = function(n) {
56975702
var r = "";
5698-
var __c14 = viml_range(n);
5699-
for (var __i14 = 0; __i14 < __c14.length; ++__i14) {
5700-
var i = __c14[__i14];
5703+
var __c15 = viml_range(n);
5704+
for (var __i15 = 0; __i15 < __c15.length; ++__i15) {
5705+
var i = __c15[__i15];
57015706
var c = this.reader.peek();
57025707
if (!isxdigit(c)) {
57035708
break;

py/vimlparser.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1420,10 +1420,6 @@ def parse_heredoc(self):
14201420
viml_add(words, key)
14211421
else:
14221422
node.op = key
1423-
if viml_empty(words):
1424-
self.reader.seek_set(pos)
1425-
self.parse_cmd_common()
1426-
return
14271423
node.rlist = words
14281424
lines = []
14291425
self.parse_trail()
@@ -1475,7 +1471,7 @@ def parse_cmd_let(self):
14751471
elif s2 == "=<<":
14761472
self.reader.getn(viml_len(s2))
14771473
self.reader.skip_white()
1478-
node.op = "="
1474+
node.op = s2
14791475
node.right = self.parse_heredoc()
14801476
self.add_node(node)
14811477
return
@@ -3811,19 +3807,24 @@ def compile_curlynamepart(self, node):
38113807
def compile_curlynameexpr(self, node):
38123808
return "{" + self.compile(node.value) + "}"
38133809

3810+
def escape_string(self, str):
3811+
m = AttributeDict({"\n":"\\n", "\t":"\\t", "\r":"\\r"})
3812+
out = "\""
3813+
for i in viml_range(viml_len(str)):
3814+
c = str[i]
3815+
if viml_has_key(m, c):
3816+
out += m[c]
3817+
else:
3818+
out += c
3819+
out += "\""
3820+
return out
3821+
38143822
def compile_lambda(self, node):
38153823
rlist = [self.compile(vval) for vval in node.rlist]
38163824
return viml_printf("(lambda (%s) %s)", viml_join(rlist, " "), self.compile(node.left))
38173825

3818-
def escape_string(str):
3819-
str = "\"" + viml_escape(str, "\\\"") + "\""
3820-
str = viml_substitute(str, "\r", "\\\\r", "g")
3821-
str = viml_substitute(str, "\n", "\\\\n", "g")
3822-
str = viml_substitute(str, "\t", "\\\\t", "g")
3823-
return str
3824-
38253826
def compile_heredoc(self, node):
3826-
return viml_printf("(heredoc (%s) \"%s\" %s))", viml_join(node.rlist, " "), node.op, escape_string(node.str))
3827+
return viml_printf("(heredoc (%s) \"%s\" %s))", viml_join(node.rlist, " "), node.op, self.escape_string(node.str))
38273828

38283829
# TODO: under construction
38293830
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 () "EOS" "hello\n world\n")))
2+
(let =<< a (heredoc (trim) "EOS" "\thello\nworld\n")))

0 commit comments

Comments
 (0)