summaryrefslogtreecommitdiff
path: root/vala/valasymbolresolver.vala
diff options
context:
space:
mode:
authorJuerg Billeter <j@bitron.ch>2007-07-21 14:29:16 +0000
committerJürg Billeter <juergbi@src.gnome.org>2007-07-21 14:29:16 +0000
commitdb24aa20579b766161a070df69923e9f56ab7dd3 (patch)
tree92e6b6a6c5f6638c4ccce8cab3e2348b83286c03 /vala/valasymbolresolver.vala
parent611df119392203ed4648f754139902547c2ebee8 (diff)
downloadvala-db24aa20579b766161a070df69923e9f56ab7dd3.tar.gz
derive from Symbol class where appropriate and move symbol table into
2007-07-21 Juerg Billeter <j@bitron.ch> * vala/Makefile.am, vala/parser.y, vala/scanner.l, vala/vala.h, vala/valaarray.vala, vala/valaarraylengthfield.vala, vala/valaarrayresizemethod.vala, vala/valaattributeprocessor.vala, vala/valablock.vala, vala/valabreakstatement.vala, vala/valacallback.vala, vala/valaclass.vala, vala/valacodecontext.vala, vala/valacodenode.vala, vala/valacodevisitor.vala, vala/valaconstant.vala, vala/valaconstructor.vala, vala/valacontinuestatement.vala, vala/valacreationmethod.vala, vala/valadatatype.vala, vala/valadeclarationstatement.vala, vala/valadestructor.vala, vala/valadostatement.vala, vala/valaemptystatement.vala, vala/valaenum.vala, vala/valaenumvalue.vala, vala/valaexpressionstatement.vala, vala/valafield.vala, vala/valaflags.vala, vala/valaflagsvalue.vala, vala/valaforeachstatement.vala, vala/valaformalparameter.vala, vala/valaforstatement.vala, vala/valaifstatement.vala, vala/valainterface.vala, vala/valainterfacewriter.vala, vala/valalockstatement.vala, vala/valamember.vala, vala/valamemorymanager.vala, vala/valamethod.vala, vala/valanamespace.vala, vala/valaproperty.vala, vala/valapropertyaccessor.vala, vala/valareturnstatement.vala, vala/valascope.vala, vala/valasemanticanalyzer.vala, vala/valasignal.vala, vala/valasourcefile.vala, vala/valastatement.vala, vala/valastruct.vala, vala/valaswitchstatement.vala, vala/valasymbol.vala, vala/valasymbolbuilder.vala, vala/valasymbolresolver.vala, vala/valathrowstatement.vala, vala/valatrystatement.vala, vala/valatypeparameter.vala, vala/valatypereference.vala, vala/valavariabledeclarator.vala, vala/valawhilestatement.vala, gobject/valacodegenerator.vala, gobject/valacodegeneratorassignment.vala, gobject/valacodegeneratorclass.vala, gobject/valacodegeneratorinterface.vala, gobject/valacodegeneratorinvocationexpression.vala, gobject/valacodegeneratormemberaccess.vala, gobject/valacodegeneratormethod.vala, gobject/valacodegeneratorsignal.vala, gobject/valacodegeneratorstruct.vala, compiler/valacompiler.vala, vapi/atk.vala, vapi/gdk-2.0.vala, vapi/gio-standalone.vala, vapi/glib-2.0.vala, vapi/gstreamer-0.10.vala, vapi/gtk+-2.0.vala, vapi/packages/gstreamer-0.10/gstreamer-0.10-custom.vala, vapi/packages/gtk+-2.0/gtk+-2.0-custom.vala, vapi/pango.vala, vapi/vte.vala, vapigen/valagidlparser.vala, vapigen/valavapigen.vala: derive from Symbol class where appropriate and move symbol table into separate Scope class svn path=/trunk/; revision=366
Diffstat (limited to 'vala/valasymbolresolver.vala')
-rw-r--r--vala/valasymbolresolver.vala62
1 files changed, 36 insertions, 26 deletions
diff --git a/vala/valasymbolresolver.vala b/vala/valasymbolresolver.vala
index 2b90d628d..379ebeb84 100644
--- a/vala/valasymbolresolver.vala
+++ b/vala/valasymbolresolver.vala
@@ -27,7 +27,7 @@ using GLib;
*/
public class Vala.SymbolResolver : CodeVisitor {
Symbol root_symbol;
- Symbol current_scope;
+ Scope current_scope;
List<weak NamespaceReference> current_using_directives;
Class object_class;
@@ -39,12 +39,12 @@ public class Vala.SymbolResolver : CodeVisitor {
*/
public void resolve (CodeContext! context) {
root_symbol = context.root;
- current_scope = root_symbol;
+ current_scope = root_symbol.scope;
// TODO: don't require GLib namespace in symbol resolver
- var glib_ns = root_symbol.lookup ("GLib");
+ var glib_ns = root_symbol.scope.lookup ("GLib");
if (glib_ns != null) {
- object_class = (Class) glib_ns.lookup ("Object").node;
+ object_class = (Class) glib_ns.scope.lookup ("Object");
}
context.accept (this);
@@ -52,7 +52,7 @@ public class Vala.SymbolResolver : CodeVisitor {
public override void visit_source_file (SourceFile! file) {
current_using_directives = file.get_using_directives ();
- current_scope = root_symbol;
+ current_scope = root_symbol.scope;
file.accept_children (this);
@@ -60,14 +60,14 @@ public class Vala.SymbolResolver : CodeVisitor {
}
public override void visit_class (Class! cl) {
- current_scope = cl.symbol;
+ current_scope = cl.scope;
cl.accept_children (this);
foreach (TypeReference type in cl.get_base_types ()) {
if (type.data_type is Class) {
if (cl.base_class != null) {
- Report.error (type.source_reference, "%s: Classes cannot have multiple base classes (`%s' and `%s')".printf (cl.symbol.get_full_name (), cl.base_class.symbol.get_full_name (), type.data_type.symbol.get_full_name ()));
+ Report.error (type.source_reference, "%s: Classes cannot have multiple base classes (`%s' and `%s')".printf (cl.get_full_name (), cl.base_class.get_full_name (), type.data_type.get_full_name ()));
return;
}
cl.base_class = (Class) type.data_type;
@@ -80,51 +80,61 @@ public class Vala.SymbolResolver : CodeVisitor {
cl.base_class = object_class;
}
- current_scope = current_scope.parent_symbol;
+ current_scope = current_scope.parent_scope;
}
public override void visit_struct (Struct! st) {
- current_scope = st.symbol;
+ current_scope = st.scope;
st.accept_children (this);
- current_scope = current_scope.parent_symbol;
+ current_scope = current_scope.parent_scope;
}
public override void visit_interface (Interface! iface) {
- current_scope = iface.symbol;
+ current_scope = iface.scope;
iface.accept_children (this);
- current_scope = current_scope.parent_symbol;
+ current_scope = current_scope.parent_scope;
}
public override void visit_enum (Enum! en) {
- current_scope = en.symbol;
+ current_scope = en.scope;
en.accept_children (this);
- current_scope = current_scope.parent_symbol;
+ current_scope = current_scope.parent_scope;
}
public override void visit_callback (Callback! cb) {
- current_scope = cb.symbol;
+ current_scope = cb.scope;
cb.accept_children (this);
- current_scope = current_scope.parent_symbol;
+ current_scope = current_scope.parent_scope;
}
public override void visit_constant (Constant! c) {
+ current_scope = c.scope;
+
c.accept_children (this);
}
public override void visit_field (Field! f) {
+ current_scope = f.scope;
+
f.accept_children (this);
+
+ current_scope = current_scope.parent_scope;
}
public override void visit_method (Method! m) {
+ current_scope = m.scope;
+
m.accept_children (this);
+
+ current_scope = current_scope.parent_scope;
}
public override void visit_creation_method (CreationMethod! m) {
@@ -173,11 +183,11 @@ public class Vala.SymbolResolver : CodeVisitor {
if (type.namespace_name == null) {
Symbol sym = null;
- Symbol scope = current_scope;
+ Scope scope = current_scope;
while (sym == null && scope != null) {
sym = scope.lookup (type.type_name);
- scope = scope.parent_symbol;
- if (sym != null && !(sym.node is DataType) && !(sym.node is TypeParameter)) {
+ scope = scope.parent_scope;
+ if (sym != null && !(sym is DataType) && !(sym is TypeParameter)) {
// ignore non-type symbols
sym = null;
}
@@ -188,7 +198,7 @@ public class Vala.SymbolResolver : CodeVisitor {
continue;
}
- var local_sym = ns.namespace_symbol.lookup (type.type_name);
+ var local_sym = ns.namespace_symbol.scope.lookup (type.type_name);
if (local_sym != null) {
if (sym != null) {
Report.error (type.source_reference, "`%s' is an ambiguous reference between `%s' and `%s'".printf (type.type_name, sym.get_full_name (), local_sym.get_full_name ()));
@@ -202,25 +212,25 @@ public class Vala.SymbolResolver : CodeVisitor {
Report.error (type.source_reference, "The type name `%s' could not be found".printf (type.type_name));
return;
}
- if (sym.node is TypeParameter) {
- type.type_parameter = (TypeParameter) sym.node;
+ if (sym is TypeParameter) {
+ type.type_parameter = (TypeParameter) sym;
} else {
- type.data_type = (DataType) sym.node;
+ type.data_type = (DataType) sym;
}
} else {
- var ns_symbol = root_symbol.lookup (type.namespace_name);
+ var ns_symbol = root_symbol.scope.lookup (type.namespace_name);
if (ns_symbol == null) {
type.error = true;
Report.error (type.source_reference, "The namespace name `%s' could not be found".printf (type.namespace_name));
return;
}
- var sym = ns_symbol.lookup (type.type_name);
+ var sym = ns_symbol.scope.lookup (type.type_name);
if (sym == null) {
Report.error (type.source_reference, "The type name `%s' does not exist in the namespace `%s'".printf (type.type_name, type.namespace_name));
return;
}
- type.data_type = (DataType) sym.node;
+ type.data_type = (DataType) sym;
}
if (type.pointer_level > 0) {