From 8d8e771af944796eba10cfa9568d284daaab93a1 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Thu, 9 Jul 2026 09:21:57 +0200 Subject: Implement record extensions --- include/elna/boot/ast.h | 4 +++- include/elna/boot/semantic.h | 12 +++++++++++- include/elna/boot/symbol.h | 5 ++++- 3 files changed, 18 insertions(+), 3 deletions(-) (limited to 'include') diff --git a/include/elna/boot/ast.h b/include/elna/boot/ast.h index 0642d44..6942ca5 100644 --- a/include/elna/boot/ast.h +++ b/include/elna/boot/ast.h @@ -287,8 +287,10 @@ namespace elna::boot { public: const std::vector fields; + const std::optional base; - record_type_expression(const struct position position, std::vector&& fields); + record_type_expression(const struct position position, + std::vector&& fields, std::optional base); void accept(parser_visitor *visitor) override; record_type_expression *is_record() override; diff --git a/include/elna/boot/semantic.h b/include/elna/boot/semantic.h index a0a4a73..6bc7fe0 100644 --- a/include/elna/boot/semantic.h +++ b/include/elna/boot/semantic.h @@ -78,6 +78,16 @@ namespace elna::boot std::string what() const override; }; + class base_type_error : public error + { + const std::string base; + + public: + base_type_error(const std::string& base, const struct position position); + + std::string what() const override; + }; + /** * Checks types. */ @@ -153,7 +163,7 @@ namespace elna::boot void visit(traits_expression *trait) override; void visit(binary_expression *expression) override; void visit(unary_expression *expression) override; - void visit(named_expression *type_expression) override; + void visit(named_expression *expression) override; void visit(array_access_expression *expression) override; void visit(field_access_expression *expression) override; void visit(dereference_expression *expression) override; diff --git a/include/elna/boot/symbol.h b/include/elna/boot/symbol.h index 5ef917e..beb44e2 100644 --- a/include/elna/boot/symbol.h +++ b/include/elna/boot/symbol.h @@ -129,6 +129,9 @@ namespace elna::boot struct record_type { std::vector fields; + const type base; + + explicit record_type(type base = type()); }; struct union_type @@ -143,7 +146,7 @@ namespace elna::boot std::vector parameters; const return_t return_type; - procedure_type(return_t return_type = return_t()); + explicit procedure_type(return_t return_type = return_t()); }; struct enumeration_type -- cgit v1.2.3