diff options
author | Jürg Billeter <j@bitron.ch> | 2010-10-13 22:17:41 +0200 |
---|---|---|
committer | Jürg Billeter <j@bitron.ch> | 2010-10-13 22:17:41 +0200 |
commit | 46fece1d814e59bb1443697fda41132a93bc4978 (patch) | |
tree | dc4ccfd58a8d64a7cd7e8f26426b71493ff862a7 /vala/valablock.vala | |
parent | 1190b8bbe1c27d348b367e62d74406306fd87732 (diff) | |
download | vala-46fece1d814e59bb1443697fda41132a93bc4978.tar.gz |
Add suport for local constants
Fixes bug 530623.
Diffstat (limited to 'vala/valablock.vala')
-rw-r--r-- | vala/valablock.vala | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/vala/valablock.vala b/vala/valablock.vala index d7b35f28f..c5b044d6a 100644 --- a/vala/valablock.vala +++ b/vala/valablock.vala @@ -36,6 +36,7 @@ public class Vala.Block : Symbol, Statement { private List<Statement> statement_list = new ArrayList<Statement> (); private List<LocalVariable> local_variables = new ArrayList<LocalVariable> (); + private List<Constant> local_constants = new ArrayList<Constant> (); /** * Creates a new block. @@ -90,7 +91,7 @@ public class Vala.Block : Symbol, Statement { var parent_block = parent_symbol; while (parent_block is Block || parent_block is Method || parent_block is PropertyAccessor) { if (parent_block.scope.lookup (local.name) != null) { - Report.error (local.source_reference, "Local variable `%s' conflicts with another local variable declared in a parent scope".printf (local.name)); + Report.error (local.source_reference, "Local variable `%s' conflicts with a local variable or constant declared in a parent scope".printf (local.name)); break; } parent_block = parent_block.parent_symbol; @@ -111,6 +112,19 @@ public class Vala.Block : Symbol, Statement { return local_variables; } + public void add_local_constant (Constant constant) { + var parent_block = parent_symbol; + while (parent_block is Block || parent_block is Method || parent_block is PropertyAccessor) { + if (parent_block.scope.lookup (constant.name) != null) { + Report.error (constant.source_reference, "Local constant `%s' conflicts with a local variable or constant declared in a parent scope".printf (constant.name)); + break; + } + parent_block = parent_block.parent_symbol; + } + local_constants.add (constant); + scope.add (constant.name, constant); + } + public override void accept (CodeVisitor visitor) { visitor.visit_block (this); } @@ -143,6 +157,10 @@ public class Vala.Block : Symbol, Statement { local.active = false; } + foreach (Constant constant in local_constants) { + constant.active = false; + } + // use get_statements () instead of statement_list to not miss errors within StatementList objects foreach (Statement stmt in get_statements ()) { add_error_types (stmt.get_error_types ()); |