Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix "let" and "let var" became NODE_EXCMD #138

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
118 changes: 56 additions & 62 deletions autoload/vimlparser.vim
Original file line number Diff line number Diff line change
Expand Up @@ -1495,11 +1495,18 @@ function! s:VimLParser.parse_cmd_let() abort
" :let
if self.ends_excmds(self.reader.peek())
call self.reader.seek_set(pos)
call self.parse_cmd_common()
let node = s:Node(s:NODE_LET)
let node.pos = self.ea.cmdpos
let node.ea = self.ea
let node.left = s:NIL
let node.list = s:NIL
let node.rest = s:NIL
let node.right = s:NIL
call self.add_node(node)
return
endif

let lhs = self.parse_letlhs()
let lhs = self.parse_letlhs(s:FALSE)
call self.reader.skip_white()
let s1 = self.reader.peekn(1)
let s2 = self.reader.peekn(2)
Expand All @@ -1510,8 +1517,14 @@ function! s:VimLParser.parse_cmd_let() abort

" :let {var-name} ..
if self.ends_excmds(s1) || (s2 !=# '+=' && s2 !=# '-=' && s2 !=# '.=' && s2 !=# '..=' && s2 !=# '*=' && s2 !=# '/=' && s2 !=# '%=' && s1 !=# '=')
call self.reader.seek_set(pos)
call self.parse_cmd_common()
let node = s:Node(s:NODE_LET)
let node.pos = self.ea.cmdpos
let node.ea = self.ea
let node.left = lhs.left
let node.list = lhs.list
let node.rest = lhs.rest
let node.right = s:NIL
call self.add_node(node)
return
endif

Expand All @@ -1538,24 +1551,35 @@ function! s:VimLParser.parse_cmd_let() abort
endfunction

function! s:VimLParser.parse_cmd_const() abort
let pos = self.reader.tell()
call self.reader.skip_white()

" :const
if self.ends_excmds(self.reader.peek())
call self.reader.seek_set(pos)
call self.parse_cmd_common()
let node = s:Node(s:NODE_CONST)
let node.pos = self.ea.cmdpos
let node.ea = self.ea
let node.left = s:NIL
let node.list = s:NIL
let node.rest = s:NIL
let node.right = s:NIL
call self.add_node(node)
return
endif

let lhs = self.parse_constlhs()
let lhs = self.parse_letlhs(s:TRUE)
call self.reader.skip_white()
let s1 = self.reader.peekn(1)

" :const {var-name}
if self.ends_excmds(s1) || s1 !=# '='
call self.reader.seek_set(pos)
call self.parse_cmd_common()
let node = s:Node(s:NODE_CONST)
let node.pos = self.ea.cmdpos
let node.ea = self.ea
let node.left = lhs.left
let node.list = lhs.list
let node.rest = lhs.rest
let node.right = s:NIL
call self.add_node(node)
return
endif

Expand Down Expand Up @@ -1696,7 +1720,7 @@ function! s:VimLParser.parse_cmd_for() abort
let node.left = s:NIL
let node.right = s:NIL
let node.endfor = s:NIL
let lhs = self.parse_letlhs()
let lhs = self.parse_letlhs(s:FALSE)
let node.left = lhs.left
let node.list = lhs.list
let node.rest = lhs.rest
Expand Down Expand Up @@ -1905,7 +1929,6 @@ function! s:VimLParser.parse_lvalue() abort
throw s:Err('Invalid Expression', node.pos)
endfunction

" TODO: merge with s:VimLParser.parse_lvalue()
function! s:VimLParser.parse_constlvalue() abort
let p = s:LvalueParser.new(self.reader)
let node = p.parse()
Expand Down Expand Up @@ -1945,7 +1968,7 @@ function! s:VimLParser.parse_lvaluelist() abort
endfunction

" FIXME:
function! s:VimLParser.parse_letlhs() abort
function! s:VimLParser.parse_letlhs(is_const) abort
let lhs = {'left': s:NIL, 'list': s:NIL, 'rest': s:NIL}
let tokenizer = s:ExprTokenizer.new(self.reader)
if tokenizer.peek().type ==# s:TOKEN_SQOPEN
Expand All @@ -1972,46 +1995,14 @@ function! s:VimLParser.parse_letlhs() abort
throw s:Err(printf('E475 Invalid argument: %s', token.value), token.pos)
endif
endwhile
elseif a:is_const
let lhs.left = self.parse_constlvalue()
else
let lhs.left = self.parse_lvalue()
endif
return lhs
endfunction

" TODO: merge with s:VimLParser.parse_letlhs() ?
function! s:VimLParser.parse_constlhs() abort
let lhs = {'left': s:NIL, 'list': s:NIL, 'rest': s:NIL}
let tokenizer = s:ExprTokenizer.new(self.reader)
if tokenizer.peek().type ==# s:TOKEN_SQOPEN
call tokenizer.get()
let lhs.list = []
while s:TRUE
let node = self.parse_lvalue()
call add(lhs.list, node)
let token = tokenizer.get()
if token.type ==# s:TOKEN_SQCLOSE
break
elseif token.type ==# s:TOKEN_COMMA
continue
elseif token.type ==# s:TOKEN_SEMICOLON
let node = self.parse_lvalue()
let lhs.rest = node
let token = tokenizer.get()
if token.type ==# s:TOKEN_SQCLOSE
break
else
throw s:Err(printf('E475 Invalid argument: %s', token.value), token.pos)
endif
else
throw s:Err(printf('E475 Invalid argument: %s', token.value), token.pos)
endif
endwhile
else
let lhs.left = self.parse_constlvalue()
endif
return lhs
endfunction

function! s:VimLParser.ends_excmds(c) abort
return a:c ==# '' || a:c ==# '|' || a:c ==# '"' || a:c ==# '<EOF>' || a:c ==# '<EOL>'
endfunction
Expand Down Expand Up @@ -4996,23 +4987,20 @@ function! s:Compiler.compile_excall(node) abort
endfunction

function! s:Compiler.compile_let(node) abort
let left = ''
if a:node.left isnot# s:NIL
let left = self.compile(a:node.left)
else
let left = join(map(a:node.list, 'self.compile(v:val)'), ' ')
if a:node.rest isnot# s:NIL
let left .= ' . ' . self.compile(a:node.rest)
endif
let left = '(' . left . ')'
endif
let right = self.compile(a:node.right)
call self.out('(let %s %s %s)', a:node.op, left, right)
call self.compile_letconst(a:node, 'let')
endfunction

" TODO: merge with s:Compiler.compile_let() ?
function! s:Compiler.compile_const(node) abort
call self.compile_letconst(a:node, 'const')
endfunction

function! s:Compiler.compile_letconst(node, cmd) abort
let left = ''
let right = ''
if a:node.left is# s:NIL && a:node.right is# s:NIL
call self.out('(%s)', a:cmd)
return
endif
if a:node.left isnot# s:NIL
let left = self.compile(a:node.left)
else
Expand All @@ -5022,8 +5010,14 @@ function! s:Compiler.compile_const(node) abort
endif
let left = '(' . left . ')'
endif
let right = self.compile(a:node.right)
call self.out('(const %s %s %s)', a:node.op, left, right)
if a:node.right isnot# s:NIL
let right = self.compile(a:node.right)
endif
if a:node.left isnot# s:NIL && a:node.right is# s:NIL
call self.out('(%s () %s)', a:cmd, left)
else
call self.out('(%s %s %s %s)', a:cmd, a:node.op, left, right)
endif
endfunction

function! s:Compiler.compile_unlet(node) abort
Expand Down
Loading