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 2024/02/26 17:41:41 UTC

(groovy) branch master updated: GROOVY-9396, GROOVY-11313: no access method for shared context variable

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

emilles 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 094b57b0f7 GROOVY-9396, GROOVY-11313: no access method for shared context variable
094b57b0f7 is described below

commit 094b57b0f760fe1afba1fe93741e0115ed185b73
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Mon Feb 26 11:03:15 2024 -0600

    GROOVY-9396, GROOVY-11313: no access method for shared context variable
---
 .../groovy/classgen/asm/ClosureWriter.java         | 41 ++++++----------------
 .../classgen/asm/sc/StaticTypesLambdaWriter.java   |  2 +-
 .../groovy/generated/ClosureGeneratedTest.groovy   | 15 --------
 .../org/codehaus/groovy/ast/ClassNodeTest.java     | 29 +++++++++++----
 .../transform/GeneratedAnnotationTest.groovy       | 19 ----------
 5 files changed, 34 insertions(+), 72 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/ClosureWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/ClosureWriter.java
index 82fa899340..3864d3309d 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/ClosureWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/ClosureWriter.java
@@ -49,15 +49,12 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
-import static org.apache.groovy.ast.tools.AnnotatedNodeUtils.markAsGenerated;
 import static org.apache.groovy.ast.tools.ClassNodeUtils.addGeneratedMethod;
 import static org.codehaus.groovy.ast.ClassHelper.long_TYPE;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.args;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.callThisX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.constX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.ctorSuperX;
-import static org.codehaus.groovy.ast.tools.GeneralUtils.fieldX;
-import static org.codehaus.groovy.ast.tools.GeneralUtils.getGetterName;
 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.stmt;
@@ -255,8 +252,8 @@ public class ClosureWriter {
         // let's make the constructor
         BlockStatement block = createBlockStatementForConstructor(expression, rootClass, classNode);
 
-        // let's assign all the parameter fields from the outer context
-        addFieldsAndGettersForLocalVariables(answer, localVariableParams);
+        // let's make fields for variables from outer context
+        addFieldsForLocalVariables(answer, localVariableParams);
 
         addConstructor(expression, localVariableParams, answer, block);
 
@@ -303,10 +300,15 @@ public class ClosureWriter {
         return constructorNode;
     }
 
-    protected void addFieldsAndGettersForLocalVariables(final InnerClassNode closureClass, final Parameter[] localVariableParams) {
+    protected void addFieldsForLocalVariables(final InnerClassNode closureClass, final Parameter[] localVariableParams) {
         for (Parameter param : localVariableParams) {
             String     paramName = param.getName();
-            ClassNode  paramType = param.getType();
+            ClassNode  paramType = param.getOriginType();
+            if (ClassHelper.isPrimitiveType(paramType)) {
+                paramType = ClassHelper.getWrapper(paramType);
+            } else {
+                paramType = paramType.getPlainNodeReference();
+            }
 
             VariableExpression initialValue = varX(paramName);
             initialValue.setAccessedVariable(param);
@@ -314,31 +316,8 @@ public class ClosureWriter {
             param.setType(ClassHelper.makeReference());
 
             FieldNode paramField = closureClass.addField(paramName, ACC_PRIVATE | ACC_SYNTHETIC, param.getType(), initialValue);
-            paramField.setOriginType(ClassHelper.getWrapper(param.getOriginType()));
+            paramField.setOriginType(paramType);
             paramField.setHolder(true);
-
-            switch (paramName) {
-              case "class":
-              case "owner":
-              case "delegate":
-              case "directive":
-              case "metaClass":
-              case "thisObject":
-              case "parameterTypes":
-              case "resolveStrategy":
-              case "maximumNumberOfParameters":
-                  break; // GROOVY-11313
-              default:
-                MethodNode getMethod = closureClass.addMethod(
-                    getGetterName(paramName),
-                    ACC_PUBLIC,
-                    paramType.getPlainNodeReference(),
-                    Parameter.EMPTY_ARRAY,
-                    ClassNode.EMPTY_ARRAY,
-                    returnS(fieldX(paramField))
-                );
-                markAsGenerated(closureClass, getMethod, true);
-            }
         }
     }
 
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesLambdaWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesLambdaWriter.java
index 142312ef6b..d661c9bcf8 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesLambdaWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesLambdaWriter.java
@@ -242,7 +242,7 @@ public class StaticTypesLambdaWriter extends LambdaWriter implements AbstractFun
         MethodNode syntheticLambdaMethodNode = addSyntheticLambdaMethodNode(expression, lambdaClass, abstractMethod);
 
         Parameter[] localVariableParameters = expression.getNodeMetaData(LAMBDA_SHARED_VARIABLES);
-        addFieldsAndGettersForLocalVariables(lambdaClass, localVariableParameters);
+        addFieldsForLocalVariables(lambdaClass, localVariableParameters);
 
         ConstructorNode constructorNode = addConstructor(expression, localVariableParameters, lambdaClass, createBlockStatementForConstructor(expression, outermostClass, enclosingClass));
         constructorNode.putNodeMetaData(IS_GENERATED_CONSTRUCTOR, Boolean.TRUE);
diff --git a/src/test/groovy/generated/ClosureGeneratedTest.groovy b/src/test/groovy/generated/ClosureGeneratedTest.groovy
index 9450c65250..bc64994556 100644
--- a/src/test/groovy/generated/ClosureGeneratedTest.groovy
+++ b/src/test/groovy/generated/ClosureGeneratedTest.groovy
@@ -22,21 +22,6 @@ import org.junit.Test
 
 final class ClosureGeneratedTest extends AbstractGeneratedAstTestCase {
 
-    @Test
-    void 'captured argument accessor is annotated'() {
-        def classUnderTest = parseClass '''
-            class C {
-                Closure<String> m(String string) {
-                    return { -> string }
-                }
-            }
-        '''
-        def objectUnderTest = classUnderTest.newInstance()
-        Closure<String> cls = classUnderTest.getMethod('m', String).invoke(objectUnderTest, 'value')
-
-        assertMethodIsAnnotated/*AsGenerated*/(cls.class, 'getString')
-    }
-
     // GROOVY-11313
     @Test
     void 'no accessor for captured argument with reserved name'() {
diff --git a/src/test/org/codehaus/groovy/ast/ClassNodeTest.java b/src/test/org/codehaus/groovy/ast/ClassNodeTest.java
index 2091033a4b..3759da76ed 100644
--- a/src/test/org/codehaus/groovy/ast/ClassNodeTest.java
+++ b/src/test/org/codehaus/groovy/ast/ClassNodeTest.java
@@ -84,6 +84,22 @@ public final class ClassNodeTest {
         assertEquals("Package", "com.acme", packageNode.getPackageName());
     }
 
+    @Test
+    public void testPlainReference() {
+        ClassNode arrayNode = classNode.getPlainNodeReference().makeArray().makeArray();
+        ClassNode plainNode = arrayNode.getPlainNodeReference();
+
+        assertTrue(plainNode.isArray());
+        assertTrue(plainNode.getComponentType().isArray());
+        assertEquals(arrayNode.getComponentType(), plainNode.getComponentType());
+        assertEquals(classNode, plainNode.getComponentType().getComponentType());
+
+        assertEquals(arrayNode.getName(), plainNode.getName());
+        assertEquals(arrayNode.toString(), plainNode.toString());
+        assertEquals(arrayNode.getComponentType().getName(), plainNode.getComponentType().getName());
+        assertEquals(arrayNode.getComponentType().toString(), plainNode.getComponentType().toString());
+    }
+
     @Test
     public void testTypeAnnotations() {
         var annotation = new AnnotationNode(ClassHelper.make(Deprecated.class));
@@ -98,9 +114,9 @@ public final class ClassNodeTest {
 
     @Test
     public void testPermittedSubclasses() throws Exception {
-        assumeTrue(groovy.test.GroovyAssert.isAtLeastJdk("17.0"));
+        assumeTrue(Runtime.version().feature() >= 17);
 
-        Class<?> c = Class.forName("java.lang.constant.ConstantDesc");
+        Class<?>  c  = Class.forName("java.lang.constant.ConstantDesc");
         ClassNode cn = new ClassNode(c);
         assertTrue(!cn.getPermittedSubclasses().isEmpty());
         assertTrue(cn.isSealed());
@@ -109,9 +125,10 @@ public final class ClassNodeTest {
         assertTrue(!cn.getPermittedSubclasses().isEmpty());
         assertTrue(cn.isSealed());
 
-        // some constructors of ClassNode do not trigger the lazy initialization
-//        cn = ClassHelper.make("java.lang.constant.ConstantDesc");
-//        assertTrue(!cn.getPermittedSubclasses().isEmpty());
-//        assertTrue(cn.isSealed());
+        /* some constructors of ClassNode do not trigger the lazy initialization
+        cn = ClassHelper.make("java.lang.constant.ConstantDesc");
+        assertTrue(!cn.getPermittedSubclasses().isEmpty());
+        assertTrue(cn.isSealed());
+        */
     }
 }
diff --git a/src/test/org/codehaus/groovy/transform/GeneratedAnnotationTest.groovy b/src/test/org/codehaus/groovy/transform/GeneratedAnnotationTest.groovy
index c3fbc7ebd2..6574c5b714 100644
--- a/src/test/org/codehaus/groovy/transform/GeneratedAnnotationTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/GeneratedAnnotationTest.groovy
@@ -78,25 +78,6 @@ final class GeneratedAnnotationTest {
         assert !annos.contains('groovy.transform.Generated')
     }
 
-    // GROOVY-9396
-    @Test
-    void testCapturedArgForGeneratedClosureIsAnnotatedWithGenerated() {
-        def closure = evaluate '''
-            class C {
-                Closure<String> m(String string) {
-                    return { ->
-                        string
-                    }
-                }
-            }
-            new C().m('value')
-        '''
-
-        def method = closure.getClass().getMethod('getString')
-        def annos  = method.annotations*.annotationType()*.name
-        assert annos.contains('groovy.transform.Generated')
-    }
-
     // GROOVY-10505
     @Test
     void testTraitComposerMarksGeneratedMethodsForVariablesAsGenerated() {