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 |
|
|
|