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 {