Module: MilkTea::CompileTime::Reflection
- Defined in:
- lib/milk_tea/core/compile_time.rb
Class Method Summary collapse
- .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
- .core_field_handle(struct_handle, field_name) ⇒ Object
- .core_field_handles(struct_handle) ⇒ Object
- .core_member_handles(type) ⇒ Object
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
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 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 |
# File 'lib/milk_tea/core/compile_time.rb', line 298 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
283 284 285 286 287 288 |
# File 'lib/milk_tea/core/compile_time.rb', line 283 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
290 291 292 |
# File 'lib/milk_tea/core/compile_time.rb', line 290 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
294 295 296 |
# File 'lib/milk_tea/core/compile_time.rb', line 294 def self.core_member_handles(type) type.members.map { |name, value| Types::MemberHandle.new(nil, name, value) } end |