| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | // Copyright (c) 2021-2025 ChilliBits. All rights reserved. | ||
| 2 | |||
| 3 | #pragma once | ||
| 4 | |||
| 5 | #include <CompilerPass.h> | ||
| 6 | #include <ast/ASTVisitor.h> | ||
| 7 | |||
| 8 | namespace spice::compiler { | ||
| 9 | |||
| 10 | const char *const MAIN_FUNCTION_NAME = "main"; | ||
| 11 | const char *const RETURN_VARIABLE_NAME = "result"; | ||
| 12 | const char *const THIS_VARIABLE_NAME = "this"; | ||
| 13 | const char *const FOREACH_DEFAULT_IDX_VARIABLE_NAME = "idx"; | ||
| 14 | const char *const CTOR_FUNCTION_NAME = "ctor"; | ||
| 15 | const char *const DTOR_FUNCTION_NAME = "dtor"; | ||
| 16 | const char *const ALIAS_CONTAINER_SUFFIX = ".container"; | ||
| 17 | const char *const STRUCT_SCOPE_PREFIX = "struct:"; | ||
| 18 | const char *const INTERFACE_SCOPE_PREFIX = "interface:"; | ||
| 19 | const char *const ENUM_SCOPE_PREFIX = "enum:"; | ||
| 20 | static constexpr char UNUSED_VARIABLE_NAME = '_'; | ||
| 21 | |||
| 22 | /** | ||
| 23 | * Jobs: | ||
| 24 | * - Build symbol table | ||
| 25 | */ | ||
| 26 | class SymbolTableBuilder final : CompilerPass, public ASTVisitor { | ||
| 27 | public: | ||
| 28 | // Constructors | ||
| 29 | SymbolTableBuilder(GlobalResourceManager &resourceManager, SourceFile *sourceFile); | ||
| 30 | |||
| 31 | // Public methods | ||
| 32 | std::any visitEntry(EntryNode *node) override; | ||
| 33 | std::any visitMainFctDef(MainFctDefNode *node) override; | ||
| 34 | std::any visitFctDef(FctDefNode *node) override; | ||
| 35 | std::any visitProcDef(ProcDefNode *node) override; | ||
| 36 | std::any visitStructDef(StructDefNode *node) override; | ||
| 37 | std::any visitInterfaceDef(InterfaceDefNode *node) override; | ||
| 38 | std::any visitEnumDef(EnumDefNode *node) override; | ||
| 39 | std::any visitGenericTypeDef(GenericTypeDefNode *node) override; | ||
| 40 | std::any visitAliasDef(AliasDefNode *node) override; | ||
| 41 | std::any visitGlobalVarDef(GlobalVarDefNode *node) override; | ||
| 42 | std::any visitExtDecl(ExtDeclNode *node) override; | ||
| 43 | std::any visitUnsafeBlock(UnsafeBlockNode *node) override; | ||
| 44 | std::any visitForLoop(ForLoopNode *node) override; | ||
| 45 | std::any visitForeachLoop(ForeachLoopNode *node) override; | ||
| 46 | std::any visitWhileLoop(WhileLoopNode *node) override; | ||
| 47 | std::any visitDoWhileLoop(DoWhileLoopNode *node) override; | ||
| 48 | std::any visitIfStmt(IfStmtNode *node) override; | ||
| 49 | std::any visitElseStmt(ElseStmtNode *node) override; | ||
| 50 | std::any visitCaseBranch(CaseBranchNode *node) override; | ||
| 51 | std::any visitDefaultBranch(DefaultBranchNode *node) override; | ||
| 52 | std::any visitAnonymousBlockStmt(AnonymousBlockStmtNode *node) override; | ||
| 53 | std::any visitEnumItem(EnumItemNode *node) override; | ||
| 54 | std::any visitField(FieldNode *node) override; | ||
| 55 | std::any visitSignature(SignatureNode *node) override; | ||
| 56 | std::any visitDeclStmt(DeclStmtNode *node) override; | ||
| 57 | std::any visitModAttr(ModAttrNode *node) override; | ||
| 58 | std::any visitAttr(AttrNode *node) override; | ||
| 59 | std::any visitLambdaFunc(LambdaFuncNode *node) override; | ||
| 60 | std::any visitLambdaProc(LambdaProcNode *node) override; | ||
| 61 | std::any visitLambdaExpr(LambdaExprNode *node) override; | ||
| 62 | |||
| 63 | private: | ||
| 64 | // Private members | ||
| 65 | Scope *rootScope; | ||
| 66 | bool hasMainFunction = false; | ||
| 67 | }; | ||
| 68 | |||
| 69 | } // namespace spice::compiler | ||
| 70 |