From 5173d5e359a31463fbfa3d844b323146bf457734 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Tue, 21 May 2019 16:36:46 +0300 Subject: [PATCH] [NI] More accurate handle of capture types from subtyping #KT-31520 Fixed --- .../fir/FirDiagnosticsSmokeTestGenerated.java | 5 ++++ .../components/ConstraintInjector.kt | 4 +-- .../captureTypeOnlyOnTopLevel.kt | 4 +-- .../noCaptureTypeErrorForNonTopLevel.kt | 4 +-- ...aintFromVariantTypeWithNestedProjection.kt | 16 +++++++++++ ...intFromVariantTypeWithNestedProjection.txt | 27 +++++++++++++++++++ .../checkers/DiagnosticsTestGenerated.java | 5 ++++ .../DiagnosticsUsingJavacTestGenerated.java | 5 ++++ 8 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/inference/constraints/constraintFromVariantTypeWithNestedProjection.kt create mode 100644 compiler/testData/diagnostics/tests/inference/constraints/constraintFromVariantTypeWithNestedProjection.txt diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java index 02cbdda7fd3..ff35d831f51 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java @@ -10014,6 +10014,11 @@ public class FirDiagnosticsSmokeTestGenerated extends AbstractFirDiagnosticsSmok KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/inference/constraints"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("constraintFromVariantTypeWithNestedProjection.kt") + public void testConstraintFromVariantTypeWithNestedProjection() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/constraints/constraintFromVariantTypeWithNestedProjection.kt"); + } + @TestMetadata("constraintOnFunctionLiteral.kt") public void testConstraintOnFunctionLiteral() throws Exception { runTest("compiler/testData/diagnostics/tests/inference/constraints/constraintOnFunctionLiteral.kt"); diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintInjector.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintInjector.kt index 04b0570f08b..b0589bf289d 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintInjector.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintInjector.kt @@ -181,7 +181,7 @@ class ConstraintInjector(val constraintIncorporator: ConstraintIncorporator, val if (kind == UPPER) { val subType = typeApproximator.approximateToSubType(type, TypeApproximatorConfiguration.SubtypeCapturedTypesApproximation) - if (subType != null && !subType.typeConstructor().isNothingConstructor()) { + if (subType != null) { targetType = subType } } @@ -189,7 +189,7 @@ class ConstraintInjector(val constraintIncorporator: ConstraintIncorporator, val if (kind == LOWER) { val superType = typeApproximator.approximateToSuperType(type, TypeApproximatorConfiguration.SubtypeCapturedTypesApproximation) - if (superType != null && !superType.typeConstructor().isAnyConstructor()) { // todo rethink error reporting for Any cases + if (superType != null) { // todo rethink error reporting for Any cases targetType = superType } } diff --git a/compiler/testData/diagnostics/tests/inference/capturedTypes/captureTypeOnlyOnTopLevel.kt b/compiler/testData/diagnostics/tests/inference/capturedTypes/captureTypeOnlyOnTopLevel.kt index bc5136a9527..3da1c1e0305 100644 --- a/compiler/testData/diagnostics/tests/inference/capturedTypes/captureTypeOnlyOnTopLevel.kt +++ b/compiler/testData/diagnostics/tests/inference/capturedTypes/captureTypeOnlyOnTopLevel.kt @@ -4,7 +4,7 @@ fun foo(array: Array>): Array> = array fun test(array: Array>) { - foo(array) + foo(array) - val f: Array> = foo(array) + val f: Array> = foo(array) } diff --git a/compiler/testData/diagnostics/tests/inference/capturedTypes/noCaptureTypeErrorForNonTopLevel.kt b/compiler/testData/diagnostics/tests/inference/capturedTypes/noCaptureTypeErrorForNonTopLevel.kt index f0675fd5d5c..5e81dc3ae06 100644 --- a/compiler/testData/diagnostics/tests/inference/capturedTypes/noCaptureTypeErrorForNonTopLevel.kt +++ b/compiler/testData/diagnostics/tests/inference/capturedTypes/noCaptureTypeErrorForNonTopLevel.kt @@ -11,8 +11,8 @@ fun bar(b: B>, bOut: B>, bOut2: B(b) - baz(bOut) - baz(bOut) + baz(bOut) + baz(bOut) baz(bOut2) baz(bOut2) diff --git a/compiler/testData/diagnostics/tests/inference/constraints/constraintFromVariantTypeWithNestedProjection.kt b/compiler/testData/diagnostics/tests/inference/constraints/constraintFromVariantTypeWithNestedProjection.kt new file mode 100644 index 00000000000..c643d8c7f05 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/constraints/constraintFromVariantTypeWithNestedProjection.kt @@ -0,0 +1,16 @@ +// !WITH_NEW_INFERENCE +// !DIAGNOSTICS: -UNUSED_PARAMETER + +class Out +class In +class Inv + +fun choose1(c: Out>) {} +fun choose2(c: In>) {} +fun choose3(c: Inv>) {} + +fun f(o: Out>, i: In>, inv: Inv>) { + choose1(o) + choose2(i) + choose3(inv) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inference/constraints/constraintFromVariantTypeWithNestedProjection.txt b/compiler/testData/diagnostics/tests/inference/constraints/constraintFromVariantTypeWithNestedProjection.txt new file mode 100644 index 00000000000..5468486d64c --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/constraints/constraintFromVariantTypeWithNestedProjection.txt @@ -0,0 +1,27 @@ +package + +public fun choose1(/*0*/ c: Out>): kotlin.Unit +public fun choose2(/*0*/ c: In>): kotlin.Unit +public fun choose3(/*0*/ c: Inv>): kotlin.Unit +public fun f(/*0*/ o: Out>, /*1*/ i: In>, /*2*/ inv: Inv>): kotlin.Unit + +public final class In { + public constructor In() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Inv { + public constructor Inv() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Out { + public constructor Out() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index ae7e5c896b7..bcb8d657a70 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -10021,6 +10021,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/inference/constraints"), Pattern.compile("^(.*)\\.kts?$"), TargetBackend.ANY, true); } + @TestMetadata("constraintFromVariantTypeWithNestedProjection.kt") + public void testConstraintFromVariantTypeWithNestedProjection() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/constraints/constraintFromVariantTypeWithNestedProjection.kt"); + } + @TestMetadata("constraintOnFunctionLiteral.kt") public void testConstraintOnFunctionLiteral() throws Exception { runTest("compiler/testData/diagnostics/tests/inference/constraints/constraintOnFunctionLiteral.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index e6bc7729bb5..7fe46339fe1 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -10016,6 +10016,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/inference/constraints"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("constraintFromVariantTypeWithNestedProjection.kt") + public void testConstraintFromVariantTypeWithNestedProjection() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/constraints/constraintFromVariantTypeWithNestedProjection.kt"); + } + @TestMetadata("constraintOnFunctionLiteral.kt") public void testConstraintOnFunctionLiteral() throws Exception { runTest("compiler/testData/diagnostics/tests/inference/constraints/constraintOnFunctionLiteral.kt");