@@ -11,8 +11,8 @@ func (self *VimLParser) Parse(reader *StringReader, filename string) ast.Node {
1111 return newAstNode (self .parse (reader ), filename )
1212}
1313
14- func (self * ExprParser ) Parse () ast.Node {
15- return newAstNode (self .parse (), "" )
14+ func (self * ExprParser ) Parse () ast.Expr {
15+ return newExprNode (self .parse (), "" )
1616}
1717
1818// ----
@@ -65,7 +65,7 @@ func newAstNode(n *VimNode, filename string) ast.Node {
6565 Func : pos ,
6666 ExArg : newExArg (* n .ea , filename ),
6767 Body : newBody (* n , filename ),
68- Name : newAstNode (n .left , filename ),
68+ Name : newExprNode (n .left , filename ),
6969 Params : newIdents (* n , filename ),
7070 Attr : attr ,
7171 EndFunction : newAstNode (n .endfunction , filename ).(* ast.EndFunction ),
@@ -81,14 +81,14 @@ func newAstNode(n *VimNode, filename string) ast.Node {
8181 return & ast.DelFunction {
8282 DelFunc : pos ,
8383 ExArg : newExArg (* n .ea , filename ),
84- Name : newAstNode (n .left , filename ),
84+ Name : newExprNode (n .left , filename ),
8585 }
8686
8787 case NODE_RETURN :
8888 return & ast.Return {
8989 Return : pos ,
9090 ExArg : newExArg (* n .ea , filename ),
91- Result : newAstNode (n .left , filename ),
91+ Result : newExprNode (n .left , filename ),
9292 }
9393
9494 case NODE_EXCALL :
@@ -103,10 +103,10 @@ func newAstNode(n *VimNode, filename string) ast.Node {
103103 Let : pos ,
104104 ExArg : newExArg (* n .ea , filename ),
105105 Op : n .op ,
106- Left : newAstNode (n .left , filename ),
106+ Left : newExprNode (n .left , filename ),
107107 List : newList (* n , filename ),
108- Rest : newAstNode (n .rest , filename ),
109- Right : newAstNode (n .right , filename ),
108+ Rest : newExprNode (n .rest , filename ),
109+ Right : newExprNode (n .right , filename ),
110110 }
111111
112112 case NODE_UNLET :
@@ -150,7 +150,7 @@ func newAstNode(n *VimNode, filename string) ast.Node {
150150 If : pos ,
151151 ExArg : newExArg (* n .ea , filename ),
152152 Body : newBody (* n , filename ),
153- Condition : newAstNode (n .cond , filename ),
153+ Condition : newExprNode (n .cond , filename ),
154154 ElseIf : elifs ,
155155 Else : els ,
156156 EndIf : newAstNode (n .endif , filename ).(* ast.EndIf ),
@@ -161,7 +161,7 @@ func newAstNode(n *VimNode, filename string) ast.Node {
161161 ElseIf : pos ,
162162 ExArg : newExArg (* n .ea , filename ),
163163 Body : newBody (* n , filename ),
164- Condition : newAstNode (n .cond , filename ),
164+ Condition : newExprNode (n .cond , filename ),
165165 }
166166
167167 case NODE_ELSE :
@@ -182,7 +182,7 @@ func newAstNode(n *VimNode, filename string) ast.Node {
182182 While : pos ,
183183 ExArg : newExArg (* n .ea , filename ),
184184 Body : newBody (* n , filename ),
185- Condition : newAstNode (n .cond , filename ),
185+ Condition : newExprNode (n .cond , filename ),
186186 EndWhile : newAstNode (n .endwhile , filename ).(* ast.EndWhile ),
187187 }
188188
@@ -197,10 +197,10 @@ func newAstNode(n *VimNode, filename string) ast.Node {
197197 For : pos ,
198198 ExArg : newExArg (* n .ea , filename ),
199199 Body : newBody (* n , filename ),
200- Left : newAstNode (n .left , filename ),
200+ Left : newExprNode (n .left , filename ),
201201 List : newList (* n , filename ),
202- Rest : newAstNode (n .rest , filename ),
203- Right : newAstNode (n .right , filename ),
202+ Rest : newExprNode (n .rest , filename ),
203+ Right : newExprNode (n .right , filename ),
204204 EndFor : newAstNode (n .endfor , filename ).(* ast.EndFor ),
205205 }
206206
@@ -270,7 +270,7 @@ func newAstNode(n *VimNode, filename string) ast.Node {
270270 return & ast.Throw {
271271 Throw : pos ,
272272 ExArg : newExArg (* n .ea , filename ),
273- Expr : newAstNode (n .left , filename ),
273+ Expr : newExprNode (n .left , filename ),
274274 }
275275
276276 case NODE_ECHO , NODE_ECHON , NODE_ECHOMSG , NODE_ECHOERR :
@@ -298,9 +298,9 @@ func newAstNode(n *VimNode, filename string) ast.Node {
298298 case NODE_TERNARY :
299299 return & ast.TernaryExpr {
300300 Ternary : pos ,
301- Condition : newAstNode (n .cond , filename ),
302- Left : newAstNode (n .left , filename ),
303- Right : newAstNode (n .right , filename ),
301+ Condition : newExprNode (n .cond , filename ),
302+ Left : newExprNode (n .left , filename ),
303+ Right : newExprNode (n .right , filename ),
304304 }
305305
306306 case NODE_OR , NODE_AND , NODE_EQUAL , NODE_EQUALCI , NODE_EQUALCS ,
@@ -313,44 +313,44 @@ func newAstNode(n *VimNode, filename string) ast.Node {
313313 NODE_ISNOTCI , NODE_ISNOTCS , NODE_ADD , NODE_SUBTRACT , NODE_CONCAT ,
314314 NODE_MULTIPLY , NODE_DIVIDE , NODE_REMAINDER :
315315 return & ast.BinaryExpr {
316- Left : newAstNode (n .left , filename ),
316+ Left : newExprNode (n .left , filename ),
317317 OpPos : pos ,
318318 Op : opToken (n .type_ ),
319- Right : newAstNode (n .right , filename ),
319+ Right : newExprNode (n .right , filename ),
320320 }
321321
322322 case NODE_NOT , NODE_MINUS , NODE_PLUS :
323323 return & ast.UnaryExpr {
324324 OpPos : pos ,
325325 Op : opToken (n .type_ ),
326- X : newAstNode (n .left , filename ),
326+ X : newExprNode (n .left , filename ),
327327 }
328328
329329 case NODE_SUBSCRIPT :
330330 return & ast.SubscriptExpr {
331331 Lbrack : pos ,
332- Left : newAstNode (n .left , filename ),
333- Right : newAstNode (n .right , filename ),
332+ Left : newExprNode (n .left , filename ),
333+ Right : newExprNode (n .right , filename ),
334334 }
335335
336336 case NODE_SLICE :
337337 return & ast.SliceExpr {
338338 Lbrack : pos ,
339- X : newAstNode (n .left , filename ),
340- Low : newAstNode (n .rlist [0 ], filename ),
341- High : newAstNode (n .rlist [1 ], filename ),
339+ X : newExprNode (n .left , filename ),
340+ Low : newExprNode (n .rlist [0 ], filename ),
341+ High : newExprNode (n .rlist [1 ], filename ),
342342 }
343343
344344 case NODE_CALL :
345345 return & ast.CallExpr {
346346 Lparen : pos ,
347- Fun : newAstNode (n .left , filename ),
347+ Fun : newExprNode (n .left , filename ),
348348 Args : newRlist (* n , filename ),
349349 }
350350
351351 case NODE_DOT :
352352 return & ast.DotExpr {
353- Left : newAstNode (n .left , filename ),
353+ Left : newExprNode (n .left , filename ),
354354 Dot : pos ,
355355 Right : newAstNode (n .right , filename ).(* ast.Ident ),
356356 }
@@ -378,8 +378,8 @@ func newAstNode(n *VimNode, filename string) ast.Node {
378378 kvs := make ([]ast.KeyValue , 0 , len (entries ))
379379 for _ , nn := range entries {
380380 kv := nn .([]interface {})
381- k := newAstNode (kv [0 ].(* VimNode ), filename )
382- v := newAstNode (kv [1 ].(* VimNode ), filename )
381+ k := newExprNode (kv [0 ].(* VimNode ), filename )
382+ v := newExprNode (kv [1 ].(* VimNode ), filename )
383383 kvs = append (kvs , ast.KeyValue {Key : k , Value : v })
384384 }
385385 return & ast.Dict {
@@ -434,20 +434,25 @@ func newAstNode(n *VimNode, filename string) ast.Node {
434434 n := n .value .(* VimNode )
435435 return & ast.CurlyNameExpr {
436436 CurlyNameExpr : pos ,
437- Value : newAstNode (n , filename ),
437+ Value : newExprNode (n , filename ),
438438 }
439439
440440 case NODE_LAMBDA :
441441 return & ast.LambdaExpr {
442442 Lcurlybrace : pos ,
443443 Params : newIdents (* n , filename ),
444- Expr : newAstNode (n .left , filename ),
444+ Expr : newExprNode (n .left , filename ),
445445 }
446446
447447 }
448448 panic (fmt .Errorf ("Unknown node type: %v, node: %v" , n .type_ , n ))
449449}
450450
451+ func newExprNode (n * VimNode , filename string ) ast.Expr {
452+ node , _ := newAstNode (n , filename ).(ast.Expr )
453+ return node
454+ }
455+
451456func newPos (p * pos , filename string ) * ast.Pos {
452457 if p == nil {
453458 return nil
@@ -508,7 +513,7 @@ func newBody(n VimNode, filename string) []ast.Statement {
508513 }
509514 for _ , node := range n .body {
510515 if node != nil { // conservative
511- body = append (body , newAstNode (node , filename ))
516+ body = append (body , newAstNode (node , filename ).(ast. Statement ) )
512517 }
513518 }
514519 return body
@@ -534,7 +539,7 @@ func newRlist(n VimNode, filename string) []ast.Expr {
534539 }
535540 for _ , node := range n .rlist {
536541 if node != nil { // conservative
537- exprs = append (exprs , newAstNode (node , filename ))
542+ exprs = append (exprs , newExprNode (node , filename ))
538543 }
539544 }
540545 return exprs
@@ -547,7 +552,7 @@ func newList(n VimNode, filename string) []ast.Expr {
547552 }
548553 for _ , node := range n .list {
549554 if node != nil { // conservative
550- list = append (list , newAstNode (node , filename ))
555+ list = append (list , newExprNode (node , filename ))
551556 }
552557 }
553558 return list
@@ -557,7 +562,7 @@ func newValues(n VimNode, filename string) []ast.Expr {
557562 var values []ast.Expr
558563 for _ , v := range n .value .([]interface {}) {
559564 n := v .(* VimNode )
560- values = append (values , newAstNode (n , filename ))
565+ values = append (values , newExprNode (n , filename ))
561566 }
562567 return values
563568}
0 commit comments