Module: MilkTea::CompileTime
- Defined in:
- lib/milk_tea/core/compile_time.rb,
lib/milk_tea/core/compile_time/method_folding.rb
Defined Under Namespace
Modules: MethodFolding, Reflection
Classes: BlockContext, BreakOutcome, ContinueOutcome, Error, Evaluator, ReturnOutcome, VariantValue
Constant Summary
collapse
- Layout =
::MilkTea::Types::Layout
Class Method Summary
collapse
Class Method Details
.boolean_value?(value) ⇒ Boolean
79
80
81
|
# File 'lib/milk_tea/core/compile_time.rb', line 79
def self.boolean_value?(value)
value == true || value == false
end
|
.equality_result(left, right) ⇒ Object
45
46
47
48
49
50
51
52
53
54
|
# File 'lib/milk_tea/core/compile_time.rb', line 45
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
36
37
38
39
40
41
42
43
|
# File 'lib/milk_tea/core/compile_time.rb', line 36
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.
58
59
60
61
62
63
64
65
66
67
68
|
# File 'lib/milk_tea/core/compile_time.rb', line 58
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
73
74
75
76
77
|
# File 'lib/milk_tea/core/compile_time.rb', line 73
def self.variant_equality_result(left, right)
return false unless left.arm == right.arm
struct_equality_result(left.fields, right.fields)
end
|