You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2022/08/30 02:01:43 UTC
[groovy] branch master updated: GROOVY-10732: @Immutable handling of cloneable types should have the same behavior for non-cloneables on JDK16+
This is an automated email from the ASF dual-hosted git repository.
paulk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/master by this push:
new 513dd31f08 GROOVY-10732: @Immutable handling of cloneable types should have the same behavior for non-cloneables on JDK16+
513dd31f08 is described below
commit 513dd31f08c4039d5850c9589a6631a1413773b2
Author: Paul King <pa...@asert.com.au>
AuthorDate: Mon Aug 29 20:02:16 2022 +1000
GROOVY-10732: @Immutable handling of cloneable types should have the same behavior for non-cloneables on JDK16+
---
.../groovy/transform/options/ImmutablePropertyHandler.java | 13 +++++++++----
.../codehaus/groovy/transform/ImmutableTransformTest.groovy | 2 +-
2 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/src/main/java/groovy/transform/options/ImmutablePropertyHandler.java b/src/main/java/groovy/transform/options/ImmutablePropertyHandler.java
index b47beef658..2b5fac14e6 100644
--- a/src/main/java/groovy/transform/options/ImmutablePropertyHandler.java
+++ b/src/main/java/groovy/transform/options/ImmutablePropertyHandler.java
@@ -82,6 +82,7 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.varX;
public class ImmutablePropertyHandler extends PropertyHandler {
private static final ClassNode CLONEABLE_TYPE = make(Cloneable.class);
+ private static final ClassNode CLONENOTSUPPORTED_TYPE = make(CloneNotSupportedException.class);
private static final ClassNode COLLECTION_TYPE = makeWithoutCaching(Collection.class, false);
private static final ClassNode DGM_TYPE = make(DefaultGroovyMethods.class);
private static final ClassNode SELF_TYPE = make(ImmutableASTTransformation.class);
@@ -230,8 +231,8 @@ public class ImmutablePropertyHandler extends PropertyHandler {
return assignStmt;
}
ArgumentListExpression nameArg = args(constX(fNode.getName()));
- MethodCallExpression var = callX(varX(map), "get", nameArg);
- var.setImplicitThis(false);
+ MethodCallExpression get = callX(varX(map), "get", nameArg);
+ get.setImplicitThis(false);
MethodCallExpression containsKey = callX(varX(map), "containsKey", nameArg);
containsKey.setImplicitThis(false);
fNode.getDeclaringClass().getField(fNode.getName()).setInitialValueExpression(null); // to avoid default initialization
@@ -292,13 +293,17 @@ public class ImmutablePropertyHandler extends PropertyHandler {
assignStmt = ifElseS(
equalsNullX(param),
shouldNullCheck ? NullCheckASTTransformation.makeThrowStmt(fNode.getName()) : assignNullS(fieldExpr),
- assignStmt);
+ ifElseS(isInstanceOfX(param, CLONEABLE_TYPE),
+ assignStmt,
+ throwS(ctorX(CLONENOTSUPPORTED_TYPE))));
final Statement assignInit;
final Expression initExpr = fNode.getInitialValueExpression();
if (initExpr == null || (initExpr instanceof ConstantExpression && ((ConstantExpression) initExpr).isNullExpression())) {
assignInit = shouldNullCheck ? NullCheckASTTransformation.makeThrowStmt(fNode.getName()) : assignNullS(fieldExpr);
} else {
- assignInit = assignS(fieldExpr, cloneArrayOrCloneableExpr(initExpr, fieldType));
+ assignInit = ifElseS(isInstanceOfX(initExpr, CLONEABLE_TYPE),
+ assignS(fieldExpr, cloneArrayOrCloneableExpr(initExpr, fieldType)),
+ throwS(ctorX(CLONENOTSUPPORTED_TYPE)));
}
return assignFieldWithDefault(namedArgsMap, fNode, assignStmt, assignInit);
}
diff --git a/src/test/org/codehaus/groovy/transform/ImmutableTransformTest.groovy b/src/test/org/codehaus/groovy/transform/ImmutableTransformTest.groovy
index 2095952132..e74dac7e94 100644
--- a/src/test/org/codehaus/groovy/transform/ImmutableTransformTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/ImmutableTransformTest.groovy
@@ -139,7 +139,7 @@ class ImmutableTransformTest extends GroovyShellTestCase {
@Test
void testCloneableFieldNotCloneableObject() {
- shouldFail(isAtLeastJdk('16.0') ? IllegalAccessException : CloneNotSupportedException, '''
+ shouldFail(CloneNotSupportedException, '''
import groovy.transform.Immutable
class Dolly {