aboutsummaryrefslogtreecommitdiff
path: root/boot/evaluator.cc
diff options
context:
space:
mode:
Diffstat (limited to 'boot/evaluator.cc')
-rw-r--r--boot/evaluator.cc42
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>