Module: MilkTea::CompileTime::Reflection

Defined in:
lib/milk_tea/core/compile_time.rb

Class Method Summary collapse

Class Method Details

.core_evaluate_type_returning(callee_name, type_args, evaluate_value:, resolve_type_ref:, pointer_to:, const_pointer_to:, top_level_functions:, evaluate_type_returning_function_body: nil) ⇒ Object



838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
# File 'lib/milk_tea/core/compile_time.rb', line 838

def self.core_evaluate_type_returning(
  callee_name, type_args,
  evaluate_value:,
  resolve_type_ref:,
  pointer_to:,
  const_pointer_to:,
  top_level_functions:,
  evaluate_type_returning_function_body: nil
)
  case callee_name
  when "ptr", "const_ptr", "span", "array", "str_buffer", "Task"
    evaluated_args = (type_args || []).map do |arg|
      value = arg.value
      if value.is_a?(AST::Identifier)
        evaluate_value.call(value)
      elsif value.is_a?(AST::TypeRef)
        resolve_type_ref.call(value)
      elsif value.is_a?(AST::IntegerLiteral)
        Types::LiteralTypeArg.new(value.value)
      end
    end
    return nil if evaluated_args.any?(&:nil?)

    case callee_name
    when "ptr" then pointer_to.call(evaluated_args.first)
    when "const_ptr" then const_pointer_to.call(evaluated_args.first)
    when "span" then Types::Registry.span(evaluated_args.first)
    when "array" then Types::Registry.generic_instance("array", evaluated_args)
    when "str_buffer" then Types::Registry.generic_instance("str_buffer", evaluated_args)
    when "Task" then Types::Registry.task(evaluated_args.first)
    end
  else
    func = top_level_functions.call(callee_name)
    return nil unless func
    return nil unless func.body_return_type == Types::BUILTIN_TYPE_META_TYPE

    if type_args && func.ast && evaluate_type_returning_function_body
      value = evaluate_type_returning_function_body.call(func, type_args)
      return value if value
    end

    Types::BUILTIN_TYPE_META_TYPE
  end
end

.core_field_handle(struct_handle, field_name) ⇒ Object



823
824
825
826
827
828
# File 'lib/milk_tea/core/compile_time.rb', line 823

def self.core_field_handle(struct_handle, field_name)
  field_decl = struct_handle.declaration.fields.find { |f| f.name == field_name }
  return nil unless field_decl

  Types::FieldHandle.new(struct_handle, field_name, field_decl)
end

.core_field_handles(struct_handle) ⇒ Object



830
831
832
# File 'lib/milk_tea/core/compile_time.rb', line 830

def self.core_field_handles(struct_handle)
  struct_handle.declaration.fields.map { |f| Types::FieldHandle.new(struct_handle, f.name, f) }
end

.core_member_handles(type) ⇒ Object



834
835
836
# File 'lib/milk_tea/core/compile_time.rb', line 834

def self.core_member_handles(type)
  type.members.map { |name| Types::MemberHandle.new(nil, name, type.member_value(name)) }
end