Skip to content

Commit a27e2e2

Browse files
committed
fix ":let [{var}]" and ":const [{var}]" parsing
1 parent 7a85dd3 commit a27e2e2

File tree

3 files changed

+58
-22
lines changed

3 files changed

+58
-22
lines changed

autoload/vimlparser.vim

Lines changed: 50 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1495,7 +1495,14 @@ function! s:VimLParser.parse_cmd_let() abort
14951495
" :let
14961496
if self.ends_excmds(self.reader.peek())
14971497
call self.reader.seek_set(pos)
1498-
call self.parse_cmd_common()
1498+
let node = s:Node(s:NODE_LET)
1499+
let node.pos = self.ea.cmdpos
1500+
let node.ea = self.ea
1501+
let node.left = s:NIL
1502+
let node.list = s:NIL
1503+
let node.rest = s:NIL
1504+
let node.right = s:NIL
1505+
call self.add_node(node)
14991506
return
15001507
endif
15011508

@@ -1510,8 +1517,14 @@ function! s:VimLParser.parse_cmd_let() abort
15101517

15111518
" :let {var-name} ..
15121519
if self.ends_excmds(s1) || (s2 !=# '+=' && s2 !=# '-=' && s2 !=# '.=' && s2 !=# '..=' && s2 !=# '*=' && s2 !=# '/=' && s2 !=# '%=' && s1 !=# '=')
1513-
call self.reader.seek_set(pos)
1514-
call self.parse_cmd_common()
1520+
let node = s:Node(s:NODE_LET)
1521+
let node.pos = self.ea.cmdpos
1522+
let node.ea = self.ea
1523+
let node.left = lhs.left
1524+
let node.list = lhs.list
1525+
let node.rest = lhs.rest
1526+
let node.right = s:NIL
1527+
call self.add_node(node)
15151528
return
15161529
endif
15171530

@@ -1543,8 +1556,14 @@ function! s:VimLParser.parse_cmd_const() abort
15431556

15441557
" :const
15451558
if self.ends_excmds(self.reader.peek())
1546-
call self.reader.seek_set(pos)
1547-
call self.parse_cmd_common()
1559+
let node = s:Node(s:NODE_CONST)
1560+
let node.pos = self.ea.cmdpos
1561+
let node.ea = self.ea
1562+
let node.left = s:NIL
1563+
let node.list = s:NIL
1564+
let node.rest = s:NIL
1565+
let node.right = s:NIL
1566+
call self.add_node(node)
15481567
return
15491568
endif
15501569

@@ -1554,8 +1573,14 @@ function! s:VimLParser.parse_cmd_const() abort
15541573

15551574
" :const {var-name}
15561575
if self.ends_excmds(s1) || s1 !=# '='
1557-
call self.reader.seek_set(pos)
1558-
call self.parse_cmd_common()
1576+
let node = s:Node(s:NODE_CONST)
1577+
let node.pos = self.ea.cmdpos
1578+
let node.ea = self.ea
1579+
let node.left = lhs.left
1580+
let node.list = lhs.list
1581+
let node.rest = lhs.rest
1582+
let node.right = s:NIL
1583+
call self.add_node(node)
15591584
return
15601585
endif
15611586

@@ -4996,23 +5021,20 @@ function! s:Compiler.compile_excall(node) abort
49965021
endfunction
49975022

49985023
function! s:Compiler.compile_let(node) abort
4999-
let left = ''
5000-
if a:node.left isnot# s:NIL
5001-
let left = self.compile(a:node.left)
5002-
else
5003-
let left = join(map(a:node.list, 'self.compile(v:val)'), ' ')
5004-
if a:node.rest isnot# s:NIL
5005-
let left .= ' . ' . self.compile(a:node.rest)
5006-
endif
5007-
let left = '(' . left . ')'
5008-
endif
5009-
let right = self.compile(a:node.right)
5010-
call self.out('(let %s %s %s)', a:node.op, left, right)
5024+
call self.compile_letconst(a:node, 'let')
50115025
endfunction
50125026

5013-
" TODO: merge with s:Compiler.compile_let() ?
50145027
function! s:Compiler.compile_const(node) abort
5028+
call self.compile_letconst(a:node, 'const')
5029+
endfunction
5030+
5031+
function! s:Compiler.compile_letconst(node, cmd) abort
50155032
let left = ''
5033+
let right = ''
5034+
if a:node.left is# s:NIL && a:node.right is# s:NIL
5035+
call self.out('(%s)', a:cmd)
5036+
return
5037+
endif
50165038
if a:node.left isnot# s:NIL
50175039
let left = self.compile(a:node.left)
50185040
else
@@ -5022,8 +5044,14 @@ function! s:Compiler.compile_const(node) abort
50225044
endif
50235045
let left = '(' . left . ')'
50245046
endif
5025-
let right = self.compile(a:node.right)
5026-
call self.out('(const %s %s %s)', a:node.op, left, right)
5047+
if a:node.right isnot# s:NIL
5048+
let right = self.compile(a:node.right)
5049+
endif
5050+
if a:node.left isnot# s:NIL && a:node.right is# s:NIL
5051+
call self.out('(%s () %s)', a:cmd, left)
5052+
else
5053+
call self.out('(%s %s %s %s)', a:cmd, a:node.op, left, right)
5054+
endif
50275055
endfunction
50285056

50295057
function! s:Compiler.compile_unlet(node) abort

test/test_letconst.ok

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,7 @@
2222
(const = a 1)
2323
(const = (a b) (list 1 2))
2424
(const = (a b . c) (list 1 2 3))
25+
(let)
26+
(let () var)
27+
(const)
28+
(const () var)

test/test_letconst.vim

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,7 @@ let a = '🐥'
2222
const a = 1
2323
const [a, b] = [1, 2]
2424
const [a, b; c] = [1, 2, 3]
25+
let
26+
let var
27+
const
28+
const var

0 commit comments

Comments
 (0)