summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohan Dahlin <jdahlin@async.com.br>2008-04-28 22:14:43 +0000
committerJohan Dahlin <johan@src.gnome.org>2008-04-28 22:14:43 +0000
commitfeb328d2395743d44cb0f3532213ac4e06888d87 (patch)
tree5bd82bbdd8b6196118f3bb619e518d64c9588058
parentb01ed146b04d718eb352d6321c374be1dcdb045f (diff)
downloadgobject-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--ChangeLog12
-rw-r--r--giscanner/ast.py3
-rw-r--r--giscanner/glibast.py3
-rw-r--r--giscanner/glibtransformer.py2
-rw-r--r--giscanner/transformer.py30
-rwxr-xr-xtools/g-ir-scanner21
6 files changed, 57 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index 4182660e..b379166c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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,))