sammine-lang
Loading...
Searching...
No Matches
ScopeGeneratorVisitor.h
Go to the documentation of this file.
1#pragma once
2#include "ast/Ast.h"
3#include "ast/AstBase.h"
5#include "util/Utilities.h"
6namespace sammine_lang::AST {
7
11class ScopeGeneratorVisitor : public ScopedASTVisitor {
12public:
14 // A simple scoping class, doesn't differentiate between different names, like
15 // variable name, func name and all that
17 // variant_name → list of owning enum QualifiedNames
18 std::map<std::string, std::vector<sammine_util::QualifiedName>> variant_to_enum;
19 // Track when we're inside an imported definition whose type expressions
20 // need module-qualifying (imported generic functions and imported externs)
21 bool insideImportedDef_ = false;
22 std::string currentImportModule_;
23 // Type params of the current imported generic function (skip qualification)
24 std::vector<std::string> currentGenericTypeParams_;
25 ScopeGeneratorVisitor() {
26 scope_stack.push_context();
27 }
28 void qualify_type_expr(TypeExprAST *expr);
29
30 // INFO: CheckAndReg means: Check if there's redefinition, if not, register
31 // INFO: Check for castable means: Check if the name existed, if not, register
32
33 virtual void enter_new_scope() override { this->scope_stack.push_context(); }
34 virtual void exit_new_scope() override { this->scope_stack.pop_context(); }
35 NameQueryResult can_see(const std::string &symbol) const {
36 return this->scope_stack.recursiveQueryName(symbol);
37 }
38 NameQueryResult can_see_parent(const std::string &symbol) const {
39 const auto *parent_scope = this->scope_stack.parent_scope();
40 return parent_scope->recursiveQueryName(symbol);
41 }
42 void register_name_parent(const std::string &symbol,
44 auto *parent_scope = this->scope_stack.parent_scope();
45 return parent_scope->registerNameT(symbol, loc);
46 }
47 void register_name(const std::string &symbol, sammine_util::Location loc) {
48 return this->scope_stack.registerNameT(symbol, loc);
49 }
50 // pre order
51
52 // INFO: Nothing here
53 virtual void preorder_walk(ProgramAST *ast) override;
54
55 // INFO: CheckAndReg variable name
56 virtual void preorder_walk(VarDefAST *ast) override;
57
58 // Case expressions: arm bodies contain pattern bindings not known at scope-gen time
59 virtual void visit(CaseExprAST *ast) override {
60 ast->scrutinee->accept_vis(this);
61 }
62
63 // Type class decls/instances: skip scope checking for their methods
64 virtual void visit(TypeClassDeclAST *ast) override {}
65 virtual void visit(TypeClassInstanceAST *ast) override {}
66
67 // INFO: CheckAndReg extern name
68 virtual void visit(ExternAST *ast) override;
69 virtual void preorder_walk(ExternAST *ast) override;
70 // INFO: CheckAndReg function name, enter new block
71 virtual void preorder_walk(FuncDefAST *ast) override;
72 virtual void preorder_walk(StructDefAST *ast) override;
73 virtual void preorder_walk(EnumDefAST *ast) override;
74 virtual void preorder_walk(TypeAliasDefAST *ast) override;
75 // INFO: CheckAndReg all variable name, which should only clash if you have
76 // the same names in prototype
77 virtual void preorder_walk(PrototypeAST *ast) override;
78 // INFO: Check
79 virtual void preorder_walk(CallExprAST *ast) override;
80 virtual void preorder_walk(ReturnExprAST *ast) override;
81 virtual void preorder_walk(BinaryExprAST *ast) override;
82 virtual void preorder_walk(NumberExprAST *ast) override;
83 virtual void preorder_walk(StringExprAST *ast) override;
84 virtual void preorder_walk(BoolExprAST *ast) override;
85 virtual void preorder_walk(CharExprAST *ast) override;
86
87 // INFO: Check
88 virtual void preorder_walk(VariableExprAST *ast) override;
89 virtual void preorder_walk(BlockAST *ast) override;
90 virtual void preorder_walk(IfExprAST *ast) override;
91 virtual void preorder_walk(UnitExprAST *ast) override;
92 virtual void preorder_walk(TypedVarAST *ast) override;
93 virtual void preorder_walk(DerefExprAST *ast) override;
94 virtual void preorder_walk(AddrOfExprAST *ast) override;
95 virtual void preorder_walk(AllocExprAST *ast) override;
96 virtual void preorder_walk(FreeExprAST *ast) override;
97 virtual void preorder_walk(ArrayLiteralExprAST *ast) override;
98 virtual void preorder_walk(IndexExprAST *ast) override;
99 virtual void preorder_walk(LenExprAST *ast) override;
100 virtual void preorder_walk(UnaryNegExprAST *ast) override;
101 virtual void preorder_walk(StructLiteralExprAST *ast) override;
102 virtual void preorder_walk(FieldAccessExprAST *ast) override;
103 virtual void preorder_walk(CaseExprAST *ast) override;
104 virtual void preorder_walk(WhileExprAST *ast) override;
105 virtual void preorder_walk(TupleLiteralExprAST *ast) override;
106 virtual void preorder_walk(TypeClassDeclAST *ast) override;
107 virtual void preorder_walk(TypeClassInstanceAST *ast) override;
108
109 // post order
110 virtual void postorder_walk(ProgramAST *ast) override;
111 virtual void postorder_walk(VarDefAST *ast) override;
112 virtual void postorder_walk(ExternAST *ast) override;
113 // INFO: Pop the scope
114 virtual void postorder_walk(FuncDefAST *ast) override;
115 virtual void postorder_walk(StructDefAST *ast) override;
116 virtual void postorder_walk(EnumDefAST *ast) override;
117 virtual void postorder_walk(TypeAliasDefAST *ast) override;
118 virtual void postorder_walk(PrototypeAST *ast) override;
119 virtual void postorder_walk(CallExprAST *ast) override;
120 virtual void postorder_walk(ReturnExprAST *ast) override;
121 virtual void postorder_walk(BinaryExprAST *ast) override;
122 virtual void postorder_walk(NumberExprAST *ast) override;
123 virtual void postorder_walk(StringExprAST *ast) override;
124 virtual void postorder_walk(BoolExprAST *ast) override;
125 virtual void postorder_walk(CharExprAST *ast) override;
126 virtual void postorder_walk(VariableExprAST *ast) override;
127 virtual void postorder_walk(BlockAST *ast) override;
128 virtual void postorder_walk(IfExprAST *ast) override;
129 virtual void postorder_walk(UnitExprAST *ast) override;
130 virtual void postorder_walk(TypedVarAST *ast) override;
131 virtual void postorder_walk(DerefExprAST *ast) override;
132 virtual void postorder_walk(AddrOfExprAST *ast) override;
133 virtual void postorder_walk(AllocExprAST *ast) override;
134 virtual void postorder_walk(FreeExprAST *ast) override;
135 virtual void postorder_walk(ArrayLiteralExprAST *ast) override;
136 virtual void postorder_walk(IndexExprAST *ast) override;
137 virtual void postorder_walk(LenExprAST *ast) override;
138 virtual void postorder_walk(UnaryNegExprAST *ast) override;
139 virtual void postorder_walk(StructLiteralExprAST *ast) override;
140 virtual void postorder_walk(FieldAccessExprAST *ast) override;
141 virtual void postorder_walk(CaseExprAST *ast) override;
142 virtual void postorder_walk(WhileExprAST *ast) override;
143 virtual void postorder_walk(TupleLiteralExprAST *ast) override;
144 virtual void postorder_walk(TypeClassDeclAST *ast) override;
145 virtual void postorder_walk(TypeClassInstanceAST *ast) override;
146};
147
148} // namespace sammine_lang::AST
Defines the AST Abstract class for printing out AST Nodes.
Defined the AST Node classes (ProgramAST, StructDefAST, FuncDefAST) and a visitor interface for trave...
A simple scoping class, doesn't differentiate between different names, like variable name,...
NameQueryResult
NameQueryResult enum.
Definition LexicalContext.h:13
Holds classes and functionalities for dealing with Error handling, source locations caching & indexin...
An AST to simulate a { } code block.
Definition Ast.h:317
Definition Ast.h:485
Definition Ast.h:548
Definition Ast.h:798
Definition Ast.h:495
Definition Ast.h:378
A Function Definition that has the prototype and definition in terms of a block.
Definition Ast.h:291
Definition Ast.h:667
Definition Ast.h:326
Definition Ast.h:598
Definition Ast.h:707
Definition AstBase.h:239
Definition Ast.h:197
A prototype to present "func func_name(...) -> type;".
Definition Ast.h:236
Definition AstBase.h:277
virtual void visit(FuncDefAST *ast)
Definition Ast.cpp:243
Definition Ast.h:205
Definition Ast.h:581
A variable definition: "var x = expression;" or "let (a, b) = expr;".
Definition Ast.h:420
Definition Utilities.h:70