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 1bf59bdb77 GROOVY-11736: propagate missing type arguments to super 
interface(s)
1bf59bdb77 is described below

commit 1bf59bdb777380c815587973b67b00c3835c2568
Author: Eric Milles <[email protected]>
AuthorDate: Sat Aug 23 11:46:39 2025 -0500

    GROOVY-11736: propagate missing type arguments to super interface(s)
---
 .../codehaus/groovy/ast/tools/GeneralUtils.java    |  19 ++-
 .../codehaus/groovy/classgen/ExtendedVerifier.java |  58 ++++----
 .../org/codehaus/groovy/classgen/Verifier.java     |  13 ++
 .../transform/DelegateASTTransformation.java       |  29 ++--
 src/test/groovy/bugs/Groovy7722.groovy             |  11 +-
 src/test/groovy/groovy/InterfaceTest.groovy        |  15 ++-
 .../groovy/transform/DelegateTransformTest.groovy  | 150 +++++++++++++++------
 7 files changed, 199 insertions(+), 96 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java 
b/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java
index ca2e994566..9d11192ba2 100644
--- a/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java
+++ b/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java
@@ -87,6 +87,7 @@ import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
 import java.util.function.Consumer;
+import java.util.function.UnaryOperator;
 
 import static 
org.codehaus.groovy.antlr.PrimitiveHelper.getDefaultValueForPrimitive;
 
@@ -488,17 +489,27 @@ public class GeneralUtils {
     }
 
     private static void addAllInterfaces(final Set<ClassNode> result, final 
ClassNode source) {
-        for (ClassNode in : source.getInterfaces()) {
-            if (in.getGenericsTypes() != null) { // GROOVY-11707
-                in = GenericsUtils.parameterizeType(source, in);
+        UnaryOperator<ClassNode> sourceTypeArgs = (ClassNode cn) -> {
+            if (source.isRedirectNode() && 
GenericsUtils.hasUnresolvedGenerics(cn)) { // GROOVY-11707
+                if (source.getGenericsTypes() == null && 
source.redirect().getGenericsTypes() != null) {
+                    cn = cn.getPlainNodeReference(); // GROOVY-11736
+                } else {
+                    cn = GenericsUtils.parameterizeType(source, cn);
+                }
             }
+            return cn;
+        };
+
+        for (ClassNode in : source.getInterfaces()) {
+            in = sourceTypeArgs.apply(in);
             if (result.add(in)) {
                 addAllInterfaces(result, in);
             }
         }
+
         ClassNode sc = source.redirect().getUnresolvedSuperClass(false);
         if (sc != null && !ClassHelper.isObjectType(sc)) {
-            addAllInterfaces(result, GenericsUtils.parameterizeType(source, 
sc));
+            addAllInterfaces(result, sourceTypeArgs.apply(sc));
         }
     }
 
diff --git a/src/main/java/org/codehaus/groovy/classgen/ExtendedVerifier.java 
b/src/main/java/org/codehaus/groovy/classgen/ExtendedVerifier.java
index c81f207d7b..880c4ac95d 100644
--- a/src/main/java/org/codehaus/groovy/classgen/ExtendedVerifier.java
+++ b/src/main/java/org/codehaus/groovy/classgen/ExtendedVerifier.java
@@ -46,8 +46,10 @@ import org.objectweb.asm.Opcodes;
 import java.lang.annotation.Retention;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
@@ -65,11 +67,10 @@ import static 
org.codehaus.groovy.ast.AnnotationNode.TYPE_TARGET;
 import static org.codehaus.groovy.ast.AnnotationNode.TYPE_USE_TARGET;
 import static org.codehaus.groovy.ast.ClassHelper.DEPRECATED_TYPE;
 import static org.codehaus.groovy.ast.ClassHelper.makeCached;
-import static 
org.codehaus.groovy.ast.tools.GeneralUtils.getInterfacesAndSuperInterfaces;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.listX;
 import static 
org.codehaus.groovy.ast.tools.GenericsUtils.correctToGenericsSpec;
-import static 
org.codehaus.groovy.ast.tools.GenericsUtils.correctToGenericsSpecRecurse;
 import static org.codehaus.groovy.ast.tools.GenericsUtils.createGenericsSpec;
+import static org.codehaus.groovy.ast.tools.GenericsUtils.parameterizeType;
 import static org.codehaus.groovy.ast.tools.ParameterUtils.parametersEqual;
 import static 
org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.evaluateExpression;
 
@@ -423,10 +424,10 @@ public class ExtendedVerifier extends 
ClassCodeVisitorSupport {
         if (annotationType.isResolved() && 
"java.lang.Override".equals(annotationType.getName())) {
             if (node instanceof MethodNode && 
!Boolean.TRUE.equals(node.getNodeMetaData(Verifier.DEFAULT_PARAMETER_GENERATED)))
 {
                 boolean override = false;
-                MethodNode origMethod = (MethodNode) node;
-                ClassNode cNode = origMethod.getDeclaringClass();
-                if (origMethod.hasDefaultValue()) {
-                    List<MethodNode> variants = 
cNode.getDeclaredMethods(origMethod.getName());
+                MethodNode mNode = (MethodNode) node;
+                ClassNode  cNode = mNode.getDeclaringClass();
+                if (mNode.hasDefaultValue()) {
+                    List<MethodNode> variants = 
cNode.getDeclaredMethods(mNode.getName());
                     for (MethodNode m : variants) {
                         if (m.getAnnotations().contains(visited) && 
isOverrideMethod(m)) {
                             override = true;
@@ -434,11 +435,11 @@ public class ExtendedVerifier extends 
ClassCodeVisitorSupport {
                         }
                     }
                 } else {
-                    override = isOverrideMethod(origMethod);
+                    override = isOverrideMethod(mNode);
                 }
 
                 if (!override) {
-                    addError("Method '" + origMethod.getName() + "' from class 
'" + cNode.getName() + "' does not override " +
+                    addError("Method '" + mNode.getName() + "' from class '" + 
cNode.getName() + "' does not override " +
                             "method from its superclass or interfaces but is 
annotated with @Override.", visited);
                 }
             }
@@ -446,32 +447,29 @@ public class ExtendedVerifier extends 
ClassCodeVisitorSupport {
     }
 
     private static boolean isOverrideMethod(final MethodNode method) {
-        ClassNode declaringClass = method.getDeclaringClass();
-        ClassNode next = declaringClass;
-        outer:
-        while (next != null) {
-            Map<String, ClassNode> nextSpec = createGenericsSpec(next);
-            MethodNode mn = correctToGenericsSpec(nextSpec, method);
-            if (next != declaringClass) {
-                if (getDeclaredMethodCorrected(nextSpec, mn, next) != null) 
break;
-            }
-
-            for (ClassNode face : getInterfacesAndSuperInterfaces(next)) {
-                Map<String, ClassNode> faceSpec = createGenericsSpec(face, 
nextSpec);
-                if (getDeclaredMethodCorrected(faceSpec, mn, face) != null) 
break outer;
+        final ClassNode declaringClass = method.getDeclaringClass();
+        var todo = new LinkedList<ClassNode>();
+        var done = new HashSet<ClassNode>();
+        var next = declaringClass;
+        do {
+            if (done.add(next)) {
+                if (next != declaringClass
+                        && getDeclaredMethodCorrected(method, next) != null) {
+                    return true;
+                }
+                ClassNode sc = next.redirect().getUnresolvedSuperClass(false);
+                if (sc != null) todo.addFirst(parameterizeType(next, sc));
+                for (ClassNode in : next.getInterfaces()) {
+                    todo.add(parameterizeType(next, in));
+                }
             }
+        } while ((next = todo.poll()) != null);
 
-            ClassNode superClass = next.getUnresolvedSuperClass();
-            if (superClass != null) {
-                next = correctToGenericsSpecRecurse(nextSpec, superClass);
-            } else {
-                next = null;
-            }
-        }
-        return next != null;
+        return false;
     }
 
-    private static MethodNode getDeclaredMethodCorrected(final Map<String, 
ClassNode> genericsSpec, final MethodNode mn, final ClassNode cn) {
+    private static MethodNode getDeclaredMethodCorrected(final MethodNode mn, 
final ClassNode cn) {
+        Map<String, ClassNode> genericsSpec = createGenericsSpec(cn);
         for (MethodNode declared : cn.getDeclaredMethods(mn.getName())) {
             MethodNode corrected = correctToGenericsSpec(genericsSpec, 
declared);
             if (parametersEqual(corrected.getParameters(), 
mn.getParameters())) {
diff --git a/src/main/java/org/codehaus/groovy/classgen/Verifier.java 
b/src/main/java/org/codehaus/groovy/classgen/Verifier.java
index f45013210c..daff243dfe 100644
--- a/src/main/java/org/codehaus/groovy/classgen/Verifier.java
+++ b/src/main/java/org/codehaus/groovy/classgen/Verifier.java
@@ -86,6 +86,7 @@ import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.IntFunction;
 import java.util.stream.Collectors;
 
 import static java.lang.reflect.Modifier.isFinal;
@@ -402,6 +403,18 @@ public class Verifier implements GroovyClassVisitor, 
Opcodes {
                                 if (t.equals(in)) {
                                     String one = in.toString(false), two = 
t.toString(false);
                                     if (!one.equals(two)) {
+                                        IntFunction<String> via = (n) -> {
+                                            ClassNode from;
+                                            if (n < nInterfaces) {
+                                                from = interfaces[n];
+                                                if (from.equals(in)) from = cn;
+                                            } else {
+                                                from = 
cn.getUnresolvedSuperClass();
+                                            }
+                                            return " (via " + 
from.getNameWithoutPackage() + ")";
+                                        };
+                                        one += via.apply(i);
+                                        two += via.apply(j);
                                         if (Traits.isTrait(in)) { // 
GROOVY-11508
                                             
cn.getModule().getContext().addWarning("The trait " + 
in.getNameWithoutPackage() +
                                                 " is implemented more than 
once with different arguments: " + one + " and " + two, cn);
diff --git 
a/src/main/java/org/codehaus/groovy/transform/DelegateASTTransformation.java 
b/src/main/java/org/codehaus/groovy/transform/DelegateASTTransformation.java
index 6d2a5b9767..320c12468b 100644
--- a/src/main/java/org/codehaus/groovy/transform/DelegateASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/DelegateASTTransformation.java
@@ -47,8 +47,8 @@ import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Stream;
 
-import static java.util.Arrays.copyOf;
 import static java.util.stream.Collectors.toSet;
 import static org.apache.groovy.ast.tools.ClassNodeUtils.addGeneratedMethod;
 import static org.codehaus.groovy.ast.ClassHelper.DEPRECATED_TYPE;
@@ -201,19 +201,20 @@ public class DelegateASTTransformation extends 
AbstractASTTransformation {
 
             if (skipInterfaces) return;
 
-            Set<ClassNode> addedInterfaces = 
getInterfacesAndSuperInterfaces(delegate.type);
-            addedInterfaces.removeIf(i -> (i.getModifiers() & (ACC_PUBLIC | 
ACC_SYNTHETIC)) != ACC_PUBLIC || i.isSealed()); // GROOVY-7288 and JDK16+
-            if (!addedInterfaces.isEmpty()) {
-                Set<ClassNode> ownerInterfaces = 
getInterfacesAndSuperInterfaces(delegate.owner);
-                for (ClassNode i : addedInterfaces) {
-                    if (!ownerInterfaces.contains(i)) {
-                        ClassNode[] faces = delegate.owner.getInterfaces();
-                        faces = copyOf(faces, faces.length + 1);
-                        faces[faces.length - 1] = i;
-
-                        delegate.owner.setInterfaces(faces);
-                    }
-                }
+            Set<ClassNode> interfaces;
+            if (delegate.type.isInterface()) { // GROOVY-11736
+                interfaces = new HashSet<>(Set.of(delegate.type));
+            } else {
+                interfaces = getInterfacesAndSuperInterfaces(delegate.type);
+                // if interfaces contains Collection, remove redundant Iterable
+                interfaces.removeIf(i1 -> interfaces.stream().anyMatch(i2 -> 
i2 != i1 && i2.implementsInterface(i1)));
+            }
+            interfaces.removeIf(i -> (i.getModifiers() & (ACC_PUBLIC | 
ACC_SYNTHETIC)) != ACC_PUBLIC || i.isSealed()); // GROOVY-7288 and JDK16+
+
+            
interfaces.removeAll(getInterfacesAndSuperInterfaces(delegate.owner));
+
+            if (!interfaces.isEmpty()) {
+                
delegate.owner.setInterfaces(Stream.concat(Stream.of(delegate.owner.getInterfaces()),
 interfaces.stream()).toArray(ClassNode[]::new));
             }
         }
     }
diff --git a/src/test/groovy/bugs/Groovy7722.groovy 
b/src/test/groovy/bugs/Groovy7722.groovy
index 46174cef94..0c9e067308 100644
--- a/src/test/groovy/bugs/Groovy7722.groovy
+++ b/src/test/groovy/bugs/Groovy7722.groovy
@@ -19,7 +19,7 @@
 package bugs
 
 import groovy.transform.CompileStatic
-import org.junit.Test
+import org.junit.jupiter.api.Test
 
 import static groovy.test.GroovyAssert.assertScript
 
@@ -46,7 +46,8 @@ final class Groovy7722 {
         '''
     }
 
-    @Test // GROOVY-7864
+    // GROOVY-7864
+    @Test
     void testGenericsStackOverflow2() {
         assertScript '''
             // from RxJava 1.x
@@ -54,12 +55,12 @@ final class Groovy7722 {
                 interface OnSubscribe<T> extends Action1<Subscriber<? super 
T>> {
                 }
                 static <T> Observable<T> create(OnSubscribe<T> f) {
-                    return new Observable<T>(/*RxJavaHooks.onCreate(f)*/);
+                    new Observable<T>(/*RxJavaHooks.onCreate(f)*/)
                 }
             }
             abstract class Subscriber<T> implements Observer<T>, Subscription {
             }
-            interface Action1<T> /*extends Action*/ {
+            interface Action1<T> {
                 void call(T t)
             }
             interface Observer<T> {
@@ -67,7 +68,7 @@ final class Groovy7722 {
                 void onCompleted()
                 void onError(Throwable t)
             }
-            public interface Subscription {
+            interface Subscription {
                 void unsubscribe()
                 boolean isUnsubscribed()
             }
diff --git a/src/test/groovy/groovy/InterfaceTest.groovy 
b/src/test/groovy/groovy/InterfaceTest.groovy
index 8142f83b15..7938e8bdd6 100644
--- a/src/test/groovy/groovy/InterfaceTest.groovy
+++ b/src/test/groovy/groovy/InterfaceTest.groovy
@@ -44,7 +44,7 @@ final class InterfaceTest extends CompilableTestSupport {
             interface J<T> extends I<T> {}
             class X implements I<String>, J<Number> {}
         '''
-        assert err.contains('The interface I cannot be implemented more than 
once with different arguments: I<java.lang.String> and I<java.lang.Number>')
+        assert err.contains('The interface I cannot be implemented more than 
once with different arguments: I<java.lang.String> (via X) and 
I<java.lang.Number> (via J)')
     }
 
     // GROOVY-5106
@@ -54,7 +54,7 @@ final class InterfaceTest extends CompilableTestSupport {
             class X implements I<Number> {}
             class Y extends X implements I<String> {}
         '''
-        assert err.contains('The interface I cannot be implemented more than 
once with different arguments: I<java.lang.String> and I<java.lang.Number>')
+        assert err.contains('The interface I cannot be implemented more than 
once with different arguments: I<java.lang.String> (via Y) and 
I<java.lang.Number> (via X)')
     }
 
     // GROOVY-11707
@@ -67,6 +67,17 @@ final class InterfaceTest extends CompilableTestSupport {
         '''
     }
 
+    // GROOVY-11736
+    void testReImplementsInterface4() {
+        def err = shouldFail '''
+            abstract class A implements Comparable<Object> {
+            }
+            abstract class B extends A implements Comparable {
+            }
+        '''
+        assert err.contains('The interface Comparable cannot be implemented 
more than once with different arguments: java.lang.Comparable (via B) and 
java.lang.Comparable<java.lang.Object> (via A)')
+    }
+
     // GROOVY-10060
     void testPrivateInterfaceMethod() {
         assertScript '''
diff --git 
a/src/test/groovy/org/codehaus/groovy/transform/DelegateTransformTest.groovy 
b/src/test/groovy/org/codehaus/groovy/transform/DelegateTransformTest.groovy
index b74a571614..e1020fe9e2 100644
--- a/src/test/groovy/org/codehaus/groovy/transform/DelegateTransformTest.groovy
+++ b/src/test/groovy/org/codehaus/groovy/transform/DelegateTransformTest.groovy
@@ -21,7 +21,7 @@ package org.codehaus.groovy.transform
 import org.codehaus.groovy.control.CompilerConfiguration
 import org.codehaus.groovy.control.MultipleCompilationErrorsException
 import org.codehaus.groovy.tools.javac.JavaAwareCompilationUnit
-import org.junit.Test
+import org.junit.jupiter.api.Test
 
 import java.util.concurrent.Callable
 import java.util.concurrent.locks.Lock
@@ -37,7 +37,8 @@ import static org.junit.Assert.assertTrue
  */
 final class DelegateTransformTest {
 
-    @Test // GROOVY-3380
+    // GROOVY-3380
+    @Test
     void testDelegateImplementingNonPublicInterface() {
         assertScript '''
             import 
org.codehaus.groovy.transform.ClassImplementingANonPublicInterface
@@ -51,7 +52,8 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-3380
+    // GROOVY-3380
+    @Test
     void testDelegateImplementingNonPublicInterfaceWithZipFileConcreteCase() {
         assertScript '''
             import java.util.zip.*
@@ -64,7 +66,8 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-10439
+    // GROOVY-10439
+    @Test
     void testDelegateImplementingInterfaceWithDifferentTypeArgumentThanOwner() 
{
         def err = shouldFail '''
             class C extends ArrayList<String> {
@@ -79,10 +82,11 @@ final class DelegateTransformTest {
                 @Delegate HashSet<Number> numbers // Set<Number> added; 
Verifier checks
             }
         '''
-        assert err =~ /The interface Collection cannot be implemented more 
than once with different arguments: java.util.Collection<java.lang.Number> and 
java.util.Collection<java.lang.String>/
+        assert err =~ /The interface Collection cannot be implemented more 
than once with different arguments: java.util.Collection<java.lang.Number> 
\(via Set\) and java.util.Collection<java.lang.String> \(via ArrayList\)/
     }
 
-    @Test // GROOVY-5974
+    // GROOVY-5974
+    @Test
     void testDelegateExcludes() {
         assertScript '''
             class MapSet {
@@ -198,7 +202,8 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-3471
+    // GROOVY-3471
+    @Test
     void 
testDelegateOnAMapTypeFieldWithInitializationUsingConstructorProperties() {
         assertScript '''
             class Test3471 { @Delegate Map mp }
@@ -207,13 +212,15 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-3323
+    // GROOVY-3323
+    @Test
     void testDelegateTransformCorrectlyDelegatesMethodsFromSuperInterfaces() {
         assert new DelegateBarImpl(new DelegateFooImpl()).bar() == 'bar impl'
         assert new DelegateBarImpl(new DelegateFooImpl()).foo() == 'foo impl'
     }
 
-    @Test // GROOVY-3555
+    // GROOVY-3555
+    @Test
     void testDelegateTransformIgnoresDeprecatedMethodsByDefault() {
         def b1 = new DelegateBarForcingDeprecated(baz: new 
BazWithDeprecatedFoo())
         def b2 = new DelegateBarWithoutDeprecated(baz: new 
BazWithDeprecatedFoo())
@@ -225,7 +232,8 @@ final class DelegateTransformTest {
         }
     }
 
-    @Test // GROOVY-4163
+    // GROOVY-4163
+    @Test
     void testDelegateTransformAllowsInterfacesAndDelegation() {
         assertScript '''
             class Temp implements Runnable {
@@ -258,7 +266,8 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-4265
+    // GROOVY-4265
+    @Test
     void testShouldPreferDelegatedOverStaticSuperMethod() {
         assertScript '''
             class A {
@@ -274,7 +283,8 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-4244
+    // GROOVY-4244
+    @Test
     void testSetPropertiesThroughDelegate() {
         def foo = new Foo4244()
 
@@ -288,12 +298,14 @@ final class DelegateTransformTest {
         }
     }
 
+    // GROOVY-4619
     @Test
-    void testDelegateSuperInterfaces_Groovy4619() {
+    void testDelegateSuperInterfaces() {
         assert 'doSomething' in SomeClass4619.class.methods*.name
     }
 
-    @Test // GROOVY-5112
+    // GROOVY-5112
+    @Test
     void testGenericsOnArray() {
         assertScript '''
             class ListWrapper {
@@ -307,7 +319,41 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-5732
+    // GROOVY-11736
+    @Test
+    void testRawTypeInterfaces() {
+        assertScript '''
+            class C implements Collection {
+                @Delegate Collection collection
+                C(Collection collection) {
+                    this.collection = collection
+                }
+            }
+
+            class D extends C implements Set {
+                @Delegate Set set
+                D(Set set) {
+                    super(set)
+                    this.set = set
+                }
+            }
+
+            def c = new C(new HashSet<>())
+            assert c instanceof Collection
+            assert c !instanceof Set
+            assert c.isEmpty()
+
+            def d = new D(new HashSet<>())
+            assert d instanceof Collection
+            assert d.collection.isEmpty()
+            assert d instanceof Set
+            assert d.set.isEmpty()
+            assert d.isEmpty()
+        '''
+    }
+
+    // GROOVY-5732
+    @Test
     void testInterfacesFromSuperClasses() {
         assertScript '''
             interface I5732 {
@@ -328,7 +374,8 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-5729
+    // GROOVY-5729
+    @Test
     void testDeprecationWithInterfaces() {
         assertScript '''
             interface I5729 {
@@ -356,7 +403,8 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-5446
+    // GROOVY-5446
+    @Test
     void testDelegateWithParameterAnnotations() {
         assertScript '''
             import java.lang.annotation.*
@@ -503,7 +551,8 @@ final class DelegateTransformTest {
         assert err.message.contains('@Delegate does not support keeping 
Closure annotation members.')
     }
 
-    @Test // GROOVY-5445
+    // GROOVY-5445
+    @Test
     void testDelegateToSuperProperties() {
         assertScript '''
             class Foo {
@@ -523,7 +572,8 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-7243
+    // GROOVY-7243
+    @Test
     void testInclude() {
         assertScript '''
             class Book {
@@ -568,7 +618,8 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-6329
+    // GROOVY-6329
+    @Test
     void testIncludeAndExcludeByType() {
         assertScript '''
             interface OddInclusionsTU<T, U> {
@@ -609,7 +660,8 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-5211
+    // GROOVY-5211
+    @Test
     void testAvoidFieldNameClashWithParameterName() {
         assertScript '''
             class A {
@@ -638,7 +690,8 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-6542
+    // GROOVY-6542
+    @Test
     void testLineNumberInStackTrace() {
         def err = shouldFail '''\
             @groovy.transform.ASTTest(phase=CANONICALIZATION, value={
@@ -692,7 +745,8 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-7118
+    // GROOVY-7118
+    @Test
     void testDelegateOfMethodHavingPlaceholder() {
         assertScript '''
             interface FooInt {
@@ -725,7 +779,8 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-7261
+    // GROOVY-7261
+    @Test
     void testShouldWorkWithLazyTransform() {
         assertScript '''
             class Foo {
@@ -741,7 +796,8 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-6454
+    // GROOVY-6454
+    @Test
     void testMethodsWithInternalNameShouldNotBeDelegatedTo() {
         assertScript '''
             class HasMethodWithInternalName {
@@ -758,7 +814,8 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-6454
+    // GROOVY-6454
+    @Test
     void testMethodsWithInternalNameShouldBeDelegatedToIfRequested() {
         assertScript '''
             interface HasMethodWithInternalName {
@@ -774,7 +831,8 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-6454
+    // GROOVY-6454
+    @Test
     void testProperitesWithInternalNameShouldBeDelegatedToIfRequested() {
         assertScript '''
             class HasPropertyWithInternalName {
@@ -794,15 +852,15 @@ final class DelegateTransformTest {
 
     @Test
     void testDelegateToGetterMethod() {
-        // given:
         def delegate = { new DelegateFooImpl() }
-        // when:
+
         def foo = new FooToMethod(delegate)
-        // then:
+
         assert foo.foo() == delegate().foo()
     }
 
-    @Test // GROOVY-5752
+    // GROOVY-5752
+    @Test
     void testDelegationShouldAccountForPrimitiveBooleanProperties() {
         assertScript '''
             class A {
@@ -831,7 +889,8 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test //GROOVY-8132
+    //GROOVY-8132
+    @Test
     void testOwnerPropertyPreferredToDelegateProperty() {
         assertScript '''
             class Foo {
@@ -863,7 +922,8 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-8204
+    // GROOVY-8204
+    @Test
     void testDelegateToArray() {
         assertScript '''
             class BugsMe {
@@ -877,7 +937,8 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-9289
+    // GROOVY-9289
+    @Test
     void testExcludesWithInvalidPropertyNameResultsInError() {
         def err = shouldFail '''
             class WMap {
@@ -897,7 +958,8 @@ final class DelegateTransformTest {
         assert err.message.contains("Error during @Delegate processing: 
'excludes' property or method 'name' does not exist.")
     }
 
-    @Test // GROOVY-8825
+    // GROOVY-8825
+    @Test
     void testDelegateToPrecompiledGroovyGeneratedMethod() {
         assertScript '''
             import org.codehaus.groovy.transform.CompiledClass8825
@@ -909,7 +971,8 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-9414
+    // GROOVY-9414
+    @Test
     void testDelegateToPropertyViaGetter() {
         assertScript '''
             class Bar {
@@ -922,7 +985,8 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-4516
+    // GROOVY-4516
+    @Test
     void testParameterWithDefaultArgument1() {
         assertScript '''
             class C {
@@ -939,7 +1003,8 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-4516
+    // GROOVY-4516
+    @Test
     void testParameterWithDefaultArgument2() {
         assertScript '''
             class C {
@@ -978,7 +1043,8 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-4320
+    // GROOVY-4320
+    @Test
     void testParameterWithDefaultArgument4() {
         assertScript '''
             interface I {
@@ -999,7 +1065,8 @@ final class DelegateTransformTest {
         '''
     }
 
-    @Test // GROOVY-4320
+    // GROOVY-4320
+    @Test
     void testParameterWithDefaultArgument5() {
         def config = new CompilerConfiguration(
             targetDirectory: File.createTempDir(),
@@ -1055,7 +1122,8 @@ final class DelegateTransformTest {
         }
     }
 
-    @Test // GROOVY-5204
+    // GROOVY-5204
+    @Test
     void testParameterWithDefaultArgument6() {
         assertScript '''
             class C {

Reply via email to