summaryrefslogtreecommitdiff
path: root/vala/valainterface.vala
diff options
context:
space:
mode:
authorJürg Billeter <j@bitron.ch>2008-11-07 09:49:07 +0000
committerJürg Billeter <juergbi@src.gnome.org>2008-11-07 09:49:07 +0000
commita81a3482c8d1f449c1bbeb9c7038c9b19e5698e7 (patch)
treee0086e84b5115831ee614663de78d7ffa2cf9fca /vala/valainterface.vala
parent06e32e1d81513d4657015070b809bf7cc496e6ac (diff)
downloadvala-a81a3482c8d1f449c1bbeb9c7038c9b19e5698e7.tar.gz
Move type symbol checking to code nodes
2008-11-07 Jürg Billeter <j@bitron.ch> * vala/valadelegate.vala: * vala/valaenum.vala: * vala/valaenumvalue.vala: * vala/valaerrorcode.vala: * vala/valaerrordomain.vala: * vala/valainterface.vala: * vala/valanamespace.vala: * vala/valasemanticanalyzer.vala: * vala/valastruct.vala: Move type symbol checking to code nodes svn path=/trunk/; revision=1999
Diffstat (limited to 'vala/valainterface.vala')
-rw-r--r--vala/valainterface.vala50
1 files changed, 50 insertions, 0 deletions
diff --git a/vala/valainterface.vala b/vala/valainterface.vala
index d7c434c5b..306eb21d6 100644
--- a/vala/valainterface.vala
+++ b/vala/valainterface.vala
@@ -540,4 +540,54 @@ public class Vala.Interface : ObjectTypeSymbol {
return null;
}
+
+ public override bool check (SemanticAnalyzer analyzer) {
+ if (checked) {
+ return !error;
+ }
+
+ checked = true;
+
+ process_attributes ();
+
+ analyzer.current_symbol = this;
+
+ foreach (DataType prerequisite_reference in get_prerequisites ()) {
+ // check whether prerequisite is at least as accessible as the interface
+ if (!analyzer.is_type_accessible (this, prerequisite_reference)) {
+ error = true;
+ Report.error (source_reference, "prerequisite `%s` is less accessible than interface `%s`".printf (prerequisite_reference.to_string (), get_full_name ()));
+ return false;
+ }
+
+ analyzer.current_source_file.add_type_dependency (prerequisite_reference, SourceFileDependencyType.HEADER_FULL);
+ }
+
+ /* check prerequisites */
+ Class prereq_class;
+ foreach (DataType prereq in get_prerequisites ()) {
+ TypeSymbol class_or_interface = prereq.data_type;
+ /* skip on previous errors */
+ if (class_or_interface == null) {
+ error = true;
+ continue;
+ }
+ /* interfaces are not allowed to have multiple instantiable prerequisites */
+ if (class_or_interface is Class) {
+ if (prereq_class != null) {
+ error = true;
+ Report.error (source_reference, "%s: Interfaces cannot have multiple instantiable prerequisites (`%s' and `%s')".printf (get_full_name (), class_or_interface.get_full_name (), prereq_class.get_full_name ()));
+ return false;
+ }
+
+ prereq_class = (Class) class_or_interface;
+ }
+ }
+
+ accept_children (analyzer);
+
+ analyzer.current_symbol = analyzer.current_symbol.parent_symbol;
+
+ return !error;
+ }
}