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