From 21cc43cc93abb304bd73448ab113255f5f5b05fb Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Wed, 25 Aug 2010 14:19:29 -0400 Subject: scanner: Better handling of empty namespace prefix for X Add namespacing prefixes to the static .gir files. Support the empty prefix, as is needed for xlib. --- gir/DBus-1.0.gir | 4 +++- gir/DBusGLib-1.0.gir | 4 +++- gir/GL-1.0.gir | 4 +++- gir/cairo-1.0.gir | 3 ++- gir/fontconfig-2.0.gir | 4 +++- gir/freetype2-2.0.gir | 4 +++- gir/libxml2-2.0.gir | 4 +++- gir/xfixes-4.0.gir | 4 +++- gir/xft-2.0.gir | 5 ++++- gir/xlib-2.0.gir | 4 +++- gir/xrandr-1.3.gir | 4 +++- giscanner/ast.py | 4 ++-- giscanner/maintransformer.py | 4 +++- giscanner/scannermain.py | 16 ++++++++++++++-- giscanner/transformer.py | 45 ++++++++++++++++++++++++++------------------ 15 files changed, 79 insertions(+), 34 deletions(-) diff --git a/gir/DBus-1.0.gir b/gir/DBus-1.0.gir index 5eab4ce1..4ce03091 100644 --- a/gir/DBus-1.0.gir +++ b/gir/DBus-1.0.gir @@ -2,7 +2,9 @@ + xmlns:glib="http://www.gtk.org/introspection/glib/1.0" + c:identifier-prefixes="DBus" + c:symbol-prefixes="DBus"> + xmlns:glib="http://www.gtk.org/introspection/glib/1.0" + c:identifier-prefixes="DBus" + c:symbol-prefixes="DBus"> diff --git a/gir/GL-1.0.gir b/gir/GL-1.0.gir index cf07454b..f93100ad 100644 --- a/gir/GL-1.0.gir +++ b/gir/GL-1.0.gir @@ -2,7 +2,9 @@ - + diff --git a/gir/cairo-1.0.gir b/gir/cairo-1.0.gir index 05f1a783..dbec19de 100644 --- a/gir/cairo-1.0.gir +++ b/gir/cairo-1.0.gir @@ -4,7 +4,8 @@ xmlns:c="http://www.gtk.org/introspection/c/1.0" xmlns:glib="http://www.gtk.org/introspection/glib/1.0"> + c:identifier-prefixes="cairo" + c:symbol-prefixes="cairo"> diff --git a/gir/fontconfig-2.0.gir b/gir/fontconfig-2.0.gir index 192d7205..e7ecd512 100644 --- a/gir/fontconfig-2.0.gir +++ b/gir/fontconfig-2.0.gir @@ -2,7 +2,9 @@ - + diff --git a/gir/freetype2-2.0.gir b/gir/freetype2-2.0.gir index 495726a2..ac74dc8a 100644 --- a/gir/freetype2-2.0.gir +++ b/gir/freetype2-2.0.gir @@ -2,7 +2,9 @@ - + diff --git a/gir/libxml2-2.0.gir b/gir/libxml2-2.0.gir index cd962d0e..34aeadc8 100644 --- a/gir/libxml2-2.0.gir +++ b/gir/libxml2-2.0.gir @@ -2,7 +2,9 @@ - + diff --git a/gir/xfixes-4.0.gir b/gir/xfixes-4.0.gir index 7a0fa18e..2ffe968a 100644 --- a/gir/xfixes-4.0.gir +++ b/gir/xfixes-4.0.gir @@ -2,7 +2,9 @@ - + diff --git a/gir/xft-2.0.gir b/gir/xft-2.0.gir index 1117847d..83e1e847 100644 --- a/gir/xft-2.0.gir +++ b/gir/xft-2.0.gir @@ -2,7 +2,10 @@ - + + diff --git a/gir/xlib-2.0.gir b/gir/xlib-2.0.gir index 10816521..95cdc74f 100644 --- a/gir/xlib-2.0.gir +++ b/gir/xlib-2.0.gir @@ -2,7 +2,9 @@ - + diff --git a/gir/xrandr-1.3.gir b/gir/xrandr-1.3.gir index d8844da1..2e62e98e 100644 --- a/gir/xrandr-1.3.gir +++ b/gir/xrandr-1.3.gir @@ -2,7 +2,9 @@ - + diff --git a/giscanner/ast.py b/giscanner/ast.py index 3bb6cf82..915c3ed5 100644 --- a/giscanner/ast.py +++ b/giscanner/ast.py @@ -273,11 +273,11 @@ class Namespace(object): symbol_prefixes=None): self.name = name self.version = version - if identifier_prefixes: + if identifier_prefixes is not None: self.identifier_prefixes = identifier_prefixes else: self.identifier_prefixes = [name] - if symbol_prefixes: + if symbol_prefixes is not None: self.symbol_prefixes = symbol_prefixes else: ps = self.identifier_prefixes diff --git a/giscanner/maintransformer.py b/giscanner/maintransformer.py index ac180155..f1d0d689 100644 --- a/giscanner/maintransformer.py +++ b/giscanner/maintransformer.py @@ -315,7 +315,7 @@ class MainTransformer(object): assert supercls if cls is supercls: return True - if cls.parent: + if cls.parent and cls.parent.target_giname != 'GObject.Object': return self._is_gi_subclass(cls.parent, supercls_type) return False @@ -638,6 +638,8 @@ class MainTransformer(object): if target: node.parent = parent break + else: + node.parent = ast.Type(target_giname='GObject.Object') for prop in node.properties: self._transformer.resolve_type(prop.type) for sig in node.signals: diff --git a/giscanner/scannermain.py b/giscanner/scannermain.py index ec2302ec..89fe42c9 100644 --- a/giscanner/scannermain.py +++ b/giscanner/scannermain.py @@ -260,12 +260,24 @@ def scanner_main(args): # against the absolute path that cpp will give us filenames.append(os.path.abspath(arg)) + # We do this dance because the empty list has different semantics from + # None; if the user didn't specify the options, we want to use None so + # the Namespace constructor picks the defaults. + if options.identifier_prefixes: + identifier_prefixes = options.identifier_prefixes + else: + identifier_prefixes = None + if options.symbol_prefixes: + symbol_prefixes = options.symbol_prefixes + else: + symbol_prefixes = None + cachestore = CacheStore() transformer = Transformer(cachestore, options.namespace_name, options.namespace_version, - options.identifier_prefixes, - options.symbol_prefixes) + identifier_prefixes, + symbol_prefixes) if options.warn_all: transformer.enable_warnings(True) transformer.set_include_paths(options.include_paths) diff --git a/giscanner/transformer.py b/giscanner/transformer.py index f6639a61..0eb129c4 100644 --- a/giscanner/transformer.py +++ b/giscanner/transformer.py @@ -280,10 +280,14 @@ or raise ValueError. As a special case, if the current namespace matches, it is always biggest (i.e. last).""" matches = [] for ns in self._iter_namespaces(): - for prefix in ns.identifier_prefixes: - if ident.startswith(prefix): - matches.append((ns, ident[len(prefix):], len(prefix))) - break + if ns.identifier_prefixes: + for prefix in ns.identifier_prefixes: + if ident.startswith(prefix): + matches.append((ns, ident[len(prefix):], len(prefix))) + break + else: + # A special case for namespaces without a prefix, such as X + matches.append((ns, ident, 0)) if matches: matches.sort(self._sort_matches) return map(lambda x: (x[0], x[1]), matches) @@ -767,6 +771,21 @@ both GI type string (utf8, Foo.Bar) style, as well as C (char *, FooBar) style." typeval.ctype = None return typeval + def _resolve_type_from_ctype(self, typeval): + pointer_stripped = typeval.ctype.replace('*', '') + try: + matches = self.split_ctype_namespaces(pointer_stripped) + except ValueError, e: + raise TypeResolutionException(e) + target_giname = None + for namespace, name in matches: + target = namespace.get(name) + if not target: + target = namespace.get_by_ctype(pointer_stripped) + if target: + typeval.target_giname = '%s.%s' % (namespace.name, target.name) + return + def resolve_type(self, typeval): if isinstance(typeval, (ast.Array, ast.List)): self.resolve_type(typeval.element_type) @@ -775,20 +794,10 @@ both GI type string (utf8, Foo.Bar) style, as well as C (char *, FooBar) style." self.resolve_type(typeval.key_type) self.resolve_type(typeval.value_type) return - elif not typeval.resolved and typeval.ctype: - pointer_stripped = typeval.ctype.replace('*', '') - try: - matches = self.split_ctype_namespaces(pointer_stripped) - except ValueError, e: - raise TypeResolutionException(e) - target_giname=None - for namespace, name in matches: - target = namespace.get(name) - if not target: - target = namespace.get_by_ctype(pointer_stripped) - if target: - typeval.target_giname='%s.%s' % (namespace.name, target.name) - return + elif typeval.resolved: + return + elif typeval.ctype: + return self._resolve_type_from_ctype(typeval) def _typepair_to_str(self, item): nsname, item = item -- cgit v1.2.1