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

Returns:

  • (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