Skip to content

Commit cd75985

Browse files
author
Kuniwak
committed
Add CURLYNAMEEXPR
1 parent f22b6bc commit cd75985

File tree

1 file changed

+23
-18
lines changed

1 file changed

+23
-18
lines changed

autoload/vimlparser.vim

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ let s:NODE_CURLYNAME = 87
128128
let s:NODE_ENV = 88
129129
let s:NODE_REG = 89
130130
let s:NODE_CURLYNAMEPART = 90
131+
let s:NODE_CURLYNAMEEXPR = 91
131132

132133
let s:TOKEN_EOF = 1
133134
let s:TOKEN_EOL = 2
@@ -390,6 +391,8 @@ endfunction
390391
" CURLYNAME .value
391392
" ENV .value
392393
" REG .value
394+
" CURLYNAMEPART .value
395+
" CURLYNAMEEXPR .value
393396
function! s:Node(type)
394397
return {'type': a:type}
395398
endfunction
@@ -3265,8 +3268,7 @@ function! s:ExprParser.parse_identifier()
32653268
if c ==# '<' && self.reader.peekn(5) ==? '<SID>'
32663269
let name = self.reader.getn(5)
32673270
let node_1 = s:Node(s:NODE_CURLYNAMEPART)
3268-
let node_1.curly = 0
3269-
let node_1.pos = npos
3271+
let node_1.pos = self.reader.getpos()
32703272
let node_1.value = name
32713273
call add(id, node_1)
32723274
endif
@@ -3275,29 +3277,28 @@ function! s:ExprParser.parse_identifier()
32753277
if s:isnamec(c)
32763278
let name = self.reader.read_name()
32773279
let node_2 = s:Node(s:NODE_CURLYNAMEPART)
3278-
let node_2.curly = 0
3279-
let node_2.pos = npos
3280+
let node_2.pos = self.reader.getpos()
32803281
let node_2.value = name
32813282
call add(id, node_2)
32823283
elseif c ==# '{'
32833284
call self.reader.get()
3285+
let pos_3 = self.reader.getpos()
32843286
let node = self.parse_expr1()
32853287
call self.reader.skip_white()
32863288
let c = self.reader.p(0)
32873289
if c !=# '}'
32883290
throw s:Err(printf('unexpected token: %s', c), self.reader.getpos())
32893291
endif
32903292
call self.reader.seek_cur(1)
3291-
let node_3 = s:Node(s:NODE_CURLYNAMEPART)
3292-
let node_3.curly = 1
3293-
let node_3.pos = npos
3294-
let node_3.value = id[0].value
3293+
let node_3 = s:Node(s:NODE_CURLYNAMEEXPR)
3294+
let node_3.pos = pos_3
3295+
let node_3.value = node
32953296
call add(id, node_3)
32963297
else
32973298
break
32983299
endif
32993300
endwhile
3300-
if len(id) == 1 && id[0].curly == 0
3301+
if len(id) == 1 && id[0].type == s:NODE_CURLYNAMEPART
33013302
let node = s:Node(s:NODE_IDENTIFIER)
33023303
let node.pos = npos
33033304
let node.value = id[0].value
@@ -3851,6 +3852,10 @@ function! s:Compiler.compile(node)
38513852
return self.compile_env(a:node)
38523853
elseif a:node.type == s:NODE_REG
38533854
return self.compile_reg(a:node)
3855+
elseif a:node.type == s:NODE_CURLYNAMEPART
3856+
return self.compile_curlynamepart(a:node)
3857+
elseif a:node.type == s:NODE_CURLYNAMEEXPR
3858+
return self.compile_curlynameexpr(a:node)
38543859
else
38553860
throw printf('Compiler: unknown node: %s', string(a:node))
38563861
endif
@@ -4287,15 +4292,7 @@ function! s:Compiler.compile_identifier(node)
42874292
endfunction
42884293

42894294
function! s:Compiler.compile_curlyname(node)
4290-
let name = ''
4291-
for x in a:node.value
4292-
if x.curly
4293-
let name .= '{' . self.compile(x.value) . '}'
4294-
else
4295-
let name .= x.value
4296-
endif
4297-
endfor
4298-
return name
4295+
return join(map(a:node.value, 'self.compile(v:val)'), '')
42994296
endfunction
43004297

43014298
function! s:Compiler.compile_env(node)
@@ -4306,6 +4303,14 @@ function! s:Compiler.compile_reg(node)
43064303
return a:node.value
43074304
endfunction
43084305

4306+
function! s:Compiler.compile_curlynamepart(node)
4307+
return a:node.value
4308+
endfunction
4309+
4310+
function! s:Compiler.compile_curlynameexpr(node)
4311+
return '{' . self.compile(a:node.value) . '}'
4312+
endfunction
4313+
43094314
" TODO: under construction
43104315
let s:RegexpParser = {}
43114316

0 commit comments

Comments
 (0)