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



487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
# File 'lib/milk_tea/core/compile_time.rb', line 487

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



472
473
474
475
476
477
# File 'lib/milk_tea/core/compile_time.rb', line 472

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



479
480
481
# File 'lib/milk_tea/core/compile_time.rb', line 479

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



483
484
485
# File 'lib/milk_tea/core/compile_time.rb', line 483

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