9 def __init__(self, name, retval, parameters, symbol):
12 self.parameters = parameters
16 return 'Function(%r, %r, %r)' % (self.name, self.retval,
20 class Parameter(Node):
21 def __init__(self, name, type):
26 return 'Parameter(%r, %r)' % (self.name, self.type)
30 def __init__(self, name, members):
32 self.members = members
35 return 'Enum(%r, %r)' % (self.name, self.members)
39 def __init__(self, name, value):
44 return 'Member(%r, %r)' % (self.name, self.value)
48 def __init__(self, name):
52 return 'Struct(%r)' % (self.name,)
56 def __init__(self, type):
60 return 'Return(%r)' % (self.type,)
64 def __init__(self, name, parent):
68 self.constructors = []
72 return '%s(%r, %r, %r)' % (
73 self.__class__.__name__,
74 self.name, self.parent, self.methods)
77 class Interface(Node):
78 def __init__(self, name):
84 return '%s(%r, %r)' % (
85 self.__class__.__name__,
86 self.name, self.methods)
90 def __init__(self, name, type, value):
96 return 'Constant(%r, %r, %r)' % (
97 self.name, self.type, self.value)
100 class Property(Node):
101 def __init__(self, name, type):
106 return '%s(%r, %r, %r)' % (
107 self.__class__.__name__,
108 self.name, self.type, self.value)
111 class Callback(Node):
112 def __init__(self, name, retval, parameters):
115 self.parameters = parameters
118 return 'Callback(%r, %r, %r)' % (
119 self.name, self.retval, self.parameters)
122 class TreeBuilder(object):
123 def __init__(self, generator):
124 self.generator = generator
130 for node in self.nodes:
134 for symbol in self.generator.get_symbols():
135 node = self._traverse_one(symbol)
137 self.nodes.append(node)
139 def _traverse_one(self, symbol, stype=None):
140 # Skip private symbols
141 if symbol.ident.startswith('_'):
145 if stype == giscanner.CSYMBOL_TYPE_FUNCTION:
146 return self._create_function(symbol)
147 elif stype == giscanner.CSYMBOL_TYPE_TYPEDEF:
148 if (symbol.base_type.type == giscanner.CTYPE_POINTER and
149 symbol.base_type.base_type.type == giscanner.CTYPE_FUNCTION):
150 return self._create_callback(symbol)
152 return self._traverse_one(symbol, symbol.base_type.type)
153 elif stype == giscanner.CSYMBOL_TYPE_STRUCT:
154 return self._create_struct(symbol)
155 elif stype == giscanner.CSYMBOL_TYPE_ENUM:
156 return self._create_enum(symbol)
158 print 'BUILDER: unhandled symbol', symbol.type
160 def _create_enum(self, symbol):
162 for child in symbol.base_type.child_list:
163 members.append(Member(child.ident,
166 return Enum(symbol.ident, members)
168 def _create_function(self, symbol):
169 parameters = self._create_parameters(symbol.base_type)
170 retval = Return(self._create_source_type(symbol.base_type.base_type))
171 return Function(symbol.ident, retval, list(parameters), symbol.ident)
173 def _create_source_type(self, source_type):
174 if source_type.type == giscanner.CTYPE_VOID:
176 elif source_type.type == giscanner.CTYPE_BASIC_TYPE:
177 value = source_type.name
178 elif source_type.type == giscanner.CTYPE_TYPEDEF:
179 value = source_type.name
180 elif source_type.type == giscanner.CTYPE_POINTER:
181 value = self._create_source_type(source_type.base_type) + '*'
183 print 'BUILDER: Unhandled source type: %d' % (source_type.type,)
187 def _create_parameters(self, base_type):
188 for child in base_type.child_list:
189 yield self._create_parameter(child)
191 def _create_parameter(self, symbol):
192 return Parameter(symbol.ident,
193 self._create_source_type(symbol.base_type))
195 def _create_struct(self, symbol):
196 return Struct(symbol.ident)
198 def _create_callback(self, symbol):
199 parameters = self._create_parameters(symbol.base_type.base_type)
200 retval = Return(self._create_source_type(symbol.base_type.base_type.base_type))
201 return Callback(symbol.ident, retval, list(parameters))