summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2010-09-08 09:58:32 -0400
committerColin Walters <walters@verbum.org>2010-09-08 09:58:32 -0400
commit5ee812f5553e0786bf8daeedeb956a9074eedb4c (patch)
tree4b0a652434055333954c0af89f4a7f7ce806650c
parentaa94e0736dda492f84e06794cfd009feb6178be8 (diff)
downloadgobject-introspection-5ee812f5553e0786bf8daeedeb956a9074eedb4c.tar.gz
scanner: Don't attempt to pair methods/constructors with foreign namespaces
See test case, hit in practice in gnome-shell.
-rw-r--r--giscanner/maintransformer.py4
-rw-r--r--tests/scanner/Foo-1.0-expected.gir11
-rw-r--r--tests/scanner/foo.h4
3 files changed, 19 insertions, 0 deletions
diff --git a/giscanner/maintransformer.py b/giscanner/maintransformer.py
index 5493fcd0..59f93e23 100644
--- a/giscanner/maintransformer.py
+++ b/giscanner/maintransformer.py
@@ -775,6 +775,8 @@ method or constructor of some type."""
ast.Record, ast.Union,
glibast.GLibBoxedOther)):
return False
+ if target.namespace != self._namespace:
+ return False
# A quick hack here...in the future we should catch C signature/GI signature
# mismatches in a general way in finaltransformer
@@ -829,6 +831,8 @@ method or constructor of some type."""
(origin_node, funcname) = split
if not isinstance(origin_node, (ast.Class, glibast.GLibBoxed)):
return False
+ if origin_node.namespace != self._namespace:
+ return False
if isinstance(target, ast.Class):
parent = origin_node
while parent and (not parent.create_type().target_giname == 'GObject.Object'):
diff --git a/tests/scanner/Foo-1.0-expected.gir b/tests/scanner/Foo-1.0-expected.gir
index 731b0c02..0c4c2b63 100644
--- a/tests/scanner/Foo-1.0-expected.gir
+++ b/tests/scanner/Foo-1.0-expected.gir
@@ -318,6 +318,17 @@ and/or use gtk-doc annotations. -->
<type name="Object" c:type="FooObject*"/>
</return-value>
</constructor>
+ <function name="a_global_method"
+ c:identifier="foo_object_a_global_method">
+ <return-value transfer-ownership="none">
+ <type name="none" c:type="void"/>
+ </return-value>
+ <parameters>
+ <parameter name="obj" transfer-ownership="none">
+ <type name="Utility.Object" c:type="UtilityObject*"/>
+ </parameter>
+ </parameters>
+ </function>
<function name="get_default" c:identifier="foo_object_get_default">
<doc xml:whitespace="preserve">This function is intended to match clutter_stage_get_default which
uses a C sugar return type.</doc>
diff --git a/tests/scanner/foo.h b/tests/scanner/foo.h
index 2d11ba6a..5a67e654 100644
--- a/tests/scanner/foo.h
+++ b/tests/scanner/foo.h
@@ -415,5 +415,9 @@ struct _FooForeignStruct
int foo;
};
+/* This one should be a global, not a method on UtilityObject since
+ * it's a separate namespace.
+ */
+void foo_object_a_global_method (UtilityObject *obj);
#endif /* __FOO_OBJECT_H__ */