From 44d6e8a27294e5ca7300ab11900011b73d9336d4 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Tue, 21 Jul 2026 01:55:56 +0200 Subject: Implement slices --- boot/name_analysis.cc | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'boot/name_analysis.cc') 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()) + { + if (field_name == "length") + { + return lookup_primitive_type("Word"); + } + else if (field_name == "ptr") + { + return type(std::make_shared(slice->base)); + } + } else if (auto primitive = resolved_type.get(); primitive != nullptr && primitive->identifier == "String") { if (field_name == "length") @@ -209,6 +220,12 @@ namespace elna::boot this->current_type = type(std::make_shared(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(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(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()) + { + expression->type_decoration = type(std::make_shared(pointer->base)); + } + else if (auto array = resolved_base.get()) + { + expression->type_decoration = type(std::make_shared(array->base)); + } + else if (auto slice = resolved_base.get()) + { + expression->type_decoration = type(slice); + } + } + void name_analysis_visitor::visit(procedure_type_expression *expression) { std::shared_ptr 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()) + { + expression->type_decoration = slice->base; + } else if (resolved_base == lookup_primitive_type("String")) { expression->type_decoration = lookup_primitive_type("Char"); -- cgit v1.2.3