summaryrefslogtreecommitdiff
path: root/tests/scanner
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@gnome.org>2022-07-13 12:45:57 +0100
committerEmmanuele Bassi <ebassi@gmail.com>2023-01-08 21:48:45 +0000
commit8d44bd13940649a708c8a2186cd3ba58ce6fc503 (patch)
tree390c0457dc2939502a7c7a1e15e8b933fc1145d7 /tests/scanner
parent9ffbdd3738b02a0220c8d9156babf20e0c5ff7d4 (diff)
downloadgobject-introspection-8d44bd13940649a708c8a2186cd3ba58ce6fc503.tar.gz
Split disguised attribute into two
The disguised attribute started off as a way to indicate a typedef to a structure pointer, e.g. typedef struct Foo* FooPtr; Over the years, though, it started to include opaque structure types, e.g. typedef struct _FooObject FooObject; typedef struct _FooObjectClass FooObjectClass; This has led to issues in language bindings, code generators, and documentation generators, which now have issues when dealing with both pointer aliases and opaque types. An initial attempt at fixing this mess in commit f606183a ended up breaking Vala, and had to be reverted. To avoid breaking existing users we can follow a similar approach to the allow-none/nullable/optional solution: 1. introduce a new pair of attributes: "pointer" and "opaque" 2. deprecate the "disguised" attribute The "pointer" attribute covers the case of pointer types. The "opaque" attribute covers the case of opaque structured types. See also: https://gitlab.gnome.org/GNOME/vala/-/issues/735 Fixes: #101
Diffstat (limited to 'tests/scanner')
-rw-r--r--tests/scanner/Identfilter-1.0-expected.gir7
-rw-r--r--tests/scanner/Regress-1.0-expected.gir13
-rw-r--r--tests/scanner/Symbolfilter-1.0-expected.gir2
-rw-r--r--tests/scanner/Typedefs-1.0-expected.gir1
-rw-r--r--tests/scanner/test_transformer.py39
5 files changed, 56 insertions, 6 deletions
diff --git a/tests/scanner/Identfilter-1.0-expected.gir b/tests/scanner/Identfilter-1.0-expected.gir
index 15cd408a..05af2a56 100644
--- a/tests/scanner/Identfilter-1.0-expected.gir
+++ b/tests/scanner/Identfilter-1.0-expected.gir
@@ -11,10 +11,13 @@ and/or use gtk-doc annotations. -->
shared-library=""
c:identifier-prefixes="Identfilter"
c:symbol-prefixes="identfilter">
- <record name="Context" c:type="identfilter_t" disguised="1">
+ <record name="Context" c:type="identfilter_t" disguised="1" opaque="1">
<source-position filename="identfilter.h" line="4"/>
</record>
- <record name="Object" c:type="identfilter_object_t" disguised="1">
+ <record name="Object"
+ c:type="identfilter_object_t"
+ disguised="1"
+ opaque="1">
<source-position filename="identfilter.h" line="5"/>
<method name="foo_method" c:identifier="identfilter_object_foo_method">
<source-position filename="identfilter.h" line="8"/>
diff --git a/tests/scanner/Regress-1.0-expected.gir b/tests/scanner/Regress-1.0-expected.gir
index ecfc5cb6..902513d7 100644
--- a/tests/scanner/Regress-1.0-expected.gir
+++ b/tests/scanner/Regress-1.0-expected.gir
@@ -1511,6 +1511,7 @@ it says it's pointer but it's actually a string.</doc>
</union>
<record name="FooBoxed"
c:type="RegressFooBoxed"
+ opaque="1"
glib:type-name="RegressFooBoxed"
glib:get-type="regress_foo_boxed_get_type"
c:symbol-prefix="foo_boxed">
@@ -1557,6 +1558,7 @@ it says it's pointer but it's actually a string.</doc>
<record name="FooBufferClass"
c:type="RegressFooBufferClass"
disguised="1"
+ opaque="1"
glib:is-gtype-struct-for="FooBuffer">
<source-position filename="foo.h" line="52"/>
</record>
@@ -1582,6 +1584,7 @@ it says it's pointer but it's actually a string.</doc>
</callback>
<record name="FooDBusData"
c:type="RegressFooDBusData"
+ opaque="1"
glib:type-name="RegressFooDBusData"
glib:get-type="regress_foo_dbus_data_get_type"
c:symbol-prefix="foo_dbus_data">
@@ -2252,6 +2255,7 @@ uses a C sugar return type.</doc>
<record name="FooOtherObjectClass"
c:type="RegressFooOtherObjectClass"
disguised="1"
+ opaque="1"
glib:is-gtype-struct-for="FooOtherObject">
<source-position filename="foo.h" line="54"/>
</record>
@@ -2378,7 +2382,8 @@ exposed to language bindings.</doc>
</record>
<record name="FooStructPrivate"
c:type="RegressFooStructPrivate"
- disguised="1">
+ disguised="1"
+ opaque="1">
<source-position filename="foo.h" line="325"/>
</record>
<interface name="FooSubInterface"
@@ -2648,7 +2653,7 @@ exposed to language bindings.</doc>
<source-position filename="regress.h" line="520"/>
<type name="gint" c:type="gint"/>
</constant>
- <record name="Intset" c:type="RegressIntset" disguised="1">
+ <record name="Intset" c:type="RegressIntset" disguised="1" opaque="1">
<doc xml:space="preserve"
filename="regress.h"
line="1422">Like telepathy-glib's TpIntset.</doc>
@@ -3137,6 +3142,7 @@ use it should be.</doc>
</record>
<record name="TestBoxedD"
c:type="RegressTestBoxedD"
+ opaque="1"
copy-function="regress_test_boxed_d_copy"
free-function="regress_test_boxed_d_free"
glib:type-name="RegressTestBoxedD"
@@ -3193,7 +3199,8 @@ use it should be.</doc>
</record>
<record name="TestBoxedPrivate"
c:type="RegressTestBoxedPrivate"
- disguised="1">
+ disguised="1"
+ opaque="1">
<source-position filename="regress.h" line="677"/>
</record>
<callback name="TestCallback" c:type="RegressTestCallback">
diff --git a/tests/scanner/Symbolfilter-1.0-expected.gir b/tests/scanner/Symbolfilter-1.0-expected.gir
index 80fe0d4b..176b4f07 100644
--- a/tests/scanner/Symbolfilter-1.0-expected.gir
+++ b/tests/scanner/Symbolfilter-1.0-expected.gir
@@ -11,7 +11,7 @@ and/or use gtk-doc annotations. -->
shared-library=""
c:identifier-prefixes="Symbolfilter"
c:symbol-prefixes="symbolfilter">
- <record name="Object" c:type="SymbolfilterObject" disguised="1">
+ <record name="Object" c:type="SymbolfilterObject" disguised="1" opaque="1">
<source-position filename="symbolfilter.h" line="4"/>
<method name="filterObjectFooMethod"
c:identifier="SymbolfilterObjectFooMethod">
diff --git a/tests/scanner/Typedefs-1.0-expected.gir b/tests/scanner/Typedefs-1.0-expected.gir
index 05df44b9..94a50e7b 100644
--- a/tests/scanner/Typedefs-1.0-expected.gir
+++ b/tests/scanner/Typedefs-1.0-expected.gir
@@ -26,6 +26,7 @@ and/or use gtk-doc annotations. -->
</record>
<record name="BoxedWithHiddenStruct"
c:type="TypedefsBoxedWithHiddenStruct"
+ opaque="1"
glib:type-name="TypedefsBoxedWithHiddenStruct"
glib:get-type="typedefs_boxed_with_hidden_struct_get_type"
c:symbol-prefix="boxed_with_hidden_struct">
diff --git a/tests/scanner/test_transformer.py b/tests/scanner/test_transformer.py
index 3feed441..1b7aef3c 100644
--- a/tests/scanner/test_transformer.py
+++ b/tests/scanner/test_transformer.py
@@ -97,6 +97,8 @@ class TestStructTypedefs(unittest.TestCase):
node = self.namespace.get('Struct')
self.assertTrue(node is not None)
self.assertTrue(isinstance(node, ast.Record))
+ self.assertFalse(node.opaque)
+ self.assertFalse(node.pointer)
self.assertFalse(node.disguised)
self.assertEqual(len(node.fields), 1)
@@ -111,6 +113,8 @@ class TestStructTypedefs(unittest.TestCase):
node = self.namespace.get('Struct')
self.assertTrue(node is not None)
self.assertTrue(isinstance(node, ast.Record))
+ self.assertFalse(node.opaque)
+ self.assertFalse(node.pointer)
self.assertFalse(node.disguised)
self.assertEqual(len(node.fields), 1)
@@ -125,6 +129,8 @@ class TestStructTypedefs(unittest.TestCase):
node = self.namespace.get('Struct')
self.assertTrue(node is not None)
self.assertTrue(isinstance(node, ast.Record))
+ self.assertFalse(node.opaque)
+ self.assertFalse(node.pointer)
self.assertFalse(node.disguised)
self.assertEqual(len(node.fields), 1)
@@ -138,6 +144,8 @@ class TestStructTypedefs(unittest.TestCase):
node = self.namespace.get('Struct')
self.assertTrue(node is not None)
self.assertTrue(isinstance(node, ast.Record))
+ self.assertFalse(node.opaque)
+ self.assertFalse(node.pointer)
self.assertFalse(node.disguised)
self.assertEqual(len(node.fields), 1)
@@ -151,6 +159,8 @@ class TestStructTypedefs(unittest.TestCase):
node = self.namespace.get('Struct')
self.assertTrue(node is not None)
self.assertTrue(isinstance(node, ast.Record))
+ self.assertFalse(node.opaque)
+ self.assertFalse(node.pointer)
self.assertFalse(node.disguised)
self.assertEqual(len(node.fields), 1)
@@ -167,6 +177,8 @@ class TestStructTypedefs(unittest.TestCase):
node = self.namespace.get('Struct')
self.assertTrue(node is not None)
self.assertTrue(isinstance(node, ast.Record))
+ self.assertFalse(node.opaque)
+ self.assertFalse(node.pointer)
self.assertFalse(node.disguised)
self.assertEqual(len(node.fields), 1)
@@ -194,6 +206,8 @@ class TestStructTypedefs(unittest.TestCase):
node = self.namespace.get('Struct')
self.assertTrue(node is not None)
self.assertTrue(isinstance(node, ast.Record))
+ self.assertFalse(node.opaque)
+ self.assertFalse(node.pointer)
self.assertFalse(node.disguised)
self.assertEqual(len(node.fields), 1)
self.assertEqual(node.ctype, 'TestStruct')
@@ -201,6 +215,8 @@ class TestStructTypedefs(unittest.TestCase):
shared = self.namespace.get('StructAlias')
self.assertTrue(shared is not None)
self.assertTrue(isinstance(shared, ast.Record))
+ self.assertFalse(shared.opaque)
+ self.assertFalse(shared.pointer)
self.assertFalse(shared.disguised)
self.assertEqual(len(shared.fields), 1)
self.assertEqual(shared.ctype, 'TestStructAlias')
@@ -218,6 +234,8 @@ class TestStructTypedefs(unittest.TestCase):
node = self.namespace.get('Struct')
self.assertTrue(node is not None)
self.assertTrue(isinstance(node, ast.Record))
+ self.assertFalse(node.opaque)
+ self.assertFalse(node.pointer)
self.assertFalse(node.disguised)
self.assertEqual(len(node.fields), 1)
self.assertEqual(node.ctype, 'TestStruct')
@@ -225,6 +243,8 @@ class TestStructTypedefs(unittest.TestCase):
shared = self.namespace.get('StructAlias')
self.assertTrue(shared is not None)
self.assertTrue(isinstance(shared, ast.Record))
+ self.assertFalse(shared.opaque)
+ self.assertFalse(shared.pointer)
self.assertFalse(shared.disguised)
self.assertEqual(len(shared.fields), 1)
self.assertEqual(shared.ctype, 'TestStructAlias')
@@ -262,6 +282,8 @@ class TestStructTypedefs(unittest.TestCase):
node = self.namespace.get('Struct')
self.assertTrue(node is not None)
self.assertTrue(isinstance(node, ast.Record))
+ self.assertFalse(node.opaque)
+ self.assertFalse(node.pointer)
self.assertFalse(node.disguised)
self.assertEqual(node.ctype, 'TestStruct')
self.assertEqual(len(node.fields), 1)
@@ -270,10 +292,27 @@ class TestStructTypedefs(unittest.TestCase):
self.assertTrue(ptr is not None)
# This currently gives a disguised Record instead of an Alias
self.assertTrue(isinstance(ptr, ast.Record))
+ self.assertFalse(ptr.opaque)
+ self.assertTrue(ptr.pointer)
self.assertTrue(ptr.disguised)
self.assertEqual(len(ptr.fields), 0)
self.assertEqual(ptr.ctype, 'TestStructPtr')
+ def test_opaque_struct(self):
+ load_namespace_from_source_string(self.namespace, """
+ typedef struct _TestStruct TestStruct;
+ """)
+ self.assertEqual(len(self.namespace.names), 1)
+
+ node = self.namespace.get('Struct')
+ self.assertIsNotNone(node)
+ self.assertIsInstance(node, ast.Record)
+ self.assertTrue(node.opaque)
+ self.assertFalse(node.pointer)
+ self.assertTrue(node.disguised)
+ self.assertEqual(node.ctype, 'TestStruct')
+ self.assertFalse(node.fields)
+
class TestNestedStructs(unittest.TestCase):
def setUp(self):