blob: c65429c2e6af7106824b30565fdf9635dbaf1e7f [file] [log] [blame]
Ethan Nicholasfc994162019-06-06 10:04:27 -04001/*
2 * Copyright 2019 Google LLC
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SKSL_ASTNODE
9#define SKSL_ASTNODE
10
11#include "src/sksl/SkSLLexer.h"
12#include "src/sksl/SkSLString.h"
13#include "src/sksl/ir/SkSLModifiers.h"
14
15#include <vector>
16
17namespace SkSL {
18
19// std::max isn't constexpr in some compilers
20static constexpr size_t Max(size_t a, size_t b) {
21 return a > b ? a : b;
22}
23
24/**
25 * Represents a node in the abstract syntax tree (AST). The AST is based directly on the parse tree;
26 * it is a parsed-but-not-yet-analyzed version of the program.
27 */
28struct ASTNode {
29 class ID {
30 public:
31 static ID Invalid() {
32 return ID();
33 }
34
35 bool operator==(const ID& other) {
36 return fValue == other.fValue;
37 }
38
39 bool operator!=(const ID& other) {
40 return fValue != other.fValue;
41 }
42
43 operator bool() const { return fValue >= 0; }
44
45 private:
46 ID()
47 : fValue(-1) {}
48
49 ID(int value)
50 : fValue(value) {}
51
52 int fValue;
53
54 friend struct ASTFile;
55 friend struct ASTNode;
56 friend class Parser;
57 };
58
59 enum class Kind {
60 // data: operator(Token), children: left, right
61 kBinary,
62 // children: statements
63 kBlock,
64 // data: value(bool)
65 kBool,
66 kBreak,
67 // children: target, arg1, arg2...
68 kCall,
69 kContinue,
70 kDiscard,
71 // children: statement, test
72 kDo,
73 // data: name(StringFragment), children: enumCases
74 kEnum,
75 // data: name(StringFragment), children: value?
76 kEnumCase,
77 // data: name(StringFragment)
78 kExtension,
79 // data: field(StringFragment), children: base
80 kField,
81 // children: declarations
82 kFile,
83 // data: value(float)
84 kFloat,
85 // children: init, test, next, statement
86 kFor,
87 // data: FunctionData, children: returnType, parameters, statement?
88 kFunction,
89 // data: name(StringFragment)
90 kIdentifier,
91 // children: base, index?
92 kIndex,
93 // data: isStatic(bool), children: test, ifTrue, ifFalse?
94 kIf,
95 // value(data): int
96 kInt,
97 // data: InterfaceBlockData, children: declaration1, declaration2, ..., size1, size2, ...
98 kInterfaceBlock,
99 // data: Modifiers
100 kModifiers,
101 kNull,
102 // data: ParameterData, children: type, arraySize1, arraySize2, ..., value?
103 kParameter,
104 // data: operator(Token), children: operand
105 kPostfix,
106 // data: operator(Token), children: operand
107 kPrefix,
108 // children: value
109 kReturn,
Brian Osman6518d772020-09-10 16:50:06 -0400110 // data: field(StringFragment), children: base
111 kScope,
Ethan Nicholasfc994162019-06-06 10:04:27 -0400112 // ...
113 kSection,
114 // children: value, statement 1, statement 2...
115 kSwitchCase,
116 // children: value, case 1, case 2...
117 kSwitch,
118 // children: test, ifTrue, ifFalse
119 kTernary,
120 // data: TypeData, children: sizes
121 kType,
122 // data: VarData, children: arraySize1, arraySize2, ..., value?
123 kVarDeclaration,
124 // children: modifiers, type, varDeclaration1, varDeclaration2, ...
125 kVarDeclarations,
126 // children: test, statement
127 kWhile,
128 };
129
130 class iterator {
131 public:
132 iterator operator++() {
133 SkASSERT(fID);
134 fID = (**this).fNext;
135 return *this;
136 }
137
138 iterator operator++(int) {
139 SkASSERT(fID);
140 iterator old = *this;
141 fID = (**this).fNext;
142 return old;
143 }
144
145 iterator operator+=(int count) {
146 SkASSERT(count >= 0);
147 for (; count > 0; --count) {
148 ++(*this);
149 }
150 return *this;
151 }
152
153 iterator operator+(int count) {
154 iterator result(*this);
155 return result += count;
156 }
157
158 bool operator==(const iterator& other) const {
159 return fID == other.fID;
160 }
161
162 bool operator!=(const iterator& other) const {
163 return fID != other.fID;
164 }
165
166 ASTNode& operator*() {
167 SkASSERT(fID);
168 return (*fNodes)[fID.fValue];
169 }
170
171 ASTNode* operator->() {
172 SkASSERT(fID);
173 return &(*fNodes)[fID.fValue];
174 }
175
176 private:
177 iterator(std::vector<ASTNode>* nodes, ID id)
178 : fNodes(nodes)
179 , fID(id) {}
180
181 std::vector<ASTNode>* fNodes;
182
183 ID fID;
184
185 friend struct ASTNode;
186 };
187
188 struct TypeData {
189 TypeData() {}
190
191 TypeData(StringFragment name, bool isStructDeclaration, bool isNullable)
192 : fName(name)
193 , fIsStructDeclaration(isStructDeclaration)
194 , fIsNullable(isNullable) {}
195
196 StringFragment fName;
197 bool fIsStructDeclaration;
198 bool fIsNullable;
199 };
200
201 struct ParameterData {
202 ParameterData() {}
203
204 ParameterData(Modifiers modifiers, StringFragment name, size_t sizeCount)
205 : fModifiers(modifiers)
206 , fName(name)
207 , fSizeCount(sizeCount) {}
208
209 Modifiers fModifiers;
210 StringFragment fName;
211 size_t fSizeCount;
212 };
213
214 struct VarData {
215 VarData() {}
216
217 VarData(StringFragment name, size_t sizeCount)
218 : fName(name)
219 , fSizeCount(sizeCount) {}
220
221 StringFragment fName;
222 size_t fSizeCount;
223 };
224
225 struct FunctionData {
226 FunctionData() {}
227
228 FunctionData(Modifiers modifiers, StringFragment name, size_t parameterCount)
229 : fModifiers(modifiers)
230 , fName(name)
231 , fParameterCount(parameterCount) {}
232
233 Modifiers fModifiers;
234 StringFragment fName;
235 size_t fParameterCount;
236 };
237
238 struct InterfaceBlockData {
239 InterfaceBlockData() {}
240
241 InterfaceBlockData(Modifiers modifiers, StringFragment typeName, size_t declarationCount,
242 StringFragment instanceName, size_t sizeCount)
243 : fModifiers(modifiers)
244 , fTypeName(typeName)
245 , fDeclarationCount(declarationCount)
246 , fInstanceName(instanceName)
247 , fSizeCount(sizeCount) {}
248
249 Modifiers fModifiers;
250 StringFragment fTypeName;
251 size_t fDeclarationCount;
252 StringFragment fInstanceName;
253 size_t fSizeCount;
254 };
255
256 struct SectionData {
257 SectionData() {}
258
259 SectionData(StringFragment name, StringFragment argument, StringFragment text)
260 : fName(name)
261 , fArgument(argument)
262 , fText(text) {}
263
264 StringFragment fName;
265 StringFragment fArgument;
266 StringFragment fText;
267 };
268
269 struct NodeData {
270 char fBytes[Max(sizeof(Token),
271 Max(sizeof(StringFragment),
272 Max(sizeof(bool),
273 Max(sizeof(SKSL_INT),
274 Max(sizeof(SKSL_FLOAT),
275 Max(sizeof(Modifiers),
276 Max(sizeof(TypeData),
277 Max(sizeof(FunctionData),
278 Max(sizeof(ParameterData),
279 Max(sizeof(VarData),
280 Max(sizeof(InterfaceBlockData),
281 sizeof(SectionData))))))))))))];
282
283 enum class Kind {
284 kToken,
285 kStringFragment,
286 kBool,
287 kInt,
288 kFloat,
289 kModifiers,
290 kTypeData,
291 kFunctionData,
292 kParameterData,
293 kVarData,
294 kInterfaceBlockData,
295 kSectionData
296 } fKind;
297
298 NodeData() = default;
299
300 NodeData(Token data)
301 : fKind(Kind::kToken) {
302 memcpy(fBytes, &data, sizeof(data));
303 }
304
305 NodeData(StringFragment data)
306 : fKind(Kind::kStringFragment) {
307 memcpy(fBytes, &data, sizeof(data));
308 }
309
310 NodeData(bool data)
311 : fKind(Kind::kBool) {
312 memcpy(fBytes, &data, sizeof(data));
313 }
314
315 NodeData(SKSL_INT data)
316 : fKind(Kind::kInt) {
317 memcpy(fBytes, &data, sizeof(data));
318 }
319
320 NodeData(SKSL_FLOAT data)
321 : fKind(Kind::kFloat) {
322 memcpy(fBytes, &data, sizeof(data));
323 }
324
325 NodeData(Modifiers data)
326 : fKind(Kind::kModifiers) {
327 memcpy(fBytes, &data, sizeof(data));
328 }
329
330 NodeData(TypeData data)
331 : fKind(Kind::kTypeData) {
332 memcpy(fBytes, &data, sizeof(data));
333 }
334
335 NodeData(FunctionData data)
336 : fKind(Kind::kFunctionData) {
337 memcpy(fBytes, &data, sizeof(data));
338 }
339
340 NodeData(VarData data)
341 : fKind(Kind::kVarData) {
342 memcpy(fBytes, &data, sizeof(data));
343 }
344
345 NodeData(ParameterData data)
346 : fKind(Kind::kParameterData) {
347 memcpy(fBytes, &data, sizeof(data));
348 }
349
350 NodeData(InterfaceBlockData data)
351 : fKind(Kind::kInterfaceBlockData) {
352 memcpy(fBytes, &data, sizeof(data));
353 }
354
355 NodeData(SectionData data)
356 : fKind(Kind::kSectionData) {
357 memcpy(fBytes, &data, sizeof(data));
358 }
359 };
360
361 ASTNode()
362 : fOffset(-1)
363 , fKind(Kind::kNull) {}
364
365 ASTNode(std::vector<ASTNode>* nodes, int offset, Kind kind)
366 : fNodes(nodes)
367 , fOffset(offset)
368 , fKind(kind) {
369 switch (kind) {
370 case Kind::kBinary:
371 case Kind::kPostfix:
372 case Kind::kPrefix:
373 fData.fKind = NodeData::Kind::kToken;
374 break;
375
376 case Kind::kBool:
377 case Kind::kIf:
378 case Kind::kSwitch:
379 fData.fKind = NodeData::Kind::kBool;
380 break;
381
382 case Kind::kEnum:
383 case Kind::kEnumCase:
384 case Kind::kExtension:
385 case Kind::kField:
386 case Kind::kIdentifier:
Brian Osman6518d772020-09-10 16:50:06 -0400387 case Kind::kScope:
Ethan Nicholasfc994162019-06-06 10:04:27 -0400388 fData.fKind = NodeData::Kind::kStringFragment;
389 break;
390
391 case Kind::kFloat:
392 fData.fKind = NodeData::Kind::kFloat;
393 break;
394
395 case Kind::kFunction:
396 fData.fKind = NodeData::Kind::kFunctionData;
397 break;
398
399 case Kind::kInt:
400 fData.fKind = NodeData::Kind::kInt;
401 break;
402
403 case Kind::kInterfaceBlock:
404 fData.fKind = NodeData::Kind::kInterfaceBlockData;
405 break;
406
407 case Kind::kModifiers:
408 fData.fKind = NodeData::Kind::kModifiers;
409 break;
410
411 case Kind::kParameter:
412 fData.fKind = NodeData::Kind::kParameterData;
413 break;
414
415 case Kind::kVarDeclaration:
416 fData.fKind = NodeData::Kind::kVarData;
417 break;
418
419 case Kind::kType:
420 fData.fKind = NodeData::Kind::kTypeData;
421 break;
422
423 default:
424 break;
425 }
426 }
427
428 ASTNode(std::vector<ASTNode>* nodes, int offset, Kind kind, Token t)
429 : fNodes(nodes)
430 , fData(t)
431 , fOffset(offset)
432 , fKind(kind) {}
433
434 ASTNode(std::vector<ASTNode>* nodes, int offset, Kind kind, StringFragment s)
435 : fNodes(nodes)
436 , fData(s)
437 , fOffset(offset)
438 , fKind(kind) {}
439
440 ASTNode(std::vector<ASTNode>* nodes, int offset, Kind kind, const char* s)
441 : fNodes(nodes)
442 , fData(StringFragment(s))
443 , fOffset(offset)
444 , fKind(kind) {}
445
446 ASTNode(std::vector<ASTNode>* nodes, int offset, Kind kind, bool b)
447 : fNodes(nodes)
448 , fData(b)
449 , fOffset(offset)
450 , fKind(kind) {}
451
452 ASTNode(std::vector<ASTNode>* nodes, int offset, Kind kind, SKSL_INT i)
453 : fNodes(nodes)
454 , fData(i)
455 , fOffset(offset)
456 , fKind(kind) {}
457
458 ASTNode(std::vector<ASTNode>* nodes, int offset, Kind kind, SKSL_FLOAT f)
459 : fNodes(nodes)
460 , fData(f)
461 , fOffset(offset)
462 , fKind(kind) {}
463
464 ASTNode(std::vector<ASTNode>* nodes, int offset, Kind kind, Modifiers m)
465 : fNodes(nodes)
466 , fData(m)
467 , fOffset(offset)
468 , fKind(kind) {}
469
470 ASTNode(std::vector<ASTNode>* nodes, int offset, Kind kind, TypeData td)
471 : fNodes(nodes)
472 , fData(td)
473 , fOffset(offset)
474 , fKind(kind) {}
475
476 ASTNode(std::vector<ASTNode>* nodes, int offset, Kind kind, SectionData s)
477 : fNodes(nodes)
478 , fData(s)
479 , fOffset(offset)
480 , fKind(kind) {}
481
482 operator bool() const {
483 return fKind != Kind::kNull;
484 }
485
486 Token getToken() const {
487 SkASSERT(fData.fKind == NodeData::Kind::kToken);
488 Token result;
489 memcpy(&result, fData.fBytes, sizeof(result));
490 return result;
491 }
492
493 bool getBool() const {
494 SkASSERT(fData.fKind == NodeData::Kind::kBool);
495 bool result;
496 memcpy(&result, fData.fBytes, sizeof(result));
497 return result;
498 }
499
500 SKSL_INT getInt() const {
501 SkASSERT(fData.fKind == NodeData::Kind::kInt);
502 SKSL_INT result;
503 memcpy(&result, fData.fBytes, sizeof(result));
504 return result;
505 }
506
507 SKSL_FLOAT getFloat() const {
508 SkASSERT(fData.fKind == NodeData::Kind::kFloat);
509 SKSL_FLOAT result;
510 memcpy(&result, fData.fBytes, sizeof(result));
511 return result;
512 }
513
514 StringFragment getString() const {
515 SkASSERT(fData.fKind == NodeData::Kind::kStringFragment);
516 StringFragment result;
517 memcpy(&result, fData.fBytes, sizeof(result));
518 return result;
519 }
520
521 Modifiers getModifiers() const {
522 SkASSERT(fData.fKind == NodeData::Kind::kModifiers);
523 Modifiers result;
524 memcpy(&result, fData.fBytes, sizeof(result));
525 return result;
526 }
527
528 void setModifiers(const Modifiers& m) {
529 memcpy(fData.fBytes, &m, sizeof(m));
530 }
531
532 TypeData getTypeData() const {
533 SkASSERT(fData.fKind == NodeData::Kind::kTypeData);
534 TypeData result;
535 memcpy(&result, fData.fBytes, sizeof(result));
536 return result;
537 }
538
539 void setTypeData(const ASTNode::TypeData& td) {
540 SkASSERT(fData.fKind == NodeData::Kind::kTypeData);
541 memcpy(fData.fBytes, &td, sizeof(td));
542 }
543
544 ParameterData getParameterData() const {
545 SkASSERT(fData.fKind == NodeData::Kind::kParameterData);
546 ParameterData result;
547 memcpy(&result, fData.fBytes, sizeof(result));
548 return result;
549 }
550
551 void setParameterData(const ASTNode::ParameterData& pd) {
552 SkASSERT(fData.fKind == NodeData::Kind::kParameterData);
553 memcpy(fData.fBytes, &pd, sizeof(pd));
554 }
555
556 VarData getVarData() const {
557 SkASSERT(fData.fKind == NodeData::Kind::kVarData);
558 VarData result;
559 memcpy(&result, fData.fBytes, sizeof(result));
560 return result;
561 }
562
563 void setVarData(const ASTNode::VarData& vd) {
564 SkASSERT(fData.fKind == NodeData::Kind::kVarData);
565 memcpy(fData.fBytes, &vd, sizeof(vd));
566 }
567
568 FunctionData getFunctionData() const {
569 SkASSERT(fData.fKind == NodeData::Kind::kFunctionData);
570 FunctionData result;
571 memcpy(&result, fData.fBytes, sizeof(result));
572 return result;
573 }
574
575 void setFunctionData(const ASTNode::FunctionData& fd) {
576 SkASSERT(fData.fKind == NodeData::Kind::kFunctionData);
577 memcpy(fData.fBytes, &fd, sizeof(fd));
578 }
579
580 InterfaceBlockData getInterfaceBlockData() const {
581 SkASSERT(fData.fKind == NodeData::Kind::kInterfaceBlockData);
582 InterfaceBlockData result;
583 memcpy(&result, fData.fBytes, sizeof(result));
584 return result;
585 }
586
587 void setInterfaceBlockData(const ASTNode::InterfaceBlockData& id) {
588 SkASSERT(fData.fKind == NodeData::Kind::kInterfaceBlockData);
589 memcpy(fData.fBytes, &id, sizeof(id));
590 }
591
592 SectionData getSectionData() const {
593 SkASSERT(fData.fKind == NodeData::Kind::kSectionData);
594 SectionData result;
595 memcpy(&result, fData.fBytes, sizeof(result));
596 return result;
597 }
598
599 void addChild(ID id) {
600 SkASSERT(!(*fNodes)[id.fValue].fNext);
601 if (fLastChild) {
602 SkASSERT(!(*fNodes)[fLastChild.fValue].fNext);
603 (*fNodes)[fLastChild.fValue].fNext = id;
604 } else {
605 fFirstChild = id;
606 }
607 fLastChild = id;
608 SkASSERT(!(*fNodes)[fLastChild.fValue].fNext);
609 }
610
611 iterator begin() const {
612 return iterator(fNodes, fFirstChild);
613 }
614
615 iterator end() const {
616 return iterator(fNodes, ID(-1));
617 }
618
Ethan Nicholas2a099da2020-01-02 14:40:54 -0500619#ifdef SK_DEBUG
Ethan Nicholasfc994162019-06-06 10:04:27 -0400620 String description() const;
Ethan Nicholas2a099da2020-01-02 14:40:54 -0500621#endif
Ethan Nicholasfc994162019-06-06 10:04:27 -0400622
623 std::vector<ASTNode>* fNodes;
624
625 NodeData fData;
626
627 int fOffset;
628
629 Kind fKind;
630
631 ID fFirstChild;
632
633 ID fLastChild;
634
635 ID fNext;
636};
637
John Stilesa6841be2020-08-06 14:11:56 -0400638} // namespace SkSL
Ethan Nicholasfc994162019-06-06 10:04:27 -0400639
640#endif