Skip to content

Commit 8b3ff02

Browse files
committed
GROOVY-10633, GROOVY-10662
1 parent c09df72 commit 8b3ff02

File tree

4 files changed

+71
-1
lines changed

4 files changed

+71
-1
lines changed

base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/TypeCheckedTests.java

+54-1
Original file line numberDiff line numberDiff line change
@@ -5757,7 +5757,8 @@ public void testTypeChecked10624() {
57575757
"class A<T> {\n" +
57585758
"}\n" +
57595759
"class B<T> {\n" +
5760-
" B(A<T> a) { }\n" +
5760+
" B(A<T> a_of_t) {\n" +
5761+
" }\n" +
57615762
"}\n" +
57625763
"@groovy.transform.TypeChecked\n" +
57635764
"void test() {\n" +
@@ -5770,6 +5771,33 @@ public void testTypeChecked10624() {
57705771
runConformTest(sources);
57715772
}
57725773

5774+
@Test
5775+
public void testTypeChecked10633() {
5776+
//@formatter:off
5777+
String[] sources = {
5778+
"Main.groovy",
5779+
"class A<T, Y> {\n" +
5780+
" public B<Y> f\n" +
5781+
" A(B<Y> b_of_y, T t) {\n" +
5782+
" f = b_of_y\n" +
5783+
" }\n" +
5784+
"}\n" +
5785+
"class B<T> {\n" +
5786+
" void m(T t) {\n" +
5787+
" }\n" +
5788+
"}\n" +
5789+
"@groovy.transform.TypeChecked\n" +
5790+
"def <T extends Number> void test() {\n" +
5791+
" def x = new B<T>()\n" +
5792+
" new A<>(x, '').f.m((T) null)\n" +
5793+
"}\n" +
5794+
"test()\n",
5795+
};
5796+
//@formatter:on
5797+
5798+
runConformTest(sources);
5799+
}
5800+
57735801
@Test
57745802
public void testTypeChecked10651() {
57755803
//@formatter:off
@@ -5791,4 +5819,29 @@ public void testTypeChecked10651() {
57915819

57925820
runConformTest(sources);
57935821
}
5822+
5823+
@Test
5824+
public void testTypeChecked10662() {
5825+
//@formatter:off
5826+
String[] sources = {
5827+
"Main.groovy",
5828+
"class A<X, T> {\n" +
5829+
" A(T t, X x) {}\n" +
5830+
" void m(X x) {}\n" +
5831+
"}\n" +
5832+
"@groovy.transform.TypeChecked\n" +
5833+
"class B<T extends Number> {\n" +
5834+
" void test() {\n" +
5835+
" T t = (T) null\n" +
5836+
" Character c = 'c'\n" +
5837+
" def a = new A<>(c, t)\n" +
5838+
" a.m((T) null)\n" + // Cannot find matching method A#m(T)
5839+
" }\n" +
5840+
"}\n" +
5841+
"new B<Integer>().test()\n",
5842+
};
5843+
//@formatter:on
5844+
5845+
runConformTest(sources);
5846+
}
57945847
}

base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java

+5
Original file line numberDiff line numberDiff line change
@@ -1765,10 +1765,13 @@ static void applyGenericsConnections(
17651765
Map<GenericsTypeName, GenericsType> connections,
17661766
Map<GenericsTypeName, GenericsType> resolvedPlaceholders
17671767
) {
1768+
if (!asBoolean(connections)) return;
1769+
/* GRECLIPSE edit -- GROOVY-10662
17681770
if (connections == null) return;
17691771
int count = 0;
17701772
17711773
while (count++ < 10000) {
1774+
*/
17721775
boolean checkForMorePlaceholders = false;
17731776
for (Map.Entry<GenericsTypeName, GenericsType> entry : resolvedPlaceholders.entrySet()) {
17741777
// entry could be T=T, T=T extends U, T=V, T=String, T=? extends String, etc.
@@ -1806,11 +1809,13 @@ static void applyGenericsConnections(
18061809
}
18071810
}
18081811
}
1812+
/* GRECLIPSE edit
18091813
if (!checkForMorePlaceholders) break;
18101814
}
18111815
if (count >= 10000) {
18121816
throw new GroovyBugError("unable to handle generics in " + resolvedPlaceholders + " with connections " + connections);
18131817
}
1818+
*/
18141819
}
18151820

18161821
private static ClassNode extractType(GenericsType gt) {

base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java

+4
Original file line numberDiff line numberDiff line change
@@ -1666,8 +1666,10 @@ public static ClassNode resolveClassNodeGenerics(final Map<GenericsTypeName, Gen
16661666

16671667
static void applyGenericsConnections(final Map<GenericsTypeName, GenericsType> connections, final Map<GenericsTypeName, GenericsType> resolvedPlaceholders) {
16681668
if (connections == null || connections.isEmpty()) return;
1669+
/* GRECLIPSE edit -- GROOVY-10633, GROOVY-10662
16691670
int count = 0;
16701671
while (count++ < 10000) {
1672+
*/
16711673
boolean checkForMorePlaceholders = false;
16721674
for (Map.Entry<GenericsTypeName, GenericsType> entry : resolvedPlaceholders.entrySet()) {
16731675
// entry could be T=T, T=T extends U, T=V, T=String, T=? extends String, etc.
@@ -1712,11 +1714,13 @@ static void applyGenericsConnections(final Map<GenericsTypeName, GenericsType> c
17121714
}
17131715
}
17141716
}
1717+
/* GRECLIPSE edit
17151718
if (!checkForMorePlaceholders) break;
17161719
}
17171720
if (count >= 10000) {
17181721
throw new GroovyBugError("unable to handle generics in " + resolvedPlaceholders + " with connections " + connections);
17191722
}
1723+
*/
17201724
}
17211725

17221726
private static ClassNode extractType(GenericsType gt) {

base/org.codehaus.groovy40/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java

+8
Original file line numberDiff line numberDiff line change
@@ -1609,9 +1609,11 @@ public static ClassNode resolveClassNodeGenerics(Map<GenericsTypeName, GenericsT
16091609

16101610
static void applyGenericsConnections(final Map<GenericsTypeName, GenericsType> connections, final Map<GenericsTypeName, GenericsType> resolvedPlaceholders) {
16111611
if (connections == null || connections.isEmpty()) return;
1612+
/* GRECLIPSE edit -- GROOVY-10633, GROOVY-10662
16121613
int count = 0;
16131614
while (count++ < 10000) {
16141615
boolean checkForMorePlaceholders = false;
1616+
*/
16151617
for (Map.Entry<GenericsTypeName, GenericsType> entry : resolvedPlaceholders.entrySet()) {
16161618
// entry could be T=T, T=T extends U, T=V, T=String, T=? extends String, etc.
16171619
GenericsType oldValue = entry.getValue();
@@ -1627,9 +1629,11 @@ static void applyGenericsConnections(final Map<GenericsTypeName, GenericsType> c
16271629
}
16281630
if (newValue == null) {
16291631
entry.setValue(newValue = applyGenericsContext(connections, oldValue));
1632+
/* GRECLIPSE edit
16301633
if (!checkForMorePlaceholders) {
16311634
checkForMorePlaceholders = !equalIncludingGenerics(oldValue, newValue);
16321635
}
1636+
*/
16331637
} else if (!newValue.isPlaceholder() || newValue != resolvedPlaceholders.get(name)) {
16341638
// GROOVY-6787: Don't override the original if the replacement doesn't respect the bounds otherwise
16351639
// the original bounds are lost, which can result in accepting an incompatible type as an argument!
@@ -1645,18 +1649,22 @@ static void applyGenericsConnections(final Map<GenericsTypeName, GenericsType> c
16451649
} else {
16461650
entry.setValue(newValue);
16471651
}
1652+
/* GRECLIPSE edit
16481653
if (!checkForMorePlaceholders && newValue.isPlaceholder()) {
16491654
checkForMorePlaceholders = !equalIncludingGenerics(oldValue, newValue);
16501655
}
1656+
*/
16511657
}
16521658
}
16531659
}
16541660
}
1661+
/* GRECLIPSE edit
16551662
if (!checkForMorePlaceholders) break;
16561663
}
16571664
if (count >= 10000) {
16581665
throw new GroovyBugError("unable to handle generics in " + resolvedPlaceholders + " with connections " + connections);
16591666
}
1667+
*/
16601668
}
16611669

16621670
private static ClassNode extractType(GenericsType gt) {

0 commit comments

Comments
 (0)