summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2010-08-25 14:19:29 -0400
committerColin Walters <walters@verbum.org>2010-08-31 16:05:57 -0400
commit21cc43cc93abb304bd73448ab113255f5f5b05fb (patch)
treef93982e3eb0e823867954e407ee9c187679b74ee
parentb816bf21bfbf4dbfa35d4bc5987c2a3006478aea (diff)
downloadgobject-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.gir4
-rw-r--r--gir/DBusGLib-1.0.gir4
-rw-r--r--gir/GL-1.0.gir4
-rw-r--r--gir/cairo-1.0.gir3
-rw-r--r--gir/fontconfig-2.0.gir4
-rw-r--r--gir/freetype2-2.0.gir4
-rw-r--r--gir/libxml2-2.0.gir4
-rw-r--r--gir/xfixes-4.0.gir4
-rw-r--r--gir/xft-2.0.gir5
-rw-r--r--gir/xlib-2.0.gir4
-rw-r--r--gir/xrandr-1.3.gir4
-rw-r--r--giscanner/ast.py4
-rw-r--r--giscanner/maintransformer.py4
-rw-r--r--giscanner/scannermain.py16
-rw-r--r--giscanner/transformer.py45
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