Method: EasySwig::GeneratorUtil#nested_workaround

Defined in:
lib/generators/generator_util.rb

#nested_workaround(innerclass) ⇒ Object

Innerclasses



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/generators/generator_util.rb', line 6

def nested_workaround(innerclass) # Innerclasses      
  return '' if innerclass.abstract?
  return '' if no_public_constructors?(innerclass) || no_public_destructors?(innerclass)
  return '' if @all_innerclasses[innerclass.target_name]
  
  namespace = @api_class.parent
  siblings = namespace.classes + namespace.structs
  return '' if siblings.any?{ |c| c.basename == innerclass.basename }
  swig_file  = ''
  own_typedefs = {}
  
  swig_file << "namespace #{namespace.name} {\n"
  swig_file << "\tclass #{innerclass.target_name} {\n"
  swig_file << "\t\tpublic:\n"
  innerclass.api_attributes.each { |attr| 
    typename = attr.type.name
    if is_template?(typename)
      typename = typename.gsub('>::type', '>') # TODO only for Ogre
    end
    swig_file << "\t\t#{attr.static.to_s} #{typename} #{attr.basename};\n"
  }
  innerclass.api_methods.each { |meth|
    broken = false
   type_typename = meth.type.name
    if is_template?(type_typename)
      type_typename = type_typename.gsub('>::type', '>') # TODO only for Ogre
    end
    param_typenames = ""
   n = 1
    meth.params.map{ |p|
      typename = p.type.name
      if is_template?(typename)
        typename = typename.gsub('>::type', '>') # TODO only for Ogre
      end
      param_typenames << " #{typename} arg#{n},"
      n += 1
    }
    next if broken
    swig_file << "\t\t#{meth.static.to_s} #{type_typename} #{meth.basename}(#{param_typenames.chop});\n"
  }
  innerclass.api_enums.each { |enum|
    swig_file << enum_snippet(enum)
  }
  @all_innerclasses[innerclass.target_name] = 1
  swig_file << "\t};\n}\n"
  swig_file << "%rename(#{innerclass.target_name}) #{innerclass.basename};\n"
  swig_file << "%nestedworkaround #{@api_class.name}::#{innerclass.basename};\n"
  swig_file << "%{\nnamespace #{namespace.name} {\n"
  swig_file << "\ttypedef #{@api_class.name}::#{innerclass.basename} #{innerclass.target_name};\n"
  swig_file << "}\n%}\n"
  swig_file
end