Skip to content

Commit f6e1808

Browse files
committed
feat(vimparser): update to latest version
1 parent 420a797 commit f6e1808

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "vim-language-server",
3-
"version": "2.3.0",
3+
"version": "2.3.1",
44
"description": "vim language server",
55
"keywords": [
66
"viml",

src/lib/vimparser.js

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1805,12 +1805,14 @@ VimLParser.prototype.parse_cmd_call = function() {
18051805
this.add_node(node);
18061806
}
18071807

1808-
VimLParser.prototype.parse_heredoc = function() {
1808+
VimLParser.prototype.parse_heredoc = function(prefix) {
18091809
var node = Node(NODE_HEREDOC);
18101810
node.pos = this.ea.cmdpos;
18111811
node.op = "";
18121812
node.rlist = [];
18131813
node.body = [];
1814+
// allow prefix to precede heredoc end marker if true
1815+
var is_trim = FALSE;
18141816
while (TRUE) {
18151817
this.reader.skip_white();
18161818
var pos = this.reader.getpos();
@@ -1827,6 +1829,9 @@ VimLParser.prototype.parse_heredoc = function() {
18271829
keynode.pos = pos;
18281830
keynode.value = key;
18291831
viml_add(node.rlist, keynode);
1832+
if (key == "trim") {
1833+
var is_trim = TRUE;
1834+
}
18301835
}
18311836
}
18321837
if (node.op == "") {
@@ -1839,7 +1844,7 @@ VimLParser.prototype.parse_heredoc = function() {
18391844
}
18401845
var pos = this.reader.getpos();
18411846
var line = this.reader.getn(-1);
1842-
if (line == node.op) {
1847+
if (line == node.op || is_trim && line == prefix + node.op) {
18431848
return node;
18441849
}
18451850
var linenode = Node(NODE_STRING);
@@ -1894,7 +1899,30 @@ VimLParser.prototype.parse_cmd_let = function() {
18941899
this.reader.getn(viml_len(s2));
18951900
this.reader.skip_white();
18961901
node.op = s2;
1897-
node.right = this.parse_heredoc();
1902+
// compute allowed prefix for heredoc end marker (e.g. EOF)
1903+
var pos = this.reader.tell();
1904+
while (this.reader.tell() > 0) {
1905+
if (this.reader.peek() == "<EOL>") {
1906+
this.reader.seek_cur(1);
1907+
break;
1908+
}
1909+
this.reader.seek_cur(-1);
1910+
}
1911+
var prefix = "";
1912+
while (TRUE) {
1913+
var c = this.reader.getn(1);
1914+
if (c == ":") {
1915+
// any presence of leading ':' disables prefix for heredoc end marker
1916+
var prefix = "";
1917+
break;
1918+
}
1919+
else if (!iswhite(c)) {
1920+
break;
1921+
}
1922+
prefix += c;
1923+
}
1924+
this.reader.seek_set(pos);
1925+
node.right = this.parse_heredoc(prefix);
18981926
this.add_node(node);
18991927
return;
19001928
}

0 commit comments

Comments
 (0)