diff options
author | Jürg Billeter <j@bitron.ch> | 2008-11-07 09:49:07 +0000 |
---|---|---|
committer | Jürg Billeter <juergbi@src.gnome.org> | 2008-11-07 09:49:07 +0000 |
commit | a81a3482c8d1f449c1bbeb9c7038c9b19e5698e7 (patch) | |
tree | e0086e84b5115831ee614663de78d7ffa2cf9fca /vala/valainterface.vala | |
parent | 06e32e1d81513d4657015070b809bf7cc496e6ac (diff) | |
download | vala-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.vala | 50 |
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; + } } |