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> { }