diff options
author | Emmanuele Bassi <ebassi@gnome.org> | 2022-07-13 12:45:57 +0100 |
---|---|---|
committer | Emmanuele Bassi <ebassi@gmail.com> | 2023-01-08 21:48:45 +0000 |
commit | 8d44bd13940649a708c8a2186cd3ba58ce6fc503 (patch) | |
tree | 390c0457dc2939502a7c7a1e15e8b933fc1145d7 /tests/scanner/test_transformer.py | |
parent | 9ffbdd3738b02a0220c8d9156babf20e0c5ff7d4 (diff) | |
download | gobject-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/test_transformer.py')
-rw-r--r-- | tests/scanner/test_transformer.py | 39 |
1 files changed, 39 insertions, 0 deletions
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): |