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);
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");
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);
}
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);
}
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 \
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 \
--- /dev/null
+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>
--- /dev/null
+[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 {
+ }
+}
--- /dev/null
+VALAFLAGS="--vapidir ${abs_srcdir}/girwriter"
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");
public string gir_version { get; set; }
+ public bool gir_ambiguous { get; set; }
+
/**
* The context this source file belongs to.
*/