summaryrefslogtreecommitdiff
path: root/vala/valacreationmethod.vala
diff options
context:
space:
mode:
authorJürg Billeter <j@bitron.ch>2008-11-07 10:31:16 +0000
committerJürg Billeter <juergbi@src.gnome.org>2008-11-07 10:31:16 +0000
commit920935d9e2927e6d83fb65af22916e011da6c958 (patch)
treed7c36391e82ca13c7bca8b20bed2e0f4528dac88 /vala/valacreationmethod.vala
parenta81a3482c8d1f449c1bbeb9c7038c9b19e5698e7 (diff)
downloadvala-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.vala38
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;
+ }
}