aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google
diff options
context:
space:
mode:
authorGravatar laurentlb <laurentlb@google.com>2017-08-24 20:32:02 +0200
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2017-08-25 12:53:40 +0200
commitaf682d18c45790e3937e12de6fac34ddb44a639a (patch)
treec0878806c39886f874ee52cd9473c01cc6b81538 /src/main/java/com/google
parent4d7935d39f68581ee305a2abf288a98d1cf9c6a3 (diff)
Introduce enum to quickly discriminate AST nodes.
RELNOTES: None. PiperOrigin-RevId: 166370036
Diffstat (limited to 'src/main/java/com/google')
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/AbstractComprehension.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/AssignmentStatement.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/AugmentedAssignmentStatement.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/ConditionalExpression.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/DictionaryLiteral.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/Expression.java26
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/ExpressionStatement.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/FlowStatement.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/ForStatement.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/Identifier.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/IfStatement.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/IndexExpression.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/IntegerLiteral.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/ListLiteral.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/ReturnStatement.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/SliceExpression.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/Statement.java23
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/StringLiteral.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/UnaryOperatorExpression.java5
24 files changed, 166 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/AbstractComprehension.java b/src/main/java/com/google/devtools/build/lib/syntax/AbstractComprehension.java
index 5cdaaa9476..5278c80aef 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/AbstractComprehension.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/AbstractComprehension.java
@@ -269,6 +269,11 @@ public abstract class AbstractComprehension extends Expression {
}
@Override
+ public Kind kind() {
+ return Kind.COMPREHENSION;
+ }
+
+ @Override
Object doEval(Environment env) throws EvalException, InterruptedException {
OutputCollector collector = createCollector(env);
evalStep(env, collector, 0);
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/AssignmentStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/AssignmentStatement.java
index 436384a43a..facf5dd39d 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/AssignmentStatement.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/AssignmentStatement.java
@@ -66,4 +66,9 @@ public final class AssignmentStatement extends Statement {
public void accept(SyntaxTreeVisitor visitor) {
visitor.visit(this);
}
+
+ @Override
+ public Kind kind() {
+ return Kind.ASSIGNMENT;
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/AugmentedAssignmentStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/AugmentedAssignmentStatement.java
index 902b73acdb..25203489ec 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/AugmentedAssignmentStatement.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/AugmentedAssignmentStatement.java
@@ -67,4 +67,9 @@ public final class AugmentedAssignmentStatement extends Statement {
public void accept(SyntaxTreeVisitor visitor) {
visitor.visit(this);
}
+
+ @Override
+ public Kind kind() {
+ return Kind.AUGMENTED_ASSIGNMENT;
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java
index 65565ad7fa..bd416a77b4 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java
@@ -259,6 +259,11 @@ public final class BinaryOperatorExpression extends Expression {
visitor.visit(this);
}
+ @Override
+ public Kind kind() {
+ return Kind.BINARY_OPERATOR;
+ }
+
/** Implements Operator.PLUS. */
private static Object plus(
Object lval, Object rval, Environment env, Location location, boolean isAugmented)
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ConditionalExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/ConditionalExpression.java
index c2d1c5de95..e5a0b4c116 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/ConditionalExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/ConditionalExpression.java
@@ -65,4 +65,9 @@ public final class ConditionalExpression extends Expression {
public void accept(SyntaxTreeVisitor visitor) {
visitor.visit(this);
}
+
+ @Override
+ public Kind kind() {
+ return Kind.CONDITIONAL;
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/DictionaryLiteral.java b/src/main/java/com/google/devtools/build/lib/syntax/DictionaryLiteral.java
index 7a5abd2818..2cecb1110c 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/DictionaryLiteral.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/DictionaryLiteral.java
@@ -99,6 +99,11 @@ public final class DictionaryLiteral extends Expression {
visitor.visit(this);
}
+ @Override
+ public Kind kind() {
+ return Kind.DICTIONARY_LITERAL;
+ }
+
public ImmutableList<DictionaryEntryLiteral> getEntries() {
return entries;
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java
index 056fca42ca..970d0ca14c 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java
@@ -124,4 +124,9 @@ public final class DotExpression extends Expression {
public void accept(SyntaxTreeVisitor visitor) {
visitor.visit(this);
}
+
+ @Override
+ public Kind kind() {
+ return Kind.DOT;
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Expression.java b/src/main/java/com/google/devtools/build/lib/syntax/Expression.java
index ae1707c678..a7188d816f 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Expression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Expression.java
@@ -21,6 +21,26 @@ import java.io.IOException;
public abstract class Expression extends ASTNode {
/**
+ * Kind of the expression. This is similar to using instanceof, except that it's more efficient
+ * and can be used in a switch/case.
+ */
+ public enum Kind {
+ BINARY_OPERATOR,
+ COMPREHENSION,
+ CONDITIONAL,
+ DICTIONARY_LITERAL,
+ DOT,
+ FUNCALL,
+ IDENTIFIER,
+ INDEX,
+ INTEGER_LITERAL,
+ LIST_LITERAL,
+ SLICE,
+ STRING_LITERAL,
+ UNARY_OPERATOR,
+ }
+
+ /**
* Returns the result of evaluating this build-language expression in the
* specified environment. All BUILD language datatypes are mapped onto the
* corresponding Java types as follows:
@@ -70,4 +90,10 @@ public abstract class Expression extends ASTNode {
*/
@Override
public abstract void prettyPrint(Appendable buffer) throws IOException;
+
+ /**
+ * Kind of the expression. This is similar to using instanceof, except that it's more efficient
+ * and can be used in a switch/case.
+ */
+ public abstract Kind kind();
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ExpressionStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/ExpressionStatement.java
index f0a5fa39ad..7367fdc584 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/ExpressionStatement.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/ExpressionStatement.java
@@ -47,4 +47,9 @@ public final class ExpressionStatement extends Statement {
public void accept(SyntaxTreeVisitor visitor) {
visitor.visit(this);
}
+
+ @Override
+ public Kind kind() {
+ return Kind.EXPRESSION;
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FlowStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/FlowStatement.java
index 187c4b83e0..e2d5344de4 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/FlowStatement.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/FlowStatement.java
@@ -19,6 +19,7 @@ import java.io.IOException;
* A class for flow statements (e.g. break and continue)
*/
public final class FlowStatement extends Statement {
+ // TODO(laurentlb): This conflicts with Statement.Kind, maybe remove it?
public enum Kind {
BREAK("break"),
CONTINUE("continue");
@@ -68,6 +69,11 @@ public final class FlowStatement extends Statement {
visitor.visit(this);
}
+ @Override
+ public Statement.Kind kind() {
+ return Statement.Kind.FLOW;
+ }
+
/**
* An exception that signals changes in the control flow (e.g. break or continue)
*/
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ForStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/ForStatement.java
index 381995d250..32a1d26b7f 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/ForStatement.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/ForStatement.java
@@ -96,4 +96,9 @@ public final class ForStatement extends Statement {
public void accept(SyntaxTreeVisitor visitor) {
visitor.visit(this);
}
+
+ @Override
+ public Kind kind() {
+ return Kind.FOR;
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
index e034b16bd3..f3019e471a 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
@@ -761,6 +761,11 @@ public final class FuncallExpression extends Expression {
}
@Override
+ public Kind kind() {
+ return Kind.FUNCALL;
+ }
+
+ @Override
protected boolean isNewScope() {
return true;
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java
index d3089c3845..544870e0c7 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java
@@ -110,4 +110,9 @@ public final class FunctionDefStatement extends Statement {
public void accept(SyntaxTreeVisitor visitor) {
visitor.visit(this);
}
+
+ @Override
+ public Kind kind() {
+ return Kind.FUNCTION_DEF;
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Identifier.java b/src/main/java/com/google/devtools/build/lib/syntax/Identifier.java
index 419427c9b1..a0dc773469 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Identifier.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Identifier.java
@@ -85,6 +85,11 @@ public final class Identifier extends Expression {
visitor.visit(this);
}
+ @Override
+ public Kind kind() {
+ return Kind.IDENTIFIER;
+ }
+
EvalException createInvalidIdentifierException(Set<String> symbols) {
if (name.equals("$error$")) {
return new EvalException(getLocation(), "contains syntax error(s)", true);
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/IfStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/IfStatement.java
index 089f9c113a..c49613da85 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/IfStatement.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/IfStatement.java
@@ -62,6 +62,11 @@ public final class IfStatement extends Statement {
visitor.visit(this);
}
+ @Override
+ public Kind kind() {
+ return Kind.CONDITIONAL;
+ }
+
public Expression getCondition() {
return condition;
}
@@ -133,4 +138,9 @@ public final class IfStatement extends Statement {
public void accept(SyntaxTreeVisitor visitor) {
visitor.visit(this);
}
+
+ @Override
+ public Kind kind() {
+ return Kind.IF;
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/IndexExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/IndexExpression.java
index 6597f9b742..efb1a64edf 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/IndexExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/IndexExpression.java
@@ -83,4 +83,9 @@ public final class IndexExpression extends Expression {
public void accept(SyntaxTreeVisitor visitor) {
visitor.visit(this);
}
+
+ @Override
+ public Kind kind() {
+ return Kind.INDEX;
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/IntegerLiteral.java b/src/main/java/com/google/devtools/build/lib/syntax/IntegerLiteral.java
index 68192c82c2..ea88509f77 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/IntegerLiteral.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/IntegerLiteral.java
@@ -43,4 +43,9 @@ public final class IntegerLiteral extends Expression {
public void accept(SyntaxTreeVisitor visitor) {
visitor.visit(this);
}
+
+ @Override
+ public Kind kind() {
+ return Kind.INTEGER_LITERAL;
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ListLiteral.java b/src/main/java/com/google/devtools/build/lib/syntax/ListLiteral.java
index c1734011ef..26bf96b1e9 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/ListLiteral.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/ListLiteral.java
@@ -32,6 +32,7 @@ public final class ListLiteral extends Expression {
/**
* Types of the ListLiteral.
*/
+ // TODO(laurentlb): This conflicts with Expression.Kind, maybe remove it?
public enum Kind {LIST, TUPLE}
private final Kind kind;
@@ -112,4 +113,9 @@ public final class ListLiteral extends Expression {
public void accept(SyntaxTreeVisitor visitor) {
visitor.visit(this);
}
+
+ @Override
+ public Expression.Kind kind() {
+ return Expression.Kind.LIST_LITERAL;
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java
index 21c0888200..084ffa81b0 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/LoadStatement.java
@@ -107,4 +107,9 @@ public final class LoadStatement extends Statement {
public void accept(SyntaxTreeVisitor visitor) {
visitor.visit(this);
}
+
+ @Override
+ public Kind kind() {
+ return Kind.LOAD;
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ReturnStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/ReturnStatement.java
index 5235e5860f..83661192dc 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/ReturnStatement.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/ReturnStatement.java
@@ -81,4 +81,9 @@ public final class ReturnStatement extends Statement {
public void accept(SyntaxTreeVisitor visitor) {
visitor.visit(this);
}
+
+ @Override
+ public Kind kind() {
+ return Kind.RETURN;
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SliceExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/SliceExpression.java
index 71b637630c..a2b6036e28 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SliceExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SliceExpression.java
@@ -118,4 +118,9 @@ public final class SliceExpression extends Expression {
public void accept(SyntaxTreeVisitor visitor) {
visitor.visit(this);
}
+
+ @Override
+ public Kind kind() {
+ return Kind.SLICE;
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Statement.java b/src/main/java/com/google/devtools/build/lib/syntax/Statement.java
index 58130b6e87..1795af1733 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Statement.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Statement.java
@@ -20,6 +20,23 @@ package com.google.devtools.build.lib.syntax;
public abstract class Statement extends ASTNode {
/**
+ * Kind of the statement. This is similar to using instanceof, except that it's more efficient and
+ * can be used in a switch/case.
+ */
+ public enum Kind {
+ ASSIGNMENT,
+ AUGMENTED_ASSIGNMENT,
+ CONDITIONAL,
+ EXPRESSION,
+ FLOW,
+ FOR,
+ FUNCTION_DEF,
+ IF,
+ LOAD,
+ RETURN,
+ }
+
+ /**
* Executes the statement in the specified build environment, which may be
* modified.
*
@@ -44,4 +61,10 @@ public abstract class Statement extends ASTNode {
* @throws InterruptedException may be thrown in a sub class.
*/
abstract void doExec(Environment env) throws EvalException, InterruptedException;
+
+ /**
+ * Kind of the statement. This is similar to using instanceof, except that it's more efficient and
+ * can be used in a switch/case.
+ */
+ public abstract Kind kind();
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/StringLiteral.java b/src/main/java/com/google/devtools/build/lib/syntax/StringLiteral.java
index 61856e2c64..26144ec02d 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/StringLiteral.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/StringLiteral.java
@@ -43,4 +43,9 @@ public final class StringLiteral extends Expression {
public void accept(SyntaxTreeVisitor visitor) {
visitor.visit(this);
}
+
+ @Override
+ public Kind kind() {
+ return Kind.STRING_LITERAL;
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/UnaryOperatorExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/UnaryOperatorExpression.java
index e55acdd305..6ca614b397 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/UnaryOperatorExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/UnaryOperatorExpression.java
@@ -99,4 +99,9 @@ public final class UnaryOperatorExpression extends Expression {
public void accept(SyntaxTreeVisitor visitor) {
visitor.visit(this);
}
+
+ @Override
+ public Kind kind() {
+ return Kind.UNARY_OPERATOR;
+ }
}