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 {