Skip to content

Commit e99ee95

Browse files
committed
Do not use slice
1 parent 8e56b9b commit e99ee95

File tree

3 files changed

+138
-5
lines changed

3 files changed

+138
-5
lines changed

autoload/vimlparser.vim

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1500,15 +1500,18 @@ function! s:VimLParser.parse_heredoc()
15001500
if key == ''
15011501
break
15021502
endif
1503-
call add(words, key)
1503+
if key == 'trim'
1504+
call add(words, key)
1505+
else
1506+
let node.op = key
1507+
endif
15041508
endwhile
15051509
if empty(words)
15061510
call self.reader.seek_set(pos)
15071511
call self.parse_cmd_common()
15081512
return
15091513
endif
1510-
let node.rlist = words[:-2]
1511-
let node.op = words[-1]
1514+
let node.rlist = words
15121515
let lines = []
15131516
call self.parse_trail()
15141517
while s:TRUE

js/vimlparser.js

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,7 @@ var NODE_CURLYNAMEPART = 90;
314314
var NODE_CURLYNAMEEXPR = 91;
315315
var NODE_LAMBDA = 92;
316316
var NODE_BLOB = 93;
317+
var NODE_HEREDOC = 94;
317318
var TOKEN_EOF = 1;
318319
var TOKEN_EOL = 2;
319320
var TOKEN_SPACE = 3;
@@ -382,6 +383,7 @@ var TOKEN_ARROW = 65;
382383
var TOKEN_BLOB = 66;
383384
var TOKEN_LITCOPEN = 67;
384385
var TOKEN_DOTDOT = 68;
386+
var TOKEN_HEREDOC = 69;
385387
var MAX_FUNC_ARGS = 20;
386388
function isalpha(c) {
387389
return viml_eqregh(c, "^[A-Za-z]$");
@@ -580,6 +582,7 @@ function ExArg() {
580582
// CURLYNAMEPART .value
581583
// CURLYNAMEEXPR .value
582584
// LAMBDA .rlist .left
585+
// HEREDOC .rlist .op .str
583586
function Node(type) {
584587
return {"type":type};
585588
}
@@ -1770,6 +1773,49 @@ VimLParser.prototype.parse_cmd_call = function() {
17701773
this.add_node(node);
17711774
}
17721775

1776+
VimLParser.prototype.parse_heredoc = function() {
1777+
var node = Node(NODE_HEREDOC);
1778+
node.pos = this.ea.cmdpos;
1779+
node.op = "";
1780+
node.rlist = [];
1781+
node.str = "";
1782+
var words = [];
1783+
while (TRUE) {
1784+
this.reader.skip_white();
1785+
var key = this.reader.read_alpha();
1786+
if (key == "") {
1787+
break;
1788+
}
1789+
if (key == "trim") {
1790+
viml_add(words, key);
1791+
}
1792+
else {
1793+
node.op = key;
1794+
}
1795+
}
1796+
if (viml_empty(words)) {
1797+
this.reader.seek_set(pos);
1798+
this.parse_cmd_common();
1799+
return;
1800+
}
1801+
node.rlist = words;
1802+
var lines = [];
1803+
this.parse_trail();
1804+
while (TRUE) {
1805+
if (this.reader.peek() == "<EOF>") {
1806+
break;
1807+
}
1808+
var line = this.reader.getn(-1);
1809+
if (line == node.op) {
1810+
node.str = viml_join(lines, "\n") + "\n";
1811+
return node;
1812+
}
1813+
viml_add(lines, line);
1814+
this.reader.get();
1815+
}
1816+
return NIL;
1817+
}
1818+
17731819
VimLParser.prototype.parse_cmd_let = function() {
17741820
var pos = this.reader.tell();
17751821
this.reader.skip_white();
@@ -1787,8 +1833,11 @@ VimLParser.prototype.parse_cmd_let = function() {
17871833
if (s2 == "..") {
17881834
var s2 = this.reader.peekn(3);
17891835
}
1836+
else if (s2 == "=<") {
1837+
var s2 = this.reader.peekn(3);
1838+
}
17901839
// :let {var-name} ..
1791-
if (this.ends_excmds(s1) || s2 != "+=" && s2 != "-=" && s2 != ".=" && s2 != "..=" && s2 != "*=" && s2 != "/=" && s2 != "%=" && s1 != "=") {
1840+
if (this.ends_excmds(s1) || s2 != "+=" && s2 != "-=" && s2 != ".=" && s2 != "..=" && s2 != "*=" && s2 != "/=" && s2 != "%=" && s2 != "=<<" && s1 != "=") {
17921841
this.reader.seek_set(pos);
17931842
this.parse_cmd_common();
17941843
return;
@@ -1806,6 +1855,14 @@ VimLParser.prototype.parse_cmd_let = function() {
18061855
this.reader.getn(viml_len(s2));
18071856
node.op = s2;
18081857
}
1858+
else if (s2 == "=<<") {
1859+
this.reader.getn(viml_len(s2));
1860+
this.reader.skip_white();
1861+
node.op = "=";
1862+
node.right = this.parse_heredoc();
1863+
this.add_node(node);
1864+
return;
1865+
}
18091866
else if (s1 == "=") {
18101867
this.reader.getn(1);
18111868
node.op = s1;
@@ -4325,6 +4382,9 @@ Compiler.prototype.compile = function(node) {
43254382
else if (node.type == NODE_LAMBDA) {
43264383
return this.compile_lambda(node);
43274384
}
4385+
else if (node.type == NODE_HEREDOC) {
4386+
return this.compile_heredoc(node);
4387+
}
43284388
else {
43294389
throw viml_printf("Compiler: unknown node: %s", viml_string(node));
43304390
}
@@ -4808,6 +4868,18 @@ Compiler.prototype.compile_lambda = function(node) {
48084868
return viml_printf("(lambda (%s) %s)", viml_join(rlist, " "), this.compile(node.left));
48094869
}
48104870

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+
4879+
Compiler.prototype.compile_heredoc = function(node) {
4880+
return viml_printf("(heredoc (%s) \"%s\" %s))", viml_join(node.rlist, " "), node.op, escape_string(node.str));
4881+
}
4882+
48114883
// TODO: under construction
48124884
function RegexpParser() { this.__init__.apply(this, arguments); }
48134885
RegexpParser.prototype.RE_VERY_NOMAGIC = 1;

py/vimlparser.py

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@ def viml_stridx(a, b):
270270
NODE_CURLYNAMEEXPR = 91
271271
NODE_LAMBDA = 92
272272
NODE_BLOB = 93
273+
NODE_HEREDOC = 94
273274
TOKEN_EOF = 1
274275
TOKEN_EOL = 2
275276
TOKEN_SPACE = 3
@@ -338,6 +339,7 @@ def viml_stridx(a, b):
338339
TOKEN_BLOB = 66
339340
TOKEN_LITCOPEN = 67
340341
TOKEN_DOTDOT = 68
342+
TOKEN_HEREDOC = 69
341343
MAX_FUNC_ARGS = 20
342344
def isalpha(c):
343345
return viml_eqregh(c, "^[A-Za-z]$")
@@ -520,6 +522,7 @@ def ExArg():
520522
# CURLYNAMEPART .value
521523
# CURLYNAMEEXPR .value
522524
# LAMBDA .rlist .left
525+
# HEREDOC .rlist .op .str
523526
def Node(type):
524527
return AttributeDict({"type":type})
525528

@@ -1401,6 +1404,40 @@ def parse_cmd_call(self):
14011404
raise VimLParserException(Err("Not an function call", node.left.pos))
14021405
self.add_node(node)
14031406

1407+
def parse_heredoc(self):
1408+
node = Node(NODE_HEREDOC)
1409+
node.pos = self.ea.cmdpos
1410+
node.op = ""
1411+
node.rlist = []
1412+
node.str = ""
1413+
words = []
1414+
while TRUE:
1415+
self.reader.skip_white()
1416+
key = self.reader.read_alpha()
1417+
if key == "":
1418+
break
1419+
if key == "trim":
1420+
viml_add(words, key)
1421+
else:
1422+
node.op = key
1423+
if viml_empty(words):
1424+
self.reader.seek_set(pos)
1425+
self.parse_cmd_common()
1426+
return
1427+
node.rlist = words
1428+
lines = []
1429+
self.parse_trail()
1430+
while TRUE:
1431+
if self.reader.peek() == "<EOF>":
1432+
break
1433+
line = self.reader.getn(-1)
1434+
if line == node.op:
1435+
node.str = viml_join(lines, "\n") + "\n"
1436+
return node
1437+
viml_add(lines, line)
1438+
self.reader.get()
1439+
return NIL
1440+
14041441
def parse_cmd_let(self):
14051442
pos = self.reader.tell()
14061443
self.reader.skip_white()
@@ -1416,8 +1453,10 @@ def parse_cmd_let(self):
14161453
# TODO check scriptversion?
14171454
if s2 == "..":
14181455
s2 = self.reader.peekn(3)
1456+
elif s2 == "=<":
1457+
s2 = self.reader.peekn(3)
14191458
# :let {var-name} ..
1420-
if self.ends_excmds(s1) or s2 != "+=" and s2 != "-=" and s2 != ".=" and s2 != "..=" and s2 != "*=" and s2 != "/=" and s2 != "%=" and s1 != "=":
1459+
if self.ends_excmds(s1) or s2 != "+=" and s2 != "-=" and s2 != ".=" and s2 != "..=" and s2 != "*=" and s2 != "/=" and s2 != "%=" and s2 != "=<<" and s1 != "=":
14211460
self.reader.seek_set(pos)
14221461
self.parse_cmd_common()
14231462
return
@@ -1433,6 +1472,13 @@ def parse_cmd_let(self):
14331472
if s2 == "+=" or s2 == "-=" or s2 == ".=" or s2 == "..=" or s2 == "*=" or s2 == "/=" or s2 == "%=":
14341473
self.reader.getn(viml_len(s2))
14351474
node.op = s2
1475+
elif s2 == "=<<":
1476+
self.reader.getn(viml_len(s2))
1477+
self.reader.skip_white()
1478+
node.op = "="
1479+
node.right = self.parse_heredoc()
1480+
self.add_node(node)
1481+
return
14361482
elif s1 == "=":
14371483
self.reader.getn(1)
14381484
node.op = s1
@@ -3404,6 +3450,8 @@ def compile(self, node):
34043450
return self.compile_curlynameexpr(node)
34053451
elif node.type == NODE_LAMBDA:
34063452
return self.compile_lambda(node)
3453+
elif node.type == NODE_HEREDOC:
3454+
return self.compile_heredoc(node)
34073455
else:
34083456
raise VimLParserException(viml_printf("Compiler: unknown node: %s", viml_string(node)))
34093457
return NIL
@@ -3767,6 +3815,16 @@ def compile_lambda(self, node):
37673815
rlist = [self.compile(vval) for vval in node.rlist]
37683816
return viml_printf("(lambda (%s) %s)", viml_join(rlist, " "), self.compile(node.left))
37693817

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+
3825+
def compile_heredoc(self, node):
3826+
return viml_printf("(heredoc (%s) \"%s\" %s))", viml_join(node.rlist, " "), node.op, escape_string(node.str))
3827+
37703828
# TODO: under construction
37713829
class RegexpParser:
37723830
RE_VERY_NOMAGIC = 1

0 commit comments

Comments
 (0)