aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java
diff options
context:
space:
mode:
authorGravatar laurentlb <laurentlb@google.com>2017-09-04 17:39:09 +0200
committerGravatar Yun Peng <pcloudy@google.com>2017-09-04 18:24:44 +0200
commita9b9aea25913707636aec3023a7225b8bce8d69f (patch)
treeaa3c826a3262f361cbe75c8c66d05118166e603d /src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java
parenta94ef48d52c5bcbe88a504d261f173b4fa59c313 (diff)
skylark/syntax: Move flow statement check to the validation pass.
Mutiple other cleanups in the parser, update code documentation. RELNOTES: None. PiperOrigin-RevId: 167501136
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java b/src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java
index da63ca2e19..95a1c84021 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java
@@ -58,6 +58,7 @@ public final class ValidationEnvironment extends SyntaxTreeVisitor {
private final SkylarkSemanticsOptions semantics;
private Block block;
+ private int loopCount;
/** Create a ValidationEnvironment for a given global Environment. */
ValidationEnvironment(Environment env) {
@@ -106,7 +107,24 @@ public final class ValidationEnvironment extends SyntaxTreeVisitor {
public void visit(ReturnStatement node) {
if (isTopLevel()) {
throw new ValidationException(
- node.getLocation(), "Return statements must be inside a function");
+ node.getLocation(), "return statements must be inside a function");
+ }
+ super.visit(node);
+ }
+
+ @Override
+ public void visit(ForStatement node) {
+ loopCount++;
+ super.visit(node);
+ Preconditions.checkState(loopCount > 0);
+ loopCount--;
+ }
+
+ @Override
+ public void visit(FlowStatement node) {
+ if (loopCount <= 0) {
+ throw new ValidationException(
+ node.getLocation(), node.getKind().getName() + " statement must be inside a for loop");
}
super.visit(node);
}