Line data Source code
1 : #ifndef MONOMORPHIZE_H
2 : #define MONOMORPHIZE_H
3 :
4 : #include "../../tables/functionTable/functionTable.h"
5 : #include "../../tables/scope/scope.h"
6 : #include "../../tables/typeTable/typeTable.h"
7 : #include "../visitor.h"
8 : #include <memory>
9 : #include <variant>
10 : #include <vector>
11 :
12 : namespace nicole {
13 :
14 : class Monomorphize final : public Visitor<std::monostate> {
15 : private:
16 : mutable std::shared_ptr<FunctionTable> functionTable_;
17 : mutable std::shared_ptr<TypeTable> typeTable_;
18 :
19 : public:
20 : Monomorphize(
21 : const std::shared_ptr<FunctionTable> &functionTable,
22 : std::shared_ptr<TypeTable> &typeTable) noexcept
23 0 : : functionTable_{functionTable},
24 0 : typeTable_{typeTable} {}
25 :
26 : [[nodiscard]] std::expected<std::monostate, Error>
27 : visit(const AST_BOOL *node) const noexcept override;
28 :
29 : [[nodiscard]] std::expected<std::monostate, Error>
30 : visit(const AST_CHAR *node) const noexcept override;
31 :
32 : [[nodiscard]] std::expected<std::monostate, Error>
33 : visit(const AST_DOUBLE *node) const noexcept override;
34 :
35 : [[nodiscard]] std::expected<std::monostate, Error>
36 : visit(const AST_FLOAT *node) const noexcept override;
37 :
38 : [[nodiscard]] std::expected<std::monostate, Error>
39 : visit(const AST_INT *node) const noexcept override;
40 :
41 : [[nodiscard]] std::expected<std::monostate, Error>
42 : visit(const AST_NULL *node) const noexcept override;
43 :
44 : [[nodiscard]] std::expected<std::monostate, Error>
45 : visit(const AST_STRING *node) const noexcept override;
46 :
47 : [[nodiscard]] std::expected<std::monostate, Error>
48 : visit(const AST_VECTOR *node) const noexcept override;
49 :
50 : [[nodiscard]] std::expected<std::monostate, Error>
51 : visit(const AST_INDEX *node) const noexcept override;
52 :
53 : [[nodiscard]] std::expected<std::monostate, Error>
54 : visit(const AST_DELETE *node) const noexcept override;
55 :
56 : [[nodiscard]] std::expected<std::monostate, Error>
57 : visit(const AST_NEW *node) const noexcept override;
58 :
59 : [[nodiscard]] std::expected<std::monostate, Error>
60 : visit(const AST_DEREF *node) const noexcept override;
61 :
62 : [[nodiscard]] std::expected<std::monostate, Error>
63 : visit(const AST_BINARY *node) const noexcept override;
64 :
65 : [[nodiscard]] std::expected<std::monostate, Error>
66 : visit(const AST_UNARY *node) const noexcept override;
67 :
68 : [[nodiscard]] std::expected<std::monostate, Error>
69 : visit(const AST_ASSIGNMENT *node) const noexcept override;
70 :
71 : [[nodiscard]] std::expected<std::monostate, Error>
72 : visit(const AST_PRINT *node) const noexcept override;
73 :
74 : [[nodiscard]] std::expected<std::monostate, Error>
75 : visit(const AST_IMPORT *node) const noexcept override;
76 :
77 : [[nodiscard]] std::expected<std::monostate, Error>
78 : visit(const AST_STATEMENT *node) const noexcept override;
79 :
80 : [[nodiscard]] std::expected<std::monostate, Error>
81 : visit(const AST_BODY *node) const noexcept override;
82 :
83 : [[nodiscard]] std::expected<std::monostate, Error>
84 : visit(const AST_WHILE *node) const noexcept override;
85 :
86 : [[nodiscard]] std::expected<std::monostate, Error>
87 : visit(const AST_FOR *node) const noexcept override;
88 :
89 : [[nodiscard]] std::expected<std::monostate, Error>
90 : visit(const AST_DO_WHILE *node) const noexcept override;
91 :
92 : [[nodiscard]] std::expected<std::monostate, Error>
93 : visit(const AST_PASS *node) const noexcept override;
94 :
95 : [[nodiscard]] std::expected<std::monostate, Error>
96 : visit(const AST_STOP *node) const noexcept override;
97 :
98 : [[nodiscard]] std::expected<std::monostate, Error>
99 : visit(const AST_IF *node) const noexcept override;
100 :
101 : [[nodiscard]] std::expected<std::monostate, Error>
102 : visit(const AST_ELSE_IF *node) const noexcept override;
103 :
104 : [[nodiscard]] std::expected<std::monostate, Error>
105 : visit(const AST_SWITCH *node) const noexcept override;
106 :
107 : [[nodiscard]] std::expected<std::monostate, Error>
108 : visit(const AST_CASE *node) const noexcept override;
109 :
110 : [[nodiscard]] std::expected<std::monostate, Error>
111 : visit(const AST_DEFAULT *node) const noexcept override;
112 :
113 : [[nodiscard]] std::expected<std::monostate, Error>
114 : visit(const AST_TERNARY *node) const noexcept override;
115 :
116 : [[nodiscard]] std::expected<std::monostate, Error>
117 : visit(const AST_CONDITION *node) const noexcept override;
118 :
119 : [[nodiscard]] std::expected<std::monostate, Error>
120 : visit(const AST_FUNC_CALL *node) const noexcept override;
121 :
122 : [[nodiscard]] std::expected<std::monostate, Error>
123 : visit(const AST_FUNC_DECL *node) const noexcept override;
124 :
125 : [[nodiscard]] std::expected<std::monostate, Error>
126 : visit(const AST_RETURN *node) const noexcept override;
127 :
128 : [[nodiscard]] std::expected<std::monostate, Error>
129 : visit(const AST_ENUM *node) const noexcept override;
130 :
131 : [[nodiscard]] std::expected<std::monostate, Error>
132 : visit(const AST_ENUM_ACCESS *node) const noexcept override;
133 :
134 : [[nodiscard]] std::expected<std::monostate, Error>
135 : visit(const AST_STRUCT *node) const noexcept override;
136 :
137 : [[nodiscard]] std::expected<std::monostate, Error>
138 : visit(const AST_ATTR_ACCESS *node) const noexcept override;
139 :
140 : [[nodiscard]] std::expected<std::monostate, Error>
141 : visit(const AST_METHOD_CALL *node) const noexcept override;
142 :
143 : [[nodiscard]] std::expected<std::monostate, Error>
144 : visit(const AST_METHOD_DECL *node) const noexcept override;
145 :
146 : [[nodiscard]] std::expected<std::monostate, Error>
147 : visit(const AST_CONSTRUCTOR_DECL *node) const noexcept override;
148 :
149 : [[nodiscard]] std::expected<std::monostate, Error>
150 : visit(const AST_SUPER *node) const noexcept override;
151 :
152 : [[nodiscard]] std::expected<std::monostate, Error>
153 : visit(const AST_DESTRUCTOR_DECL *node) const noexcept override;
154 :
155 : [[nodiscard]] std::expected<std::monostate, Error>
156 : visit(const AST_THIS *node) const noexcept override;
157 :
158 : [[nodiscard]] std::expected<std::monostate, Error>
159 : visit(const AST_CONSTRUCTOR_CALL *node) const noexcept override;
160 :
161 : [[nodiscard]] std::expected<std::monostate, Error>
162 : visit(const AST_AUTO_DECL *node) const noexcept override;
163 :
164 : [[nodiscard]] std::expected<std::monostate, Error>
165 : visit(const AST_VAR_TYPED_DECL *node) const noexcept override;
166 :
167 : [[nodiscard]] std::expected<std::monostate, Error>
168 : visit(const AST_VAR_CALL *node) const noexcept override;
169 :
170 : [[nodiscard]] std::expected<std::monostate, Error>
171 : visit(const AST_CHAINED *node) const noexcept override;
172 :
173 : [[nodiscard]] std::expected<std::monostate, Error>
174 : visit(const Tree *tree) const noexcept override;
175 :
176 : [[nodiscard]] std::expected<std::monostate, Error>
177 0 : transform(const Tree *tree) const noexcept {
178 0 : return visit(tree);
179 0 : }
180 : };
181 :
182 : } // namespace nicole
183 :
184 : #endif
|