This repository was archived by the owner on Jan 8, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathScope.cpp
More file actions
74 lines (57 loc) · 1.93 KB
/
Scope.cpp
File metadata and controls
74 lines (57 loc) · 1.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include "Entity/Scope.h"
void Scope::addChild(const SharedPtr<LocalScope> &scope) {
children.push_back(scope);
}
void Scope::addVariable(const String &varName, const SharedPtr<VarDeclNode> &varDecl) {
variables[varName] = varDecl;
}
bool Scope::hasVariable(const String &varName) {
return mapFind(variables, varName) != nullptr;
}
SharedPtr<TopLevelScope> TopLevelScope::create() {
return makeShared<TopLevelScope>();
}
bool TopLevelScope::isTopLevel() {
return true;
}
SharedPtr<Scope> TopLevelScope::getParent() {
return nullptr;
}
SharedPtr<TopLevelScope> TopLevelScope::getTopLevel() {
return staticPtrCast<TopLevelScope>(shared_from_this());
}
void TopLevelScope::addFunction(const String &funcName, const SharedPtr<FunctionDeclNode> &funcDecl) {
functions[funcName] = funcDecl;
}
SharedPtr<VarDeclNode> TopLevelScope::resolveVariable(const String &name) {
return mapFind(variables, name);
}
SharedPtr<FunctionDeclNode> TopLevelScope::resolveFunction(const String &name) {
SharedPtr<FunctionDeclNode> function = mapFind(functions, name);
if (!function) {
return mapFind(libFunctions, name);
}
return function;
}
bool TopLevelScope::hasFunction(const String &name) {
return resolveFunction(name) != nullptr;
}
SharedPtr<LocalScope> LocalScope::create(const SharedPtr<Scope> &parent) {
const SharedPtr<LocalScope> &localScope = makeShared<LocalScope>(parent);
parent->addChild(localScope);
return localScope;
}
LocalScope::LocalScope(const SharedPtr<Scope> &parent) : parent(parent) {}
bool LocalScope::isTopLevel() {
return false;
}
SharedPtr<TopLevelScope> LocalScope::getTopLevel() {
return parent->getTopLevel();
}
SharedPtr<Scope> LocalScope::getParent() {
return parent;
}
SharedPtr<VarDeclNode> LocalScope::resolveVariable(const String &name) {
auto variable = mapFind(variables, name);
return variable ? variable : parent->resolveVariable(name);
}