minor edits
diff --git a/src/main/groovy/org/codehaus/groovy/transform/ASTTestTransformation.groovy b/src/main/groovy/org/codehaus/groovy/transform/ASTTestTransformation.groovy
index a36f9e0..ca675fb 100644
--- a/src/main/groovy/org/codehaus/groovy/transform/ASTTestTransformation.groovy
+++ b/src/main/groovy/org/codehaus/groovy/transform/ASTTestTransformation.groovy
@@ -162,9 +162,8 @@
}
sample
}
-
}
-
+
private static class ProgressCallbackChain implements CompilationUnit.ProgressCallback {
private final List<CompilationUnit.ProgressCallback> chain = new LinkedList<CompilationUnit.ProgressCallback>()
@@ -178,7 +177,7 @@
void addCallback(CompilationUnit.ProgressCallback callback) {
chain << callback
}
-
+
@Override
void call(final ProcessingUnit context, final int phase) {
chain*.call(context, phase)
@@ -220,12 +219,11 @@
@Override
protected void visitStatement(final Statement statement) {
super.visitStatement(statement)
- if (statement.statementLabel==label) targets << statement
+ if (label in statement.statementLabels) targets << statement
}
List<Statement> getTargets() {
Collections.unmodifiableList(targets)
}
}
-
}
diff --git a/src/main/groovy/org/codehaus/groovy/transform/tailrec/ReturnStatementToIterationConverter.groovy b/src/main/groovy/org/codehaus/groovy/transform/tailrec/ReturnStatementToIterationConverter.groovy
index 6ef233e..5ebac87 100644
--- a/src/main/groovy/org/codehaus/groovy/transform/tailrec/ReturnStatementToIterationConverter.groovy
+++ b/src/main/groovy/org/codehaus/groovy/transform/tailrec/ReturnStatementToIterationConverter.groovy
@@ -61,7 +61,7 @@
List<ExpressionStatement> argAssignments = []
BlockStatement result = new BlockStatement()
- result.statementLabel = statement.statementLabel
+ result.copyStatementLabels(statement)
/* Create temp declarations for all method arguments.
* Add the declarations and var mapping to tempMapping and tempDeclarations for further reference.
diff --git a/src/main/groovy/org/codehaus/groovy/transform/tailrec/VariableAccessReplacer.groovy b/src/main/groovy/org/codehaus/groovy/transform/tailrec/VariableAccessReplacer.groovy
index 115464e..b53b5bd 100644
--- a/src/main/groovy/org/codehaus/groovy/transform/tailrec/VariableAccessReplacer.groovy
+++ b/src/main/groovy/org/codehaus/groovy/transform/tailrec/VariableAccessReplacer.groovy
@@ -45,27 +45,25 @@
void replaceIn(ASTNode root) {
Closure<Boolean> whenParam = { VariableExpression expr ->
- nameAndTypeMapping.containsKey(expr.name)
+ return nameAndTypeMapping.containsKey(expr.name)
}
Closure<VariableExpression> replaceWithLocalVariable = { VariableExpression expr ->
- Map nameAndType = nameAndTypeMapping[expr.name]
- VariableExpression newVar = AstHelper.createVariableReference(nameAndType)
+ def newVar = AstHelper.createVariableReference(nameAndTypeMapping[expr.name])
listener.variableReplaced(expr, newVar)
- newVar
+ return newVar
}
new VariableExpressionReplacer(when: whenParam, replaceWith: replaceWithLocalVariable).replaceIn(root)
}
-
}
@CompileStatic
interface VariableReplacedListener {
void variableReplaced(VariableExpression oldVar, VariableExpression newVar)
- static VariableReplacedListener NULL = new VariableReplacedListener() {
+ public static VariableReplacedListener NULL = new VariableReplacedListener() {
@Override
void variableReplaced(VariableExpression oldVar, VariableExpression newVar) {
//do nothing
}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/org/codehaus/groovy/ast/stmt/ReturnStatement.java b/src/main/java/org/codehaus/groovy/ast/stmt/ReturnStatement.java
index 432fe63..479a366 100644
--- a/src/main/java/org/codehaus/groovy/ast/stmt/ReturnStatement.java
+++ b/src/main/java/org/codehaus/groovy/ast/stmt/ReturnStatement.java
@@ -35,38 +35,41 @@
public static final ReturnStatement RETURN_NULL_OR_VOID = new ReturnStatement(nullX());
private Expression expression;
-
- public ReturnStatement(ExpressionStatement statement) {
+
+ public ReturnStatement(final ExpressionStatement statement) {
this(statement.getExpression());
- setStatementLabel(statement.getStatementLabel());
+ copyStatementLabels(statement);
}
-
- public ReturnStatement(Expression expression) {
- this.expression = expression;
- }
-
- public void visit(GroovyCodeVisitor visitor) {
- visitor.visitReturnStatement(this);
+
+ public ReturnStatement(final Expression expression) {
+ setExpression(expression);
}
public Expression getExpression() {
return expression;
}
+ public void setExpression(final Expression expression) {
+ this.expression = expression;
+ }
+
+ @Override
public String getText() {
return "return " + expression.getText();
}
- public void setExpression(Expression expression) {
- this.expression = expression;
- }
-
public boolean isReturningNullOrVoid() {
return expression instanceof ConstantExpression
- && ((ConstantExpression)expression).isNullExpression();
+ && ((ConstantExpression) expression).isNullExpression();
}
+ @Override
public String toString() {
return super.toString() + "[expression:" + expression + "]";
}
+
+ @Override
+ public void visit(final GroovyCodeVisitor visitor) {
+ visitor.visitReturnStatement(this);
+ }
}
diff --git a/src/main/java/org/codehaus/groovy/ast/stmt/Statement.java b/src/main/java/org/codehaus/groovy/ast/stmt/Statement.java
index 5764df0..bc1d4b4 100644
--- a/src/main/java/org/codehaus/groovy/ast/stmt/Statement.java
+++ b/src/main/java/org/codehaus/groovy/ast/stmt/Statement.java
@@ -22,41 +22,43 @@
import java.util.LinkedList;
import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
/**
- * Base class for any statement
+ * Base class for any statement.
*/
public class Statement extends ASTNode {
private List<String> statementLabels;
- public Statement() {
- statementLabels = null;
- }
-
- public List<String> getStatementLabels() {
+ public /*@Nullable*/ List<String> getStatementLabels() {
return statementLabels;
}
- // TODO @Deprecated
- public String getStatementLabel() {
+ @Deprecated
+ public /*@Nullable*/ String getStatementLabel() {
// last label by default which is added first by APP
return statementLabels == null ? null : statementLabels.get(0);
}
- // TODO @Deprecated
- public void setStatementLabel(String label) {
- if (statementLabels == null) statementLabels = new LinkedList<String>();
- statementLabels.add(label);
+ // TODO: @Deprecated
+ public void setStatementLabel(final String label) {
+ if (label != null) addStatementLabel(label);
}
- public void addStatementLabel(String label) {
- if (statementLabels == null) statementLabels = new LinkedList<String>();
- statementLabels.add(label);
+ public void addStatementLabel(final String label) {
+ if (statementLabels == null) statementLabels = new LinkedList<>();
+ statementLabels.add(Objects.requireNonNull(label));
+ }
+
+ public void copyStatementLabels(final Statement that) {
+ Optional.ofNullable(that.getStatementLabels()).ifPresent(labels -> {
+ labels.forEach(this::addStatementLabel);
+ });
}
public boolean isEmpty() {
return false;
}
-
}
diff --git a/src/main/java/org/codehaus/groovy/classgen/ReturnAdder.java b/src/main/java/org/codehaus/groovy/classgen/ReturnAdder.java
index da532d6..f8f3bf4 100644
--- a/src/main/java/org/codehaus/groovy/classgen/ReturnAdder.java
+++ b/src/main/java/org/codehaus/groovy/classgen/ReturnAdder.java
@@ -18,10 +18,8 @@
*/
package org.codehaus.groovy.classgen;
-import org.codehaus.groovy.ast.ClassHelper;
import org.codehaus.groovy.ast.MethodNode;
import org.codehaus.groovy.ast.VariableScope;
-import org.codehaus.groovy.ast.expr.ConstantExpression;
import org.codehaus.groovy.ast.expr.Expression;
import org.codehaus.groovy.ast.stmt.BlockStatement;
import org.codehaus.groovy.ast.stmt.BreakStatement;
@@ -40,7 +38,8 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
-import java.util.Optional;
+
+import static org.codehaus.groovy.ast.tools.GeneralUtils.nullX;
/**
* Utility class to add return statements.
@@ -79,41 +78,23 @@
}
/**
- * Adds return statements in method code whenever an implicit return is detected.
- * @param node the method node where to add return statements
- * @deprecated Use {@link #visitMethod(org.codehaus.groovy.ast.MethodNode)} instead
+ * @deprecated Use {@link #visitMethod(MethodNode)} instead.
*/
@Deprecated
public static void addReturnIfNeeded(final MethodNode node) {
- ReturnAdder adder = new ReturnAdder();
- adder.visitMethod(node);
+ new ReturnAdder().visitMethod(node);
}
+ /**
+ * Adds return statements to given method whenever an implicit return is detected.
+ */
public void visitMethod(final MethodNode node) {
- Statement statement = node.getCode();
if (!node.isVoidMethod()) {
- if (statement != null) { // happens with @interface methods
- Statement code = addReturnsIfNeeded(statement, node.getVariableScope());
+ Statement code = node.getCode();
+ if (code != null) { // happens with @interface methods
+ code = addReturnsIfNeeded(code, node.getVariableScope());
if (doAdd) node.setCode(code);
}
- } else if (!node.isAbstract() && node.getReturnType().redirect() != ClassHelper.VOID_TYPE) {
- if (!(statement instanceof BytecodeSequence)) {
- BlockStatement newBlock = new BlockStatement();
- Statement code = node.getCode();
- if (code instanceof BlockStatement) {
- newBlock.setVariableScope(((BlockStatement) code).getVariableScope());
- }
- if (statement instanceof BlockStatement) {
- newBlock.addStatements(((BlockStatement) statement).getStatements());
- } else {
- newBlock.addStatement(statement);
- }
- ReturnStatement returnStatement = ReturnStatement.RETURN_NULL_OR_VOID;
- listener.returnStatementAdded(returnStatement);
- newBlock.addStatement(returnStatement);
- newBlock.setSourcePosition(statement);
- if (doAdd) node.setCode(newBlock);
- }
}
}
@@ -124,7 +105,7 @@
}
if (statement instanceof EmptyStatement || statement == null) {
- ReturnStatement returnStatement = new ReturnStatement(ConstantExpression.NULL);
+ ReturnStatement returnStatement = new ReturnStatement(nullX());
listener.returnStatementAdded(returnStatement);
return returnStatement;
}
@@ -132,7 +113,7 @@
if (statement instanceof ExpressionStatement) {
Expression expression = ((ExpressionStatement) statement).getExpression();
ReturnStatement returnStatement = new ReturnStatement(expression);
- addLabelsToReturnStatement(statement, returnStatement);
+ returnStatement.copyStatementLabels(statement);
returnStatement.setSourcePosition(statement);
listener.returnStatementAdded(returnStatement);
return returnStatement;
@@ -191,8 +172,8 @@
if (statement instanceof BlockStatement) {
BlockStatement blockStatement = (BlockStatement) statement;
if (blockStatement.isEmpty()) {
- ReturnStatement returnStatement = new ReturnStatement(ConstantExpression.NULL);
- addLabelsToReturnStatement(blockStatement, returnStatement);
+ ReturnStatement returnStatement = new ReturnStatement(nullX());
+ returnStatement.copyStatementLabels(blockStatement);
returnStatement.setSourcePosition(blockStatement);
listener.returnStatementAdded(returnStatement);
return returnStatement;
@@ -201,8 +182,8 @@
int lastIndex = statements.size() - 1;
Statement last = addReturnsIfNeeded(statements.get(lastIndex), blockStatement.getVariableScope());
if (doAdd) statements.set(lastIndex, last);
- if (!statementReturns(last)) {
- ReturnStatement returnStatement = new ReturnStatement(ConstantExpression.NULL);
+ if (!returns(last)) {
+ ReturnStatement returnStatement = new ReturnStatement(nullX());
listener.returnStatementAdded(returnStatement);
if (doAdd) statements.add(returnStatement);
}
@@ -213,7 +194,7 @@
List<Statement> statements = new ArrayList<>(2);
statements.add(statement);
- ReturnStatement returnStatement = new ReturnStatement(ConstantExpression.NULL);
+ ReturnStatement returnStatement = new ReturnStatement(nullX());
listener.returnStatementAdded(returnStatement);
statements.add(returnStatement);
@@ -222,11 +203,6 @@
return blockStatement;
}
- private void addLabelsToReturnStatement(Statement statement, ReturnStatement returnStatement) {
- Optional.ofNullable(statement.getStatementLabels())
- .ifPresent(labels -> labels.forEach(returnStatement::addStatementLabel));
- }
-
private Statement adjustSwitchCaseCode(final Statement statement, final VariableScope scope, final boolean defaultCase) {
if (statement instanceof BlockStatement) {
List<Statement> statements = ((BlockStatement) statement).getStatements();
@@ -252,15 +228,15 @@
return statement;
}
- private static boolean statementReturns(final Statement last) {
- return last instanceof ReturnStatement
- || last instanceof BlockStatement
- || last instanceof IfStatement
- || last instanceof ExpressionStatement
- || last instanceof EmptyStatement
- || last instanceof TryCatchStatement
- || last instanceof ThrowStatement
- || last instanceof SynchronizedStatement
- || last instanceof BytecodeSequence;
+ private static boolean returns(final Statement statement) {
+ return statement instanceof ReturnStatement
+ || statement instanceof BlockStatement
+ || statement instanceof IfStatement
+ || statement instanceof ExpressionStatement
+ || statement instanceof EmptyStatement
+ || statement instanceof TryCatchStatement
+ || statement instanceof ThrowStatement
+ || statement instanceof SynchronizedStatement
+ || statement instanceof BytecodeSequence;
}
}
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/StatementWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/StatementWriter.java
index d3512bf..e452b9e 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/StatementWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/StatementWriter.java
@@ -52,6 +52,7 @@
import java.util.Iterator;
import java.util.List;
+import java.util.Optional;
import java.util.function.Consumer;
import static org.objectweb.asm.Opcodes.ALOAD;
@@ -76,11 +77,11 @@
}
protected void writeStatementLabel(final Statement statement) {
- String name = statement.getStatementLabel();
- if (name != null) {
- Label label = controller.getCompileStack().createLocalLabel(name);
- controller.getMethodVisitor().visitLabel(label);
- }
+ Optional.ofNullable(statement.getStatementLabels()).ifPresent(labels -> {
+ labels.stream().map(controller.getCompileStack()::createLocalLabel).forEach(label -> {
+ controller.getMethodVisitor().visitLabel(label);
+ });
+ });
}
public void writeBlockStatement(final BlockStatement block) {
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java b/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
index 8316a3f..fe8dc41 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
@@ -63,7 +63,6 @@
private String internalBaseClassName;
private ClassNode outermostClass;
private MethodNode methodNode;
- private SourceUnit sourceUnit;
private ConstructorNode constructorNode;
private GeneratorContext context;
private InterfaceHelperClassNode interfaceClassLoadingClass;
@@ -127,7 +126,6 @@
this.methodReferenceExpressionWriter = new MethodReferenceExpressionWriter(this);
this.internalBaseClassName = BytecodeHelper.getClassInternalName(cn.getSuperClass());
this.acg = asmClassGenerator;
- this.sourceUnit = acg.getSourceUnit();
this.context = gcon;
this.compileStack = new CompileStack(this);
this.cv = createClassVisitor(cv);
@@ -197,7 +195,7 @@
}
public SourceUnit getSourceUnit() {
- return sourceUnit;
+ return getAcg().getSourceUnit();
}
public TypeChooser getTypeChooser() {
diff --git a/src/test/org/codehaus/groovy/antlr/AntlrParserPluginTest.groovy b/src/test/org/codehaus/groovy/antlr/AntlrParserPluginTest.groovy
index 5affe96..13fe3b5 100644
--- a/src/test/org/codehaus/groovy/antlr/AntlrParserPluginTest.groovy
+++ b/src/test/org/codehaus/groovy/antlr/AntlrParserPluginTest.groovy
@@ -76,7 +76,6 @@
assert statement.lastLineNumber == 4
assert statement.columnNumber == 21
assert statement.lastColumnNumber == 34
- assert statement.statementLabel == 'label'
+ assert statement.statementLabels[0] == 'label'
}
-
}
diff --git a/src/test/org/codehaus/groovy/transform/tailrec/ReturnStatementToIterationConverterTest.groovy b/src/test/org/codehaus/groovy/transform/tailrec/ReturnStatementToIterationConverterTest.groovy
index 3861389..935f8d9 100644
--- a/src/test/org/codehaus/groovy/transform/tailrec/ReturnStatementToIterationConverterTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/tailrec/ReturnStatementToIterationConverterTest.groovy
@@ -62,7 +62,7 @@
def block = new ReturnStatementToIterationConverter().convert(statement, positionMapping)
AstAssert.assertSyntaxTree([expected], [block])
- assert block.statementLabel == "aLabel"
+ assert block.statementLabels[0] == "aLabel"
}
@Test