summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2021-06-28 20:39:09 +0200
committerRico Tzschichholz <ricotz@ubuntu.com>2021-07-22 10:59:23 +0200
commite96e20bd49c80ba170ff106f64a88d04c91f9942 (patch)
tree2e23bc9cd5eb198d7fca784b56345e12ca3fcad4
parent0a19babc1e908437f1e3a7f2a2a46c8a6626b592 (diff)
downloadvala-e96e20bd49c80ba170ff106f64a88d04c91f9942.tar.gz
Recognize multiple valid CCode.gir_namespace/_version attributes in VAPI files
Fixes https://gitlab.gnome.org/GNOME/vala/issues/1189
-rw-r--r--codegen/valagirwriter.vala29
-rw-r--r--tests/Makefile.am3
-rw-r--r--tests/girwriter/combined.test54
-rw-r--r--tests/girwriter/combined.vapi15
-rw-r--r--tests/girwriter/tests-extra-environment.sh1
-rw-r--r--vala/valanamespace.vala7
-rw-r--r--vala/valasourcefile.vala2
7 files changed, 106 insertions, 5 deletions
diff --git a/codegen/valagirwriter.vala b/codegen/valagirwriter.vala
index 174e30f67..b96c280ae 100644
--- a/codegen/valagirwriter.vala
+++ b/codegen/valagirwriter.vala
@@ -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);
}
diff --git a/tests/Makefile.am b/tests/Makefile.am
index b1742fd48..cff8492b0 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -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
index 000000000..a56f26ada
--- /dev/null
+++ b/tests/girwriter/combined.test
@@ -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
index 000000000..9c9c8775a
--- /dev/null
+++ b/tests/girwriter/combined.vapi
@@ -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
index 000000000..6287225e7
--- /dev/null
+++ b/tests/girwriter/tests-extra-environment.sh
@@ -0,0 +1 @@
+VALAFLAGS="--vapidir ${abs_srcdir}/girwriter"
diff --git a/vala/valanamespace.vala b/vala/valanamespace.vala
index 121ad9f5e..d62babb63 100644
--- a/vala/valanamespace.vala
+++ b/vala/valanamespace.vala
@@ -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");
diff --git a/vala/valasourcefile.vala b/vala/valasourcefile.vala
index ac9000f49..826925bfd 100644
--- a/vala/valasourcefile.vala
+++ b/vala/valasourcefile.vala
@@ -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.
*/