Class: Orthoses::Fiddle::Importer

Inherits:
Object
  • Object
show all
Includes:
Fiddle::Types
Defined in:
lib/orthoses/fiddle/importer.rb

Instance Method Summary collapse

Constructor Details

#initialize(loader) ⇒ Importer

Returns a new instance of Importer.



10
11
12
# File 'lib/orthoses/fiddle/importer.rb', line 10

def initialize(loader)
  @loader = loader
end

Instance Method Details

#callObject



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/orthoses/fiddle/importer.rb', line 14

def call
  extern = CallTracer.new
  store = extern.trace(::Fiddle::Importer.instance_method(:extern)) do
    @loader.call
  end

  extern.captures.each do |capture|
    base_name = Utils.module_name(capture.method.receiver) or next
    signature = capture.argument[:signature]
    name, return_type, argument_types = ::Fiddle::Importer.parse_signature(signature)
    args = argument_types.each_with_index.map do |fiddle_type, i|
      fiddle_to_rbs(fiddle_type, before: argument_types[i - 1])
    end
    store[base_name] << "# extern \"#{capture.argument[:signature]}\""
    store[base_name] << "def self.#{name}: (#{args.join(', ')}) -> #{fiddle_to_rbs(return_type)}"
  end

  store
end

#fiddle_to_rbs(fiddle_type, before: nil) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/orthoses/fiddle/importer.rb', line 34

def fiddle_to_rbs(fiddle_type, before: nil)
  case fiddle_type
  when VOID
    'void'
  when VOIDP
    'untyped'
  when CHAR, UCHAR, SHORT, USHORT, INT, UINT, LONG, ULONG, LONG_LONG, ULONG_LONG,
       INT8_T, UINT8_T, INT16_T, UINT16_T, INT32_T, UINT32_T, INT64_T, UINT64_T,
       SIZE_T, SSIZE_T, PTRDIFF_T, INTPTR_T, UINTPTR_T
    'Integer'
  when FLOAT, DOUBLE
    'Float'
  when CONST_STRING
    'String'
  when VARIADIC
    unless before
      raise "Found unexpected signature"
    end
    "*#{fiddle_to_rbs(before)}"
  else
    if defined?(BOOL) && fiddle_type == BOOL
      'bool'
    else
      raise "`#{fiddle_type}` is unsupported yat"
    end
  end
end