diff options
Diffstat (limited to 'boot/name_analysis.cc')
| -rw-r--r-- | boot/name_analysis.cc | 40 |
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"); |
