You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2020/12/10 19:21:55 UTC

[groovy] branch GROOVY_3_0_X updated: AutoImplement: remove extra block from body

This is an automated email from the ASF dual-hosted git repository.

emilles pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/GROOVY_3_0_X by this push:
     new e5d43e1  AutoImplement: remove extra block from body
e5d43e1 is described below

commit e5d43e16dffbf9dab87c4a0b78f8ad64d0de1c97
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Mon Nov 16 09:46:59 2020 -0600

    AutoImplement: remove extra block from body
    
    - refactor shared logic
    
    Conflicts:
    	src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java
    	src/main/java/org/codehaus/groovy/transform/AutoImplementASTTransformation.java
---
 .../codehaus/groovy/ast/tools/GeneralUtils.java    |  2 +-
 .../transform/AutoImplementASTTransformation.java  | 63 +++++++++++-----------
 .../transform/AutoImplementTransformTest.groovy    | 17 +++++-
 3 files changed, 48 insertions(+), 34 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java b/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java
index 4d1c417..c0d17e7 100644
--- a/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java
+++ b/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java
@@ -733,7 +733,7 @@ public class GeneralUtils {
     }
 
     public static Statement returnS(final Expression expr) {
-        return new ReturnStatement(new ExpressionStatement(expr));
+        return new ReturnStatement(expr);
     }
 
     public static Statement safeExpression(final Expression fieldExpr, final Expression expression) {
diff --git a/src/main/java/org/codehaus/groovy/transform/AutoImplementASTTransformation.java b/src/main/java/org/codehaus/groovy/transform/AutoImplementASTTransformation.java
index f545148..7a94f1b 100644
--- a/src/main/java/org/codehaus/groovy/transform/AutoImplementASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/AutoImplementASTTransformation.java
@@ -30,7 +30,6 @@ import org.codehaus.groovy.ast.Parameter;
 import org.codehaus.groovy.ast.PropertyNode;
 import org.codehaus.groovy.ast.expr.ClosureExpression;
 import org.codehaus.groovy.ast.expr.Expression;
-import org.codehaus.groovy.ast.stmt.BlockStatement;
 import org.codehaus.groovy.ast.stmt.EmptyStatement;
 import org.codehaus.groovy.ast.stmt.Statement;
 import org.codehaus.groovy.control.CompilePhase;
@@ -47,12 +46,12 @@ import static org.apache.groovy.ast.tools.MethodNodeUtils.getPropertyName;
 import static org.apache.groovy.ast.tools.MethodNodeUtils.methodDescriptorWithoutReturnType;
 import static org.apache.groovy.util.BeanUtils.capitalize;
 import static org.codehaus.groovy.antlr.PrimitiveHelper.getDefaultValueForPrimitive;
-import static org.codehaus.groovy.ast.expr.ArgumentListExpression.EMPTY_ARGUMENTS;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.callX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.constX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.ctorX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.getGetterName;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.getSetterName;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.nullX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.throwS;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.varX;
@@ -103,29 +102,48 @@ public class AutoImplementASTTransformation extends AbstractASTTransformation {
     private void createMethods(final ClassNode cNode, final ClassNode exception, final String message, final ClosureExpression code) {
         for (MethodNode candidate : getAllCorrectedMethodsMap(cNode).values()) {
             if (candidate.isAbstract()) {
-                Statement statement = buildMethodBody(exception, message, code, candidate.getReturnType());
-                String propertyName = getPropertyName(candidate);
-                if (propertyName != null && candidate.getParameters().length == 0) {
-                    String accessorName = candidate.getName().startsWith("is")
-                            ? "get" + capitalize(propertyName) : "is" + capitalize(propertyName);
-                    if (cNode.hasMethod(accessorName, Parameter.EMPTY_ARRAY)) {
-                        // delegate to existing accessor to reduce the surprise
-                        statement = returnS(callX(varX("this"), accessorName));
-                    }
-                }
-
                 addGeneratedMethod(cNode,
                         candidate.getName(),
                         candidate.getModifiers() & 0x7, // visibility only
                         candidate.getReturnType(),
                         candidate.getParameters(),
                         candidate.getExceptions(),
-                        statement
+                        createMethodBody(cNode, candidate, exception, message, code)
                 );
             }
         }
     }
 
+    private static Statement createMethodBody(final ClassNode cNode, final MethodNode mNode, final ClassNode exception, final String message, final ClosureExpression code) {
+        if (mNode.getParameters().length == 0) {
+            String propertyName = getPropertyName(mNode);
+            if (propertyName != null) {
+                String accessorName = mNode.getName().startsWith("is")
+                        ? "get" + capitalize(propertyName) : "is" + capitalize(propertyName);
+                if (cNode.hasMethod(accessorName, Parameter.EMPTY_ARRAY)) {
+                    // delegate to existing accessor to reduce the surprise
+                    return returnS(callX(varX("this"), accessorName));
+                }
+            }
+        }
+
+        if (code != null) {
+            return code.getCode();
+        }
+
+        if (exception != null) {
+            if (message == null) {
+                return throwS(ctorX(exception));
+            } else {
+                return throwS(ctorX(exception, constX(message)));
+            }
+        }
+
+        Expression retval = getDefaultValueForPrimitive(mNode.getReturnType());
+        if (retval == null) retval = nullX();
+        return returnS(retval);
+    }
+
     /**
      * Returns all methods including abstract super/interface methods but only
      * if not overridden by a concrete declared/inherited method.
@@ -190,8 +208,6 @@ public class AutoImplementASTTransformation extends AbstractASTTransformation {
                 }
                 if (!pn.getType().equals(ClassHelper.boolean_TYPE)) {
                     result.remove(getGetterName(pn) + ":");
-//                } else if (getGetterName(pn) != null) {
-//                    result.remove(getGetterName(pn) + ":");
                 } else {
                     // getter generated only if no explicit isser and vice versa
                     String isserName  = "is" + capitalize(pn.getName());
@@ -218,19 +234,4 @@ public class AutoImplementASTTransformation extends AbstractASTTransformation {
         }
         return null;
     }
-
-    private BlockStatement buildMethodBody(final ClassNode exception, final String message, final ClosureExpression code, final ClassNode returnType) {
-        BlockStatement body = new BlockStatement();
-        if (code != null) {
-            body.addStatement(code.getCode());
-        } else if (exception != null) {
-            body.addStatement(throwS(ctorX(exception, message == null ? EMPTY_ARGUMENTS : constX(message))));
-        } else {
-            Expression result = getDefaultValueForPrimitive(returnType);
-            if (result != null) {
-                body.addStatement(returnS(result));
-            }
-        }
-        return body;
-    }
 }
diff --git a/src/test/org/codehaus/groovy/transform/AutoImplementTransformTest.groovy b/src/test/org/codehaus/groovy/transform/AutoImplementTransformTest.groovy
index f6468bd..ba86e77 100644
--- a/src/test/org/codehaus/groovy/transform/AutoImplementTransformTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/AutoImplementTransformTest.groovy
@@ -18,7 +18,6 @@
  */
 package org.codehaus.groovy.transform
 
-import groovy.test.NotYetImplemented
 import org.junit.Test
 
 import static groovy.test.GroovyAssert.assertScript
@@ -172,6 +171,20 @@ final class AutoImplementTransformTest {
     }
 
     @Test
+    void testVoidReturnType() {
+        assertScript '''
+            interface Bar {
+                void baz()
+            }
+
+            @groovy.transform.AutoImplement
+            class Foo implements Bar { }
+
+            new Foo().baz() // no value to assert
+        '''
+    }
+
+    @Test
     void testGenericReturnTypes() {
         assertScript '''
             interface HasXs<T> {
@@ -193,7 +206,7 @@ final class AutoImplementTransformTest {
     }
 
     @Test // GROOVY-8270
-    void testGenericsParameterTypes() {
+    void testGenericParameterTypes() {
         assertScript '''
             @groovy.transform.AutoImplement
             class Foo implements Comparator<String> { }