Skip to content

Commit

Permalink
Recognize multiple valid CCode.gir_namespace/_version attributes in V…
Browse files Browse the repository at this point in the history
  • Loading branch information
ricotz committed Jun 28, 2021
1 parent 02221a0 commit 2b1ac18
Show file tree
Hide file tree
Showing 7 changed files with 106 additions and 5 deletions.
29 changes: 25 additions & 4 deletions codegen/valagirwriter.vala
Expand Up @@ -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);
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -1725,8 +1740,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);
}
Expand All @@ -1735,7 +1756,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);
}
Expand Down
3 changes: 3 additions & 0 deletions tests/Makefile.am
Expand Up @@ -769,6 +769,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-assignment.test \
Expand Down Expand Up @@ -1272,6 +1273,8 @@ endif

EXTRA_DIST = \
glib/tests-extra-environment.sh \
girwriter/tests-extra-environment.sh \
girwriter/combined.vapi \
gtktemplate/tests-extra-environment.sh \
parser-keep-going/tests-extra-environment.sh \
linux/tests-extra-environment.sh \
Expand Down
54 changes: 54 additions & 0 deletions 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>
15 changes: 15 additions & 0 deletions 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 {
}
}
1 change: 1 addition & 0 deletions tests/girwriter/tests-extra-environment.sh
@@ -0,0 +1 @@
VALAFLAGS="--vapidir ${abs_srcdir}/girwriter"
7 changes: 6 additions & 1 deletion vala/valanamespace.vala
Expand Up @@ -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");
Expand Down
2 changes: 2 additions & 0 deletions vala/valasourcefile.vala
Expand Up @@ -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.
*/
Expand Down

0 comments on commit 2b1ac18

Please sign in to comment.