Skip to content
Closed
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
64 changes: 60 additions & 4 deletions autoload/vimlparser.vim
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@ let s:TOKEN_DOTDOTDOT = 63
let s:TOKEN_SHARP = 64
let s:TOKEN_ARROW = 65
let s:TOKEN_BLOB = 66
let s:TOKEN_RAWCOPEN = 67

let s:MAX_FUNC_ARGS = 20

Expand Down Expand Up @@ -2522,6 +2523,24 @@ let s:VimLParser.builtin_commands = [
\ {'flags': 'EXTRA|TRLBAR|CMDWIN', 'minlen': 5, 'name': 'tmapclear', 'parser': 'parse_cmd_common'},
\ {'flags': 'EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN', 'minlen': 3, 'name': 'tnoremap', 'parser': 'parse_cmd_common'},
\ {'flags': 'EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN', 'minlen': 5, 'name': 'tunmap', 'parser': 'parse_cmd_common'},
\
\ {'flags': 'EX_RANGE|EX_COUNT|EX_TRLBAR', 'minlen': 4, 'name': 'cabove', 'parser': 'parse_cmd_common'},
\ {'flags': 'EX_RANGE|EX_COUNT|EX_TRLBAR', 'minlen': 3, 'name': 'cafter', 'parser': 'parse_cmd_common'},
\ {'flags': 'EX_RANGE|EX_COUNT|EX_TRLBAR', 'minlen': 3, 'name': 'cbefore', 'parser': 'parse_cmd_common'},
\ {'flags': 'EX_RANGE|EX_COUNT|EX_TRLBAR', 'minlen': 4, 'name': 'cbelow', 'parser': 'parse_cmd_common'},
\ {'flags': 'EX_EXTRA|EX_NOTRLCOM|EX_SBOXOK|EX_CMDWIN', 'minlen': 4, 'name': 'const', 'parser': 'parse_cmd_common'},
\ {'flags': 'EX_RANGE|EX_COUNT|EX_TRLBAR', 'minlen': 3, 'name': 'labove', 'parser': 'parse_cmd_common'},
\ {'flags': 'EX_RANGE|EX_COUNT|EX_TRLBAR', 'minlen': 3, 'name': 'lafter', 'parser': 'parse_cmd_common'},
\ {'flags': 'EX_RANGE|EX_COUNT|EX_TRLBAR', 'minlen': 3, 'name': 'lbefore', 'parser': 'parse_cmd_common'},
\ {'flags': 'EX_RANGE|EX_COUNT|EX_TRLBAR', 'minlen': 4, 'name': 'lbelow', 'parser': 'parse_cmd_common'},
\ {'flags': 'EX_TRLBAR|EX_CMDWIN', 'minlen': 7, 'name': 'redrawtabline', 'parser': 'parse_cmd_common'},
\ {'flags': 'EX_WORD1|EX_TRLBAR|EX_CMDWIN', 'minlen': 7, 'name': 'scriptversion', 'parser': 'parse_cmd_common'},
\ {'flags': 'EX_BANG|EX_FILE1|EX_TRLBAR|EX_CMDWIN', 'minlen': 2, 'name': 'tcd', 'parser': 'parse_cmd_common'},
\ {'flags': 'EX_BANG|EX_FILE1|EX_TRLBAR|EX_CMDWIN', 'minlen': 3, 'name': 'tchdir', 'parser': 'parse_cmd_common'},
\ {'flags': 'EX_RANGE|EX_ZEROR|EX_EXTRA|EX_TRLBAR|EX_NOTRLCOM|EX_CTRLV|EX_CMDWIN', 'minlen': 3, 'name': 'tlmenu', 'parser': 'parse_cmd_common'},
\ {'flags': 'EX_RANGE|EX_ZEROR|EX_EXTRA|EX_TRLBAR|EX_NOTRLCOM|EX_CTRLV|EX_CMDWIN', 'minlen': 3, 'name': 'tlnoremenu', 'parser': 'parse_cmd_common'},
\ {'flags': 'EX_RANGE|EX_ZEROR|EX_EXTRA|EX_TRLBAR|EX_NOTRLCOM|EX_CTRLV|EX_CMDWIN', 'minlen': 3, 'name': 'tlunmenu', 'parser': 'parse_cmd_common'},
\ {'flags': 'EX_EXTRA|EX_TRLBAR|EX_CMDWIN', 'minlen': 2, 'name': 'xrestore', 'parser': 'parse_cmd_common'},
\]

let s:ExprTokenizer = {}
Expand Down Expand Up @@ -2754,8 +2773,13 @@ function! s:ExprTokenizer.get2()
call r.seek_cur(1)
return self.token(s:TOKEN_COLON, ':', pos)
elseif c ==# '#'
call r.seek_cur(1)
return self.token(s:TOKEN_SHARP, '#', pos)
if r.p(1) ==# '{'
call r.seek_cur(2)
return self.token(s:TOKEN_RAWCOPEN, '#{', pos)
else
call r.seek_cur(2)
return self.token(s:TOKEN_SHARP, '#', pos)
endif
elseif c ==# '('
call r.seek_cur(1)
return self.token(s:TOKEN_POPEN, '(', pos)
Expand Down Expand Up @@ -2875,6 +2899,29 @@ function! s:ExprTokenizer.get_dstring()
return s
endfunction

function! s:ExprTokenizer.get_dict_literal_key()
call self.reader.skip_white()
let r = self.reader
let c = r.peek()
if !s:isalnum(c) && c != '_' && c != '-'
throw s:Err(printf('unexpected token: %s', token.value), token.pos)
endif
let s = c
call self.reader.seek_cur(1)
while s:TRUE
let c = self.reader.p(0)
if c ==# '<EOF>' || c ==# '<EOL>'
throw s:Err('unexpectd EOL', self.reader.getpos())
endif
if !s:isalnum(c) && c != '_' && c != '-'
break
endif
call self.reader.seek_cur(1)
let s .= c
endwhile
return s
endfunction

let s:ExprParser = {}

function! s:ExprParser.new(...)
Expand Down Expand Up @@ -3363,6 +3410,7 @@ endfunction
" 'string'
" [expr1, ...]
" {expr1: expr1, ...}
" #{literal_key1: expr1, ...}
" {args -> expr1}
" &option
" (expr1)
Expand Down Expand Up @@ -3419,7 +3467,8 @@ function! s:ExprParser.parse_expr9()
endif
endwhile
endif
elseif token.type == s:TOKEN_COPEN
elseif token.type == s:TOKEN_COPEN || token.type == s:TOKEN_RAWCOPEN
let is_rawdict = token.type == s:TOKEN_RAWCOPEN
let savepos = self.reader.tell()
let nodepos = token.pos
let token = self.tokenizer.get()
Expand Down Expand Up @@ -3507,7 +3556,7 @@ function! s:ExprParser.parse_expr9()
return node
endif
while 1
let key = self.parse_expr1()
let key = is_rawdict ? self.parse_dict_literal_key() : self.parse_expr1()
let token = self.tokenizer.get()
if token.type == s:TOKEN_CCLOSE
if !empty(node.value)
Expand Down Expand Up @@ -3572,6 +3621,13 @@ function! s:ExprParser.parse_expr9()
return node
endfunction

function! s:ExprParser.parse_dict_literal_key()
let node = s:Node(s:NODE_STRING)
let node.pos = self.reader.tell()
let node.value = "'" . self.tokenizer.get_dict_literal_key() . "'"
return node
endfunction

" SUBSCRIPT or CONCAT
" dict "." [0-9A-Za-z_]+ => (subscript dict key)
" str "." expr6 => (concat str expr6)
Expand Down
2 changes: 1 addition & 1 deletion js/vimlparser.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion py/vimlparser.py

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion scripts/update_builtin_commands.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@ fi
vim -u NONE -i NONE -n -N -e -s \
--cmd "let &rtp .= ',' . getcwd()" \
--cmd "source scripts/update_builtin_commands.vim" \
--cmd "call g:VimLParserNewCmds('$1')" \
--cmd "call VimLParserNewCmds('$1')" \
--cmd "qall!"
echo
8 changes: 4 additions & 4 deletions scripts/update_builtin_commands.vim
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ function! s:gen(ex_cmds_h) abort

let cumname = ''
for [i, line] in map(copy(lines), {i, l -> [i, l]})
if line =~# '^EX('
if line =~# '^EXCMD('
let name = matchstr(line, '"\zs.*\ze",')
let flags = matchstr(lines[i+1], '\t\+\zs.*\ze,$')

Expand All @@ -94,7 +94,7 @@ function! s:gen(ex_cmds_h) abort
\ 'flags': flags,
\ 'minlen': minlen,
\ }
let cmds = add(cmds, cmd)
call add(cmds, cmd)
endif
endfor
return cmds
Expand Down Expand Up @@ -123,12 +123,12 @@ endfunction
" -- main

" ex_cmds_h: path to vim/src/ex_cmds.h
function! g:VimLParserNewCmds(ex_cmds_h) abort
function! VimLParserNewCmds(ex_cmds_h) abort
let vimlparser = vimlparser#import()
let latest = s:gen(a:ex_cmds_h)
let new_cmds = s:gen_new_builtin(vimlparser#import().VimLParser.builtin_commands, latest)
let generated_text = s:gen_viml(new_cmds)
if generated_text == ''
if generated_text ==# ''
verbose echo 's:VimLParser.builtin_commands in autoload/vimlparser.vim is up-to-date.'
else
verbose echo "Append following lines to s:VimLParser.builtin_commands in autoload/vimlparser.vim\n"
Expand Down