@@ -205,6 +205,7 @@ let s:TOKEN_DOTDOTDOT = 63
205
205
let s: TOKEN_SHARP = 64
206
206
let s: TOKEN_ARROW = 65
207
207
let s: TOKEN_BLOB = 66
208
+ let s: TOKEN_DOTDOT = 67
208
209
209
210
let s: MAX_FUNC_ARGS = 20
210
211
@@ -2731,9 +2732,12 @@ function! s:ExprTokenizer.get2()
2731
2732
if r .p (1 ) == # ' .' && r .p (2 ) == # ' .'
2732
2733
call r .seek_cur (3 )
2733
2734
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?
2734
2738
else
2735
2739
call r .seek_cur (1 )
2736
- return self .token (s: TOKEN_DOT , ' .' , pos)
2740
+ return self .token (s: TOKEN_DOT , ' .' , pos) " TODO check scriptversion?
2737
2741
endif
2738
2742
elseif c == # ' *'
2739
2743
call r .seek_cur (1 )
@@ -3162,6 +3166,7 @@ endfunction
3162
3166
" expr5: expr6 + expr6 ..
3163
3167
" expr6 - expr6 ..
3164
3168
" expr6 . expr6 ..
3169
+ " expr6 .. expr6 ..
3165
3170
function ! s: ExprParser .parse_expr5 ()
3166
3171
let left = self .parse_expr6 ()
3167
3172
while s: TRUE
@@ -3179,7 +3184,13 @@ function! s:ExprParser.parse_expr5()
3179
3184
let node.left = left
3180
3185
let node.right = self .parse_expr6 ()
3181
3186
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?
3183
3194
let node = s: Node (s: NODE_CONCAT )
3184
3195
let node.pos = token.pos
3185
3196
let node.left = left
@@ -3342,7 +3353,7 @@ function! s:ExprParser.parse_expr8()
3342
3353
endif
3343
3354
let left = node
3344
3355
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?
3346
3357
let node = self .parse_dot (token, left )
3347
3358
if node is s: NIL
3348
3359
call self .reader.seek_set (pos)
@@ -3598,6 +3609,31 @@ function! s:ExprParser.parse_dot(token, left)
3598
3609
return node
3599
3610
endfunction
3600
3611
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
+
3601
3637
function ! s: ExprParser .parse_identifier ()
3602
3638
call self .reader.skip_white ()
3603
3639
let npos = self .reader.getpos ()
0 commit comments