aboutsummaryrefslogtreecommitdiff
path: root/boot/name_analysis.cc
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2026-07-21 01:55:56 +0200
committerEugen Wissner <belka@caraus.de>2026-07-21 01:55:56 +0200
commit44d6e8a27294e5ca7300ab11900011b73d9336d4 (patch)
treed21addb0dec93fa8fa376bbd11076b17f3412173 /boot/name_analysis.cc
parent6b131c925dee7a5f97516edd581e051e08bb52d8 (diff)
downloadelna-44d6e8a27294e5ca7300ab11900011b73d9336d4.tar.gz
Implement slices
Diffstat (limited to 'boot/name_analysis.cc')
-rw-r--r--boot/name_analysis.cc40
1 files changed, 40 insertions, 0 deletions
diff --git a/boot/name_analysis.cc b/boot/name_analysis.cc
index 54a2d1a..a2cacb2 100644
--- a/boot/name_analysis.cc
+++ b/boot/name_analysis.cc
@@ -156,6 +156,17 @@ namespace elna::boot
return lookup_field(record->base, field_name);
}
}
+ else if (auto slice = resolved_type.get<slice_type>())
+ {
+ if (field_name == "length")
+ {
+ return lookup_primitive_type("Word");
+ }
+ else if (field_name == "ptr")
+ {
+ return type(std::make_shared<pointer_type>(slice->base));
+ }
+ }
else if (auto primitive = resolved_type.get<primitive_type>(); primitive != nullptr && primitive->identifier == "String")
{
if (field_name == "length")
@@ -209,6 +220,12 @@ namespace elna::boot
this->current_type = type(std::make_shared<array_type>(this->current_type, expression->size));
}
+ void name_analysis_visitor::visit(slice_type_expression *expression)
+ {
+ walking_visitor::visit(expression);
+ this->current_type = type(std::make_shared<slice_type>(this->current_type));
+ }
+
/**
* Collects field names from a record type recursively, base first.
*/
@@ -358,6 +375,25 @@ namespace elna::boot
expression->type_decoration = type(std::make_shared<array_type>(element_type, expression->size));
}
+ void name_analysis_visitor::visit(slicing_expression *expression)
+ {
+ walking_visitor::visit(expression);
+ auto resolved_base = resolve_underlying_type(expression->base().type_decoration);
+
+ if (auto pointer = resolved_base.get<pointer_type>())
+ {
+ expression->type_decoration = type(std::make_shared<slice_type>(pointer->base));
+ }
+ else if (auto array = resolved_base.get<array_type>())
+ {
+ expression->type_decoration = type(std::make_shared<slice_type>(array->base));
+ }
+ else if (auto slice = resolved_base.get<slice_type>())
+ {
+ expression->type_decoration = type(slice);
+ }
+ }
+
void name_analysis_visitor::visit(procedure_type_expression *expression)
{
std::shared_ptr<procedure_type> const result_type =
@@ -613,6 +649,10 @@ for (const auto& member : expression->members)
{
expression->type_decoration = array->base;
}
+ else if (auto slice = resolved_base.get<slice_type>())
+ {
+ expression->type_decoration = slice->base;
+ }
else if (resolved_base == lookup_primitive_type("String"))
{
expression->type_decoration = lookup_primitive_type("Char");