Skip to content

Commit

Permalink
GROOVY-8111
Browse files Browse the repository at this point in the history
  • Loading branch information
eric-milles committed Jun 1, 2021
1 parent ac06026 commit c5ca6a4
Show file tree
Hide file tree
Showing 5 changed files with 810 additions and 1 deletion.
Expand Up @@ -901,6 +901,38 @@ public void testTypeChecked8103() {
runNegativeTest(sources, "");
}

@Test
public void testTypeChecked8111() {
//@formatter:off
String[] sources = {
"Main.groovy",
"@groovy.transform.TypeChecked\n" +
"def test(thing) {\n" +
" thing != null ?: Pair.of('k','v')\n" + // StackOverflowError
"}\n",

"Pair.groovy",
"class Pair<L,R> implements Map.Entry<L,R>, Comparable<Pair<L,R>>, Serializable {\n" +
" public final L left\n" +
" public final R right\n" +
" private Pair(final L left, final R right) {\n" +
" this.left = left\n" +
" this.right = right\n" +
" }\n" +
" static <L, R> Pair<L, R> of(final L left, final R right) {\n" +
" return new Pair<>(left, right)\n" +
" }\n" +
" L getKey() { left }\n" +
" R getValue() { right }\n" +
" R setValue(R value) { right }\n" +
" int compareTo(Pair<L,R> that) { 0 }\n" +
"}\n",
};
//@formatter:on

runConformTest(sources);
}

@Test
public void testTypeChecked8202() {
//@formatter:off
Expand Down Expand Up @@ -2940,7 +2972,7 @@ public void testTypeChecked10111a() {
" new String[]{ 1, (long)2, (short)3 }\n" +
"}\n" +
"def result = test()\n" +
"assert result.toString == '[1, 2, 3]'\n" +
"assert result.toString() == '[1, 2, 3]'\n" +
"assert result.every { it.class == String }\n",
};
//@formatter:on
Expand Down
Expand Up @@ -269,7 +269,11 @@ private static ClassNode parameterizeLowestUpperBound(final ClassNode lub, final
ClassNode t1 = agt[i].getType();
ClassNode t2 = bgt[i].getType();
ClassNode basicType;
/* GRECLIPSE edit -- GROOVY-8111
if (areEqualWithGenerics(t1, a) && areEqualWithGenerics(t2,b)) {
*/
if (areEqualWithGenerics(t1, isPrimitiveType(a)?getWrapper(a):a) && areEqualWithGenerics(t2, isPrimitiveType(b)?getWrapper(b):b)) {
// GRECLIPSE end
// we are facing a self referencing type !
basicType = fallback;
} else {
Expand Down Expand Up @@ -722,7 +726,9 @@ private static boolean areEqualWithGenerics(ClassNode a, ClassNode b) {
GenericsType ga = gta[i];
GenericsType gb = gtb[i];
boolean result = ga.isPlaceholder()==gb.isPlaceholder() && ga.isWildcard()==gb.isWildcard();
/* GRECLIPSE edit -- GROOVY-8111
result = result && ga.isResolved() && gb.isResolved();
*/
result = result && ga.getName().equals(gb.getName());
result = result && areEqualWithGenerics(ga.getType(), gb.getType());
result = result && areEqualWithGenerics(ga.getLowerBound(), gb.getLowerBound());
Expand Down
Expand Up @@ -267,7 +267,11 @@ private static ClassNode parameterizeLowestUpperBound(final ClassNode lub, final
ClassNode t1 = agt[i].getType();
ClassNode t2 = bgt[i].getType();
ClassNode basicType;
/* GRECLIPSE edit -- GROOVY-8111
if (areEqualWithGenerics(t1, a) && areEqualWithGenerics(t2,b)) {
*/
if (areEqualWithGenerics(t1, isPrimitiveType(a)?getWrapper(a):a) && areEqualWithGenerics(t2, isPrimitiveType(b)?getWrapper(b):b)) {
// GRECLIPSE end
// we are facing a self referencing type !
basicType = fallback;
} else {
Expand Down Expand Up @@ -718,7 +722,9 @@ private static boolean areEqualWithGenerics(ClassNode a, ClassNode b) {
GenericsType ga = gta[i];
GenericsType gb = gtb[i];
boolean result = ga.isPlaceholder()==gb.isPlaceholder() && ga.isWildcard()==gb.isWildcard();
/* GRECLIPSE edit -- GROOVY-8111
result = result && ga.isResolved() && gb.isResolved();
*/
result = result && ga.getName().equals(gb.getName());
result = result && areEqualWithGenerics(ga.getType(), gb.getType());
result = result && areEqualWithGenerics(ga.getLowerBound(), gb.getLowerBound());
Expand Down
1 change: 1 addition & 0 deletions base/org.codehaus.groovy40/.checkstyle
Expand Up @@ -36,6 +36,7 @@
<file-match-pattern match-pattern="groovy/ast/expr/RangeExpression.java" include-pattern="false" />
<file-match-pattern match-pattern="groovy/ast/expr/(Static)?MethodCallExpression.java" include-pattern="false" />
<file-match-pattern match-pattern="groovy/ast/tools/(Expression|Generics)Utils.java" include-pattern="false" />
<file-match-pattern match-pattern="groovy/ast/tools/WideningCategories.java" include-pattern="false" />
<file-match-pattern match-pattern="groovy/classgen/(Annotation|Enum|VariableScope)Visitor.java" include-pattern="false" />
<file-match-pattern match-pattern="groovy/classgen/(Extended)?Verifier.java" include-pattern="false" />
<file-match-pattern match-pattern="groovy/classgen/asm/ClosureWriter.java" include-pattern="false" />
Expand Down

0 comments on commit c5ca6a4

Please sign in to comment.