From 3787099a3891fb54a96ddea506cd9c95fe893696 Mon Sep 17 00:00:00 2001 From: Victor Petukhov Date: Tue, 6 Jul 2021 13:56:28 +0300 Subject: [PATCH] Put the type inference on calls with self types under the compiler flag --- ...irOldFrontendDiagnosticsTestGenerated.java | 64 +++++++++++++++---- ...DiagnosticsWithLightTreeTestGenerated.java | 64 +++++++++++++++---- .../resolve/inference/InferenceComponents.kt | 2 +- .../components/ConstraintInjector.kt | 2 +- .../components/ResultTypeResolver.kt | 10 ++- .../components/VariableFixationFinder.kt | 6 +- .../kotlin/types/AbstractTypeApproximator.kt | 4 +- .../ClassicTypeSystemContextForCS.kt | 14 +++- .../components/SimpleConstraintSystemImpl.kt | 2 +- .../kotlin/types/TypeApproximator.kt | 2 +- .../basicInferenceForImplicitSelfType.fir.kt | 2 + .../basicInferenceForImplicitSelfType.kt | 23 +++++++ .../basicInferenceForImplicitSelfType.txt | 0 .../recursiveTypeWithTwoTypeParams.fir.kt | 2 + .../recursiveTypeWithTwoTypeParams.kt | 10 +++ .../recursiveTypeWithTwoTypeParams.txt | 0 .../writerAppenderExampleRecursive.fir.kt | 2 + .../writerAppenderExampleRecursive.kt | 26 ++++++++ .../writerAppenderExampleRecursive.txt | 0 .../basicInferenceForImplicitSelfType.fir.kt | 23 +++++++ .../basicInferenceForImplicitSelfType.kt | 2 + .../basicInferenceForImplicitSelfType.txt | 14 ++++ .../recursiveTypeWithTwoTypeParams.fir.kt | 10 +++ .../recursiveTypeWithTwoTypeParams.kt | 2 + .../recursiveTypeWithTwoTypeParams.txt | 10 +++ .../writerAppenderExampleRecursive.fir.kt | 26 ++++++++ .../writerAppenderExampleRecursive.kt | 2 + .../writerAppenderExampleRecursive.txt | 26 ++++++++ .../test/runners/DiagnosticTestGenerated.java | 64 +++++++++++++++---- .../kotlin/config/LanguageVersionSettings.kt | 1 + 30 files changed, 365 insertions(+), 50 deletions(-) rename compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/{ => disabledInferenceOnSelfTypes}/basicInferenceForImplicitSelfType.fir.kt (86%) create mode 100644 compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.kt rename compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/{ => disabledInferenceOnSelfTypes}/basicInferenceForImplicitSelfType.txt (100%) rename compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/{ => disabledInferenceOnSelfTypes}/recursiveTypeWithTwoTypeParams.fir.kt (76%) create mode 100644 compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.kt rename compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/{ => disabledInferenceOnSelfTypes}/recursiveTypeWithTwoTypeParams.txt (100%) rename compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/{ => disabledInferenceOnSelfTypes}/writerAppenderExampleRecursive.fir.kt (93%) create mode 100644 compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/writerAppenderExampleRecursive.kt rename compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/{ => disabledInferenceOnSelfTypes}/writerAppenderExampleRecursive.txt (100%) create mode 100644 compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.fir.kt rename compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/{ => enabledInferenceOnSelfTypes}/basicInferenceForImplicitSelfType.kt (88%) create mode 100644 compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.txt create mode 100644 compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.fir.kt rename compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/{ => enabledInferenceOnSelfTypes}/recursiveTypeWithTwoTypeParams.kt (80%) create mode 100644 compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.txt create mode 100644 compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/writerAppenderExampleRecursive.fir.kt rename compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/{ => enabledInferenceOnSelfTypes}/writerAppenderExampleRecursive.kt (93%) create mode 100644 compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/writerAppenderExampleRecursive.txt 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 243c7970454..557a9534690 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 @@ -14185,22 +14185,60 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); } - @Test - @TestMetadata("basicInferenceForImplicitSelfType.kt") - public void testBasicInferenceForImplicitSelfType() throws Exception { - runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/basicInferenceForImplicitSelfType.kt"); + @Nested + @TestMetadata("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes") + @TestDataPath("$PROJECT_ROOT") + public class DisabledInferenceOnSelfTypes { + @Test + public void testAllFilesPresentInDisabledInferenceOnSelfTypes() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); + } + + @Test + @TestMetadata("basicInferenceForImplicitSelfType.kt") + public void testBasicInferenceForImplicitSelfType() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.kt"); + } + + @Test + @TestMetadata("recursiveTypeWithTwoTypeParams.kt") + public void testRecursiveTypeWithTwoTypeParams() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.kt"); + } + + @Test + @TestMetadata("writerAppenderExampleRecursive.kt") + public void testWriterAppenderExampleRecursive() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/writerAppenderExampleRecursive.kt"); + } } - @Test - @TestMetadata("recursiveTypeWithTwoTypeParams.kt") - public void testRecursiveTypeWithTwoTypeParams() throws Exception { - runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/recursiveTypeWithTwoTypeParams.kt"); - } + @Nested + @TestMetadata("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes") + @TestDataPath("$PROJECT_ROOT") + public class EnabledInferenceOnSelfTypes { + @Test + public void testAllFilesPresentInEnabledInferenceOnSelfTypes() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); + } - @Test - @TestMetadata("writerAppenderExampleRecursive.kt") - public void testWriterAppenderExampleRecursive() throws Exception { - runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/writerAppenderExampleRecursive.kt"); + @Test + @TestMetadata("basicInferenceForImplicitSelfType.kt") + public void testBasicInferenceForImplicitSelfType() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.kt"); + } + + @Test + @TestMetadata("recursiveTypeWithTwoTypeParams.kt") + public void testRecursiveTypeWithTwoTypeParams() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.kt"); + } + + @Test + @TestMetadata("writerAppenderExampleRecursive.kt") + public void testWriterAppenderExampleRecursive() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/writerAppenderExampleRecursive.kt"); + } } } } 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 70bcbb00f95..923ed8d4379 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 @@ -14185,22 +14185,60 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); } - @Test - @TestMetadata("basicInferenceForImplicitSelfType.kt") - public void testBasicInferenceForImplicitSelfType() throws Exception { - runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/basicInferenceForImplicitSelfType.kt"); + @Nested + @TestMetadata("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes") + @TestDataPath("$PROJECT_ROOT") + public class DisabledInferenceOnSelfTypes { + @Test + public void testAllFilesPresentInDisabledInferenceOnSelfTypes() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); + } + + @Test + @TestMetadata("basicInferenceForImplicitSelfType.kt") + public void testBasicInferenceForImplicitSelfType() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.kt"); + } + + @Test + @TestMetadata("recursiveTypeWithTwoTypeParams.kt") + public void testRecursiveTypeWithTwoTypeParams() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.kt"); + } + + @Test + @TestMetadata("writerAppenderExampleRecursive.kt") + public void testWriterAppenderExampleRecursive() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/writerAppenderExampleRecursive.kt"); + } } - @Test - @TestMetadata("recursiveTypeWithTwoTypeParams.kt") - public void testRecursiveTypeWithTwoTypeParams() throws Exception { - runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/recursiveTypeWithTwoTypeParams.kt"); - } + @Nested + @TestMetadata("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes") + @TestDataPath("$PROJECT_ROOT") + public class EnabledInferenceOnSelfTypes { + @Test + public void testAllFilesPresentInEnabledInferenceOnSelfTypes() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); + } - @Test - @TestMetadata("writerAppenderExampleRecursive.kt") - public void testWriterAppenderExampleRecursive() throws Exception { - runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/writerAppenderExampleRecursive.kt"); + @Test + @TestMetadata("basicInferenceForImplicitSelfType.kt") + public void testBasicInferenceForImplicitSelfType() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.kt"); + } + + @Test + @TestMetadata("recursiveTypeWithTwoTypeParams.kt") + public void testRecursiveTypeWithTwoTypeParams() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.kt"); + } + + @Test + @TestMetadata("writerAppenderExampleRecursive.kt") + public void testWriterAppenderExampleRecursive() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/writerAppenderExampleRecursive.kt"); + } } } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceComponents.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceComponents.kt index 74aa941cead..2ffc055e838 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceComponents.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceComponents.kt @@ -26,7 +26,7 @@ class InferenceComponents(val session: FirSession) : FirSessionComponent { approximator, session.languageVersionSettings, ) - val resultTypeResolver = ResultTypeResolver(approximator, trivialConstraintTypeInferenceOracle) + val resultTypeResolver = ResultTypeResolver(approximator, trivialConstraintTypeInferenceOracle, session.languageVersionSettings) val variableFixationFinder = VariableFixationFinder(trivialConstraintTypeInferenceOracle, session.languageVersionSettings) val postponedArgumentInputTypesResolver = PostponedArgumentInputTypesResolver(resultTypeResolver, variableFixationFinder, ConeConstraintSystemUtilContext) diff --git a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintInjector.kt b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintInjector.kt index 9da03dec9b5..fcb2db2e93f 100644 --- a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintInjector.kt +++ b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintInjector.kt @@ -21,7 +21,7 @@ import kotlin.math.max class ConstraintInjector( val constraintIncorporator: ConstraintIncorporator, val typeApproximator: AbstractTypeApproximator, - private val languageVersionSettings: LanguageVersionSettings, + val languageVersionSettings: LanguageVersionSettings, ) { private val ALLOWED_DEPTH_DELTA_FOR_INCORPORATION = 1 diff --git a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/ResultTypeResolver.kt b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/ResultTypeResolver.kt index daab292fde1..160b8d6d2a1 100644 --- a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/ResultTypeResolver.kt +++ b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/ResultTypeResolver.kt @@ -5,6 +5,8 @@ package org.jetbrains.kotlin.resolve.calls.inference.components +import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.resolve.calls.NewCommonSuperTypeCalculator import org.jetbrains.kotlin.resolve.calls.inference.components.TypeVariableDirectionCalculator.ResolveDirection import org.jetbrains.kotlin.resolve.calls.inference.hasDeclaredUpperBoundSelfTypes @@ -16,7 +18,8 @@ import org.jetbrains.kotlin.types.model.* class ResultTypeResolver( val typeApproximator: AbstractTypeApproximator, - val trivialConstraintTypeInferenceOracle: TrivialConstraintTypeInferenceOracle + val trivialConstraintTypeInferenceOracle: TrivialConstraintTypeInferenceOracle, + private val languageVersionSettings: LanguageVersionSettings ) { interface Context : TypeSystemInferenceExtensionContext { fun isProperType(type: KotlinTypeMarker): Boolean @@ -211,8 +214,11 @@ class ResultTypeResolver( } private fun Context.findSuperType(variableWithConstraints: VariableWithConstraints): KotlinTypeMarker? { + val isTypeInferenceForSelfTypesSupported = + languageVersionSettings.supportsFeature(LanguageFeature.TypeInferenceOnCallsWithSelfTypes) val upperConstraints = variableWithConstraints.constraints.filter { - it.kind == ConstraintKind.UPPER && (hasDeclaredUpperBoundSelfTypes(it) || isProperTypeForFixation(it.type)) + it.kind == ConstraintKind.UPPER + && ((isTypeInferenceForSelfTypesSupported && hasDeclaredUpperBoundSelfTypes(it)) || isProperTypeForFixation(it.type)) } if (upperConstraints.isNotEmpty()) { val intersectionUpperType = intersectTypes(upperConstraints.map { it.type }) diff --git a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder.kt b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder.kt index bd20eb163c4..d65dce98f22 100644 --- a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder.kt +++ b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder.kt @@ -57,13 +57,17 @@ class VariableFixationFinder( private val inferenceCompatibilityModeEnabled: Boolean get() = languageVersionSettings.supportsFeature(LanguageFeature.InferenceCompatibility) + private val isTypeInferenceForSelfTypesSupported: Boolean + get() = languageVersionSettings.supportsFeature(LanguageFeature.TypeInferenceOnCallsWithSelfTypes) + private fun Context.getTypeVariableReadiness( variable: TypeConstructorMarker, dependencyProvider: TypeVariableDependencyInformationProvider, ): TypeVariableFixationReadiness = when { !notFixedTypeVariables.contains(variable) || dependencyProvider.isVariableRelatedToTopLevelType(variable) -> TypeVariableFixationReadiness.FORBIDDEN - hasDeclaredUpperBoundSelfTypes(variable) -> TypeVariableFixationReadiness.READY_FOR_FIXATION_DECLARED_UPPER_BOUND_WITH_SELF_TYPES + isTypeInferenceForSelfTypesSupported && hasDeclaredUpperBoundSelfTypes(variable) -> + TypeVariableFixationReadiness.READY_FOR_FIXATION_DECLARED_UPPER_BOUND_WITH_SELF_TYPES !variableHasProperArgumentConstraints(variable) -> TypeVariableFixationReadiness.WITHOUT_PROPER_ARGUMENT_CONSTRAINT hasDependencyToOtherTypeVariables(variable) -> TypeVariableFixationReadiness.WITH_COMPLEX_DEPENDENCY variableHasTrivialOrNonProperConstraints(variable) -> TypeVariableFixationReadiness.WITH_TRIVIAL_OR_NON_PROPER_CONSTRAINTS 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 2ee1aba3d39..df9c25d7ee1 100644 --- a/compiler/resolution.common/src/org/jetbrains/kotlin/types/AbstractTypeApproximator.kt +++ b/compiler/resolution.common/src/org/jetbrains/kotlin/types/AbstractTypeApproximator.kt @@ -406,7 +406,9 @@ abstract class AbstractTypeApproximator( val argumentTypeConstructor = argument.getType().typeConstructor() - if (argumentTypeConstructor is TypeVariableTypeConstructorMarker && conf.selfTypesWithTypeVariablesToCapturedStarProjection) { + val isTypeInferenceForSelfTypesSupported = + languageVersionSettings.supportsFeature(LanguageFeature.TypeInferenceOnCallsWithSelfTypes) + if (isTypeInferenceForSelfTypesSupported && argumentTypeConstructor is TypeVariableTypeConstructorMarker && conf.selfTypesWithTypeVariablesToCapturedStarProjection) { // If we have Self where T is bounded by Self, we approximate it to CapturedType(*) to satisfy constraints if (argumentTypeConstructor.typeParameter?.hasRecursiveBounds(type.typeConstructor()) == true) { return createCapturedStarProjectionForSelfType(argumentTypeConstructor, type) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ClassicTypeSystemContextForCS.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ClassicTypeSystemContextForCS.kt index bd338fe6e38..b9c89c3fa48 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ClassicTypeSystemContextForCS.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ClassicTypeSystemContextForCS.kt @@ -6,6 +6,8 @@ package org.jetbrains.kotlin.resolve.calls.components import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintInjector import org.jetbrains.kotlin.resolve.calls.inference.components.EmptySubstitutor import org.jetbrains.kotlin.resolve.calls.inference.components.NewTypeSubstitutor @@ -20,7 +22,10 @@ import org.jetbrains.kotlin.types.checker.NewCapturedTypeConstructor import org.jetbrains.kotlin.types.model.* import org.jetbrains.kotlin.utils.addToStdlib.cast -class ClassicTypeSystemContextForCS(override val builtIns: KotlinBuiltIns) : TypeSystemInferenceExtensionContextDelegate, +class ClassicTypeSystemContextForCS( + override val builtIns: KotlinBuiltIns, + private val languageVersionSettings: LanguageVersionSettings +) : TypeSystemInferenceExtensionContextDelegate, ClassicTypeSystemContext, BuiltInsProvider { @@ -43,13 +48,16 @@ class ClassicTypeSystemContextForCS(override val builtIns: KotlinBuiltIns) : Typ require(lowerType is UnwrappedType?, lowerType::errorMessage) require(constructorProjection is TypeProjectionBase, constructorProjection::errorMessage) + val isTypeInferenceForSelfTypesSupported = + languageVersionSettings.supportsFeature(LanguageFeature.TypeInferenceOnCallsWithSelfTypes) + @Suppress("UNCHECKED_CAST") val newCapturedTypeConstructor = NewCapturedTypeConstructor( constructorProjection, constructorSupertypes as List ) return NewCapturedType( - captureStatus, + if (isTypeInferenceForSelfTypesSupported) captureStatus else CaptureStatus.FOR_INCORPORATION, newCapturedTypeConstructor, lowerType = lowerType ) @@ -109,5 +117,5 @@ fun NewConstraintSystemImpl( constraintInjector: ConstraintInjector, builtIns: KotlinBuiltIns ): NewConstraintSystemImpl { - return NewConstraintSystemImpl(constraintInjector, ClassicTypeSystemContextForCS(builtIns)) + return NewConstraintSystemImpl(constraintInjector, ClassicTypeSystemContextForCS(builtIns, constraintInjector.languageVersionSettings)) } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/SimpleConstraintSystemImpl.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/SimpleConstraintSystemImpl.kt index fbe6cf68285..5bd2d6186b0 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/SimpleConstraintSystemImpl.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/SimpleConstraintSystemImpl.kt @@ -30,7 +30,7 @@ import org.jetbrains.kotlin.types.model.* import org.jetbrains.kotlin.types.typeUtil.asTypeProjection class SimpleConstraintSystemImpl(constraintInjector: ConstraintInjector, builtIns: KotlinBuiltIns) : SimpleConstraintSystem { - val system = NewConstraintSystemImpl(constraintInjector, ClassicTypeSystemContextForCS(builtIns)) + val system = NewConstraintSystemImpl(constraintInjector, ClassicTypeSystemContextForCS(builtIns, constraintInjector.languageVersionSettings)) val csBuilder: ConstraintSystemBuilder = system.getBuilder() diff --git a/compiler/resolution/src/org/jetbrains/kotlin/types/TypeApproximator.kt b/compiler/resolution/src/org/jetbrains/kotlin/types/TypeApproximator.kt index 88df5fa71e7..a2aee920343 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/types/TypeApproximator.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/types/TypeApproximator.kt @@ -24,7 +24,7 @@ import org.jetbrains.kotlin.resolve.calls.components.ClassicTypeSystemContextFor class TypeApproximator( builtIns: KotlinBuiltIns, languageVersionSettings: LanguageVersionSettings, -) : AbstractTypeApproximator(ClassicTypeSystemContextForCS(builtIns), languageVersionSettings) { +) : AbstractTypeApproximator(ClassicTypeSystemContextForCS(builtIns, languageVersionSettings), languageVersionSettings) { fun approximateDeclarationType(baseType: KotlinType, local: Boolean): UnwrappedType { if (!languageVersionSettings.supportsFeature(LanguageFeature.NewInference)) return baseType.unwrap() diff --git a/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/basicInferenceForImplicitSelfType.fir.kt b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.fir.kt similarity index 86% rename from compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/basicInferenceForImplicitSelfType.fir.kt rename to compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.fir.kt index 2ca7ce11f42..eee33a37eb3 100644 --- a/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/basicInferenceForImplicitSelfType.fir.kt +++ b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.fir.kt @@ -1,3 +1,5 @@ +// !LANGUAGE: -TypeInferenceOnCallsWithSelfTypes + class Builder> { fun test(): T = TODO() diff --git a/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.kt b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.kt new file mode 100644 index 00000000000..321714c2e49 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.kt @@ -0,0 +1,23 @@ +// !LANGUAGE: -TypeInferenceOnCallsWithSelfTypes + +class Builder> { + fun test(): T = TODO() + + fun foo() {} +} + +fun testStar(builder: Builder<*>) { + builder.test() + + builder + .test() + .foo() +} + +fun > testTypeParam(builder: Builder) { + builder.test() + + builder + .test() + .foo() +} diff --git a/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/basicInferenceForImplicitSelfType.txt b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.txt similarity index 100% rename from compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/basicInferenceForImplicitSelfType.txt rename to compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.txt diff --git a/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/recursiveTypeWithTwoTypeParams.fir.kt b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.fir.kt similarity index 76% rename from compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/recursiveTypeWithTwoTypeParams.fir.kt rename to compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.fir.kt index 6d30685c076..2ef5983977d 100644 --- a/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/recursiveTypeWithTwoTypeParams.fir.kt +++ b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.fir.kt @@ -1,3 +1,5 @@ +// !LANGUAGE: -TypeInferenceOnCallsWithSelfTypes + interface BodySpec> { fun isEqualTo(expected: B): T } diff --git a/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.kt b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.kt new file mode 100644 index 00000000000..42901bb42b5 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.kt @@ -0,0 +1,10 @@ +// !LANGUAGE: -TypeInferenceOnCallsWithSelfTypes + +interface BodySpec> { + fun isEqualTo(expected: B): T +} + +fun test(b: BodySpec) { + val x = b.isEqualTo("") + x +} diff --git a/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/recursiveTypeWithTwoTypeParams.txt b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.txt similarity index 100% rename from compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/recursiveTypeWithTwoTypeParams.txt rename to compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.txt diff --git a/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/writerAppenderExampleRecursive.fir.kt b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/writerAppenderExampleRecursive.fir.kt similarity index 93% rename from compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/writerAppenderExampleRecursive.fir.kt rename to compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/writerAppenderExampleRecursive.fir.kt index 6f90e01727d..0ed02c5f343 100644 --- a/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/writerAppenderExampleRecursive.fir.kt +++ b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/writerAppenderExampleRecursive.fir.kt @@ -1,3 +1,5 @@ +// !LANGUAGE: -TypeInferenceOnCallsWithSelfTypes + fun test() { ")!>WriterAppender.newBuilder() >")!>WriterAppender.Builder1() diff --git a/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/writerAppenderExampleRecursive.kt b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/writerAppenderExampleRecursive.kt new file mode 100644 index 00000000000..f099f02d2f2 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/writerAppenderExampleRecursive.kt @@ -0,0 +1,26 @@ +// !LANGUAGE: -TypeInferenceOnCallsWithSelfTypes + +fun test() { + WriterAppender.newBuilder() + WriterAppender.Builder1() + + WriterAppender.intersectTwoSelfTypes() +} + +object WriterAppender { + interface Builder2> + + class Builder1> { + fun asBuilder(): B { + return this as B + } + } + + fun > newBuilder(): B { + return Builder1().asBuilder() + } + + fun intersectTwoSelfTypes(): B where B : Builder1, B: Builder2 { + return Builder1().asBuilder() + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/writerAppenderExampleRecursive.txt b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/writerAppenderExampleRecursive.txt similarity index 100% rename from compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/writerAppenderExampleRecursive.txt rename to compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/writerAppenderExampleRecursive.txt diff --git a/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.fir.kt b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.fir.kt new file mode 100644 index 00000000000..a5837fe1b92 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.fir.kt @@ -0,0 +1,23 @@ +// !LANGUAGE: +TypeInferenceOnCallsWithSelfTypes + +class Builder> { + fun test(): T = TODO() + + fun foo() {} +} + +fun testStar(builder: Builder<*>) { + builder.test() + + builder + .test() + .foo() +} + +fun > testTypeParam(builder: Builder) { + builder.test() + + builder + .test() + .foo() +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/basicInferenceForImplicitSelfType.kt b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.kt similarity index 88% rename from compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/basicInferenceForImplicitSelfType.kt rename to compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.kt index 2bf74c06de7..9d4dcd671f3 100644 --- a/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/basicInferenceForImplicitSelfType.kt +++ b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.kt @@ -1,3 +1,5 @@ +// !LANGUAGE: +TypeInferenceOnCallsWithSelfTypes + class Builder> { fun test(): T = TODO() diff --git a/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.txt b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.txt new file mode 100644 index 00000000000..37b74c7fc6f --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.txt @@ -0,0 +1,14 @@ +package + +public fun testStar(/*0*/ builder: Builder<*>): kotlin.Unit +public fun > testTypeParam(/*0*/ builder: Builder): kotlin.Unit + +public final class Builder> { + public constructor Builder>() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final fun foo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final fun test(): T + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + diff --git a/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.fir.kt b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.fir.kt new file mode 100644 index 00000000000..5d339b162dd --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.fir.kt @@ -0,0 +1,10 @@ +// !LANGUAGE: +TypeInferenceOnCallsWithSelfTypes + +interface BodySpec> { + fun isEqualTo(expected: B): T +} + +fun test(b: BodySpec) { + val x = b.isEqualTo("") + x +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/recursiveTypeWithTwoTypeParams.kt b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.kt similarity index 80% rename from compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/recursiveTypeWithTwoTypeParams.kt rename to compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.kt index fa0b9dfc29e..e81db1d2289 100644 --- a/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/recursiveTypeWithTwoTypeParams.kt +++ b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.kt @@ -1,3 +1,5 @@ +// !LANGUAGE: +TypeInferenceOnCallsWithSelfTypes + interface BodySpec> { fun isEqualTo(expected: B): T } diff --git a/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.txt b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.txt new file mode 100644 index 00000000000..220f4c9f9b9 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.txt @@ -0,0 +1,10 @@ +package + +public fun test(/*0*/ b: BodySpec): kotlin.Unit + +public interface BodySpec> { + 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 abstract fun isEqualTo(/*0*/ expected: B): T + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/writerAppenderExampleRecursive.fir.kt b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/writerAppenderExampleRecursive.fir.kt new file mode 100644 index 00000000000..6375ab9f202 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/writerAppenderExampleRecursive.fir.kt @@ -0,0 +1,26 @@ +// !LANGUAGE: +TypeInferenceOnCallsWithSelfTypes + +fun test() { + ")!>WriterAppender.newBuilder() + >")!>WriterAppender.Builder1() + + & Builder2<*>}")!>WriterAppender.intersectTwoSelfTypes() +} + +object WriterAppender { + interface Builder2> + + class Builder1> { + fun asBuilder(): B { + return this as B + } + } + + fun > newBuilder(): B { + return Builder1().asBuilder() + } + + fun intersectTwoSelfTypes(): B where B : Builder1, B: Builder2 { + return Builder1().asBuilder() + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/writerAppenderExampleRecursive.kt b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/writerAppenderExampleRecursive.kt similarity index 93% rename from compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/writerAppenderExampleRecursive.kt rename to compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/writerAppenderExampleRecursive.kt index 6f90e01727d..6375ab9f202 100644 --- a/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/writerAppenderExampleRecursive.kt +++ b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/writerAppenderExampleRecursive.kt @@ -1,3 +1,5 @@ +// !LANGUAGE: +TypeInferenceOnCallsWithSelfTypes + fun test() { ")!>WriterAppender.newBuilder() >")!>WriterAppender.Builder1() diff --git a/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/writerAppenderExampleRecursive.txt b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/writerAppenderExampleRecursive.txt new file mode 100644 index 00000000000..fe013b5adc8 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/writerAppenderExampleRecursive.txt @@ -0,0 +1,26 @@ +package + +public fun test(): kotlin.Unit + +public object WriterAppender { + private constructor WriterAppender() + 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 final fun > intersectTwoSelfTypes(): B where B : WriterAppender.Builder2 + public final fun > newBuilder(): B + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public final class Builder1> { + public constructor Builder1>() + public final fun asBuilder(): B + 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 interface Builder2> { + 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-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 f932a367bd2..a149bcccbd1 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 @@ -14191,22 +14191,60 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes"), Pattern.compile("^(.*)\\.kts?$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); } - @Test - @TestMetadata("basicInferenceForImplicitSelfType.kt") - public void testBasicInferenceForImplicitSelfType() throws Exception { - runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/basicInferenceForImplicitSelfType.kt"); + @Nested + @TestMetadata("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes") + @TestDataPath("$PROJECT_ROOT") + public class DisabledInferenceOnSelfTypes { + @Test + public void testAllFilesPresentInDisabledInferenceOnSelfTypes() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes"), Pattern.compile("^(.*)\\.kts?$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); + } + + @Test + @TestMetadata("basicInferenceForImplicitSelfType.kt") + public void testBasicInferenceForImplicitSelfType() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.kt"); + } + + @Test + @TestMetadata("recursiveTypeWithTwoTypeParams.kt") + public void testRecursiveTypeWithTwoTypeParams() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.kt"); + } + + @Test + @TestMetadata("writerAppenderExampleRecursive.kt") + public void testWriterAppenderExampleRecursive() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/disabledInferenceOnSelfTypes/writerAppenderExampleRecursive.kt"); + } } - @Test - @TestMetadata("recursiveTypeWithTwoTypeParams.kt") - public void testRecursiveTypeWithTwoTypeParams() throws Exception { - runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/recursiveTypeWithTwoTypeParams.kt"); - } + @Nested + @TestMetadata("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes") + @TestDataPath("$PROJECT_ROOT") + public class EnabledInferenceOnSelfTypes { + @Test + public void testAllFilesPresentInEnabledInferenceOnSelfTypes() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes"), Pattern.compile("^(.*)\\.kts?$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); + } - @Test - @TestMetadata("writerAppenderExampleRecursive.kt") - public void testWriterAppenderExampleRecursive() throws Exception { - runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/writerAppenderExampleRecursive.kt"); + @Test + @TestMetadata("basicInferenceForImplicitSelfType.kt") + public void testBasicInferenceForImplicitSelfType() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/basicInferenceForImplicitSelfType.kt"); + } + + @Test + @TestMetadata("recursiveTypeWithTwoTypeParams.kt") + public void testRecursiveTypeWithTwoTypeParams() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/recursiveTypeWithTwoTypeParams.kt"); + } + + @Test + @TestMetadata("writerAppenderExampleRecursive.kt") + public void testWriterAppenderExampleRecursive() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/recursiveTypes/selfTypes/enabledInferenceOnSelfTypes/writerAppenderExampleRecursive.kt"); + } } } } diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index d6b86882477..403ea19ba20 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -213,6 +213,7 @@ enum class LanguageFeature( ClassTypeParameterAnnotations(KOTLIN_1_6), SafeCallsAreAlwaysNullable(KOTLIN_1_6), ProhibitSimplificationOfNonTrivialConstBooleanExpressions(KOTLIN_1_6), + TypeInferenceOnCallsWithSelfTypes(KOTLIN_1_6), // Temporarily disabled, see KT-27084/KT-22379 SoundSmartcastFromLoopConditionForLoopAssignedVariables(sinceVersion = null, kind = BUG_FIX),