diff options
author | Colin Walters <walters@verbum.org> | 2010-08-25 14:19:29 -0400 |
---|---|---|
committer | Colin Walters <walters@verbum.org> | 2010-08-31 16:05:57 -0400 |
commit | 21cc43cc93abb304bd73448ab113255f5f5b05fb (patch) | |
tree | f93982e3eb0e823867954e407ee9c187679b74ee | |
parent | b816bf21bfbf4dbfa35d4bc5987c2a3006478aea (diff) | |
download | gobject-introspection-21cc43cc93abb304bd73448ab113255f5f5b05fb.tar.gz |
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.
-rw-r--r-- | gir/DBus-1.0.gir | 4 | ||||
-rw-r--r-- | gir/DBusGLib-1.0.gir | 4 | ||||
-rw-r--r-- | gir/GL-1.0.gir | 4 | ||||
-rw-r--r-- | gir/cairo-1.0.gir | 3 | ||||
-rw-r--r-- | gir/fontconfig-2.0.gir | 4 | ||||
-rw-r--r-- | gir/freetype2-2.0.gir | 4 | ||||
-rw-r--r-- | gir/libxml2-2.0.gir | 4 | ||||
-rw-r--r-- | gir/xfixes-4.0.gir | 4 | ||||
-rw-r--r-- | gir/xft-2.0.gir | 5 | ||||
-rw-r--r-- | gir/xlib-2.0.gir | 4 | ||||
-rw-r--r-- | gir/xrandr-1.3.gir | 4 | ||||
-rw-r--r-- | giscanner/ast.py | 4 | ||||
-rw-r--r-- | giscanner/maintransformer.py | 4 | ||||
-rw-r--r-- | giscanner/scannermain.py | 16 | ||||
-rw-r--r-- | 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 @@ <repository version="1.2" xmlns="http://www.gtk.org/introspection/core/1.0" xmlns:c="http://www.gtk.org/introspection/c/1.0" - xmlns:glib="http://www.gtk.org/introspection/glib/1.0"> + xmlns:glib="http://www.gtk.org/introspection/glib/1.0" + c:identifier-prefixes="DBus" + c:symbol-prefixes="DBus"> <package name="dbus-1"/> <namespace name="DBus" version="1.0" diff --git a/gir/DBusGLib-1.0.gir b/gir/DBusGLib-1.0.gir index b9ba1327..ff619316 100644 --- a/gir/DBusGLib-1.0.gir +++ b/gir/DBusGLib-1.0.gir @@ -2,7 +2,9 @@ <repository version="1.2" xmlns="http://www.gtk.org/introspection/core/1.0" xmlns:c="http://www.gtk.org/introspection/c/1.0" - xmlns:glib="http://www.gtk.org/introspection/glib/1.0"> + xmlns:glib="http://www.gtk.org/introspection/glib/1.0" + c:identifier-prefixes="DBus" + c:symbol-prefixes="DBus"> <include name="GObject" version="2.0"/> <package name="dbus-glib-1"/> <namespace name="DBusGLib" version="1.0" c:prefix="DBusG"> 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 @@ <repository version="1.2" xmlns="http://www.gtk.org/introspection/core/1.0" xmlns:c="http://www.gtk.org/introspection/c/1.0"> - <namespace name="GL" version="1.0"> + <namespace name="GL" version="1.0" + c:identifier-prefixes="GL" + c:symbol-prefixes="gl"> <record name="bitfield" c:type="GLbitfield"/> <record name="charARB" c:type="GLcharARB"/> <record name="clampf" c:type="GLclampf"/> 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"> <namespace name="cairo" version="1.0" - c:prefix="cairo"> + c:identifier-prefixes="cairo" + c:symbol-prefixes="cairo"> <record name="Context" c:type="cairo_t" foreign="1"/> <record name="Surface" c:type="cairo_surface_t" foreign="1"/> <record name="Matrix" c:type="cairo_matrix_t" foreign="1"/> 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 @@ <repository version="1.2" xmlns="http://www.gtk.org/introspection/core/1.0" xmlns:c="http://www.gtk.org/introspection/c/1.0"> - <namespace name="fontconfig" version="2.0"> + <namespace name="fontconfig" version="2.0" + c:identifier-prefixes="Fc" + c:symbol-prefixes="fc"> <record name="Pattern" c:type="FcPattern"/> <record name="CharSet" c:type="FcCharSet"/> <function name="init" c:identifier="FcInit"> 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 @@ <repository version="1.2" xmlns="http://www.gtk.org/introspection/core/1.0" xmlns:c="http://www.gtk.org/introspection/c/1.0"> - <namespace name="freetype2" version="2.0"> + <namespace name="freetype2" version="2.0" + c:identifier-prefixes="FT" + c:symbol-prefixes="FT"> <record name="Bitmap" c:type="FT_Bitmap"/> <record name="Face" c:type="FT_Face"/> <record name="Library" c:type="FT_Library"/> 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 @@ <repository version="1.2" xmlns="http://www.gtk.org/introspection/core/1.0" xmlns:c="http://www.gtk.org/introspection/c/1.0"> - <namespace name="libxml2" version="2.0"> + <namespace name="libxml2" version="2.0" + c:identifier-prefixes="xml" + c:symbol-prefixes="xml"> <record name="Node" c:type="xmlNode"/> <record name="NodePtr" c:type="xmlNodePtr"/> <record name="Doc" c:type="xmlDoc"/> 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 @@ <repository version="1.2" xmlns="http://www.gtk.org/introspection/core/1.0" xmlns:c="http://www.gtk.org/introspection/c/1.0"> - <namespace name="xfixes" version="4.0"> + <namespace name="xfixes" version="4.0" + c:identifier-prefixes="X" + c:symbol-prefixes="X"> <record name="XserverRegion" c:type="XserverRegion"/> </namespace> </repository> 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 @@ <repository version="1.2" xmlns="http://www.gtk.org/introspection/core/1.0" xmlns:c="http://www.gtk.org/introspection/c/1.0"> - <namespace name="xft" version="2.0"> + <include name="xlib" version="2.0"/> + <namespace name="xft" version="2.0" + c:identifier-prefixes="Xft" + c:symbol-prefixes="Xft"> <record name="Color" c:type="XftColor"/> <record name="Draw" c:type="XftDraw"/> <record name="Font" c:type="XftFont"/> 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 @@ <repository version="1.2" xmlns="http://www.gtk.org/introspection/core/1.0" xmlns:c="http://www.gtk.org/introspection/c/1.0"> - <namespace name="xlib" version="2.0"> + <namespace name="xlib" version="2.0" + c:identifier-prefixes="" + c:symbol-prefixes="X"> <record name="Atom" c:type="Atom"/> <record name="Colormap" c:type="Colormap"/> <record name="Cursor" c:type="Cursor"/> 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 @@ <repository version="1.2" xmlns="http://www.gtk.org/introspection/core/1.0" xmlns:c="http://www.gtk.org/introspection/c/1.0"> - <namespace name="xrandr" version="1.3"> + <namespace name="xrandr" version="1.3" + c:identifier-prefixes="XRR" + c:symbol-prefixes="XRR"> <record name="ScreenSize" c:type="XRRScreenSize"/> <record name="ScreenChangeNotifyEvent" c:type="XRRScreenChangeNotifyEvent"/> <record name="NotifyEvent" c:type="XRRNotifyEvent"/> 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 |