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