summaryrefslogtreecommitdiff
path: root/vala/valasymbolresolver.vala
diff options
context:
space:
mode:
authorJuerg Billeter <j@bitron.ch>2008-02-24 15:15:07 +0000
committerJürg Billeter <juergbi@src.gnome.org>2008-02-24 15:15:07 +0000
commit3c0ec04e5aa5255fa1fe54c734b28814c9726cbc (patch)
treede2fb00e1efad1af7609ab3ca46e44b835f54ed5 /vala/valasymbolresolver.vala
parent4dbdb2ebbfefd809aa52fb72f69f34db3a1cdcb7 (diff)
downloadvala-3c0ec04e5aa5255fa1fe54c734b28814c9726cbc.tar.gz
generalize symbol resolving to fully support inner types
2008-02-24 Juerg Billeter <j@bitron.ch> * vala/parser.y, vala/vala.h, vala/valasymbolresolver.vala, vala/valaunresolvedsymbol.vala, vala/valaunresolvedtype.vala: generalize symbol resolving to fully support inner types * vala/Makefile.am: update * vapigen/valagidlparser.vala, vapi/packages/gtk+-2.0/: adapt to new symbol resolving * vapi/atk.vapi, vapi/gdk-2.0.vapi, vapi/glib-2.0.vapi, vapi/gnome-desktop-2.0.vapi, vapi/gnome-vfs-2.0.vapi, vapi/gstreamer-0.10.vapi, vapi/gtk+-2.0.vapi, vapi/libglade-2.0.vapi, vapi/libgnomeui-2.0.vapi, vapi/webkit-1.0.vapi: regenerated svn path=/trunk/; revision=1049
Diffstat (limited to 'vala/valasymbolresolver.vala')
-rw-r--r--vala/valasymbolresolver.vala114
1 files changed, 53 insertions, 61 deletions
diff --git a/vala/valasymbolresolver.vala b/vala/valasymbolresolver.vala
index c758ff1a6..c1f5f8bcc 100644
--- a/vala/valasymbolresolver.vala
+++ b/vala/valasymbolresolver.vala
@@ -180,34 +180,13 @@ public class Vala.SymbolResolver : CodeVisitor {
}
}
- private DataType! resolve_type (UnresolvedType! unresolved_type) {
- var type = new DataType ();
- type.source_reference = unresolved_type.source_reference;
- type.takes_ownership = unresolved_type.takes_ownership;
- type.transfers_ownership = unresolved_type.transfers_ownership;
- type.is_ref = unresolved_type.is_ref;
- type.is_out = unresolved_type.is_out;
- type.nullable = unresolved_type.nullable;
- type.requires_null_check = unresolved_type.requires_null_check;
- foreach (DataType type_arg in unresolved_type.get_type_arguments ()) {
- type.add_type_argument (type_arg);
- }
-
- // still required for vapigen
- if (unresolved_type.type_name == "void") {
- return new VoidType ();
- }
-
- if (unresolved_type.namespace_name == null) {
+ private Symbol? resolve_symbol (UnresolvedSymbol unresolved_symbol) {
+ if (unresolved_symbol.inner == null) {
Symbol sym = null;
Scope scope = current_scope;
while (sym == null && scope != null) {
- sym = scope.lookup (unresolved_type.type_name);
+ sym = scope.lookup (unresolved_symbol.name);
scope = scope.parent_scope;
- if (sym != null && !(sym is Typesymbol) && !(sym is TypeParameter)) {
- // ignore non-type symbols
- sym = null;
- }
}
if (sym == null) {
foreach (NamespaceReference ns in current_using_directives) {
@@ -215,55 +194,68 @@ public class Vala.SymbolResolver : CodeVisitor {
continue;
}
- var local_sym = ns.namespace_symbol.scope.lookup (unresolved_type.type_name);
+ var local_sym = ns.namespace_symbol.scope.lookup (unresolved_symbol.name);
if (local_sym != null) {
if (sym != null) {
- Report.error (type.source_reference, "`%s' is an ambiguous reference between `%s' and `%s'".printf (unresolved_type.type_name, sym.get_full_name (), local_sym.get_full_name ()));
- return new InvalidType ();
+ unresolved_symbol.error = true;
+ Report.error (unresolved_symbol.source_reference, "`%s' is an ambiguous reference between `%s' and `%s'".printf (unresolved_symbol.name, sym.get_full_name (), local_sym.get_full_name ()));
+ return null;
}
sym = local_sym;
}
}
}
- if (sym == null) {
- Report.error (type.source_reference, "The type name `%s' could not be found".printf (unresolved_type.type_name));
- return new InvalidType ();
- }
- if (sym is TypeParameter) {
- type.type_parameter = (TypeParameter) sym;
- } else if (sym is Typesymbol) {
- if (sym is Delegate) {
- type = new DelegateType ((Delegate) sym);
- } else {
- type.data_type = (Typesymbol) sym;
- }
- } else {
- Report.error (type.source_reference, "`%s' is not a type".printf (sym.get_full_name ()));
- return new InvalidType ();
- }
+ return sym;
} else {
- var ns_symbol = root_symbol.scope.lookup (unresolved_type.namespace_name);
- if (ns_symbol == null) {
- type.error = true;
- Report.error (type.source_reference, "The namespace name `%s' could not be found".printf (unresolved_type.namespace_name));
- return new InvalidType ();
+ var parent_symbol = resolve_symbol (unresolved_symbol.inner);
+ if (parent_symbol == null) {
+ unresolved_symbol.error = true;
+ Report.error (unresolved_symbol.inner.source_reference, "The symbol `%s' could not be found".printf (unresolved_symbol.inner.name));
+ return null;
}
-
- var sym = ns_symbol.scope.lookup (unresolved_type.type_name);
- if (sym == null) {
- Report.error (type.source_reference, "The type name `%s' does not exist in the namespace `%s'".printf (unresolved_type.type_name, unresolved_type.namespace_name));
- return new InvalidType ();
+
+ return parent_symbol.scope.lookup (unresolved_symbol.name);
+ }
+ }
+
+ private DataType! resolve_type (UnresolvedType! unresolved_type) {
+ var type = new DataType ();
+ type.source_reference = unresolved_type.source_reference;
+ type.takes_ownership = unresolved_type.takes_ownership;
+ type.transfers_ownership = unresolved_type.transfers_ownership;
+ type.is_ref = unresolved_type.is_ref;
+ type.is_out = unresolved_type.is_out;
+ type.nullable = unresolved_type.nullable;
+ type.requires_null_check = unresolved_type.requires_null_check;
+ foreach (DataType type_arg in unresolved_type.get_type_arguments ()) {
+ type.add_type_argument (type_arg);
+ }
+
+ // still required for vapigen
+ if (unresolved_type.unresolved_symbol.name == "void") {
+ return new VoidType ();
+ }
+
+ var sym = resolve_symbol (unresolved_type.unresolved_symbol);
+ if (sym == null) {
+ // don't report same error twice
+ if (!unresolved_type.unresolved_symbol.error) {
+ Report.error (type.source_reference, "The type name `%s' could not be found".printf (unresolved_type.unresolved_symbol.to_string ()));
}
- if (sym is Typesymbol) {
- if (sym is Delegate) {
- type = new DelegateType ((Delegate) sym);
- } else {
- type.data_type = (Typesymbol) sym;
- }
+ return new InvalidType ();
+ }
+
+ if (sym is TypeParameter) {
+ type.type_parameter = (TypeParameter) sym;
+ } else if (sym is Typesymbol) {
+ if (sym is Delegate) {
+ type = new DelegateType ((Delegate) sym);
} else {
- Report.error (type.source_reference, "`%s' is not a type".printf (sym.get_full_name ()));
- return new InvalidType ();
+ type.data_type = (Typesymbol) sym;
}
+ } else {
+ Report.error (type.source_reference, "`%s' is not a type".printf (sym.get_full_name ()));
+ return new InvalidType ();
}
for (int pointer_level = unresolved_type.pointer_level; pointer_level > 0; pointer_level--) {