]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Recognize multiple valid CCode.gir_namespace/_version attributes in VAPI files
authorRico Tzschichholz <ricotz@ubuntu.com>
Mon, 28 Jun 2021 18:39:09 +0000 (20:39 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Thu, 22 Jul 2021 08:59:23 +0000 (10:59 +0200)
Fixes https://gitlab.gnome.org/GNOME/vala/issues/1189

codegen/valagirwriter.vala
tests/Makefile.am
tests/girwriter/combined.test [new file with mode: 0644]
tests/girwriter/combined.vapi [new file with mode: 0644]
tests/girwriter/tests-extra-environment.sh [new file with mode: 0644]
vala/valanamespace.vala
vala/valasourcefile.vala

index 174e30f6708d1c8bc3a43bd66f5b1fca4eda0e6d..b96c280ae4fdd204fe242b1de5d8003bd46c30d8 100644 (file)
@@ -124,6 +124,16 @@ public class Vala.GIRWriter : CodeVisitor {
                public bool equal (GIRNamespace g) {
                        return ((ns == g.ns) && (version == g.version));
                }
+
+               public static GIRNamespace for_symbol (Symbol sym) {
+                       while (sym.parent_symbol != null && sym.parent_symbol.name != null) {
+                               sym = sym.parent_symbol;
+                       }
+                       assert (sym is Namespace);
+                       string gir_namespace = sym.get_attribute_string ("CCode", "gir_namespace");
+                       string gir_version = sym.get_attribute_string ("CCode", "gir_version");
+                       return GIRNamespace (gir_namespace, gir_version);
+               }
        }
 
        private ArrayList<GIRNamespace?> externals = new ArrayList<GIRNamespace?> ((EqualFunc<GIRNamespace>) GIRNamespace.equal);
@@ -300,7 +310,12 @@ public class Vala.GIRWriter : CodeVisitor {
                        if (node is Namespace && ((Namespace) node).parent_symbol == context.root) {
                                var a = node.get_attribute ("CCode");
                                if (a != null && a.has_argument ("gir_namespace")) {
-                                       source_file.gir_namespace = a.get_string ("gir_namespace");
+                                       var new_gir = a.get_string ("gir_namespace");
+                                       var old_gir = source_file.gir_namespace;
+                                       if (old_gir != null && old_gir != new_gir) {
+                                               source_file.gir_ambiguous = true;
+                                       }
+                                       source_file.gir_namespace = new_gir;
                                }
                                if (a != null && a.has_argument ("gir_version")) {
                                        source_file.gir_version = a.get_string ("gir_version");
@@ -1710,8 +1725,14 @@ public class Vala.GIRWriter : CodeVisitor {
                        Namespace ns = parent as Namespace;
                        var ns_gir_name = ns.get_attribute_string ("GIR", "name") ?? ns.name;
                        if (ns_gir_name != null) {
-                               if (type_symbol.source_reference.file.gir_namespace != null) {
-                                       GIRNamespace external = GIRNamespace (type_symbol.source_reference.file.gir_namespace, type_symbol.source_reference.file.gir_version);
+                               unowned SourceFile source_file = type_symbol.source_reference.file;
+                               if (source_file.gir_namespace != null) {
+                                       GIRNamespace external;
+                                       if (source_file.gir_ambiguous) {
+                                               external = GIRNamespace.for_symbol (type_symbol);
+                                       } else {
+                                               external = GIRNamespace (source_file.gir_namespace, source_file.gir_version);
+                                       }
                                        if (!externals.contains (external)) {
                                                externals.add (external);
                                        }
@@ -1720,7 +1741,7 @@ public class Vala.GIRWriter : CodeVisitor {
                                                return gir_fullname;
                                        }
                                        var type_name = type_symbol.get_attribute_string ("GIR", "name") ?? type_symbol.name;
-                                       return "%s.%s".printf (type_symbol.source_reference.file.gir_namespace, type_name);
+                                       return "%s.%s".printf (external.ns, type_name);
                                } else {
                                        unannotated_namespaces.add(ns);
                                }
index b1742fd48ec7328f96bc7059df10d5df46abf453..cff8492b0e268ee8f854b854739f1d469578e679 100644 (file)
@@ -754,6 +754,7 @@ TESTS = \
        gir/symbol-type-csuffix.test \
        gir/union.test \
        gir/union-transparent.test \
+       girwriter/combined.test \
        gtktemplate/gtkcallback-incompatible.test \
        gtktemplate/gtkcallback-unknown.test \
        gtktemplate/gtkchild-field-incompatible-type.test \
@@ -1234,6 +1235,8 @@ LINUX_TESTS += \
 endif
 
 EXTRA_DIST = \
+       girwriter/tests-extra-environment.sh \
+       girwriter/combined.vapi \
        gtktemplate/tests-extra-environment.sh \
        linux/tests-extra-environment.sh \
        nullability/tests-extra-environment.sh \
diff --git a/tests/girwriter/combined.test b/tests/girwriter/combined.test
new file mode 100644 (file)
index 0000000..a56f26a
--- /dev/null
@@ -0,0 +1,54 @@
+Packages: combined
+GIRWriter
+
+Input:
+
+public Foo.Test use_combined_foo (Foo.Test param) {
+       return param;
+}
+public Bar.Test use_combined_bar (Bar.Test param) {
+       return param;
+}
+public Manam.Test use_combined_manam (Manam.Test param) {
+       return param;
+}
+
+Output:
+
+<include name="Foo" version="1.0"/>
+<include name="Bar" version="1.0"/>
+<include name="Manam" version="1.0"/>
+<package name="test"/>
+<c:include name="test.h"/>
+<namespace name="Test" version="1.2" c:prefix="Test" c:identifier-prefixes="Test" c:symbol-prefixes="test">
+  <function name="use_combined_foo" c:identifier="test_use_combined_foo">
+    <return-value transfer-ownership="full">
+      <type name="Foo.Test" c:type="FooTest*"/>
+    </return-value>
+    <parameters>
+      <parameter name="param" transfer-ownership="none">
+        <type name="Foo.Test" c:type="FooTest*"/>
+      </parameter>
+    </parameters>
+  </function>
+  <function name="use_combined_bar" c:identifier="test_use_combined_bar">
+    <return-value transfer-ownership="full">
+      <type name="Bar.Test" c:type="BarTest*"/>
+    </return-value>
+    <parameters>
+      <parameter name="param" transfer-ownership="none">
+        <type name="Bar.Test" c:type="BarTest*"/>
+      </parameter>
+    </parameters>
+  </function>
+  <function name="use_combined_manam" c:identifier="test_use_combined_manam">
+    <return-value transfer-ownership="full">
+      <type name="Manam.Test" c:type="ManamTest*"/>
+    </return-value>
+    <parameters>
+      <parameter name="param" transfer-ownership="none">
+        <type name="Manam.Test" c:type="ManamTest*"/>
+      </parameter>
+    </parameters>
+  </function>
+</namespace>
diff --git a/tests/girwriter/combined.vapi b/tests/girwriter/combined.vapi
new file mode 100644 (file)
index 0000000..9c9c877
--- /dev/null
@@ -0,0 +1,15 @@
+[CCode (cprefix = "Bar", gir_namespace = "Bar", gir_version = "1.0", lower_case_cprefix = "bar_")]
+namespace Bar {
+       public class Test {
+       }
+}
+[CCode (cprefix = "Foo", gir_namespace = "Foo", gir_version = "1.0", lower_case_cprefix = "foo_")]
+namespace Foo {
+       public class Test {
+       }
+}
+[CCode (cprefix = "Manam", gir_namespace = "Manam", gir_version = "1.0", lower_case_cprefix = "manam_")]
+namespace Manam {
+       public class Test {
+       }
+}
diff --git a/tests/girwriter/tests-extra-environment.sh b/tests/girwriter/tests-extra-environment.sh
new file mode 100644 (file)
index 0000000..6287225
--- /dev/null
@@ -0,0 +1 @@
+VALAFLAGS="--vapidir ${abs_srcdir}/girwriter"
index 121ad9f5eb233a5566adb7173368f810a616e6c8..d62babb63fd306e42f631de6ca3caa505c280c11 100644 (file)
@@ -467,7 +467,12 @@ public class Vala.Namespace : Symbol {
 
                var a = get_attribute ("CCode");
                if (a != null && a.has_argument ("gir_namespace")) {
-                       source_reference.file.gir_namespace = a.get_string ("gir_namespace");
+                       var new_gir = a.get_string ("gir_namespace");
+                       var old_gir = source_reference.file.gir_namespace;
+                       if (old_gir != null && old_gir != new_gir) {
+                               source_reference.file.gir_ambiguous = true;
+                       }
+                       source_reference.file.gir_namespace = new_gir;
                }
                if (a != null && a.has_argument ("gir_version")) {
                        source_reference.file.gir_version = a.get_string ("gir_version");
index ac9000f49f2aa701db42ec28eea181ab430e2577..826925bfd9e3ac6943bb77be80874472a75bc01c 100644 (file)
@@ -105,6 +105,8 @@ public class Vala.SourceFile {
 
        public string gir_version { get; set; }
 
+       public bool gir_ambiguous { get; set; }
+
        /**
         * The context this source file belongs to.
         */