Module: MilkTea::CompileTime
- Defined in:
- lib/milk_tea/core/compile_time.rb
Defined Under Namespace
Modules: Reflection
Classes: BlockContext, Error, Evaluator, ReturnValue, VariantValue
Constant Summary
collapse
- Layout =
::MilkTea::Types::Layout
Class Method Summary
collapse
Class Method Details
.boolean_value?(value) ⇒ Boolean
63
64
65
|
# File 'lib/milk_tea/core/compile_time.rb', line 63
def self.boolean_value?(value)
value == true || value == false
end
|
.equality_result(left, right) ⇒ Object
29
30
31
32
33
34
35
36
37
38
|
# File 'lib/milk_tea/core/compile_time.rb', line 29
def self.equality_result(left, right)
return left == right if left.is_a?(Numeric) && right.is_a?(Numeric)
return left == right if left.is_a?(String) && right.is_a?(String)
return left == right if boolean_value?(left) && boolean_value?(right)
return left == right if left.is_a?(Types::Base) && right.is_a?(Types::Base)
return struct_equality_result(left, right) if left.is_a?(Hash) && right.is_a?(Hash)
return variant_equality_result(left, right) if left.is_a?(VariantValue) && right.is_a?(VariantValue)
nil
end
|
.evaluate(expression, resolve_identifier:, resolve_member_access:, resolve_type_ref: nil, resolve_call: nil) ⇒ Object
20
21
22
23
24
25
26
27
|
# File 'lib/milk_tea/core/compile_time.rb', line 20
def self.evaluate(expression, resolve_identifier:, resolve_member_access:, resolve_type_ref: nil, resolve_call: nil)
Evaluator.new(
resolve_identifier:,
resolve_member_access:,
resolve_type_ref:,
resolve_call:,
).evaluate(expression)
end
|
.struct_equality_result(left, right) ⇒ Object
Const-time struct values are represented as => value hashes;
compare them field by field, mirroring the runtime struct == semantics.
42
43
44
45
46
47
48
49
50
51
52
|
# File 'lib/milk_tea/core/compile_time.rb', line 42
def self.struct_equality_result(left, right)
return nil unless left.is_a?(Hash) && right.is_a?(Hash)
return nil unless left.keys.sort == right.keys.sort
left.each do |name, value|
field_result = equality_result(value, right[name])
return nil if field_result.nil?
return false if field_result == false
end
true
end
|
.variant_equality_result(left, right) ⇒ Object
57
58
59
60
61
|
# File 'lib/milk_tea/core/compile_time.rb', line 57
def self.variant_equality_result(left, right)
return false unless left.arm == right.arm
struct_equality_result(left.fields, right.fields)
end
|