Skip to content

Commit 0ba484b

Browse files
committed
dot dot
1 parent 19cda80 commit 0ba484b

File tree

1 file changed

+39
-3
lines changed

1 file changed

+39
-3
lines changed

autoload/vimlparser.vim

Lines changed: 39 additions & 3 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_DOTDOT = 67
208209

209210
let s:MAX_FUNC_ARGS = 20
210211

@@ -2731,9 +2732,12 @@ function! s:ExprTokenizer.get2()
27312732
if r.p(1) ==# '.' && r.p(2) ==# '.'
27322733
call r.seek_cur(3)
27332734
return self.token(s:TOKEN_DOTDOTDOT, '...', pos)
2735+
elseif r.p(1) ==# '.'
2736+
call r.seek_cur(2)
2737+
return self.token(s:TOKEN_DOTDOT, '..', pos) " TODO check scriptversion?
27342738
else
27352739
call r.seek_cur(1)
2736-
return self.token(s:TOKEN_DOT, '.', pos)
2740+
return self.token(s:TOKEN_DOT, '.', pos) " TODO check scriptversion?
27372741
endif
27382742
elseif c ==# '*'
27392743
call r.seek_cur(1)
@@ -3162,6 +3166,7 @@ endfunction
31623166
" expr5: expr6 + expr6 ..
31633167
" expr6 - expr6 ..
31643168
" expr6 . expr6 ..
3169+
" expr6 .. expr6 ..
31653170
function! s:ExprParser.parse_expr5()
31663171
let left = self.parse_expr6()
31673172
while s:TRUE
@@ -3179,7 +3184,13 @@ function! s:ExprParser.parse_expr5()
31793184
let node.left = left
31803185
let node.right = self.parse_expr6()
31813186
let left = node
3182-
elseif token.type == s:TOKEN_DOT
3187+
elseif token.type == s:TOKEN_DOTDOT " TODO check scriptversion?
3188+
let node = s:Node(s:NODE_CONCAT)
3189+
let node.pos = token.pos
3190+
let node.left = left
3191+
let node.right = self.parse_expr6()
3192+
let left = node
3193+
elseif token.type == s:TOKEN_DOT " TODO check scriptversion?
31833194
let node = s:Node(s:NODE_CONCAT)
31843195
let node.pos = token.pos
31853196
let node.left = left
@@ -3342,7 +3353,7 @@ function! s:ExprParser.parse_expr8()
33423353
endif
33433354
let left = node
33443355
unlet node
3345-
elseif !s:iswhite(c) && token.type == s:TOKEN_DOT
3356+
elseif !s:iswhite(c) && token.type == s:TOKEN_DOT " TODO check scriptversion?
33463357
let node = self.parse_dot(token, left)
33473358
if node is s:NIL
33483359
call self.reader.seek_set(pos)
@@ -3598,6 +3609,31 @@ function! s:ExprParser.parse_dot(token, left)
35983609
return node
35993610
endfunction
36003611

3612+
" CONCAT
3613+
" str ".." expr6 => (concat str expr6)
3614+
function! s:ExprParser.parse_concat(token, left)
3615+
if a:left.type != s:NODE_IDENTIFIER && a:left.type != s:NODE_CURLYNAME && a:left.type != s:NODE_DICT && a:left.type != s:NODE_SUBSCRIPT && a:left.type != s:NODE_CALL && a:left.type != s:NODE_DOT
3616+
return s:NIL
3617+
endif
3618+
if !s:iswordc(self.reader.p(0))
3619+
return s:NIL
3620+
endif
3621+
let pos = self.reader.getpos()
3622+
let name = self.reader.read_word()
3623+
if s:isnamec(self.reader.p(0))
3624+
" XXX: foo is str => ok, foo is obj => invalid expression
3625+
" foo.s:bar or foo.bar#baz
3626+
return s:NIL
3627+
endif
3628+
let node = s:Node(s:NODE_CONCAT)
3629+
let node.pos = a:token.pos
3630+
let node.left = a:left
3631+
let node.right = s:Node(s:NODE_IDENTIFIER)
3632+
let node.right.pos = pos
3633+
let node.right.value = name
3634+
return node
3635+
endfunction
3636+
36013637
function! s:ExprParser.parse_identifier()
36023638
call self.reader.skip_white()
36033639
let npos = self.reader.getpos()

0 commit comments

Comments
 (0)