Skip to content

Commit 20485ce

Browse files
committed
feat(Sema): Added basic declaration tracking and lvalue rvalue check for binops and basic sema scaffolding
1 parent 5200c12 commit 20485ce

19 files changed

Lines changed: 617 additions & 255 deletions

File tree

.clang-format

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ IndentWidth: 2
33
ColumnLimit: 100
44
BreakBeforeBraces: Attach
55
AllowShortIfStatementsOnASingleLine: true
6-
AllowShortFunctionsOnASingleLine: true
6+
AllowShortFunctionsOnASingleLine: All
77
PointerAlignment: Left

.clang-tidy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ Checks: >
88
WarningsAsErrors: ""
99
HeaderFilterRegex: "src/|include/"
1010
FormatStyle: file
11-
Add: [-std=c++20]
11+
Add: [-std=c++23]

include/cinder/ast/decl.hpp

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,23 +27,39 @@ class TranslationUnit final : public ASTNode {
2727
};
2828
class Decl : public ASTNode {
2929
public:
30-
explicit Decl(common::Span span) : ASTNode(span) {}
30+
enum class DeclKind { Named, Record, Function, Var, Error, Field };
31+
explicit Decl(common::Span span, DeclKind kind) : ASTNode(span), kind_(kind) {}
32+
33+
[[nodiscard]] DeclKind kind() const { return kind_; }
34+
35+
private:
36+
DeclKind kind_;
37+
};
38+
39+
class NamedDecl : public Decl {
40+
public:
41+
explicit NamedDecl(std::string_view name, DeclKind kind, common::Span span)
42+
: Decl(span, kind), name_(name) {}
43+
std::string_view name() const { return name_; }
44+
45+
private:
46+
std::string_view name_;
3147
};
3248

3349
class ErrorDecl final : public Decl {
3450
public:
35-
explicit ErrorDecl(common::Span span) : Decl(span) {}
51+
explicit ErrorDecl(common::Span span) : Decl(span, DeclKind::Error) {}
3652

3753
void accept(ASTVisitor& visitor) override { visitor.visit(*this); }
3854
};
3955

40-
class FunctionDecl final : public Decl {
56+
class FunctionDecl final : public NamedDecl {
4157
public:
4258
explicit FunctionDecl(std::string_view name, type::QualType return_type,
4359
std::vector<type::QualType> params, ast::CompoundStmt* body,
4460
StorageClass storage_class, bool is_inline, bool is_noreturn,
4561
common::Span span)
46-
: Decl(span),
62+
: NamedDecl(name, DeclKind::Function, span),
4763
name_(name),
4864
return_type_(return_type),
4965
body_(body),
@@ -80,7 +96,7 @@ class FunctionDecl final : public Decl {
8096
class TypedefDecl final : public Decl {
8197
public:
8298
explicit TypedefDecl(std::string_view name, type::QualType alias, common::Span span)
83-
: Decl(span), name_(name), alias_(alias) {}
99+
: Decl(span, DeclKind::Named), name_(name), alias_(alias) {}
84100

85101
void accept(ASTVisitor& visitor) override { visitor.visit(*this); }
86102

@@ -93,13 +109,13 @@ class TypedefDecl final : public Decl {
93109
type::QualType alias_;
94110
};
95111

96-
class ParamDecl : public Decl {};
112+
class ParamDecl : public NamedDecl {};
97113

98-
class VarDecl final : public Decl {
114+
class VarDecl final : public NamedDecl {
99115
public:
100116
explicit VarDecl(std::string_view name, std::optional<Expr*> initializer, type::QualType type,
101117
StorageClass storage_class, common::Span span)
102-
: Decl(span),
118+
: NamedDecl(name, DeclKind::Var, span),
103119
name_(name),
104120
initializer_(initializer),
105121
type_(type),
@@ -122,10 +138,12 @@ class VarDecl final : public Decl {
122138
StorageClass storage_class_;
123139
};
124140

141+
class RecordDecl final : public NamedDecl {};
142+
125143
class FieldDecl final : public Decl {
126144
public:
127145
explicit FieldDecl(std::string_view name, type::QualType type, common::Span span)
128-
: Decl(span), name_(name), type_(type) {}
146+
: Decl(span, DeclKind::Field), name_(name), type_(type) {}
129147

130148
void accept(ASTVisitor& visitor) override { visitor.visit(*this); }
131149

include/cinder/ast/expr.hpp

Lines changed: 59 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -4,36 +4,49 @@
44

55
#include "cinder/ast/ast_node.hpp"
66
#include "cinder/ast/ast_visitor.hpp"
7+
#include "cinder/type/types.hpp"
78
namespace cinder::ast {
89
class 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

1837
class 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

2643
class 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 {
4255
class 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 {
163158
class 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 {
190177
class 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 {
212193
class 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

234209
class 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

Comments
 (0)