@@ -11,8 +11,8 @@ func (self *VimLParser) Parse(reader *StringReader, filename string) ast.Node {
11
11
return newAstNode (self .parse (reader ), filename )
12
12
}
13
13
14
- func (self * ExprParser ) Parse () ast.Node {
15
- return newAstNode (self .parse (), "" )
14
+ func (self * ExprParser ) Parse () ast.Expr {
15
+ return newExprNode (self .parse (), "" )
16
16
}
17
17
18
18
// ----
@@ -65,7 +65,7 @@ func newAstNode(n *VimNode, filename string) ast.Node {
65
65
Func : pos ,
66
66
ExArg : newExArg (* n .ea , filename ),
67
67
Body : newBody (* n , filename ),
68
- Name : newAstNode (n .left , filename ),
68
+ Name : newExprNode (n .left , filename ),
69
69
Params : newIdents (* n , filename ),
70
70
Attr : attr ,
71
71
EndFunction : newAstNode (n .endfunction , filename ).(* ast.EndFunction ),
@@ -81,14 +81,14 @@ func newAstNode(n *VimNode, filename string) ast.Node {
81
81
return & ast.DelFunction {
82
82
DelFunc : pos ,
83
83
ExArg : newExArg (* n .ea , filename ),
84
- Name : newAstNode (n .left , filename ),
84
+ Name : newExprNode (n .left , filename ),
85
85
}
86
86
87
87
case NODE_RETURN :
88
88
return & ast.Return {
89
89
Return : pos ,
90
90
ExArg : newExArg (* n .ea , filename ),
91
- Result : newAstNode (n .left , filename ),
91
+ Result : newExprNode (n .left , filename ),
92
92
}
93
93
94
94
case NODE_EXCALL :
@@ -103,10 +103,10 @@ func newAstNode(n *VimNode, filename string) ast.Node {
103
103
Let : pos ,
104
104
ExArg : newExArg (* n .ea , filename ),
105
105
Op : n .op ,
106
- Left : newAstNode (n .left , filename ),
106
+ Left : newExprNode (n .left , filename ),
107
107
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 ),
110
110
}
111
111
112
112
case NODE_UNLET :
@@ -150,7 +150,7 @@ func newAstNode(n *VimNode, filename string) ast.Node {
150
150
If : pos ,
151
151
ExArg : newExArg (* n .ea , filename ),
152
152
Body : newBody (* n , filename ),
153
- Condition : newAstNode (n .cond , filename ),
153
+ Condition : newExprNode (n .cond , filename ),
154
154
ElseIf : elifs ,
155
155
Else : els ,
156
156
EndIf : newAstNode (n .endif , filename ).(* ast.EndIf ),
@@ -161,7 +161,7 @@ func newAstNode(n *VimNode, filename string) ast.Node {
161
161
ElseIf : pos ,
162
162
ExArg : newExArg (* n .ea , filename ),
163
163
Body : newBody (* n , filename ),
164
- Condition : newAstNode (n .cond , filename ),
164
+ Condition : newExprNode (n .cond , filename ),
165
165
}
166
166
167
167
case NODE_ELSE :
@@ -182,7 +182,7 @@ func newAstNode(n *VimNode, filename string) ast.Node {
182
182
While : pos ,
183
183
ExArg : newExArg (* n .ea , filename ),
184
184
Body : newBody (* n , filename ),
185
- Condition : newAstNode (n .cond , filename ),
185
+ Condition : newExprNode (n .cond , filename ),
186
186
EndWhile : newAstNode (n .endwhile , filename ).(* ast.EndWhile ),
187
187
}
188
188
@@ -197,10 +197,10 @@ func newAstNode(n *VimNode, filename string) ast.Node {
197
197
For : pos ,
198
198
ExArg : newExArg (* n .ea , filename ),
199
199
Body : newBody (* n , filename ),
200
- Left : newAstNode (n .left , filename ),
200
+ Left : newExprNode (n .left , filename ),
201
201
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 ),
204
204
EndFor : newAstNode (n .endfor , filename ).(* ast.EndFor ),
205
205
}
206
206
@@ -270,7 +270,7 @@ func newAstNode(n *VimNode, filename string) ast.Node {
270
270
return & ast.Throw {
271
271
Throw : pos ,
272
272
ExArg : newExArg (* n .ea , filename ),
273
- Expr : newAstNode (n .left , filename ),
273
+ Expr : newExprNode (n .left , filename ),
274
274
}
275
275
276
276
case NODE_ECHO , NODE_ECHON , NODE_ECHOMSG , NODE_ECHOERR :
@@ -298,9 +298,9 @@ func newAstNode(n *VimNode, filename string) ast.Node {
298
298
case NODE_TERNARY :
299
299
return & ast.TernaryExpr {
300
300
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 ),
304
304
}
305
305
306
306
case NODE_OR , NODE_AND , NODE_EQUAL , NODE_EQUALCI , NODE_EQUALCS ,
@@ -313,44 +313,44 @@ func newAstNode(n *VimNode, filename string) ast.Node {
313
313
NODE_ISNOTCI , NODE_ISNOTCS , NODE_ADD , NODE_SUBTRACT , NODE_CONCAT ,
314
314
NODE_MULTIPLY , NODE_DIVIDE , NODE_REMAINDER :
315
315
return & ast.BinaryExpr {
316
- Left : newAstNode (n .left , filename ),
316
+ Left : newExprNode (n .left , filename ),
317
317
OpPos : pos ,
318
318
Op : opToken (n .type_ ),
319
- Right : newAstNode (n .right , filename ),
319
+ Right : newExprNode (n .right , filename ),
320
320
}
321
321
322
322
case NODE_NOT , NODE_MINUS , NODE_PLUS :
323
323
return & ast.UnaryExpr {
324
324
OpPos : pos ,
325
325
Op : opToken (n .type_ ),
326
- X : newAstNode (n .left , filename ),
326
+ X : newExprNode (n .left , filename ),
327
327
}
328
328
329
329
case NODE_SUBSCRIPT :
330
330
return & ast.SubscriptExpr {
331
331
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 ),
334
334
}
335
335
336
336
case NODE_SLICE :
337
337
return & ast.SliceExpr {
338
338
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 ),
342
342
}
343
343
344
344
case NODE_CALL :
345
345
return & ast.CallExpr {
346
346
Lparen : pos ,
347
- Fun : newAstNode (n .left , filename ),
347
+ Fun : newExprNode (n .left , filename ),
348
348
Args : newRlist (* n , filename ),
349
349
}
350
350
351
351
case NODE_DOT :
352
352
return & ast.DotExpr {
353
- Left : newAstNode (n .left , filename ),
353
+ Left : newExprNode (n .left , filename ),
354
354
Dot : pos ,
355
355
Right : newAstNode (n .right , filename ).(* ast.Ident ),
356
356
}
@@ -378,8 +378,8 @@ func newAstNode(n *VimNode, filename string) ast.Node {
378
378
kvs := make ([]ast.KeyValue , 0 , len (entries ))
379
379
for _ , nn := range entries {
380
380
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 )
383
383
kvs = append (kvs , ast.KeyValue {Key : k , Value : v })
384
384
}
385
385
return & ast.Dict {
@@ -434,20 +434,25 @@ func newAstNode(n *VimNode, filename string) ast.Node {
434
434
n := n .value .(* VimNode )
435
435
return & ast.CurlyNameExpr {
436
436
CurlyNameExpr : pos ,
437
- Value : newAstNode (n , filename ),
437
+ Value : newExprNode (n , filename ),
438
438
}
439
439
440
440
case NODE_LAMBDA :
441
441
return & ast.LambdaExpr {
442
442
Lcurlybrace : pos ,
443
443
Params : newIdents (* n , filename ),
444
- Expr : newAstNode (n .left , filename ),
444
+ Expr : newExprNode (n .left , filename ),
445
445
}
446
446
447
447
}
448
448
panic (fmt .Errorf ("Unknown node type: %v, node: %v" , n .type_ , n ))
449
449
}
450
450
451
+ func newExprNode (n * VimNode , filename string ) ast.Expr {
452
+ node , _ := newAstNode (n , filename ).(ast.Expr )
453
+ return node
454
+ }
455
+
451
456
func newPos (p * pos , filename string ) * ast.Pos {
452
457
if p == nil {
453
458
return nil
@@ -508,7 +513,7 @@ func newBody(n VimNode, filename string) []ast.Statement {
508
513
}
509
514
for _ , node := range n .body {
510
515
if node != nil { // conservative
511
- body = append (body , newAstNode (node , filename ))
516
+ body = append (body , newAstNode (node , filename ).(ast. Statement ) )
512
517
}
513
518
}
514
519
return body
@@ -534,7 +539,7 @@ func newRlist(n VimNode, filename string) []ast.Expr {
534
539
}
535
540
for _ , node := range n .rlist {
536
541
if node != nil { // conservative
537
- exprs = append (exprs , newAstNode (node , filename ))
542
+ exprs = append (exprs , newExprNode (node , filename ))
538
543
}
539
544
}
540
545
return exprs
@@ -547,7 +552,7 @@ func newList(n VimNode, filename string) []ast.Expr {
547
552
}
548
553
for _ , node := range n .list {
549
554
if node != nil { // conservative
550
- list = append (list , newAstNode (node , filename ))
555
+ list = append (list , newExprNode (node , filename ))
551
556
}
552
557
}
553
558
return list
@@ -557,7 +562,7 @@ func newValues(n VimNode, filename string) []ast.Expr {
557
562
var values []ast.Expr
558
563
for _ , v := range n .value .([]interface {}) {
559
564
n := v .(* VimNode )
560
- values = append (values , newAstNode (n , filename ))
565
+ values = append (values , newExprNode (n , filename ))
561
566
}
562
567
return values
563
568
}
0 commit comments