Class: FFI::Generator::Parser
- Inherits:
-
Object
- Object
- FFI::Generator::Parser
- Defined in:
- lib/generator/generator.rb
Class Method Summary collapse
- .generate(node) ⇒ Object
- .get_verbatim(node) ⇒ Object
- .is_callback?(node) ⇒ Boolean
- .is_constant?(node) ⇒ Boolean
- .is_enum?(node) ⇒ Boolean
- .is_function_decl?(node) ⇒ Boolean
- .is_insert_runtime?(node) ⇒ Boolean
- .is_struct?(node) ⇒ Boolean
- .is_typedef?(node) ⇒ Boolean
- .is_union?(node) ⇒ Boolean
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
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
286 287 288 |
# File 'lib/generator/generator.rb', line 286 def is_constant?(node) node.name == 'constant' end |
.is_enum?(node) ⇒ Boolean
289 290 291 |
# File 'lib/generator/generator.rb', line 289 def is_enum?(node) node.name == 'enum' end |
.is_function_decl?(node) ⇒ 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
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
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
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
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 |