diff options
author | Johan Dahlin <jdahlin@async.com.br> | 2008-04-28 22:14:43 +0000 |
---|---|---|
committer | Johan Dahlin <johan@src.gnome.org> | 2008-04-28 22:14:43 +0000 |
commit | feb328d2395743d44cb0f3532213ac4e06888d87 (patch) | |
tree | 5bd82bbdd8b6196118f3bb619e518d64c9588058 | |
parent | b01ed146b04d718eb352d6321c374be1dcdb045f (diff) | |
download | gobject-introspection-feb328d2395743d44cb0f3532213ac4e06888d87.tar.gz |
Add a --strip-prefix and sort out confusion between names and symbols for
2008-04-28 Johan Dahlin <jdahlin@async.com.br>
* giscanner/ast.py:
* giscanner/glibast.py:
* giscanner/glibtransformer.py:
* giscanner/transformer.py:
* tools/g-ir-scanner:
Add a --strip-prefix and sort out confusion between names and symbols
for functions and struct + derivaties.
Refactor bootstrap of g-ir-scanner, so we can set options on
Transformer() before parsing everything.
svn path=/trunk/; revision=255
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | giscanner/ast.py | 3 | ||||
-rw-r--r-- | giscanner/glibast.py | 3 | ||||
-rw-r--r-- | giscanner/glibtransformer.py | 2 | ||||
-rw-r--r-- | giscanner/transformer.py | 30 | ||||
-rwxr-xr-x | tools/g-ir-scanner | 21 |
6 files changed, 57 insertions, 14 deletions
@@ -1,3 +1,15 @@ +2008-04-28 Johan Dahlin <jdahlin@async.com.br> + + * giscanner/ast.py: + * giscanner/glibast.py: + * giscanner/glibtransformer.py: + * giscanner/transformer.py: + * tools/g-ir-scanner: + Add a --strip-prefix and sort out confusion between names and symbols + for functions and struct + derivaties. + Refactor bootstrap of g-ir-scanner, so we can set options on + Transformer() before parsing everything. + 2008-04-28 Johan Dahlin <johan@gnome.org> * giscanner/transformer.py (Transformer._traverse_one): Avoid recursion diff --git a/giscanner/ast.py b/giscanner/ast.py index cc07660c..fbe47572 100644 --- a/giscanner/ast.py +++ b/giscanner/ast.py @@ -81,9 +81,10 @@ class Member(Node): class Struct(Node): - def __init__(self, name): + def __init__(self, name, symbol): Node.__init__(self, name) self.fields = [] + self.symbol = symbol def __repr__(self): return 'Struct(%r)' % (self.name,) diff --git a/giscanner/glibast.py b/giscanner/glibast.py index 116f88d5..585a3fd2 100644 --- a/giscanner/glibast.py +++ b/giscanner/glibast.py @@ -56,11 +56,12 @@ class GLibObject(Class): class GLibBoxed(Struct): def __init__(self, name, type_name, get_type): - Struct.__init__(self, name) + Struct.__init__(self, name, get_type) self.ctype = name self.constructors = [] self.methods = [] self.type_name = type_name + self.symbol = type_name self.get_type = get_type diff --git a/giscanner/glibtransformer.py b/giscanner/glibtransformer.py index 92c88a36..b8fc28a2 100644 --- a/giscanner/glibtransformer.py +++ b/giscanner/glibtransformer.py @@ -178,7 +178,7 @@ class GLibTransformer(object): def _parse_get_type_function(self, func): # GType *_get_type(void) - symbol = func.name + symbol = func.symbol if not symbol.endswith('_get_type'): return False if func.retval.type.name != 'GType': diff --git a/giscanner/transformer.py b/giscanner/transformer.py index 98e6d04c..92393314 100644 --- a/giscanner/transformer.py +++ b/giscanner/transformer.py @@ -29,13 +29,16 @@ class Transformer(object): self.nodes = [] self._output_ns = {} self._typedefs_ns = {} - self._traverse() + self._strip_prefix = '' + + def set_strip_prefix(self, strip_prefix): + self._strip_prefix = strip_prefix def get_nodes(self): for node in self.nodes: yield node - def _traverse(self): + def parse(self): for symbol in self.generator.get_symbols(): node = self._traverse_one(symbol) if node is None: @@ -45,6 +48,17 @@ class Transformer(object): self.nodes.append(node) self._output_ns[node.name] = node + def _remove_prefix(self, name): + # when --strip-prefix=g: + # GHashTable -> HashTable + # g_hash_table_new -> hash_table_new + if name.lower().startswith(self._strip_prefix.lower()): + name = name[len(self._strip_prefix):] + + while name.startswith('_'): + name = name[1:] + return name + def _traverse_one(self, symbol, stype=None): if stype is None: stype = symbol.type @@ -67,6 +81,9 @@ class Transformer(object): return self._create_struct(symbol) elif stype == giscanner.CSYMBOL_TYPE_ENUM: return self._create_enum(symbol) + elif stype == giscanner.CSYMBOL_TYPE_UNION: + # Unions are not supported + pass else: print 'BUILDER: unhandled symbol', symbol.type @@ -83,7 +100,8 @@ class Transformer(object): parameters = list(self._create_parameters(symbol.base_type, directives)) return_ = self._create_return(symbol.base_type.base_type, directives.get('return', [])) - return Function(symbol.ident, return_, parameters, symbol.ident) + name = self._remove_prefix(symbol.ident) + return Function(name, return_, parameters, symbol.ident) def _create_source_type(self, source_type): if source_type is None: @@ -148,8 +166,10 @@ class Transformer(object): self._typedefs_ns[symbol.base_type.name] = symbol.ident def _create_struct(self, symbol): - name = self._typedefs_ns.get(symbol.ident, symbol.ident) - struct = Struct(name) + name = self._typedefs_ns.get(symbol.ident, None) + if name is None: + name = self._remove_prefix(symbol.ident) + struct = Struct(name, symbol.ident) for child in symbol.base_type.child_list: struct.fields.append(self._traverse_one(child, child.base_type.type)) diff --git a/tools/g-ir-scanner b/tools/g-ir-scanner index f9f2680a..570055b0 100755 --- a/tools/g-ir-scanner +++ b/tools/g-ir-scanner @@ -44,6 +44,9 @@ def main(args): parser.add_option("-n", "--namespace", action="store", dest="namespace", help="namespace of this unit") + parser.add_option("", "--strip-prefix", + action="store", dest="strip_prefix", default="", + help="prefix to strip from functions, like g_") parser.add_option("-o", "--output", action="store", dest="output", help="output to writeout, defaults to stdout") @@ -93,19 +96,25 @@ def main(args): ss.parse_files(filenames) ss.parse_macros() - builder = GLibTransformer(options.namespace) + transformer = Transformer(ss) + transformer.set_strip_prefix(options.strip_prefix) + + glibtransformer = GLibTransformer(options.namespace) if options.library: - builder.load_library(options.library) + glibtransformer.load_library(options.library) for include in options.includes: - builder.register_include(include) - builder.parse(Transformer(ss).get_nodes()) + glibtransformer.register_include(include) + + transformer.parse() + nodes = transformer.get_nodes() + glibtransformer.parse(nodes) if options.format == 'gir': from giscanner.girwriter import GIRWriter - writer = GIRWriter(options.namespace, builder.get_nodes()) + writer = GIRWriter(options.namespace, glibtransformer.get_nodes()) elif options.format == 'gidl': from giscanner.gidlwriter import GIDLWriter - writer = GIDLWriter(options.namespace, builder.get_nodes()) + writer = GIDLWriter(options.namespace, glibtransformer.get_nodes()) else: raise SystemExit("Unknown format: %s" % (options.format,)) |