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



282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
# File 'lib/milk_tea/core/compile_time.rb', line 282

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



267
268
269
270
271
272
# File 'lib/milk_tea/core/compile_time.rb', line 267

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



274
275
276
# File 'lib/milk_tea/core/compile_time.rb', line 274

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



278
279
280
# File 'lib/milk_tea/core/compile_time.rb', line 278

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