Skip to content

Commit 6e1a638

Browse files
committed
GROOVY-10651, GROOVY-10671
1 parent e1a97f7 commit 6e1a638

File tree

8 files changed

+806
-4
lines changed

8 files changed

+806
-4
lines changed

base-test/org.eclipse.jdt.groovy.core.tests.builder/src/org/eclipse/jdt/core/groovy/tests/search/GenericInferencingTests.java

+37
Original file line numberDiff line numberDiff line change
@@ -1797,6 +1797,43 @@ public void testCircularReference2() {
17971797
assertType(contents, offset, offset + 8, "Scorable<? super T,FeatureName>");
17981798
}
17991799

1800+
@Test // GROOVY-10671
1801+
public void testCircularReference3() {
1802+
createJavaUnit("p", "ObjectAssert",
1803+
"package p;\n" +
1804+
"abstract class ObjectAssert<SELF extends ObjectAssert<SELF>> {\n" +
1805+
" SELF as(String description) {\n" +
1806+
" return (SELF) this;\n" +
1807+
" }\n" +
1808+
"}\n");
1809+
1810+
createJavaUnit("p", "IterableAssert",
1811+
"package p;\n" +
1812+
"abstract class IterableAssert<SELF extends IterableAssert<SELF>> extends ObjectAssert<SELF> {\n" +
1813+
"}\n");
1814+
1815+
createJavaUnit("p", "CollectionAssert",
1816+
"package p;\n" +
1817+
"abstract class CollectionAssert<SELF extends CollectionAssert<SELF>> extends IterableAssert<SELF> {\n" +
1818+
" void containsExactlyInAnyOrderElementsOf(java.util.Collection<?> expect) {\n" +
1819+
" }\n" +
1820+
"}\n");
1821+
1822+
createJavaUnit("p", "Assert",
1823+
"package p;\n" +
1824+
"class Assert {\n" +
1825+
" public static <E> CollectionAssert<?> assertThat(java.util.Collection<? extends E> c) {return null;}\n" +
1826+
"}\n");
1827+
1828+
String contents =
1829+
"import static p.Assert.assertThat\n" +
1830+
"def strings = (Collection<String>) ['a','b']\n" +
1831+
"assertThat(strings).as('assertion description')\n" +
1832+
" .containsExactlyInAnyOrderElementsOf(['a','b'])\n";
1833+
1834+
assertDeclaringType(contents, "containsExactlyInAnyOrderElementsOf", "p.CollectionAssert");
1835+
}
1836+
18001837
@Test
18011838
public void testJira1718() throws Exception {
18021839
createUnit("p2", "Renderer",

base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/basic/GenericsTests.java

+45-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2009-2022 the original author or authors.
2+
* Copyright 2009-2023 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -2647,6 +2647,50 @@ public void testWildcards7() {
26472647
"----------\n");
26482648
}
26492649

2650+
@Test // GROOVY-10671
2651+
public void testWildcards8() {
2652+
//@formatter:off
2653+
String[] sources = {
2654+
"Main.groovy",
2655+
"import static p.Assert.assertThat\n" +
2656+
"def strings = (Collection<String>) ['a','b']\n" +
2657+
"assertThat(strings).as('assertion description')\n" +
2658+
" .containsExactlyInAnyOrderElementsOf(['a','b'])\n",
2659+
2660+
"p/Assert.java",
2661+
"package p;\n" +
2662+
"class Assert {\n" +
2663+
" public static <E> CollectionAssert<?> assertThat(java.util.Collection<? extends E> c) {\n" +
2664+
" return new CollectionAssert() {};\n" +
2665+
" }\n" +
2666+
"}\n",
2667+
2668+
"p/ObjectAssert.java",
2669+
"package p;\n" +
2670+
"abstract class ObjectAssert<SELF extends ObjectAssert<SELF>> {\n" +
2671+
" SELF as(String description) {\n" +
2672+
" return (SELF) this;\n" +
2673+
" }\n" +
2674+
"}\n",
2675+
2676+
"p/IterableAssert.java",
2677+
"package p;\n" +
2678+
"abstract class IterableAssert<SELF extends IterableAssert<SELF>> extends ObjectAssert<SELF> {\n" +
2679+
"}\n",
2680+
2681+
"p/CollectionAssert.java",
2682+
"package p;\n" +
2683+
"abstract class CollectionAssert<SELF extends CollectionAssert<SELF>> extends IterableAssert<SELF> {\n" +
2684+
" void containsExactlyInAnyOrderElementsOf(java.util.Collection<?> expect) {\n" +
2685+
" System.out.print(expect);\n" +
2686+
" }\n" +
2687+
"}\n",
2688+
};
2689+
//@formatter:on
2690+
2691+
runConformTest(sources, "[a, b]");
2692+
}
2693+
26502694
@Test
26512695
public void testUpperBounds1() {
26522696
//@formatter:off

base/org.codehaus.groovy30/src/org/codehaus/groovy/vmplugin/v8/Java8.java

+10
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,16 @@ private ClassNode configureWildcardType(final WildcardType wildcardType) {
246246
private ClassNode configureParameterizedType(final ParameterizedType parameterizedType) {
247247
ClassNode base = configureType(parameterizedType.getRawType());
248248
GenericsType[] gts = configureTypeArguments(parameterizedType.getActualTypeArguments());
249+
// GRECLIPSE add -- GROOVY-10153, GROOVY-10651, GROOVY-10671, GROOVY-10756, GROOVY-11258
250+
// fix erasure : ResolveVisitor#resolveWildcardBounding
251+
final int n; if (gts != null && (n = gts.length) > 0) {
252+
for (int i = 0; i < n; i += 1) { GenericsType gt = gts[i];
253+
if (!gt.isWildcard() || gt.getUpperBounds() != null) continue;
254+
ClassNode[] ubs = base.redirect().getGenericsTypes()[i].getUpperBounds();
255+
if (ubs != null && !ClassHelper.OBJECT_TYPE.equals(ubs[0])) gt.getType().setRedirect(ubs[0]);
256+
}
257+
}
258+
// GRECLIPSE end
249259
base.setGenericsTypes(gts);
250260
return base;
251261
}

base/org.codehaus.groovy40/src/org/codehaus/groovy/vmplugin/v8/Java8.java

+10
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,16 @@ private ClassNode configureWildcardType(final WildcardType wildcardType) {
254254
private ClassNode configureParameterizedType(final ParameterizedType parameterizedType) {
255255
ClassNode base = configureType(parameterizedType.getRawType());
256256
GenericsType[] gts = configureTypeArguments(parameterizedType.getActualTypeArguments());
257+
// GRECLIPSE add -- GROOVY-10153, GROOVY-10651, GROOVY-10671, GROOVY-10756, GROOVY-11258
258+
// fix erasure : ResolveVisitor#resolveWildcardBounding
259+
final int n; if (gts != null && (n = gts.length) > 0) {
260+
for (int i = 0; i < n; i += 1) { GenericsType gt = gts[i];
261+
if (!gt.isWildcard() || gt.getUpperBounds() != null) continue;
262+
ClassNode[] ubs = base.redirect().getGenericsTypes()[i].getUpperBounds();
263+
if (ubs != null && !ClassHelper.OBJECT_TYPE.equals(ubs[0])) gt.getType().setRedirect(ubs[0]);
264+
}
265+
}
266+
// GRECLIPSE end
257267
base.setGenericsTypes(gts);
258268
return base;
259269
}

base/org.codehaus.groovy50/.checkstyle

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
<file-match-pattern match-pattern="groovy/transform/trait/TraitComposer.java" include-pattern="false" />
6161
<file-match-pattern match-pattern="groovy/transform/trait/TraitReceiverTransformer.java" include-pattern="false" />
6262
<file-match-pattern match-pattern="groovy/transform/trait/Traits.java" include-pattern="false" />
63+
<file-match-pattern match-pattern="groovy/vmplugin/v8/Java8.java" include-pattern="false" />
6364
</fileset>
6465
<filter name="DerivedFiles" enabled="true" />
6566
</fileset-config>

0 commit comments

Comments
 (0)