Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Roblox
GitHub Repository: Roblox/luau
Path: blob/master/Ast/include/Luau/Cst.h
2727 views
1
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
2
#pragma once
3
4
#include "Luau/Ast.h"
5
#include "Luau/Location.h"
6
7
namespace Luau
8
{
9
10
extern int gCstRttiIndex;
11
12
template<typename T>
13
struct CstRtti
14
{
15
static const int value;
16
};
17
18
template<typename T>
19
const int CstRtti<T>::value = ++gCstRttiIndex;
20
21
#define LUAU_CST_RTTI(Class) \
22
static int CstClassIndex() \
23
{ \
24
return CstRtti<Class>::value; \
25
}
26
27
class CstNode
28
{
29
public:
30
explicit CstNode(int classIndex)
31
: classIndex(classIndex)
32
{
33
}
34
35
template<typename T>
36
bool is() const
37
{
38
return classIndex == T::CstClassIndex();
39
}
40
template<typename T>
41
T* as()
42
{
43
return classIndex == T::CstClassIndex() ? static_cast<T*>(this) : nullptr;
44
}
45
template<typename T>
46
const T* as() const
47
{
48
return classIndex == T::CstClassIndex() ? static_cast<const T*>(this) : nullptr;
49
}
50
51
const int classIndex;
52
};
53
54
class CstExprConstantNumber : public CstNode
55
{
56
public:
57
LUAU_CST_RTTI(CstExprConstantNumber)
58
59
explicit CstExprConstantNumber(const AstArray<char>& value);
60
61
AstArray<char> value;
62
};
63
64
class CstExprConstantInteger : public CstNode
65
{
66
public:
67
LUAU_CST_RTTI(CstExprConstantInteger)
68
69
explicit CstExprConstantInteger(const AstArray<char>& value);
70
71
AstArray<char> value;
72
};
73
74
class CstExprConstantString : public CstNode
75
{
76
public:
77
LUAU_CST_RTTI(CstExprConstantString)
78
79
enum QuoteStyle
80
{
81
QuotedSingle,
82
QuotedDouble,
83
QuotedRaw,
84
QuotedInterp,
85
};
86
87
CstExprConstantString(AstArray<char> sourceString, QuoteStyle quoteStyle, unsigned int blockDepth);
88
89
AstArray<char> sourceString;
90
QuoteStyle quoteStyle;
91
unsigned int blockDepth;
92
};
93
94
// Shared between the expression and call nodes
95
struct CstTypeInstantiation
96
{
97
Position leftArrow1Position = {0, 0};
98
Position leftArrow2Position = {0, 0};
99
100
AstArray<Position> commaPositions = {};
101
102
Position rightArrow1Position = {0, 0};
103
Position rightArrow2Position = {0, 0};
104
};
105
106
class CstExprCall : public CstNode
107
{
108
public:
109
LUAU_CST_RTTI(CstExprCall)
110
111
CstExprCall(std::optional<Position> openParens, std::optional<Position> closeParens, AstArray<Position> commaPositions);
112
113
std::optional<Position> openParens;
114
std::optional<Position> closeParens;
115
AstArray<Position> commaPositions;
116
CstTypeInstantiation* explicitTypes = nullptr;
117
};
118
119
class CstExprIndexExpr : public CstNode
120
{
121
public:
122
LUAU_CST_RTTI(CstExprIndexExpr)
123
124
CstExprIndexExpr(Position openBracketPosition, Position closeBracketPosition);
125
126
Position openBracketPosition;
127
Position closeBracketPosition;
128
};
129
130
class CstExprFunction : public CstNode
131
{
132
public:
133
LUAU_CST_RTTI(CstExprFunction)
134
135
CstExprFunction();
136
137
Position functionKeywordPosition{0, 0};
138
Position openGenericsPosition{0, 0};
139
AstArray<Position> genericsCommaPositions;
140
Position closeGenericsPosition{0, 0};
141
AstArray<Position> argsAnnotationColonPositions;
142
AstArray<Position> argsCommaPositions;
143
Position varargAnnotationColonPosition{0, 0};
144
Position returnSpecifierPosition{0, 0};
145
};
146
147
class CstExprTable : public CstNode
148
{
149
public:
150
LUAU_CST_RTTI(CstExprTable)
151
152
enum Separator
153
{
154
Comma,
155
Semicolon,
156
};
157
158
struct Item
159
{
160
std::optional<Position> indexerOpenPosition; // '[', only if Kind == General
161
std::optional<Position> indexerClosePosition; // ']', only if Kind == General
162
std::optional<Position> equalsPosition; // only if Kind != List
163
std::optional<Separator> separator; // may be missing for last Item
164
std::optional<Position> separatorPosition;
165
};
166
167
explicit CstExprTable(const AstArray<Item>& items);
168
169
AstArray<Item> items;
170
};
171
172
// TODO: Shared between unary and binary, should we split?
173
class CstExprOp : public CstNode
174
{
175
public:
176
LUAU_CST_RTTI(CstExprOp)
177
178
explicit CstExprOp(Position opPosition);
179
180
Position opPosition;
181
};
182
183
class CstExprTypeAssertion : public CstNode
184
{
185
public:
186
LUAU_CST_RTTI(CstExprTypeAssertion)
187
188
explicit CstExprTypeAssertion(Position opPosition);
189
190
Position opPosition;
191
};
192
193
class CstExprIfElse : public CstNode
194
{
195
public:
196
LUAU_CST_RTTI(CstExprIfElse)
197
198
CstExprIfElse(Position thenPosition, Position elsePosition, bool isElseIf);
199
200
Position thenPosition;
201
Position elsePosition;
202
bool isElseIf;
203
};
204
205
class CstExprInterpString : public CstNode
206
{
207
public:
208
LUAU_CST_RTTI(CstExprInterpString)
209
210
explicit CstExprInterpString(AstArray<AstArray<char>> sourceStrings, AstArray<Position> stringPositions);
211
212
AstArray<AstArray<char>> sourceStrings;
213
AstArray<Position> stringPositions;
214
};
215
216
class CstExprExplicitTypeInstantiation : public CstNode
217
{
218
public:
219
LUAU_CST_RTTI(CstExprExplicitTypeInstantiation)
220
221
explicit CstExprExplicitTypeInstantiation(CstTypeInstantiation instantiation);
222
223
CstTypeInstantiation instantiation;
224
};
225
226
class CstStatDo : public CstNode
227
{
228
public:
229
LUAU_CST_RTTI(CstStatDo)
230
231
explicit CstStatDo(Position statsStartPosition, Position endPosition);
232
233
Position statsStartPosition;
234
Position endPosition;
235
};
236
237
class CstStatRepeat : public CstNode
238
{
239
public:
240
LUAU_CST_RTTI(CstStatRepeat)
241
242
explicit CstStatRepeat(Position untilPosition);
243
244
Position untilPosition;
245
};
246
247
class CstStatReturn : public CstNode
248
{
249
public:
250
LUAU_CST_RTTI(CstStatReturn)
251
252
explicit CstStatReturn(AstArray<Position> commaPositions);
253
254
AstArray<Position> commaPositions;
255
};
256
257
class CstStatLocal : public CstNode
258
{
259
public:
260
LUAU_CST_RTTI(CstStatLocal)
261
262
CstStatLocal(AstArray<Position> varsAnnotationColonPositions, AstArray<Position> varsCommaPositions, AstArray<Position> valuesCommaPositions);
263
264
AstArray<Position> varsAnnotationColonPositions;
265
AstArray<Position> varsCommaPositions;
266
AstArray<Position> valuesCommaPositions;
267
};
268
269
class CstStatFor : public CstNode
270
{
271
public:
272
LUAU_CST_RTTI(CstStatFor)
273
274
CstStatFor(Position annotationColonPosition, Position equalsPosition, Position endCommaPosition, std::optional<Position> stepCommaPosition);
275
276
Position annotationColonPosition;
277
Position equalsPosition;
278
Position endCommaPosition;
279
std::optional<Position> stepCommaPosition;
280
};
281
282
class CstStatForIn : public CstNode
283
{
284
public:
285
LUAU_CST_RTTI(CstStatForIn)
286
287
CstStatForIn(AstArray<Position> varsAnnotationColonPositions, AstArray<Position> varsCommaPositions, AstArray<Position> valuesCommaPositions);
288
289
AstArray<Position> varsAnnotationColonPositions;
290
AstArray<Position> varsCommaPositions;
291
AstArray<Position> valuesCommaPositions;
292
};
293
294
class CstStatAssign : public CstNode
295
{
296
public:
297
LUAU_CST_RTTI(CstStatAssign)
298
299
CstStatAssign(AstArray<Position> varsCommaPositions, Position equalsPosition, AstArray<Position> valuesCommaPositions);
300
301
AstArray<Position> varsCommaPositions;
302
Position equalsPosition;
303
AstArray<Position> valuesCommaPositions;
304
};
305
306
class CstStatCompoundAssign : public CstNode
307
{
308
public:
309
LUAU_CST_RTTI(CstStatCompoundAssign)
310
311
explicit CstStatCompoundAssign(Position opPosition);
312
313
Position opPosition;
314
};
315
316
class CstStatFunction : public CstNode
317
{
318
public:
319
LUAU_CST_RTTI(CstStatFunction)
320
321
explicit CstStatFunction(Position functionKeywordPosition);
322
323
Position functionKeywordPosition;
324
};
325
326
class CstStatLocalFunction : public CstNode
327
{
328
public:
329
LUAU_CST_RTTI(CstStatLocalFunction)
330
331
explicit CstStatLocalFunction(Position localKeywordPosition, Position functionKeywordPosition);
332
333
Position localKeywordPosition;
334
Position functionKeywordPosition;
335
};
336
337
class CstGenericType : public CstNode
338
{
339
public:
340
LUAU_CST_RTTI(CstGenericType)
341
342
CstGenericType(std::optional<Position> defaultEqualsPosition);
343
344
std::optional<Position> defaultEqualsPosition;
345
};
346
347
class CstGenericTypePack : public CstNode
348
{
349
public:
350
LUAU_CST_RTTI(CstGenericTypePack)
351
352
CstGenericTypePack(Position ellipsisPosition, std::optional<Position> defaultEqualsPosition);
353
354
Position ellipsisPosition;
355
std::optional<Position> defaultEqualsPosition;
356
};
357
358
class CstStatTypeAlias : public CstNode
359
{
360
public:
361
LUAU_CST_RTTI(CstStatTypeAlias)
362
363
CstStatTypeAlias(
364
Position typeKeywordPosition,
365
Position genericsOpenPosition,
366
AstArray<Position> genericsCommaPositions,
367
Position genericsClosePosition,
368
Position equalsPosition
369
);
370
371
Position typeKeywordPosition;
372
Position genericsOpenPosition;
373
AstArray<Position> genericsCommaPositions;
374
Position genericsClosePosition;
375
Position equalsPosition;
376
};
377
378
class CstStatTypeFunction : public CstNode
379
{
380
public:
381
LUAU_CST_RTTI(CstStatTypeFunction)
382
383
CstStatTypeFunction(Position typeKeywordPosition, Position functionKeywordPosition);
384
385
Position typeKeywordPosition;
386
Position functionKeywordPosition;
387
};
388
389
class CstTypeReference : public CstNode
390
{
391
public:
392
LUAU_CST_RTTI(CstTypeReference)
393
394
CstTypeReference(
395
std::optional<Position> prefixPointPosition,
396
Position openParametersPosition,
397
AstArray<Position> parametersCommaPositions,
398
Position closeParametersPosition
399
);
400
401
std::optional<Position> prefixPointPosition;
402
Position openParametersPosition;
403
AstArray<Position> parametersCommaPositions;
404
Position closeParametersPosition;
405
};
406
407
class CstTypeTable : public CstNode
408
{
409
public:
410
LUAU_CST_RTTI(CstTypeTable)
411
412
struct Item
413
{
414
enum struct Kind
415
{
416
Indexer,
417
Property,
418
StringProperty,
419
};
420
421
Kind kind;
422
Position indexerOpenPosition; // '[', only if Kind != Property
423
Position indexerClosePosition; // ']' only if Kind != Property
424
Position colonPosition;
425
std::optional<CstExprTable::Separator> separator; // may be missing for last Item
426
std::optional<Position> separatorPosition;
427
428
CstExprConstantString* stringInfo = nullptr; // only if Kind == StringProperty
429
Position stringPosition{0, 0}; // only if Kind == StringProperty
430
};
431
432
CstTypeTable(AstArray<Item> items, bool isArray);
433
434
AstArray<Item> items;
435
bool isArray = false;
436
};
437
438
class CstTypeFunction : public CstNode
439
{
440
public:
441
LUAU_CST_RTTI(CstTypeFunction)
442
443
CstTypeFunction(
444
Position openGenericsPosition,
445
AstArray<Position> genericsCommaPositions,
446
Position closeGenericsPosition,
447
Position openArgsPosition,
448
AstArray<std::optional<Position>> argumentNameColonPositions,
449
AstArray<Position> argumentsCommaPositions,
450
Position closeArgsPosition,
451
Position returnArrowPosition
452
);
453
454
Position openGenericsPosition;
455
AstArray<Position> genericsCommaPositions;
456
Position closeGenericsPosition;
457
Position openArgsPosition;
458
AstArray<std::optional<Position>> argumentNameColonPositions;
459
AstArray<Position> argumentsCommaPositions;
460
Position closeArgsPosition;
461
Position returnArrowPosition;
462
};
463
464
class CstTypeTypeof : public CstNode
465
{
466
public:
467
LUAU_CST_RTTI(CstTypeTypeof)
468
469
CstTypeTypeof(Position openPosition, Position closePosition);
470
471
Position openPosition;
472
Position closePosition;
473
};
474
475
class CstTypeUnion : public CstNode
476
{
477
public:
478
LUAU_CST_RTTI(CstTypeUnion)
479
480
CstTypeUnion(std::optional<Position> leadingPosition, AstArray<Position> separatorPositions);
481
482
std::optional<Position> leadingPosition;
483
AstArray<Position> separatorPositions;
484
};
485
486
class CstTypeIntersection : public CstNode
487
{
488
public:
489
LUAU_CST_RTTI(CstTypeIntersection)
490
491
explicit CstTypeIntersection(std::optional<Position> leadingPosition, AstArray<Position> separatorPositions);
492
493
std::optional<Position> leadingPosition;
494
AstArray<Position> separatorPositions;
495
};
496
497
class CstTypeSingletonString : public CstNode
498
{
499
public:
500
LUAU_CST_RTTI(CstTypeSingletonString)
501
502
CstTypeSingletonString(AstArray<char> sourceString, CstExprConstantString::QuoteStyle quoteStyle, unsigned int blockDepth);
503
504
AstArray<char> sourceString;
505
CstExprConstantString::QuoteStyle quoteStyle;
506
unsigned int blockDepth;
507
};
508
509
class CstTypePackExplicit : public CstNode
510
{
511
public:
512
LUAU_CST_RTTI(CstTypePackExplicit)
513
514
explicit CstTypePackExplicit();
515
explicit CstTypePackExplicit(Position openParenthesesPosition, Position closeParenthesesPosition, AstArray<Position> commaPositions);
516
517
bool hasParentheses;
518
Position openParenthesesPosition;
519
Position closeParenthesesPosition;
520
AstArray<Position> commaPositions;
521
};
522
523
class CstTypePackGeneric : public CstNode
524
{
525
public:
526
LUAU_CST_RTTI(CstTypePackGeneric)
527
528
explicit CstTypePackGeneric(Position ellipsisPosition);
529
530
Position ellipsisPosition;
531
};
532
533
} // namespace Luau
534
535