Skip to content

Commit 90411d9

Browse files
committed
SONARJAVA-1606 uses subtypeOf for typeVar to not lose method resolutions
1 parent 2d30673 commit 90411d9

File tree

3 files changed

+25
-1
lines changed

3 files changed

+25
-1
lines changed

java-frontend/src/main/java/org/sonar/java/resolve/Types.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ public boolean isSubtype(JavaType t, JavaType s) {
6767
break;
6868
case JavaType.CLASS:
6969
case JavaType.WILDCARD:
70+
case JavaType.TYPEVAR:
7071
result = t.isSubtypeOf(s);
7172
break;
7273
case JavaType.BOT:

java-frontend/src/test/files/sym/Generics.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,23 @@ interface MyInterface<T> {
7474
}
7575

7676
class C<T> {
77-
}
77+
}
78+
79+
class TypeParameterUsedInMethods<T, U> {
80+
Function<? super T, ? extends U> getter;
81+
82+
void foo(T val, U wantedValue) {
83+
getter.apply(val);
84+
// these 2 calls do not compile but methods are resolved, as argument matching is based on erasure
85+
getter.apply(new Object());
86+
getter.apply(wantedValue);
87+
// not valid call with different erasure, not resolved
88+
getter.apply("hello");
89+
}
90+
91+
static class Function<X, Y> {
92+
Y apply(X from) {
93+
return null;
94+
}
95+
}
96+
}

java-frontend/src/test/java/org/sonar/java/resolve/SymbolTableTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@ public void Generics() {
9595
//Inner class referenced as type parameter in super class/interface
9696
assertThat(result.reference(68,53)).isSameAs(result.symbol("B", 69));
9797

98+
JavaSymbol applyMethod = result.symbol("apply");
99+
assertThat(result.reference(83, 12)).isSameAs(applyMethod);
100+
// FIXME SONARJAVA-1606 should be 1, subtyping of type variable is wrong
101+
assertThat(applyMethod.usages()).hasSize(3);
98102
}
99103

100104
@Test

0 commit comments

Comments
 (0)