Skip to content

Commit b2f91e6

Browse files
committed
implement #{ ... } syntax
1 parent cc94f66 commit b2f91e6

File tree

3 files changed

+58
-4
lines changed

3 files changed

+58
-4
lines changed

autoload/vimlparser.vim

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ let s:TOKEN_DOTDOTDOT = 63
205205
let s:TOKEN_SHARP = 64
206206
let s:TOKEN_ARROW = 65
207207
let s:TOKEN_BLOB = 66
208+
let s:TOKEN_RAWCOPEN = 67
208209

209210
let s:MAX_FUNC_ARGS = 20
210211

@@ -2754,8 +2755,13 @@ function! s:ExprTokenizer.get2()
27542755
call r.seek_cur(1)
27552756
return self.token(s:TOKEN_COLON, ':', pos)
27562757
elseif c ==# '#'
2757-
call r.seek_cur(1)
2758-
return self.token(s:TOKEN_SHARP, '#', pos)
2758+
if r.p(1) ==# '{'
2759+
call r.seek_cur(2)
2760+
return self.token(s:TOKEN_RAWCOPEN, '#{', pos)
2761+
else
2762+
call r.seek_cur(2)
2763+
return self.token(s:TOKEN_SHARP, '#', pos)
2764+
endif
27592765
elseif c ==# '('
27602766
call r.seek_cur(1)
27612767
return self.token(s:TOKEN_POPEN, '(', pos)
@@ -2875,6 +2881,29 @@ function! s:ExprTokenizer.get_dstring()
28752881
return s
28762882
endfunction
28772883

2884+
function! s:ExprTokenizer.get_dict_literal_key()
2885+
call self.reader.skip_white()
2886+
let r = self.reader
2887+
let c = r.peek()
2888+
if !s:isalnum(c) && c != '_' && c != '-'
2889+
throw s:Err(printf('unexpected token: %s', token.value), token.pos)
2890+
endif
2891+
let s = c
2892+
call self.reader.seek_cur(1)
2893+
while s:TRUE
2894+
let c = self.reader.p(0)
2895+
if c ==# '<EOF>' || c ==# '<EOL>'
2896+
throw s:Err('unexpectd EOL', self.reader.getpos())
2897+
endif
2898+
if !s:isalnum(c) && c != '_' && c != '-'
2899+
break
2900+
endif
2901+
call self.reader.seek_cur(1)
2902+
let s .= c
2903+
endwhile
2904+
return s
2905+
endfunction
2906+
28782907
let s:ExprParser = {}
28792908

28802909
function! s:ExprParser.new(...)
@@ -3363,6 +3392,7 @@ endfunction
33633392
" 'string'
33643393
" [expr1, ...]
33653394
" {expr1: expr1, ...}
3395+
" #{literal_key1: expr1, ...}
33663396
" {args -> expr1}
33673397
" &option
33683398
" (expr1)
@@ -3419,7 +3449,8 @@ function! s:ExprParser.parse_expr9()
34193449
endif
34203450
endwhile
34213451
endif
3422-
elseif token.type == s:TOKEN_COPEN
3452+
elseif token.type == s:TOKEN_COPEN || token.type == s:TOKEN_RAWCOPEN
3453+
let is_rawdict = token.type == s:TOKEN_RAWCOPEN
34233454
let savepos = self.reader.tell()
34243455
let nodepos = token.pos
34253456
let token = self.tokenizer.get()
@@ -3507,7 +3538,7 @@ function! s:ExprParser.parse_expr9()
35073538
return node
35083539
endif
35093540
while 1
3510-
let key = self.parse_expr1()
3541+
let key = is_rawdict ? self.parse_dict_literal_key() : self.parse_expr1()
35113542
let token = self.tokenizer.get()
35123543
if token.type == s:TOKEN_CCLOSE
35133544
if !empty(node.value)
@@ -3572,6 +3603,13 @@ function! s:ExprParser.parse_expr9()
35723603
return node
35733604
endfunction
35743605

3606+
function! s:ExprParser.parse_dict_literal_key()
3607+
let node = s:Node(s:NODE_STRING)
3608+
let node.pos = self.reader.tell()
3609+
let node.value = "'" . self.tokenizer.get_dict_literal_key() . "'"
3610+
return node
3611+
endfunction
3612+
35753613
" SUBSCRIPT or CONCAT
35763614
" dict "." [0-9A-Za-z_]+ => (subscript dict key)
35773615
" str "." expr6 => (concat str expr6)

test/test_rawdict.ok

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
(echo (dict))
2+
(echo (dict ('foo-bar' 42)))
3+
(echo (dict ('foo-' 42)))
4+
(echo (dict ('-bar' 42)))
5+
(echo (dict ('1-1' 0)))
6+
(echo (dict ('one' 1) ('two2' 2) ('3three' 3) ('44' 4)))
7+
(echo (dict ('x' (dict))))
8+
(echo (list (dict)))

test/test_rawdict.vim

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
echo #{}
2+
echo #{foo-bar: 42}
3+
echo #{foo-: 42}
4+
echo #{-bar: 42}
5+
echo #{1-1:0}
6+
echo #{one: 1, two2: 2, 3three: 3, 44: 4}
7+
echo #{x : {},}
8+
echo [#{},]

0 commit comments

Comments
 (0)