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 d51a0b645d GROOVY-7439: allow logging transform on trait class
d51a0b645d is described below

commit d51a0b645d673fdd54a9587eb1817ed320ec362e
Author: Eric Milles <[email protected]>
AuthorDate: Fri May 9 09:56:07 2025 -0500

    GROOVY-7439: allow logging transform on trait class
---
 .../ASTTransformationCollectorCodeVisitor.java     |  5 ++++-
 .../groovy/transform/ASTTransformationVisitor.java | 14 +++++++-------
 .../groovy/transform/BuilderASTTransformation.java | 22 +++++++++++-----------
 .../ExternalizeVerifierASTTransformation.java      |  7 ++++---
 .../groovy/transform/LogASTTransformation.java     |  7 ++++++-
 .../transform/SortableASTTransformation.java       |  2 +-
 .../transform/trait/TraitASTTransformation.java    |  6 +++---
 .../groovy/groovy/util/logging/Slf4jTest.groovy    |  2 --
 8 files changed, 36 insertions(+), 29 deletions(-)

diff --git 
a/src/main/java/org/codehaus/groovy/transform/ASTTransformationCollectorCodeVisitor.java
 
b/src/main/java/org/codehaus/groovy/transform/ASTTransformationCollectorCodeVisitor.java
index 7c0a26279f..9df19d8e3b 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/ASTTransformationCollectorCodeVisitor.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/ASTTransformationCollectorCodeVisitor.java
@@ -280,21 +280,24 @@ public class ASTTransformationCollectorCodeVisitor 
extends ClassCodeVisitorSuppo
         if (!ASTTransformation.class.isAssignableFrom(transformClass)) {
             String error = "Not an ASTTransformation: " + 
transformClass.getName() + " declared by " + 
annotation.getClassNode().getName();
             source.getErrorCollector().addError(new SimpleMessage(error, 
source));
+            return;
         }
 
         GroovyASTTransformation transformationClass = 
transformClass.getAnnotation(GroovyASTTransformation.class);
         if (transformationClass == null) {
             String error = "AST transformation implementation classes must be 
annotated with " + GroovyASTTransformation.class.getName() + ". " + 
transformClass.getName() + " lacks this annotation.";
             source.getErrorCollector().addError(new SimpleMessage(error, 
source));
+            return;
         }
 
         CompilePhase specifiedCompilePhase = transformationClass.phase();
         if (specifiedCompilePhase.getPhaseNumber() < 
CompilePhase.SEMANTIC_ANALYSIS.getPhaseNumber()) {
             String error = annotation.getClassNode().getName() + " is defined 
to be run in compile phase " + specifiedCompilePhase + ". Local AST 
transformations must run in SEMANTIC_ANALYSIS or later!";
             source.getErrorCollector().addError(new SimpleMessage(error, 
source));
+            return;
         }
 
-        if (!Traits.isTrait(classNode) || transformClass == 
TraitASTTransformation.class || transformClass == 
SealedASTTransformation.class) {
+        if (!Traits.isTrait(classNode) || transformClass == 
TraitASTTransformation.class || transformClass == SealedASTTransformation.class 
|| transformClass == LogASTTransformation.class) {
             classNode.addTransform((Class<? extends ASTTransformation>) 
transformClass, annotation);
         }
     }
diff --git 
a/src/main/java/org/codehaus/groovy/transform/ASTTransformationVisitor.java 
b/src/main/java/org/codehaus/groovy/transform/ASTTransformationVisitor.java
index af21d9ee75..1735b51d4e 100644
--- a/src/main/java/org/codehaus/groovy/transform/ASTTransformationVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/ASTTransformationVisitor.java
@@ -113,7 +113,7 @@ public final class ASTTransformationVisitor extends 
ClassCodeVisitorSupport {
         // only descend if we have annotations to look for
         Map<Class<? extends ASTTransformation>, Set<ASTNode>> baseTransforms = 
classNode.getTransforms(phase);
         if (!baseTransforms.isEmpty()) {
-            final Map<Class<? extends ASTTransformation>, ASTTransformation> 
transformInstances = new HashMap<Class<? extends ASTTransformation>, 
ASTTransformation>();
+            final Map<Class<? extends ASTTransformation>, ASTTransformation> 
transformInstances = new HashMap<>();
             for (Class<? extends ASTTransformation> transformClass : 
baseTransforms.keySet()) {
                 try {
                     transformInstances.put(transformClass, 
transformClass.getDeclaredConstructor().newInstance());
@@ -121,13 +121,13 @@ public final class ASTTransformationVisitor extends 
ClassCodeVisitorSupport {
                     source.getErrorCollector().addError(
                             new SimpleMessage(
                                     "Could not instantiate Transformation 
Processor " + transformClass
-                                    , //+ " declared by " + 
annotation.getClassNode().getName(),
+                                    /*+ " declared by " + 
annotation.getClassNode().getName()*/,
                                     source));
                 }
             }
 
             // invert the map, is now one to many
-            transforms = new HashMap<ASTNode, List<ASTTransformation>>();
+            transforms = new HashMap<>();
             for (Map.Entry<Class<? extends ASTTransformation>, Set<ASTNode>> 
entry : baseTransforms.entrySet()) {
                 for (ASTNode node : entry.getValue()) {
                     List<ASTTransformation> list = 
transforms.computeIfAbsent(node, k -> new ArrayList<>());
@@ -136,7 +136,7 @@ public final class ASTTransformationVisitor extends 
ClassCodeVisitorSupport {
                 }
             }
 
-            targetNodes = new LinkedList<ASTNode[]>();
+            targetNodes = new LinkedList<>();
 
             // first pass, collect nodes
             super.visitClass(classNode);
@@ -395,15 +395,15 @@ public final class ASTTransformationVisitor extends 
ClassCodeVisitorSupport {
     private static class PriorityComparator implements 
Comparator<Tuple2<ASTTransformation, ASTNode[]>> {
         @Override
         public int compare(Tuple2<ASTTransformation, ASTNode[]> o1, 
Tuple2<ASTTransformation, ASTNode[]> o2) {
-            Integer i1 = 0;
-            Integer i2 = 0;
+            int i1 = 0;
+            int i2 = 0;
             if (o1.getV1() instanceof TransformWithPriority) {
                 i1 = ((TransformWithPriority) o1.getV1()).priority();
             }
             if (o2.getV1() instanceof TransformWithPriority) {
                 i2 = ((TransformWithPriority) o2.getV1()).priority();
             }
-            return i2.compareTo(i1);
+            return Integer.compare(i2, i1);
         }
     }
 }
diff --git 
a/src/main/java/org/codehaus/groovy/transform/BuilderASTTransformation.java 
b/src/main/java/org/codehaus/groovy/transform/BuilderASTTransformation.java
index ec77fc01e9..d367485017 100644
--- a/src/main/java/org/codehaus/groovy/transform/BuilderASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/BuilderASTTransformation.java
@@ -56,15 +56,25 @@ import static 
org.codehaus.groovy.ast.tools.GeneralUtils.param;
 @GroovyASTTransformation(phase = CompilePhase.SEMANTIC_ANALYSIS)
 public class BuilderASTTransformation extends AbstractASTTransformation 
implements CompilationUnitAware, TransformWithPriority {
 
-    private static final Class MY_CLASS = Builder.class;
+    private static final Class<?> MY_CLASS = Builder.class;
     private static final ClassNode MY_TYPE = make(MY_CLASS);
     public static final String MY_TYPE_NAME = "@" + 
MY_TYPE.getNameWithoutPackage();
     private static final ClassNode RECORD_TYPE = make(RecordBase.class, false);
     public static final ClassNode[] NO_EXCEPTIONS = ClassNode.EMPTY_ARRAY;
     public static final Parameter[] NO_PARAMS = Parameter.EMPTY_ARRAY;
 
+    @Override
+    public int priority() {
+        return -5;
+    }
+
     private CompilationUnit compilationUnit;
 
+    @Override
+    public void setCompilationUnit(final CompilationUnit unit) {
+        this.compilationUnit = unit;
+    }
+
     @Override
     public void visit(ASTNode[] nodes, SourceUnit source) {
         init(nodes, source);
@@ -101,11 +111,6 @@ public class BuilderASTTransformation extends 
AbstractASTTransformation implemen
         }
     }
 
-    @Override
-    public int priority() {
-        return -5;
-    }
-
     public interface BuilderStrategy {
         void build(BuilderASTTransformation transform, AnnotatedNode 
annotatedNode, AnnotationNode anno);
     }
@@ -295,9 +300,4 @@ public class BuilderASTTransformation extends 
AbstractASTTransformation implemen
             return null;
         }
     }
-
-    @Override
-    public void setCompilationUnit(final CompilationUnit unit) {
-        this.compilationUnit = unit;
-    }
 }
diff --git 
a/src/main/java/org/codehaus/groovy/transform/ExternalizeVerifierASTTransformation.java
 
b/src/main/java/org/codehaus/groovy/transform/ExternalizeVerifierASTTransformation.java
index 8d88393391..aadc5ef930 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/ExternalizeVerifierASTTransformation.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/ExternalizeVerifierASTTransformation.java
@@ -39,9 +39,10 @@ import static 
org.codehaus.groovy.ast.tools.GeneralUtils.getInstancePropertyFiel
 import static org.objectweb.asm.Opcodes.ACC_FINAL;
 import static org.objectweb.asm.Opcodes.ACC_TRANSIENT;
 
[email protected](phase = 
CompilePhase.CLASS_GENERATION)
-public class ExternalizeVerifierASTTransformation extends 
org.codehaus.groovy.transform.AbstractASTTransformation {
-    static final Class MY_CLASS = ExternalizeVerifier.class;
+@GroovyASTTransformation(phase = CompilePhase.CLASS_GENERATION)
+public class ExternalizeVerifierASTTransformation extends 
AbstractASTTransformation {
+
+    static final Class<?> MY_CLASS = ExternalizeVerifier.class;
     static final ClassNode MY_TYPE = make(MY_CLASS);
     static final String MY_TYPE_NAME = "@" + MY_TYPE.getNameWithoutPackage();
     private static final ClassNode EXTERNALIZABLE_TYPE = 
make(Externalizable.class);
diff --git 
a/src/main/java/org/codehaus/groovy/transform/LogASTTransformation.java 
b/src/main/java/org/codehaus/groovy/transform/LogASTTransformation.java
index 971e0b9dad..1a1d925507 100644
--- a/src/main/java/org/codehaus/groovy/transform/LogASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/LogASTTransformation.java
@@ -56,7 +56,7 @@ import static org.objectweb.asm.Opcodes.ACC_TRANSIENT;
  * This class provides an AST Transformation to add a log field to a class.
  */
 @GroovyASTTransformation(phase = CompilePhase.SEMANTIC_ANALYSIS)
-public class LogASTTransformation extends AbstractASTTransformation implements 
CompilationUnitAware {
+public class LogASTTransformation extends AbstractASTTransformation implements 
CompilationUnitAware, TransformWithPriority {
 
     /**
      * This is just a dummy value used because String annotations values can 
not be null.
@@ -66,6 +66,11 @@ public class LogASTTransformation extends 
AbstractASTTransformation implements C
 
     public static final String DEFAULT_ACCESS_MODIFIER = "private";
 
+    @Override
+    public int priority() {
+        return 1; // GROOVY-7439
+    }
+
     private CompilationUnit compilationUnit;
 
     @Override
diff --git 
a/src/main/java/org/codehaus/groovy/transform/SortableASTTransformation.java 
b/src/main/java/org/codehaus/groovy/transform/SortableASTTransformation.java
index ac163c9b2d..3260916c17 100644
--- a/src/main/java/org/codehaus/groovy/transform/SortableASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/SortableASTTransformation.java
@@ -84,8 +84,8 @@ import static org.objectweb.asm.Opcodes.ACC_SYNTHETIC;
  * Injects a set of Comparators and sort methods.
  */
 @GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION)
-
 public class SortableASTTransformation extends AbstractASTTransformation {
+
     private static final ClassNode MY_TYPE = make(Sortable.class);
     private static final String MY_TYPE_NAME = "@" + 
MY_TYPE.getNameWithoutPackage();
     private static final ClassNode COMPARABLE_TYPE = 
makeClassSafe(Comparable.class);
diff --git 
a/src/main/java/org/codehaus/groovy/transform/trait/TraitASTTransformation.java 
b/src/main/java/org/codehaus/groovy/transform/trait/TraitASTTransformation.java
index addd4c5f14..50cf1eac1f 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/trait/TraitASTTransformation.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/trait/TraitASTTransformation.java
@@ -375,13 +375,13 @@ public class TraitASTTransformation extends 
AbstractASTTransformation implements
 
     /**
      * Copies annotations from the trait to the helper, excluding 
non-applicable
-     * items such as {@link Trait @Trait} and {@link Sealed @Sealed}.
+     * items such as {@link Trait @Trait}, {@link Sealed @Sealed} and logging 
transforms.
      */
     private static void copyClassAnnotations(final ClassNode helper) {
         for (AnnotationNode annotation : 
helper.getOuterClass().getAnnotations()) {
             ClassNode annotationType = annotation.getClassNode();
-            if (!annotationType.equals(Traits.TRAIT_CLASSNODE)
-                    && !annotationType.equals(SEALED_TYPE)) {
+            if (!annotationType.equals(Traits.TRAIT_CLASSNODE) && 
!annotationType.equals(SEALED_TYPE)
+                    && 
!annotationType.getName().startsWith("groovy.util.logging.")) { // GROOVY-7439
                 helper.addAnnotation(annotation);
             }
         }
diff --git a/src/test/groovy/groovy/util/logging/Slf4jTest.groovy 
b/src/test/groovy/groovy/util/logging/Slf4jTest.groovy
index 5f7bcba37d..cb1c071d24 100644
--- a/src/test/groovy/groovy/util/logging/Slf4jTest.groovy
+++ b/src/test/groovy/groovy/util/logging/Slf4jTest.groovy
@@ -24,7 +24,6 @@ import ch.qos.logback.classic.LoggerContext
 import ch.qos.logback.classic.spi.LoggingEvent
 import ch.qos.logback.core.OutputStreamAppender
 import ch.qos.logback.core.layout.EchoLayout
-import groovy.test.NotYetImplemented
 import org.junit.jupiter.api.AfterEach
 import org.junit.jupiter.api.BeforeEach
 import org.junit.jupiter.api.Test
@@ -374,7 +373,6 @@ final class Slf4jTest {
     }
 
     // GROOVY-7439
-    @NotYetImplemented
     @ParameterizedTest
     @ValueSource(strings=[
         'log', // Cannot find matching method Object#debug(String)

Reply via email to