summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2018-08-09 09:54:34 +0200
committerRico Tzschichholz <ricotz@ubuntu.com>2018-08-09 10:17:11 +0200
commit19614b6562b65d91139846826af134993275282d (patch)
tree5a09a9d8e8f0b94e610fd6fa1eb873e3e64f2201
parent3499d33bea0cd8dd705895830f7e9234d4b22be4 (diff)
downloadvala-19614b6562b65d91139846826af134993275282d.tar.gz
girparser: Actually resolve type-arguments to be able to box them if needed
-rw-r--r--vala/valagirparser.vala26
1 files changed, 16 insertions, 10 deletions
diff --git a/vala/valagirparser.vala b/vala/valagirparser.vala
index 203a1ec8a..8d266917a 100644
--- a/vala/valagirparser.vala
+++ b/vala/valagirparser.vala
@@ -1306,7 +1306,7 @@ public class Vala.GirParser : CodeVisitor {
Set<string> provided_namespaces = new HashSet<string> (str_hash, str_equal);
HashMap<UnresolvedSymbol,Symbol> unresolved_symbols_map = new HashMap<UnresolvedSymbol,Symbol> (unresolved_symbol_hash, unresolved_symbol_equal);
ArrayList<UnresolvedSymbol> unresolved_gir_symbols = new ArrayList<UnresolvedSymbol> ();
- ArrayList<DataType> unresolved_type_arguments = new ArrayList<DataType> ();
+ HashMap<UnresolvedType,Node> unresolved_type_arguments = new HashMap<UnresolvedType,Node> ();
/**
* Parses all .gir source files in the specified code
@@ -2626,7 +2626,14 @@ public class Vala.GirParser : CodeVisitor {
var element_type = parse_type ();
element_type.value_owned = transfer_elements;
type.add_type_argument (element_type);
- unresolved_type_arguments.add (element_type);
+
+ if (element_type is UnresolvedType) {
+ Node parent = current ?? root;
+ while (parent != root && parent.parent != null && parent.parent != root) {
+ parent = parent.parent;
+ }
+ unresolved_type_arguments[(UnresolvedType) element_type] = parent;
+ }
}
end_element (is_array ? "array" : "type");
@@ -3592,14 +3599,13 @@ public class Vala.GirParser : CodeVisitor {
}
void resolve_type_arguments () {
- // box structs in type arguments
- foreach (var element_type in unresolved_type_arguments) {
- TypeSymbol sym = null;
- if (element_type is UnresolvedType) {
- sym = (TypeSymbol) resolve_symbol (root, ((UnresolvedType) element_type).unresolved_symbol);
- } else if (element_type.data_type != null) {
- sym = element_type.data_type;
- }
+ var it = unresolved_type_arguments.map_iterator ();
+ while (it.next ()) {
+ var element_type = it.get_key ();
+ var parent = it.get_value ();
+ var sym = (TypeSymbol) resolve_symbol (parent, element_type.unresolved_symbol);
+
+ // box structs in type arguments
var st = sym as Struct;
if (st != null && !st.is_integer_type () && !st.is_floating_type ()) {
element_type.nullable = true;