Ignore redundant projections for declaration-site variance
This commit is contained in:
@@ -692,17 +692,17 @@ public class JetTypeMapper {
|
||||
@NotNull TypeMappingMode mode
|
||||
) {
|
||||
Variance projectionKind = projection.getProjectionKind();
|
||||
|
||||
if (mode.getSkipDeclarationSiteWildcards() && projectionKind == Variance.INVARIANT) {
|
||||
return Variance.INVARIANT;
|
||||
}
|
||||
|
||||
Variance parameterVariance = parameter.getVariance();
|
||||
|
||||
if (parameterVariance == Variance.INVARIANT) {
|
||||
return projectionKind;
|
||||
}
|
||||
|
||||
if (projectionKind == Variance.INVARIANT) {
|
||||
if (mode.getSkipDeclarationSiteWildcards()) {
|
||||
return Variance.INVARIANT;
|
||||
}
|
||||
|
||||
if (projectionKind == Variance.INVARIANT || projectionKind == parameterVariance) {
|
||||
if (mode.getSkipDeclarationSiteWildcardsIfPossible() && !projection.isStarProjection()) {
|
||||
if (parameterVariance == Variance.OUT_VARIANCE && TypeMappingUtil.isMostPreciseCovariantArgument(projection.getType())){
|
||||
return Variance.INVARIANT;
|
||||
@@ -715,9 +715,6 @@ public class JetTypeMapper {
|
||||
}
|
||||
return parameterVariance;
|
||||
}
|
||||
if (parameterVariance == projectionKind) {
|
||||
return parameterVariance;
|
||||
}
|
||||
|
||||
// In<out X> = In<*>
|
||||
// Out<in X> = Out<*>
|
||||
|
||||
@@ -28,8 +28,8 @@ fun box(): String {
|
||||
Params(1, javaClass<Any>(), "T", "T"),
|
||||
Params(2, javaClass<Z<*>>(), "Z<T>", "Z<T>"),
|
||||
Params(3, javaClass<Z<*>>(), "Z<java.lang.String>", "Z<java.lang.String>"),
|
||||
Params(4, javaClass<Any>(), "Zout<? extends java.lang.String>", "X"),
|
||||
Params(5, javaClass<Any>(), "Zin<? super TParam>", "Y")
|
||||
Params(4, javaClass<Any>(), "Zout<java.lang.String>", "X"),
|
||||
Params(5, javaClass<Any>(), "Zin<TParam>", "Y")
|
||||
)
|
||||
|
||||
|
||||
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
class Out<out E>
|
||||
interface Open
|
||||
class Final
|
||||
|
||||
fun foo(x: Out<out Open>, y: Out<out Final>): Out<out Open> = Out()
|
||||
|
||||
// method: RedundantProjectionsKt::foo
|
||||
// jvm signature: (LOut;LOut;)LOut;
|
||||
// generic signature: (LOut<+LOpen;>;LOut<LFinal;>;)LOut<LOpen;>;
|
||||
|
||||
class In<in F>
|
||||
|
||||
fun bar(x: In<in Open>, y: In<in Any?>): In<in Open> = In()
|
||||
|
||||
// method: RedundantProjectionsKt::bar
|
||||
// jvm signature: (LIn;LIn;)LIn;
|
||||
// generic signature: (LIn<-LOpen;>;LIn<Ljava/lang/Object;>;)LIn<LOpen;>;
|
||||
@@ -355,6 +355,12 @@ public class WriteSignatureTestGenerated extends AbstractWriteSignatureTest {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("RedundantProjections.kt")
|
||||
public void testRedundantProjections() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/writeSignature/declarationSiteVariance/RedundantProjections.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("SuperClassWithVariance.kt")
|
||||
public void testSuperClassWithVariance() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/writeSignature/declarationSiteVariance/SuperClassWithVariance.kt");
|
||||
|
||||
Reference in New Issue
Block a user