From 23d2b87a528ba939c9a440a7463dc6c60ef506a2 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 14 Jan 2016 12:01:02 +0300 Subject: [PATCH] Ignore redundant projections for declaration-site variance --- .../kotlin/codegen/state/JetTypeMapper.java | 15 ++++++--------- .../fullJdk/genericMethodSignature.kt | 4 ++-- .../RedundantProjections.kt | 17 +++++++++++++++++ .../compiler/WriteSignatureTestGenerated.java | 6 ++++++ 4 files changed, 31 insertions(+), 11 deletions(-) create mode 100644 compiler/testData/writeSignature/declarationSiteVariance/RedundantProjections.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java index 0e65ce40088..2cdb02d240f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java @@ -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 = In<*> // Out = Out<*> diff --git a/compiler/testData/codegen/boxWithStdlib/fullJdk/genericMethodSignature.kt b/compiler/testData/codegen/boxWithStdlib/fullJdk/genericMethodSignature.kt index 5627caa57f4..9f5ce70f8d1 100644 --- a/compiler/testData/codegen/boxWithStdlib/fullJdk/genericMethodSignature.kt +++ b/compiler/testData/codegen/boxWithStdlib/fullJdk/genericMethodSignature.kt @@ -28,8 +28,8 @@ fun box(): String { Params(1, javaClass(), "T", "T"), Params(2, javaClass>(), "Z", "Z"), Params(3, javaClass>(), "Z", "Z"), - Params(4, javaClass(), "Zout", "X"), - Params(5, javaClass(), "Zin", "Y") + Params(4, javaClass(), "Zout", "X"), + Params(5, javaClass(), "Zin", "Y") ) diff --git a/compiler/testData/writeSignature/declarationSiteVariance/RedundantProjections.kt b/compiler/testData/writeSignature/declarationSiteVariance/RedundantProjections.kt new file mode 100644 index 00000000000..8cb3750c675 --- /dev/null +++ b/compiler/testData/writeSignature/declarationSiteVariance/RedundantProjections.kt @@ -0,0 +1,17 @@ +class Out +interface Open +class Final + +fun foo(x: Out, y: Out): Out = Out() + +// method: RedundantProjectionsKt::foo +// jvm signature: (LOut;LOut;)LOut; +// generic signature: (LOut<+LOpen;>;LOut;)LOut; + +class In + +fun bar(x: In, y: In): In = In() + +// method: RedundantProjectionsKt::bar +// jvm signature: (LIn;LIn;)LIn; +// generic signature: (LIn<-LOpen;>;LIn;)LIn; diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/WriteSignatureTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/WriteSignatureTestGenerated.java index 2cbef267ad0..a0e50a8af39 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/WriteSignatureTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/WriteSignatureTestGenerated.java @@ -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");