Class: FFI::Generator::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/generator/generator.rb

Class Method Summary collapse

Class Method Details

.generate(node) ⇒ Object



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
# File 'lib/generator/generator.rb', line 307

def generate(node)
  result = ""
  node.traverse do |node|
    if is_constant?(node)
      result << Constant.new(:node => node, :indent => @indent).to_s << "\n"
    elsif is_typedef?(node)
      typedef = Typedef.new(:node => node)
      Generator.add_type(typedef.symname, typedef.statement)
      if is_callback?(node)
        cb = Callback.new(:node => node, :indent => @indent).to_s << "\n"
        Generator.add_type(typedef.symname, ":#{typedef.symname}")
        result << cb.to_s
      end
    elsif is_enum?(node)
      e = Enum.new(:node => node, :indent => @indent)
      Generator.add_type(e.symname, Generator::TYPES['int'])
      result << e.to_s << "\n"
    elsif is_struct?(node)
      s = Structure.new(:node => node, :indent => @indent)
      Generator.add_type(s.symname, "struct #{s.symname}")
      result << s.to_s
    elsif is_union?(node)
      s = Union.new(:node => node, :indent => @indent)
      Generator.add_type(s.symname, "union #{s.symname}")
      result << s.to_s
    elsif is_function_decl?(node)
      result << Function.new(:node => node, :indent => @indent).to_s << "\n"
    elsif node.name == 'insert' and not is_insert_runtime?(node)
      result << get_verbatim(node)
    end       
  end
  result
end

.get_verbatim(node) ⇒ Object



279
280
281
# File 'lib/generator/generator.rb', line 279

def get_verbatim(node)
  node.xpath("./attributelist/attribute[@name='code']").first['value']
end

.is_callback?(node) ⇒ Boolean

Returns:

  • (Boolean)


304
305
306
# File 'lib/generator/generator.rb', line 304

def is_callback?(node)
  (node / "./attributelist/attribute[@name='decl']").first['value'] =~ /^p\.f\(/
end

.is_constant?(node) ⇒ Boolean

Returns:

  • (Boolean)


286
287
288
# File 'lib/generator/generator.rb', line 286

def is_constant?(node)
  node.name == 'constant'
end

.is_enum?(node) ⇒ Boolean

Returns:

  • (Boolean)


289
290
291
# File 'lib/generator/generator.rb', line 289

def is_enum?(node)
  node.name == 'enum'
end

.is_function_decl?(node) ⇒ Boolean

Returns:

  • (Boolean)


292
293
294
# File 'lib/generator/generator.rb', line 292

def is_function_decl?(node)
  node.name == 'cdecl' and (node / "./attributelist/attribute[@name='kind']").first['value'] == 'function'
end

.is_insert_runtime?(node) ⇒ Boolean

Returns:

  • (Boolean)


282
283
284
285
# File 'lib/generator/generator.rb', line 282

def is_insert_runtime?(node)
  section = node.xpath("./attributelist/attribute[@name='section']")
  section.first['value'] == 'runtime' if section.first
end

.is_struct?(node) ⇒ Boolean

Returns:

  • (Boolean)


295
296
297
# File 'lib/generator/generator.rb', line 295

def is_struct?(node)
  node.name == 'class' and (node / "./attributelist/attribute[@name='kind']").first['value'] == 'struct'
end

.is_typedef?(node) ⇒ Boolean

Returns:

  • (Boolean)


301
302
303
# File 'lib/generator/generator.rb', line 301

def is_typedef?(node)
  node.name == 'cdecl' and (node / "./attributelist/attribute[@name='kind']").first['value'] == 'typedef'
end

.is_union?(node) ⇒ Boolean

Returns:

  • (Boolean)


298
299
300
# File 'lib/generator/generator.rb', line 298

def is_union?(node)
  node.name == 'class' and (node / "./attributelist/attribute[@name='kind']").first['value'] == 'union'
end