aboutsummaryrefslogtreecommitdiff
path: root/boot/ast.cc
diff options
context:
space:
mode:
Diffstat (limited to 'boot/ast.cc')
-rw-r--r--boot/ast.cc33
1 files changed, 33 insertions, 0 deletions
diff --git a/boot/ast.cc b/boot/ast.cc
index 118d92c..36215c1 100644
--- a/boot/ast.cc
+++ b/boot/ast.cc
@@ -114,6 +114,11 @@ namespace elna::boot
__builtin_unreachable();
}
+ void empty_visitor::visit(record_constructor_expression *)
+ {
+ __builtin_unreachable();
+ }
+
void empty_visitor::visit(traits_expression *)
{
__builtin_unreachable();
@@ -403,6 +408,14 @@ namespace elna::boot
expression->target().accept(this);
}
+ void walking_visitor::visit(record_constructor_expression *expression)
+ {
+ for (const field_initializer& initializer : expression->field_initializers)
+ {
+ initializer.value->accept(this);
+ }
+ }
+
void walking_visitor::visit(traits_expression *trait)
{
if (!trait->parameters.empty())
@@ -623,6 +636,26 @@ namespace elna::boot
return this;
}
+ record_constructor_expression::record_constructor_expression(const struct position position,
+ std::string&& type_name,
+ std::vector<field_initializer>&& field_initializers)
+ : node(position), type_name(std::move(type_name)), field_initializers(std::move(field_initializers))
+ {
+ }
+
+ void record_constructor_expression::accept(parser_visitor *visitor)
+ {
+ visitor->visit(this);
+ }
+
+ record_constructor_expression::~record_constructor_expression()
+ {
+ for (const field_initializer& initializer : field_initializers)
+ {
+ delete initializer.value;
+ }
+ }
+
variable_declaration::variable_declaration(const struct position position,
std::vector<identifier_definition>&& identifier, std::shared_ptr<type_expression> variable_type,
expression *initializer)