summaryrefslogtreecommitdiff
path: root/vala/valalockstatement.vala
diff options
context:
space:
mode:
authorJürg Billeter <j@bitron.ch>2008-11-07 11:10:31 +0000
committerJürg Billeter <juergbi@src.gnome.org>2008-11-07 11:10:31 +0000
commit955c4f6c3e8bf120d363015897528567b2df23ed (patch)
treebfbcfdbf98058f2de5f17491ee63934b98ca8355 /vala/valalockstatement.vala
parent4ed3719f219f7ee4d3c40544df7ec75719fae8fd (diff)
downloadvala-955c4f6c3e8bf120d363015897528567b2df23ed.tar.gz
Move statement checking to code nodes
2008-11-07 Jürg Billeter <j@bitron.ch> * vala/valablock.vala: * vala/valacatchclause.vala: * vala/valadeclarationstatement.vala: * vala/valadeletestatement.vala: * vala/valadostatement.vala: * vala/valaexpressionstatement.vala: * vala/valaforstatement.vala: * vala/valaifstatement.vala: * vala/valainitializerlist.vala: * vala/valalocalvariable.vala: * vala/valalockstatement.vala: * vala/valasemanticanalyzer.vala: * vala/valaswitchsection.vala: * vala/valatrystatement.vala: * vala/valawhilestatement.vala: Move statement checking to code nodes svn path=/trunk/; revision=2003
Diffstat (limited to 'vala/valalockstatement.vala')
-rw-r--r--vala/valalockstatement.vala27
1 files changed, 27 insertions, 0 deletions
diff --git a/vala/valalockstatement.vala b/vala/valalockstatement.vala
index c20763168..49a0224c7 100644
--- a/vala/valalockstatement.vala
+++ b/vala/valalockstatement.vala
@@ -47,4 +47,31 @@ public class Vala.LockStatement : CodeNode, Statement {
body.accept (visitor);
visitor.visit_lock_statement (this);
}
+
+ public override bool check (SemanticAnalyzer analyzer) {
+ if (checked) {
+ return !error;
+ }
+
+ checked = true;
+
+ /* resource must be a member access and denote a Lockable */
+ if (!(resource is MemberAccess && resource.symbol_reference is Lockable)) {
+ error = true;
+ resource.error = true;
+ Report.error (resource.source_reference, "Expression is either not a member access or does not denote a lockable member");
+ return false;
+ }
+
+ /* parent symbol must be the current class */
+ if (resource.symbol_reference.parent_symbol != analyzer.current_class) {
+ error = true;
+ resource.error = true;
+ Report.error (resource.source_reference, "Only members of the current class are lockable");
+ }
+
+ ((Lockable) resource.symbol_reference).set_lock_used (true);
+
+ return !error;
+ }
}