diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index 0961f9de34c..729c343f8cc 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -3009,7 +3009,7 @@ public class ExpressionCodegen extends KtVisitor impleme @NotNull private KotlinType approximateCapturedType(@NotNull KotlinType type) { if (state.getLanguageVersionSettings().supportsFeature(LanguageFeature.NewInference)) { - TypeApproximator approximator = new TypeApproximator(state.getModule().getBuiltIns()); + TypeApproximator approximator = new TypeApproximator(state.getModule().getBuiltIns(), state.getLanguageVersionSettings()); KotlinType approximatedType = TypeUtils.contains(type, (containedType) -> CapturedTypeConstructorKt.isCaptured(containedType)) ? diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt index 2762a4abb61..26c27684873 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt @@ -330,7 +330,7 @@ class GenerationState private constructor( val typeApproximator: TypeApproximator? = if (languageVersionSettings.supportsFeature(LanguageFeature.NewInference)) - TypeApproximator(module.builtIns) + TypeApproximator(module.builtIns, languageVersionSettings) else null diff --git a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirMetadataSerializer.kt b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirMetadataSerializer.kt index 121b775ad57..30dc65b56e1 100644 --- a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirMetadataSerializer.kt +++ b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirMetadataSerializer.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.declarations.builder.buildProperty import org.jetbrains.kotlin.fir.declarations.builder.buildPropertyAccessor import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameterCopy import org.jetbrains.kotlin.fir.diagnostics.ConeIntermediateDiagnostic +import org.jetbrains.kotlin.fir.languageVersionSettings import org.jetbrains.kotlin.fir.serialization.FirElementSerializer import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol @@ -43,7 +44,7 @@ class FirMetadataSerializer( components: Fir2IrComponents, parent: MetadataSerializer? ) : MetadataSerializer { - private val approximator = object : AbstractTypeApproximator(session.typeContext) { + private val approximator = object : AbstractTypeApproximator(session.typeContext, session.languageVersionSettings) { override fun createErrorType(debugName: String): SimpleTypeMarker { return ConeKotlinErrorType(ConeIntermediateDiagnostic(debugName)) } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrTypeConverter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrTypeConverter.kt index 2b424f3fa72..0d949e32f9d 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrTypeConverter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrTypeConverter.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.backend import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.classId +import org.jetbrains.kotlin.fir.languageVersionSettings import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.substitution.AbstractConeSubstitutor import org.jetbrains.kotlin.fir.resolve.toSymbol @@ -63,7 +64,7 @@ class Fir2IrTypeConverter( private val capturedTypeCache = mutableMapOf() private val errorTypeForCapturedTypeStub by lazy { createErrorType() } - private val typeApproximator = ConeTypeApproximator(session.typeContext) + private val typeApproximator = ConeTypeApproximator(session.typeContext, session.languageVersionSettings) fun FirTypeRef.toIrType(typeContext: ConversionTypeContext = ConversionTypeContext.DEFAULT): IrType { capturedTypeCache.clear() diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt index 96cb046c69e..31ce3fa274b 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt @@ -6,10 +6,9 @@ package org.jetbrains.kotlin.fir.backend.generators import org.jetbrains.kotlin.backend.common.ir.isMethodOfAny -import org.jetbrains.kotlin.fir.FirFakeSourceElementKind +import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression import org.jetbrains.kotlin.fir.references.FirDelegateFieldReference @@ -17,7 +16,6 @@ import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.references.FirSuperReference import org.jetbrains.kotlin.fir.references.impl.FirReferencePlaceholderForResolvedAnnotations -import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.FirSamResolverImpl import org.jetbrains.kotlin.fir.resolve.calls.getExpectedTypeForSAMConversion import org.jetbrains.kotlin.fir.resolve.calls.isFunctional @@ -31,7 +29,6 @@ import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.fir.symbols.impl.* -import org.jetbrains.kotlin.fir.typeContext import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.builders.declarations.UNDEFINED_PARAMETER_INDEX @@ -51,7 +48,7 @@ class CallAndReferenceGenerator( private val conversionScope: Fir2IrConversionScope ) : Fir2IrComponents by components { - private val approximator = ConeTypeApproximator(session.typeContext) + private val approximator = ConeTypeApproximator(session.typeContext, session.languageVersionSettings) private val adapterGenerator = AdapterGenerator(components, conversionScope) private val samResolver = FirSamResolverImpl(session, scopeSession) 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 9fcfcdc4a97..74aa941cead 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 @@ -18,7 +18,7 @@ class InferenceComponents(val session: FirSession) : FirSessionComponent { get() = this@InferenceComponents.session } - val approximator: ConeTypeApproximator = ConeTypeApproximator(ctx) + val approximator: ConeTypeApproximator = ConeTypeApproximator(ctx, session.languageVersionSettings) val trivialConstraintTypeInferenceOracle = TrivialConstraintTypeInferenceOracle.create(ctx) private val incorporator = ConstraintIncorporator(approximator, trivialConstraintTypeInferenceOracle, ConeConstraintSystemUtilContext) private val injector = ConstraintInjector( diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeTypeApproximator.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeTypeApproximator.kt index be07ed9f04e..c804ba3ef97 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeTypeApproximator.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeTypeApproximator.kt @@ -5,10 +5,12 @@ package org.jetbrains.kotlin.fir.types +import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.types.AbstractTypeApproximator import org.jetbrains.kotlin.types.TypeApproximatorConfiguration -class ConeTypeApproximator(inferenceContext: ConeInferenceContext) : AbstractTypeApproximator(inferenceContext) { +class ConeTypeApproximator(inferenceContext: ConeInferenceContext, languageVersionSettings: LanguageVersionSettings) : + AbstractTypeApproximator(inferenceContext, languageVersionSettings) { fun approximateToSuperType(type: ConeKotlinType, conf: TypeApproximatorConfiguration): ConeKotlinType? { return super.approximateToSuperType(type, conf) as ConeKotlinType? } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java index 56a07f2745a..cf753762fb1 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java @@ -700,7 +700,7 @@ public class DescriptorResolver { BindingTrace trace, @NotNull LexicalScope scope ) { - UnwrappedType approximatedType = typeApproximator.approximateDeclarationType(type, true, languageVersionSettings); + UnwrappedType approximatedType = typeApproximator.approximateDeclarationType(type, true); VariableDescriptor variableDescriptor = new LocalVariableDescriptor( scope.getOwnerDescriptor(), annotationResolver.resolveAnnotationsWithArguments(scope, parameter.getModifierList(), trace), @@ -1244,7 +1244,7 @@ public class DescriptorResolver { KotlinType publicType = transformAnonymousTypeIfNeeded( functionDescriptor, function, type, trace, anonymousTypeTransformers, languageVersionSettings ); - UnwrappedType approximatedType = typeApproximator.approximateDeclarationType(publicType, false, languageVersionSettings); + UnwrappedType approximatedType = typeApproximator.approximateDeclarationType(publicType, false); KotlinType sanitizedType = declarationReturnTypeSanitizer.sanitizeReturnType(approximatedType, wrappedTypeFactory, trace, languageVersionSettings); functionsTypingVisitor.checkTypesForReturnStatements(function, trace, sanitizedType); return sanitizedType; diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/VariableTypeAndInitializerResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/VariableTypeAndInitializerResolver.kt index e54a7cf9a05..5addb56506f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/VariableTypeAndInitializerResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/VariableTypeAndInitializerResolver.kt @@ -180,5 +180,5 @@ class VariableTypeAndInitializerResolver( } private fun approximateType(type: KotlinType, local: Boolean): UnwrappedType = - typeApproximator.approximateDeclarationType(type, local, expressionTypingServices.languageVersionSettings) + typeApproximator.approximateDeclarationType(type, local) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ResolvedAtomCompleter.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ResolvedAtomCompleter.kt index b3ca43bf765..9e892c4f877 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ResolvedAtomCompleter.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ResolvedAtomCompleter.kt @@ -218,7 +218,7 @@ class ResolvedAtomCompleter( return FunctionLiteralTypes.ProcessedType( substitutedType, approximatedType = typeApproximator.approximateDeclarationType( - substitutedType, local = true, languageVersionSettings = topLevelCallContext.languageVersionSettings + substitutedType, local = true ) ) } diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/TypeTranslatorImpl.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/TypeTranslatorImpl.kt index 16edf96faa3..f74e1e58fda 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/TypeTranslatorImpl.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/TypeTranslatorImpl.kt @@ -23,10 +23,10 @@ class TypeTranslatorImpl( override val constantValueGenerator: ConstantValueGenerator = ConstantValueGeneratorImpl(moduleDescriptor, symbolTable, this) - private val typeApproximatorForNI = TypeApproximator(moduleDescriptor.builtIns) + private val typeApproximatorForNI = TypeApproximator(moduleDescriptor.builtIns, languageVersionSettings) override fun approximateType(type: KotlinType): KotlinType = - typeApproximatorForNI.approximateDeclarationType(type, local = false, languageVersionSettings) + typeApproximatorForNI.approximateDeclarationType(type, local = false) override fun commonSupertype(types: Collection): KotlinType = CommonSupertypes.commonSupertype(types) 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 c2c0ebca922..ec765dd8fb5 100644 --- a/compiler/resolution.common/src/org/jetbrains/kotlin/types/AbstractTypeApproximator.kt +++ b/compiler/resolution.common/src/org/jetbrains/kotlin/types/AbstractTypeApproximator.kt @@ -5,11 +5,16 @@ package org.jetbrains.kotlin.types +import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.resolve.calls.NewCommonSuperTypeCalculator.commonSuperType import org.jetbrains.kotlin.types.model.* import java.util.concurrent.ConcurrentHashMap -abstract class AbstractTypeApproximator(val ctx: TypeSystemInferenceExtensionContext) : TypeSystemInferenceExtensionContext by ctx { +abstract class AbstractTypeApproximator( + val ctx: TypeSystemInferenceExtensionContext, + protected val languageVersionSettings: LanguageVersionSettings, +) : TypeSystemInferenceExtensionContext by ctx { private class ApproximationResult(val type: KotlinTypeMarker?) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/types/TypeApproximator.kt b/compiler/resolution/src/org/jetbrains/kotlin/types/TypeApproximator.kt index 20cfd25dd1c..88df5fa71e7 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/types/TypeApproximator.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/types/TypeApproximator.kt @@ -21,8 +21,11 @@ import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.resolve.calls.components.ClassicTypeSystemContextForCS -class TypeApproximator(builtIns: KotlinBuiltIns) : AbstractTypeApproximator(ClassicTypeSystemContextForCS(builtIns)) { - fun approximateDeclarationType(baseType: KotlinType, local: Boolean, languageVersionSettings: LanguageVersionSettings): UnwrappedType { +class TypeApproximator( + builtIns: KotlinBuiltIns, + languageVersionSettings: LanguageVersionSettings, +) : AbstractTypeApproximator(ClassicTypeSystemContextForCS(builtIns), languageVersionSettings) { + fun approximateDeclarationType(baseType: KotlinType, local: Boolean): UnwrappedType { if (!languageVersionSettings.supportsFeature(LanguageFeature.NewInference)) return baseType.unwrap() val configuration = if (local) TypeApproximatorConfiguration.LocalDeclaration else TypeApproximatorConfiguration.PublicDeclaration diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/internal/kotlinInternalUastUtils.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/internal/kotlinInternalUastUtils.kt index 88aa1db9c95..4ca7f22fe25 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/internal/kotlinInternalUastUtils.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/internal/kotlinInternalUastUtils.kt @@ -199,7 +199,8 @@ internal fun KotlinType.toPsiType(lightDeclaration: PsiModifierListOwner?, conte val signatureWriter = BothSignatureWriter(BothSignatureWriter.Mode.TYPE) val typeMappingMode = if (boxed) TypeMappingMode.GENERIC_ARGUMENT_UAST else TypeMappingMode.DEFAULT_UAST - val approximatedType = TypeApproximator(this.builtIns).approximateDeclarationType(this, true, languageVersionSettings) + val approximatedType = + TypeApproximator(this.builtIns, languageVersionSettings).approximateDeclarationType(this, true) typeMapper.mapType(approximatedType, signatureWriter, typeMappingMode) val signature = StringCharacterIterator(signatureWriter.toString())