aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2026-07-13 23:59:36 +0200
committerEugen Wissner <belka@caraus.de>2026-07-13 23:59:36 +0200
commit8ceb48a4e60b8ff89f28372da4f66cd152e2e0fe (patch)
treeb5e5522c47de3a7f62cd51a3258bfec7e99c062e /include
parent500c0676b3f6cd5a2297987d5b0dc7ccf34a28d9 (diff)
downloadelna-8ceb48a4e60b8ff89f28372da4f66cd152e2e0fe.tar.gz
Change record constructor syntax
Diffstat (limited to 'include')
-rw-r--r--include/elna/boot/ast.h25
-rw-r--r--include/elna/boot/semantic.h6
-rw-r--r--include/elna/gcc/elna-generic.h1
3 files changed, 28 insertions, 4 deletions
diff --git a/include/elna/boot/ast.h b/include/elna/boot/ast.h
index ab79c30..67e9fbe 100644
--- a/include/elna/boot/ast.h
+++ b/include/elna/boot/ast.h
@@ -60,6 +60,8 @@ namespace elna::boot
class type_declaration;
class procedure_call;
class cast_expression;
+ class record_constructor_expression;
+ struct field_initializer;
class assign_statement;
class if_statement;
class import_declaration;
@@ -97,6 +99,7 @@ namespace elna::boot
virtual void visit(type_declaration *) = 0;
virtual void visit(procedure_call *) = 0;
virtual void visit(cast_expression *) = 0;
+ virtual void visit(record_constructor_expression *) = 0;
virtual void visit(traits_expression *) = 0;
virtual void visit(assign_statement *) = 0;
virtual void visit(if_statement *) = 0;
@@ -152,6 +155,7 @@ namespace elna::boot
[[noreturn]] virtual void visit(procedure_call *) override;
[[noreturn]] virtual void visit(unit *) override;
[[noreturn]] virtual void visit(cast_expression *) override;
+ [[noreturn]] virtual void visit(record_constructor_expression *) override;
[[noreturn]] virtual void visit(traits_expression *) override;
[[noreturn]] virtual void visit(binary_expression *) override;
[[noreturn]] virtual void visit(unary_expression *) override;
@@ -194,6 +198,7 @@ namespace elna::boot
virtual void visit(procedure_call *call) override;
virtual void visit(unit *unit) override;
virtual void visit(cast_expression *expression) override;
+ virtual void visit(record_constructor_expression *expression) override;
virtual void visit(traits_expression *trait) override;
virtual void visit(binary_expression *expression) override;
virtual void visit(unary_expression *expression) override;
@@ -325,6 +330,26 @@ namespace elna::boot
record_type_expression *is_record() override;
};
+ struct field_initializer
+ {
+ std::string name;
+ expression *value;
+ };
+
+ class record_constructor_expression : public expression
+ {
+ public:
+ const std::string type_name;
+ const std::vector<field_initializer> field_initializers;
+
+ record_constructor_expression(const struct position position,
+ std::string&& type_name,
+ std::vector<field_initializer>&& field_initializers);
+ void accept(parser_visitor *visitor) override;
+
+ virtual ~record_constructor_expression() override;
+ };
+
/**
* Enumeration type.
*/
diff --git a/include/elna/boot/semantic.h b/include/elna/boot/semantic.h
index 1e81ebb..5ef4bc8 100644
--- a/include/elna/boot/semantic.h
+++ b/include/elna/boot/semantic.h
@@ -150,10 +150,6 @@ namespace elna::boot
bool check_unresolved_symbol(std::shared_ptr<alias_type> alias,
std::vector<std::string>& path);
- std::size_t match_record_fields(const std::shared_ptr<record_type>& record,
- std::vector<expression *>::const_iterator& argument_it,
- const std::vector<expression *>::const_iterator& argument_end);
-
public:
explicit type_analysis_visitor(symbol_bag bag);
@@ -165,6 +161,7 @@ namespace elna::boot
void visit(record_type_expression *expression) override;
void visit(procedure_call *call) override;
void visit(case_statement *statement) override;
+ void visit(record_constructor_expression *expression) override;
};
/**
@@ -195,6 +192,7 @@ namespace elna::boot
void visit(pointer_type_expression *expression) override;
void visit(type_declaration *declaration) override;
void visit(record_type_expression *expression) override;
+ void visit(record_constructor_expression *expression) override;
void visit(procedure_type_expression *expression) override;
void visit(enumeration_type_expression *expression) override;
diff --git a/include/elna/gcc/elna-generic.h b/include/elna/gcc/elna-generic.h
index 2fe4d48..f30f9d6 100644
--- a/include/elna/gcc/elna-generic.h
+++ b/include/elna/gcc/elna-generic.h
@@ -83,6 +83,7 @@ namespace elna::gcc
void visit(boot::field_access_expression *expression) override;
void visit(boot::dereference_expression *expression) override;
void visit(boot::unit *unit) override;
+ void visit(boot::record_constructor_expression *expression) override;
void visit(boot::assign_statement *statement) override;
void visit(boot::if_statement *statement) override;
void visit(boot::import_declaration *) override;