From c0182704626865c9e627e944f8085965504174f3 Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Thu, 12 May 2022 15:19:50 +0300 Subject: [PATCH] Support DNN types in approximator Mostly, it's relevant to FIR since there we started loading type parameter based types as (T & Any..T?) --- ...CompilerTestFE10TestdataTestGenerated.java | 6 ++++ ...irOldFrontendDiagnosticsTestGenerated.java | 6 ++++ ...DiagnosticsWithLightTreeTestGenerated.java | 6 ++++ .../kotlin/types/AbstractTypeApproximator.kt | 2 +- .../tests/j+k/recursiveSelfTypes.kt | 31 +++++++++++++++++++ .../recursiveFlexibleAssertions.fir.kt | 2 +- .../test/runners/DiagnosticTestGenerated.java | 6 ++++ .../kotlin/types/model/TypeSystemContext.kt | 3 ++ 8 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/j+k/recursiveSelfTypes.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index a1364cf7d3f..f83afdbc928 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -18464,6 +18464,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/j+k/recursiveRawUpperBound3.kt"); } + @Test + @TestMetadata("recursiveSelfTypes.kt") + public void testRecursiveSelfTypes() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/recursiveSelfTypes.kt"); + } + @Test @TestMetadata("safeCallDefinitelyNotNull.kt") public void testSafeCallDefinitelyNotNull() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index ee3877ebbcc..66f9edfd526 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -18464,6 +18464,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/j+k/recursiveRawUpperBound3.kt"); } + @Test + @TestMetadata("recursiveSelfTypes.kt") + public void testRecursiveSelfTypes() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/recursiveSelfTypes.kt"); + } + @Test @TestMetadata("safeCallDefinitelyNotNull.kt") public void testSafeCallDefinitelyNotNull() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index 4ce5d8f34ed..3b460647613 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -18464,6 +18464,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/j+k/recursiveRawUpperBound3.kt"); } + @Test + @TestMetadata("recursiveSelfTypes.kt") + public void testRecursiveSelfTypes() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/recursiveSelfTypes.kt"); + } + @Test @TestMetadata("safeCallDefinitelyNotNull.kt") public void testSafeCallDefinitelyNotNull() throws Exception { diff --git a/compiler/resolution.common/src/org/jetbrains/kotlin/types/AbstractTypeApproximator.kt b/compiler/resolution.common/src/org/jetbrains/kotlin/types/AbstractTypeApproximator.kt index 02df31dafde..7aab274950f 100644 --- a/compiler/resolution.common/src/org/jetbrains/kotlin/types/AbstractTypeApproximator.kt +++ b/compiler/resolution.common/src/org/jetbrains/kotlin/types/AbstractTypeApproximator.kt @@ -414,7 +414,7 @@ abstract class AbstractTypeApproximator( val argumentType = newArguments[index]?.getType() ?: argument.getType() - val capturedType = argumentType.lowerBoundIfFlexible().asCapturedType() + val capturedType = argumentType.lowerBoundIfFlexible().originalIfDefinitelyNotNullable().asCapturedType() val capturedStarProjectionOrNull = capturedType?.typeConstructorProjection()?.takeIf { it.isStarProjection() } diff --git a/compiler/testData/diagnostics/tests/j+k/recursiveSelfTypes.kt b/compiler/testData/diagnostics/tests/j+k/recursiveSelfTypes.kt new file mode 100644 index 00000000000..34d850ae856 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/recursiveSelfTypes.kt @@ -0,0 +1,31 @@ +// FIR_IDENTICAL +// SKIP_TXT +// FILE: TSFBuilder.java +public abstract class TSFBuilder> { + public B configure() { return null; } + public abstract F build(); + + public static TSFBuilder start() { return null; } +} + +// FILE: test.kt + +fun foo(x: CharSequence?) {} + +fun main() { + foo( + TSFBuilder.start() + .configure() + .configure() + .configure() + .configure() + .configure() + .configure() + .configure() + .configure() + .configure() + .configure() + .configure() + .build() + ) +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/inference/recursiveFlexibleAssertions.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/inference/recursiveFlexibleAssertions.fir.kt index a72991408a1..e78fb285be0 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/inference/recursiveFlexibleAssertions.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/inference/recursiveFlexibleAssertions.fir.kt @@ -75,5 +75,5 @@ fun test() { } // TODO: FIR // {AbstractAssert<*, out Any!>! & EnumerableAssert<*, {Comparable<*> & java.io.Serializable!}>!} with unfolded flexible nullability - & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!> & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>?, out kotlin.Any..kotlin.Any?!> & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!> & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>?, out kotlin.Comparable & java.io.Serializable..kotlin.Comparable? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!> & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!> & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>?, out kotlin.Comparable & java.io.Serializable..kotlin.Comparable? & java.io.Serializable?>?, out kotlin.Any..kotlin.Any?!> & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!> & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>?, out kotlin.Any..kotlin.Any?!> & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!> & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>?, out kotlin.Comparable & java.io.Serializable..kotlin.Comparable? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!> & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!> & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>?, out kotlin.Comparable & java.io.Serializable..kotlin.Comparable? & java.io.Serializable?>?, out kotlin.Comparable & java.io.Serializable..kotlin.Comparable? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!> & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>?, out kotlin.Any..kotlin.Any?!> & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!> & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>?, out kotlin.Comparable & java.io.Serializable..kotlin.Comparable? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!> & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!> & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>?, out kotlin.Comparable & java.io.Serializable..kotlin.Comparable? & java.io.Serializable?>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!> & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>?, out kotlin.Any..kotlin.Any?!> & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!> & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>?, out kotlin.Comparable & java.io.Serializable..kotlin.Comparable? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!> & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!> & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>?, out kotlin.Comparable & java.io.Serializable..kotlin.Comparable? & java.io.Serializable?>?, out kotlin.Comparable & java.io.Serializable..kotlin.Comparable? & java.io.Serializable?>?")!>assertion + & EnumerableAssert<*, out kotlin.Comparable & java.io.Serializable..kotlin.Comparable? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>?, out kotlin.Comparable & java.io.Serializable..kotlin.Comparable? & java.io.Serializable?>?, out kotlin.Any..kotlin.Any?!> & EnumerableAssert & EnumerableAssert<*, out kotlin.Comparable & java.io.Serializable..kotlin.Comparable? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>?, out kotlin.Comparable & java.io.Serializable..kotlin.Comparable? & java.io.Serializable?>?, out kotlin.Comparable & java.io.Serializable..kotlin.Comparable? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, out kotlin.Comparable & java.io.Serializable..kotlin.Comparable? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>?, out kotlin.Comparable & java.io.Serializable..kotlin.Comparable? & java.io.Serializable?>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, out kotlin.Comparable & java.io.Serializable..kotlin.Comparable? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>..AbstractAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Any..kotlin.Any?!>? & EnumerableAssert & EnumerableAssert<*, *>..AbstractAssert<*, *>? & EnumerableAssert<*, *>?, out kotlin.Comparable<*> & java.io.Serializable..kotlin.Comparable<*>? & java.io.Serializable?>?, out kotlin.Comparable & java.io.Serializable..kotlin.Comparable? & java.io.Serializable?>?, out kotlin.Comparable & java.io.Serializable..kotlin.Comparable? & java.io.Serializable?>?")!>assertion } diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 70f85297a6b..da24f25ea43 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -18470,6 +18470,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/j+k/recursiveRawUpperBound3.kt"); } + @Test + @TestMetadata("recursiveSelfTypes.kt") + public void testRecursiveSelfTypes() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/recursiveSelfTypes.kt"); + } + @Test @TestMetadata("safeCallDefinitelyNotNull.kt") public void testSafeCallDefinitelyNotNull() throws Exception { diff --git a/core/compiler.common/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt b/core/compiler.common/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt index c6dd7cd1c4f..f32678c28a7 100644 --- a/core/compiler.common/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt +++ b/core/compiler.common/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt @@ -584,6 +584,9 @@ interface TypeSystemContext : TypeSystemOptimizationContext { fun SimpleTypeMarker.asDefinitelyNotNullType(): DefinitelyNotNullTypeMarker? fun DefinitelyNotNullTypeMarker.original(): SimpleTypeMarker + + fun SimpleTypeMarker.originalIfDefinitelyNotNullable(): SimpleTypeMarker = asDefinitelyNotNullType()?.original() ?: this + fun KotlinTypeMarker.makeDefinitelyNotNullOrNotNull(): KotlinTypeMarker fun SimpleTypeMarker.makeSimpleTypeDefinitelyNotNullOrNotNull(): SimpleTypeMarker fun SimpleTypeMarker.isMarkedNullable(): Boolean