summaryrefslogtreecommitdiff
path: root/vala/valablock.vala
diff options
context:
space:
mode:
authorJürg Billeter <j@bitron.ch>2010-10-13 22:17:41 +0200
committerJürg Billeter <j@bitron.ch>2010-10-13 22:17:41 +0200
commit46fece1d814e59bb1443697fda41132a93bc4978 (patch)
treedc4ccfd58a8d64a7cd7e8f26426b71493ff862a7 /vala/valablock.vala
parent1190b8bbe1c27d348b367e62d74406306fd87732 (diff)
downloadvala-46fece1d814e59bb1443697fda41132a93bc4978.tar.gz
Add suport for local constants
Fixes bug 530623.
Diffstat (limited to 'vala/valablock.vala')
-rw-r--r--vala/valablock.vala20
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 ());