diff options
author | Juerg Billeter <j@bitron.ch> | 2008-02-24 15:15:07 +0000 |
---|---|---|
committer | Jürg Billeter <juergbi@src.gnome.org> | 2008-02-24 15:15:07 +0000 |
commit | 3c0ec04e5aa5255fa1fe54c734b28814c9726cbc (patch) | |
tree | de2fb00e1efad1af7609ab3ca46e44b835f54ed5 /vala/valasymbolresolver.vala | |
parent | 4dbdb2ebbfefd809aa52fb72f69f34db3a1cdcb7 (diff) | |
download | vala-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.vala | 114 |
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--) { |