z_mirror/luapls

git clone https://git.raiguard.me/z_mirror/luapls

Caleb HeuerRefactor missed statements (how did I skip these!?)96b3acb

main
4.8 KiB244 linesraw
1package ast
2
3import (
4	"github.com/raiguard/luapls/lua/token"
5)
6
7type Statement interface {
8	Node
9	statementNode()
10}
11
12type AssignmentStatement struct {
13	Vars   Punctuated[Expression]
14	Assign Unit
15	Exps   Punctuated[Expression]
16}
17
18func (as *AssignmentStatement) statementNode() {}
19func (as *AssignmentStatement) Pos() token.Pos {
20	return as.Vars.Pos()
21}
22func (as *AssignmentStatement) End() token.Pos {
23	return as.Exps.End()
24}
25
26type BreakStatement Unit
27
28func (bs *BreakStatement) statementNode() {}
29func (bs *BreakStatement) Pos() token.Pos {
30	return bs.Token.Pos
31}
32func (bs *BreakStatement) End() token.Pos {
33	return bs.Token.End()
34}
35
36type DoStatement struct {
37	DoTok  Unit
38	Body   Block
39	EndTok Unit
40}
41
42func (ds *DoStatement) statementNode() {}
43func (ds *DoStatement) Pos() token.Pos {
44	return ds.DoTok.Pos()
45}
46func (ds *DoStatement) End() token.Pos {
47	return ds.EndTok.End()
48}
49
50type ForStatement struct {
51	ForTok    Unit
52	Name      *Identifier
53	AssignTok Unit
54	Start     Pair[Expression]
55	Finish    Pair[Expression]
56	Step      *Pair[Expression]
57	DoTok     Unit
58	Body      Block
59	EndTok    Unit
60}
61
62func (fs *ForStatement) statementNode() {}
63func (fs *ForStatement) Pos() token.Pos {
64	return fs.ForTok.Pos()
65}
66func (fs *ForStatement) End() token.Pos {
67	return fs.EndTok.End()
68}
69
70type ForInStatement struct {
71	ForTok Unit
72	Names  Punctuated[*Identifier]
73	InTok  Unit
74	Exps   Punctuated[Expression]
75	DoTok  Unit
76	Body   Block
77	EndTok Unit
78}
79
80func (fs *ForInStatement) statementNode() {}
81func (fs *ForInStatement) Pos() token.Pos {
82	return fs.ForTok.Pos()
83}
84func (fs *ForInStatement) End() token.Pos {
85	return fs.EndTok.End()
86}
87
88type FunctionStatement struct {
89	LocalTok   *Unit
90	FuncTok    Unit
91	Name       Expression
92	LeftParen  Unit
93	Params     Punctuated[*Identifier]
94	Vararg     *Unit
95	RightParen Unit
96	Body       Block
97	EndTok     Unit
98}
99
100func (fs *FunctionStatement) statementNode() {}
101func (fs *FunctionStatement) Pos() token.Pos {
102	if fs.LocalTok != nil {
103		return fs.LocalTok.Pos()
104	}
105	return fs.Name.Pos()
106}
107func (fs *FunctionStatement) End() token.Pos {
108	return fs.EndTok.End()
109}
110
111type GotoStatement struct {
112	GotoTok Unit
113	Name    *Identifier
114}
115
116func (gs *GotoStatement) statementNode() {}
117func (gs *GotoStatement) Pos() token.Pos {
118	return gs.GotoTok.Pos()
119}
120func (gs *GotoStatement) End() token.Pos {
121	return gs.Name.End()
122}
123
124type IfStatement struct {
125	IfTok   Unit // TODO: Remove this in favor of Clauses[0].LeadingTok, since it will always exist
126	Clauses []*IfClause
127	EndTok  Unit
128}
129
130func (is *IfStatement) statementNode() {}
131func (is *IfStatement) Pos() token.Pos {
132	return is.IfTok.Pos()
133}
134func (is *IfStatement) End() token.Pos {
135	return is.EndTok.Pos()
136}
137
138type IfClause struct {
139	LeadingTok Unit
140	Condition  Expression
141	ThenTok    *Unit
142	Body       Block
143}
144
145func (ic *IfClause) statementNode() {}
146func (ic *IfClause) Pos() token.Pos {
147	return ic.LeadingTok.Pos()
148}
149func (ic *IfClause) End() token.Pos {
150	return ic.Body.End()
151}
152
153type LabelStatement struct {
154	LeadingLabelTok  Unit
155	Name             *Identifier
156	TrailingLabelTok Unit
157}
158
159func (ls *LabelStatement) statementNode() {}
160func (ls *LabelStatement) Pos() token.Pos {
161	return ls.LeadingLabelTok.Pos()
162}
163func (ls *LabelStatement) End() token.Pos {
164	return ls.TrailingLabelTok.End()
165}
166func (ls *LabelStatement) leaf() {}
167
168type LocalStatement struct {
169	LocalTok  Unit
170	Names     Punctuated[*Identifier]
171	AssignTok *Unit
172	Exps      *Punctuated[Expression]
173}
174
175func (ls *LocalStatement) statementNode() {}
176func (ls *LocalStatement) Pos() token.Pos {
177	return ls.LocalTok.Pos()
178}
179func (ls *LocalStatement) End() token.Pos {
180	if ls.Exps != nil {
181		return ls.Exps.End()
182	}
183	if ls.AssignTok != nil {
184		return ls.AssignTok.End()
185	}
186	return ls.Names.End()
187}
188
189type RepeatStatement struct {
190	RepeatTok Unit
191	Body      Block
192	UntilTok  Unit
193	Condition Expression
194}
195
196func (rs *RepeatStatement) statementNode() {}
197func (rs *RepeatStatement) Pos() token.Pos {
198	return rs.RepeatTok.Pos()
199}
200func (rs *RepeatStatement) End() token.Pos {
201	return rs.Condition.End()
202}
203
204type ReturnStatement struct {
205	ReturnTok Unit
206	Exps      *Punctuated[Expression]
207}
208
209func (rs *ReturnStatement) statementNode() {}
210func (rs *ReturnStatement) Pos() token.Pos {
211	return rs.ReturnTok.Pos()
212}
213func (rs *ReturnStatement) End() token.Pos {
214	if rs.Exps != nil {
215		return rs.Exps.End()
216	}
217	return rs.ReturnTok.End()
218}
219
220type SemicolonStatement Unit
221
222func (ss *SemicolonStatement) statementNode() {}
223func (ss *SemicolonStatement) Pos() token.Pos {
224	return ss.Token.Pos
225}
226func (ss *SemicolonStatement) End() token.Pos {
227	return ss.Token.End()
228}
229
230type WhileStatement struct {
231	WhileTok  Unit
232	Condition Expression
233	DoTok     Unit
234	Body      Block
235	EndTok    Unit
236}
237
238func (ws *WhileStatement) statementNode() {}
239func (ws *WhileStatement) Pos() token.Pos {
240	return ws.WhileTok.Pos()
241}
242func (ws *WhileStatement) End() token.Pos {
243	return ws.EndTok.End()
244}