44
55#include " cinder/ast/ast_node.hpp"
66#include " cinder/ast/ast_visitor.hpp"
7+ #include " cinder/type/types.hpp"
78namespace cinder ::ast {
89class Expr : public ASTNode {
910 public:
11+ enum class ExprKind : std::uint8_t {
12+ Error,
13+ IntegerLiteral,
14+ StringLiteral,
15+ BinaryExpr,
16+ UnaryExpr,
17+ MemberExpr,
18+ DeclRefExpr,
19+ CallExpr,
20+ SubscriptExpr,
21+ CastExpr
22+ };
1023 enum class ValueKind : std::uint8_t { LValue, RValue };
1124
12- explicit Expr (common::Span span) : ASTNode(span) {}
25+ explicit Expr (ExprKind kind, common::Span span) : ASTNode(span), kind_(kind) {}
26+
27+ void set_type (const type::QualType type) { type_ = type; }
28+ ExprKind kind () const { return kind_; }
29+ bool is_lvalue () const { return value_kind_ == ValueKind::LValue; }
1330
1431 private:
32+ std::optional<type::QualType> type_ = std::nullopt ;
1533 ValueKind value_kind_ = ValueKind::RValue;
34+ ExprKind kind_;
1635};
1736
1837class ErrorExpr final : public Expr {
1938 public:
20- explicit ErrorExpr (common::Span span) : Expr(span) {}
21- void accept (ASTVisitor& visitor) override {
22- visitor.visit (*this );
23- }
39+ explicit ErrorExpr (common::Span span) : Expr(ExprKind::Error, span) {}
40+ void accept (ASTVisitor& visitor) override { visitor.visit (*this ); }
2441};
2542
2643class IntegerLiteralExpr final : public Expr {
2744 public:
2845 explicit IntegerLiteralExpr (std::string_view lexeme, common::Span span)
29- : Expr(span), lexeme_(lexeme) {}
30- void accept (ASTVisitor& visitor) override {
31- visitor.visit (*this );
32- }
46+ : Expr(ExprKind::IntegerLiteral, span), lexeme_(lexeme) {}
47+ void accept (ASTVisitor& visitor) override { visitor.visit (*this ); }
3348
34- [[nodiscard]] std::string_view lexeme () const {
35- return lexeme_;
36- }
49+ [[nodiscard]] std::string_view lexeme () const { return lexeme_; }
3750
3851 private:
3952 std::string_view lexeme_;
@@ -42,14 +55,10 @@ class IntegerLiteralExpr final : public Expr {
4255class StringLiteralExpr final : public Expr {
4356 public:
4457 explicit StringLiteralExpr (std::string_view lexeme, common::Span span)
45- : Expr(span), lexeme_(lexeme) {}
46- void accept (ASTVisitor& visitor) override {
47- visitor.visit (*this );
48- }
58+ : Expr(ExprKind::StringLiteral, span), lexeme_(lexeme) {}
59+ void accept (ASTVisitor& visitor) override { visitor.visit (*this ); }
4960
50- [[nodiscard]] std::string_view lexeme () const {
51- return lexeme_;
52- }
61+ [[nodiscard]] std::string_view lexeme () const { return lexeme_; }
5362
5463 private:
5564 std::string_view lexeme_;
@@ -102,21 +111,13 @@ class BinaryExpr final : public Expr {
102111
103112 };
104113 explicit BinaryExpr (Expr* lhs, Expr* rhs, BinaryOp operation, common::Span span)
105- : Expr(span), lhs_(lhs), rhs_(rhs), operation_(operation) {}
106- void accept (ASTVisitor& visitor) override {
107- visitor.visit (*this );
108- }
109-
110- [[nodiscard]] ast::Expr* lhs () const {
111- return lhs_;
112- }
113- [[nodiscard]] ast::Expr* rhs () const {
114- return rhs_;
115- }
116-
117- [[nodiscard]] BinaryOp operation () const {
118- return operation_;
119- }
114+ : Expr(ExprKind::BinaryExpr, span), lhs_(lhs), rhs_(rhs), operation_(operation) {}
115+ void accept (ASTVisitor& visitor) override { visitor.visit (*this ); }
116+
117+ [[nodiscard]] ast::Expr* lhs () const { return lhs_; }
118+ [[nodiscard]] ast::Expr* rhs () const { return rhs_; }
119+
120+ [[nodiscard]] BinaryOp operation () const { return operation_; }
120121
121122 private:
122123 Expr* lhs_;
@@ -141,19 +142,13 @@ class UnaryExpr final : public Expr {
141142 SizeOf
142143 };
143144 explicit UnaryExpr (UnaryOp operation, Expr* base, common::Span span)
144- : Expr(span), operation_(operation), base_(base) {}
145+ : Expr(ExprKind::UnaryExpr, span), operation_(operation), base_(base) {}
145146
146- void accept (ASTVisitor& visitor) override {
147- visitor.visit (*this );
148- }
147+ void accept (ASTVisitor& visitor) override { visitor.visit (*this ); }
149148
150- [[nodiscard]] UnaryOp operation () const {
151- return operation_;
152- }
149+ [[nodiscard]] UnaryOp operation () const { return operation_; }
153150
154- [[nodiscard]] Expr* base () const {
155- return base_;
156- }
151+ [[nodiscard]] Expr* base () const { return base_; }
157152
158153 private:
159154 UnaryOp operation_;
@@ -163,23 +158,15 @@ class UnaryExpr final : public Expr {
163158class MemberExpr final : public Expr {
164159 public:
165160 explicit MemberExpr (Expr* base, std::string_view member, bool is_arrow, common::Span span)
166- : Expr(span), base_(base), member_(member), is_arrow_(is_arrow) {}
161+ : Expr(ExprKind::MemberExpr, span), base_(base), member_(member), is_arrow_(is_arrow) {}
167162
168- void accept (ASTVisitor& visitor) override {
169- visitor.visit (*this );
170- }
163+ void accept (ASTVisitor& visitor) override { visitor.visit (*this ); }
171164
172- [[nodiscard]] Expr* base () const {
173- return base_;
174- }
165+ [[nodiscard]] Expr* base () const { return base_; }
175166
176- [[nodiscard]] std::string_view member () const {
177- return member_;
178- }
167+ [[nodiscard]] std::string_view member () const { return member_; }
179168
180- [[nodiscard]] bool is_arrow () const {
181- return is_arrow_;
182- }
169+ [[nodiscard]] bool is_arrow () const { return is_arrow_; }
183170
184171 private:
185172 Expr* base_;
@@ -190,19 +177,13 @@ class MemberExpr final : public Expr {
190177class SubscriptExpr final : public Expr {
191178 public:
192179 explicit SubscriptExpr (Expr* base, Expr* index, common::Span span)
193- : Expr(span), base_(base), index_(index) {}
180+ : Expr(ExprKind::SubscriptExpr, span), base_(base), index_(index) {}
194181
195- void accept (ASTVisitor& visitor) override {
196- visitor.visit (*this );
197- }
182+ void accept (ASTVisitor& visitor) override { visitor.visit (*this ); }
198183
199- [[nodiscard]] Expr* base () const {
200- return base_;
201- }
184+ [[nodiscard]] Expr* base () const { return base_; }
202185
203- [[nodiscard]] Expr* index () const {
204- return index_;
205- }
186+ [[nodiscard]] Expr* index () const { return index_; }
206187
207188 private:
208189 Expr* base_;
@@ -212,19 +193,13 @@ class SubscriptExpr final : public Expr {
212193class CallExpr final : public Expr {
213194 public:
214195 explicit CallExpr (std::vector<Expr*> parameters, Expr* to_call, common::Span span)
215- : Expr(span), to_call_(to_call), parameters_(std::move(parameters)) {}
196+ : Expr(ExprKind::CallExpr, span), to_call_(to_call), parameters_(std::move(parameters)) {}
216197
217- [[nodiscard]] std::vector<ast::Expr*> parameters () const {
218- return parameters_;
219- }
198+ [[nodiscard]] std::vector<ast::Expr*> parameters () const { return parameters_; }
220199
221- [[nodiscard]] Expr* to_call () const {
222- return to_call_;
223- }
200+ [[nodiscard]] Expr* to_call () const { return to_call_; }
224201
225- void accept (ASTVisitor& visitor) override {
226- visitor.visit (*this );
227- }
202+ void accept (ASTVisitor& visitor) override { visitor.visit (*this ); }
228203
229204 private:
230205 Expr* to_call_;
@@ -233,17 +208,17 @@ class CallExpr final : public Expr {
233208
234209class DeclRefExpr final : public Expr {
235210 public:
236- explicit DeclRefExpr (std::string_view name, common::Span span) : Expr(span), name_(name) {}
211+ explicit DeclRefExpr (std::string_view name, common::Span span)
212+ : Expr(ExprKind::DeclRefExpr, span), name_(name) {}
213+
214+ void accept (ASTVisitor& visitor) override { visitor.visit (*this ); }
237215
238- void accept (ASTVisitor& visitor) override {
239- visitor.visit (*this );
240- }
216+ [[nodiscard]] std::string_view name () const { return name_; }
241217
242- [[nodiscard]] std::string_view name () const {
243- return name_;
244- }
218+ void set_reference (ast::Decl* decl) { reference_ = decl; }
245219
246220 private:
247221 std::string_view name_;
222+ ast::Decl* reference_;
248223};
249224} // namespace cinder::ast
0 commit comments