diff options
| author | Eugen Wissner <belka@caraus.de> | 2026-08-02 00:45:05 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2026-08-02 00:45:05 +0200 |
| commit | c07c43bf911f62ad6363c024b3f81ceb4f95b16c (patch) | |
| tree | d536b942ecede49741c090e61337947a26fbe030 /boot/evaluator.cc | |
| parent | e9cd3e5d0157f145dc0c3fea59f434fdd5ae55c6 (diff) | |
| download | elna-c07c43bf911f62ad6363c024b3f81ceb4f95b16c.tar.gz | |
Report field access errors
Diffstat (limited to 'boot/evaluator.cc')
| -rw-r--r-- | boot/evaluator.cc | 42 |
1 files changed, 20 insertions, 22 deletions
diff --git a/boot/evaluator.cc b/boot/evaluator.cc index afa72db..097b6a5 100644 --- a/boot/evaluator.cc +++ b/boot/evaluator.cc @@ -283,32 +283,29 @@ namespace elna::boot auto resolved_base = resolve_underlying_type(type_to_check); if (auto enumeration = resolved_base.get<enumeration_type>()) { - auto member_iterator = std::ranges::find(enumeration->members, subject.field().name()); - if (member_iterator != enumeration->members.end()) - { - auto enumeration_position = std::distance(enumeration->members.begin(), member_iterator) + 1; - return constant_value{ - integer_literal::from(static_cast<std::size_t>(enumeration_position)) - }; - } - return std::nullopt; - } - auto base = evaluate(subject.base()); - if (!base.has_value()) - { - return std::nullopt; + auto enumeration_position = std::distance(enumeration->members.begin(), + std::ranges::find(enumeration->members, subject.field().name())); + + return constant_value{ + integer_literal::from(static_cast<std::size_t>(enumeration_position + 1)) + }; } - auto *record = std::get_if<constant_aggregate<ordered_map>>(&base.value()); - if (record == nullptr) + else if (auto base = evaluate(subject.base())) { - return std::nullopt; + if (auto *record = std::get_if<constant_aggregate<ordered_map>>(&base.value())) + { + return (**record)[subject.field().name()]; + } + else if (auto *string_value = std::get_if<std::string>(&base.value()); subject.field() == "length") + { + return constant_value{ integer_literal::from(string_value->size()) }; + } } - auto pos = (*record)->find(subject.field().name()); - if (pos == (*record)->end()) + else if (auto array = resolved_base.get<array_type>(); subject.field() == "length") { - return std::nullopt; + return constant_value{ integer_literal::from(array->size) }; } - return pos->second; + return std::nullopt; } std::optional<std::size_t> evaluator::evaluate_index(expression& subject) @@ -411,8 +408,9 @@ namespace elna::boot return operand; case negation: case reference: - return std::nullopt; + break; } + return std::nullopt; } template<typename T> |
