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 pathDeclNode.cpp
More file actions
113 lines (97 loc) · 4.37 KB
/
DeclNode.cpp
File metadata and controls
113 lines (97 loc) · 4.37 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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <utility>
#include "AST/DeclNode.h"
#include "Sema/ASTVisitor.h"
VarDeclNode::VarDeclNode() : modifier(VarModifier::Let) {}
VarDeclNode::VarDeclNode(
VarModifier modifier,
const SharedPtr<Type> &type
) : modifier(modifier), type(type) {}
VarDeclNode::VarDeclNode(
VarModifier modifier,
String name,
const SharedPtr<Type> &type
) : modifier(modifier), name(std::move(name)), type(type) {}
VarDeclNode::VarDeclNode(VarModifier modifier,
String name,
const SharedPtr<Type> &type,
const SharedPtr<ExprNode> &initVal
) : modifier(modifier),
name(std::move(name)),
type(type),
initVal(initVal) {}
void VarDeclNode::accept(const SharedPtr<ASTVisitor> &visitor) {
visitor->visit(staticPtrCast<VarDeclNode>(shared_from_this()));
}
void VarDeclNode::bindChildrenInversely() {
auto self = shared_from_this();
if (initVal) {
initVal->parent = self;
}
}
bool VarDeclNode::isConstant() const {
return modifier == VarModifier::Const;
}
ParmVarDeclNode::ParmVarDeclNode(
const SharedPtr<Type> &type
) : VarDeclNode(VarModifier::Param, type) {}
ParmVarDeclNode::ParmVarDeclNode(
const String &name,
const SharedPtr<Type> &type
) : VarDeclNode(VarModifier::Param, name, type) {}
void ParmVarDeclNode::accept(const SharedPtr<ASTVisitor> &visitor) {
visitor->visit(staticPtrCast<ParmVarDeclNode>(shared_from_this()));
}
SharedPtrMap<String, FunctionDeclNode> FunctionDeclNode::getBuiltinFunctions() {
SharedPtrMap<String, FunctionDeclNode> functions;
SharedPtr<ParmVarDeclNode> booleanArg = makeShared<ParmVarDeclNode>(BasicType::BOOLEAN_TYPE);
SharedPtr<ParmVarDeclNode> integerArg = makeShared<ParmVarDeclNode>(BasicType::INTEGER_TYPE);
SharedPtr<ParmVarDeclNode> floatArg = makeShared<ParmVarDeclNode>(BasicType::FLOAT_TYPE);
SharedPtr<ParmVarDeclNode> strArg = makeShared<ParmVarDeclNode>(BasicType::STRING_TYPE);
SharedPtrVector<ParmVarDeclNode> booleanArgs{booleanArg};
SharedPtrVector<ParmVarDeclNode> integerArgs{integerArg};
SharedPtrVector<ParmVarDeclNode> floatArgs{floatArg};
SharedPtrVector<ParmVarDeclNode> strArgs{strArg};
functions["ss_integer2string"] = makeShared<FunctionDeclNode>("ss_integer2string", integerArgs, BasicType::STRING_TYPE);
functions["ss_string2integer"] = makeShared<FunctionDeclNode>("ss_string2integer", strArgs, BasicType::INTEGER_TYPE);
functions["ss_float2string"] = makeShared<FunctionDeclNode>("ss_float2string", floatArgs, BasicType::STRING_TYPE);
functions["ss_string2float"] = makeShared<FunctionDeclNode>("ss_string2float", strArgs, BasicType::FLOAT_TYPE);
functions["ss_print_integer"] = makeShared<FunctionDeclNode>("ss_print_integer", integerArgs);
functions["ss_println_integer"] = makeShared<FunctionDeclNode>("ss_println_integer", integerArgs);
functions["ss_print_float"] = makeShared<FunctionDeclNode>("ss_print_float", floatArgs);
functions["ss_println_float"] = makeShared<FunctionDeclNode>("ss_println_float", floatArgs);
functions["ss_print_string"] = makeShared<FunctionDeclNode>("ss_print_string", strArgs);
functions["ss_println_string"] = makeShared<FunctionDeclNode>("ss_println_string", strArgs);
functions["ss_assert"] = makeShared<FunctionDeclNode>("ss_assert", booleanArgs);
return functions;
}
FunctionDeclNode::FunctionDeclNode(
String name,
const SharedPtrVector<ParmVarDeclNode> ¶ms
) : name(std::move(name)),
params(params) {}
FunctionDeclNode::FunctionDeclNode(
String name,
const SharedPtrVector<ParmVarDeclNode> ¶ms,
const SharedPtr<Type> &returnType
) : name(std::move(name)),
params(params),
returnType(returnType) {}
FunctionDeclNode::FunctionDeclNode(
String name,
const SharedPtrVector<ParmVarDeclNode> ¶ms,
const SharedPtr<Type> &returnType,
const SharedPtr<CompoundStmtNode> &body
) : name(std::move(name)),
params(params),
returnType(returnType),
body(body) {}
void FunctionDeclNode::accept(const SharedPtr<ASTVisitor> &visitor) {
visitor->visit(staticPtrCast<FunctionDeclNode>(shared_from_this()));
}
void FunctionDeclNode::bindChildrenInversely() {
auto self = shared_from_this();
for (const SharedPtr<ParmVarDeclNode> ¶m: params) {
param->parent = self;
}
body->parent = self;
}