1
- import { Token } from "./Scanner" ;
1
+ import { Token , Empty } from "./Scanner" ;
2
2
import * as _ from "lodash" ;
3
3
import { Suggestion } from "../plugins/autocompletion_providers/Suggestions" ;
4
4
5
- abstract class ASTNode {
5
+ export abstract class ASTNode {
6
6
abstract get fullStart ( ) : number ;
7
7
abstract get fullEnd ( ) : number ;
8
8
}
@@ -17,7 +17,7 @@ abstract class LeafNode extends ASTNode {
17
17
}
18
18
19
19
get fullEnd ( ) : number {
20
- return this . fullStart + this . token . raw . length - 1 ;
20
+ return this . fullStart + this . token . raw . length ;
21
21
}
22
22
23
23
get value ( ) : string {
@@ -28,12 +28,10 @@ abstract class LeafNode extends ASTNode {
28
28
}
29
29
30
30
abstract class BranchNode extends ASTNode {
31
- readonly children : ASTNode [ ] ;
31
+ abstract get children ( ) : ASTNode [ ] ;
32
32
33
- constructor ( children : ASTNode [ ] ) {
33
+ constructor ( protected childTokens : Token [ ] ) {
34
34
super ( ) ;
35
-
36
- this . children = children ;
37
35
}
38
36
39
37
get fullStart ( ) : number {
@@ -46,21 +44,27 @@ abstract class BranchNode extends ASTNode {
46
44
}
47
45
48
46
class CompleteCommand extends BranchNode {
47
+ get children ( ) : ASTNode [ ] {
48
+ return [ new Command ( this . childTokens ) ] ;
49
+ }
49
50
}
50
51
51
52
class Command extends BranchNode {
52
- readonly commandWord : CommandWord ;
53
- readonly argumentList : ArgumentList ;
54
-
55
- constructor ( tokens : Token [ ] ) {
56
- const commandWord = new CommandWord ( tokens [ 0 ] ) ;
53
+ get children ( ) : ASTNode [ ] {
54
+ const children : ASTNode [ ] = [ this . commandWord ] ;
55
+ if ( this . childTokens . length > 1 ) {
56
+ children . push ( this . argumentList ) ;
57
+ }
57
58
58
- const argumentList = tokens . length === 1 ? new EmptyArgumentList ( ( ) => this ) : new ArgumentList ( tokens . slice ( 1 ) . map ( token => new Argument ( token , this ) ) ) ;
59
+ return children ;
60
+ }
59
61
60
- super ( [ commandWord , argumentList ] ) ;
62
+ get commandWord ( ) : CommandWord {
63
+ return new CommandWord ( this . childTokens [ 0 ] ) ;
64
+ }
61
65
62
- this . commandWord = commandWord ;
63
- this . argumentList = argumentList ;
66
+ get argumentList ( ) : ArgumentList | undefined {
67
+ return new ArgumentList ( this . childTokens . slice ( 1 ) , this ) ;
64
68
}
65
69
}
66
70
@@ -71,6 +75,13 @@ class CommandWord extends LeafNode {
71
75
}
72
76
73
77
class ArgumentList extends BranchNode {
78
+ constructor ( childTokens : Token [ ] , private command : Command ) {
79
+ super ( childTokens ) ;
80
+ }
81
+
82
+ get children ( ) : ASTNode [ ] {
83
+ return this . childTokens . map ( token => new Argument ( token , this . command ) ) ;
84
+ }
74
85
}
75
86
76
87
class Argument extends LeafNode {
@@ -90,10 +101,22 @@ class Argument extends LeafNode {
90
101
}
91
102
}
92
103
93
- export function parse ( tokens : Token [ ] ) : CompleteCommand {
94
- return new CompleteCommand ( [
95
- new Command ( tokens ) ,
96
- ] ) ;
104
+ class EmptyNode extends LeafNode {
105
+ constructor ( ) {
106
+ super ( new Empty ( ) ) ;
107
+ }
108
+
109
+ get suggestions ( ) : Suggestion [ ] {
110
+ return [ ] ;
111
+ }
112
+ }
113
+
114
+ export function parse ( tokens : Token [ ] ) : ASTNode {
115
+ if ( tokens . length === 0 ) {
116
+ return new EmptyNode ( ) ;
117
+ }
118
+
119
+ return new CompleteCommand ( tokens ) ;
97
120
}
98
121
99
122
export function leafNodeAt ( position : number , node : ASTNode ) : LeafNode {
0 commit comments