diff options
author | 2017-08-24 20:32:02 +0200 | |
---|---|---|
committer | 2017-08-25 12:53:40 +0200 | |
commit | af682d18c45790e3937e12de6fac34ddb44a639a (patch) | |
tree | c0878806c39886f874ee52cd9473c01cc6b81538 /src/main/java/com/google | |
parent | 4d7935d39f68581ee305a2abf288a98d1cf9c6a3 (diff) |
Introduce enum to quickly discriminate AST nodes.
RELNOTES: None.
PiperOrigin-RevId: 166370036
Diffstat (limited to 'src/main/java/com/google')
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; + } } |