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() {