diff options
author | Jürg Billeter <j@bitron.ch> | 2008-11-07 10:31:16 +0000 |
---|---|---|
committer | Jürg Billeter <juergbi@src.gnome.org> | 2008-11-07 10:31:16 +0000 |
commit | 920935d9e2927e6d83fb65af22916e011da6c958 (patch) | |
tree | d7c36391e82ca13c7bca8b20bed2e0f4528dac88 /vala/valacreationmethod.vala | |
parent | a81a3482c8d1f449c1bbeb9c7038c9b19e5698e7 (diff) | |
download | vala-920935d9e2927e6d83fb65af22916e011da6c958.tar.gz |
Move member checking to code nodes
2008-11-07 Jürg Billeter <j@bitron.ch>
* vala/valaconstant.vala:
* vala/valaconstructor.vala:
* vala/valacreationmethod.vala:
* vala/valadestructor.vala:
* vala/valafield.vala:
* vala/valaformalparameter.vala:
* vala/valaproperty.vala:
* vala/valapropertyaccessor.vala:
* vala/valasemanticanalyzer.vala:
* vala/valasignal.vala:
Move member checking to code nodes
svn path=/trunk/; revision=2000
Diffstat (limited to 'vala/valacreationmethod.vala')
-rw-r--r-- | vala/valacreationmethod.vala | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/vala/valacreationmethod.vala b/vala/valacreationmethod.vala index fccca87e8..b99224cec 100644 --- a/vala/valacreationmethod.vala +++ b/vala/valacreationmethod.vala @@ -114,4 +114,42 @@ public class Vala.CreationMethod : Method { return "%s%s_%s".printf (parent.get_lower_case_cprefix (), infix, name); } } + + public override bool check (SemanticAnalyzer analyzer) { + if (checked) { + return !error; + } + + checked = true; + + process_attributes (); + + if (type_name != null && type_name != analyzer.current_symbol.name) { + // type_name is null for constructors generated by GIdlParser + Report.error (source_reference, "missing return type in method `%s.%s´".printf (analyzer.current_symbol.get_full_name (), type_name)); + error = true; + return false; + } + + analyzer.current_symbol = this; + analyzer.current_return_type = return_type; + + accept_children (analyzer); + + analyzer.current_symbol = analyzer.current_symbol.parent_symbol; + analyzer.current_return_type = null; + + if (analyzer.current_symbol.parent_symbol is Method) { + /* lambda expressions produce nested methods */ + var up_method = (Method) analyzer.current_symbol.parent_symbol; + analyzer.current_return_type = up_method.return_type; + } + + if (is_abstract || is_virtual || overrides) { + Report.error (source_reference, "The creation method `%s' cannot be marked as override, virtual, or abstract".printf (get_full_name ())); + return false; + } + + return !error; + } } |