From 12fbb9387155f2d1c8b6c73163bd8001e943c133 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 26 Aug 2020 10:51:54 +0300 Subject: [PATCH] [NI] Extract FE 1.0 specific part from NewCommonSuperTypeCalculator --- .../kotlin/fir/backend/jvm/FirJvmClassCodegen.kt | 10 ++-------- .../fir/resolve/inference/InferenceComponents.kt | 9 +-------- .../kotlin/fir/types/ConeInferenceContext.kt | 6 ++++-- .../resolve/calls/tower/ResolvedAtomCompleter.kt | 1 + .../generators/OperatorExpressionGenerator.kt | 1 + .../kotlin/ir/types/IrTypeSystemContext.kt | 4 ++++ .../kotlin/resolve/calls/CommonSuperTypeUtils.kt | 13 +++++++++++++ .../resolve/calls/NewCommonSuperTypeCalculator.kt | 14 +++++--------- .../kotlin/types/AbstractTypeApproximator.kt | 2 -- .../org/jetbrains/kotlin/types/TypeApproximator.kt | 5 ----- .../kotlin/types/model/TypeSystemContext.kt | 1 + .../types/checker/ClassicTypeSystemContext.kt | 4 ++++ 12 files changed, 36 insertions(+), 34 deletions(-) create mode 100644 compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/CommonSuperTypeUtils.kt diff --git a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmClassCodegen.kt b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmClassCodegen.kt index c2d9206ed62..c1c158e227d 100644 --- a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmClassCodegen.kt +++ b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmClassCodegen.kt @@ -22,7 +22,6 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.builder.* -import org.jetbrains.kotlin.fir.diagnostics.ConeIntermediateDiagnostic import org.jetbrains.kotlin.fir.typeContext import org.jetbrains.kotlin.fir.scopes.impl.withReplacedConeType import org.jetbrains.kotlin.fir.serialization.FirElementSerializer @@ -39,7 +38,6 @@ import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader import org.jetbrains.kotlin.metadata.jvm.serialization.JvmStringTable import org.jetbrains.kotlin.types.AbstractTypeApproximator import org.jetbrains.kotlin.types.TypeApproximatorConfiguration -import org.jetbrains.kotlin.types.model.SimpleTypeMarker import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.commons.Method @@ -60,11 +58,7 @@ class FirJvmClassCodegen( else -> null } - private val approximator = object : AbstractTypeApproximator(session.typeContext) { - override fun createErrorType(message: String): SimpleTypeMarker { - return ConeKotlinErrorType(ConeIntermediateDiagnostic(message)) - } - } + private val approximator = object : AbstractTypeApproximator(session.typeContext) {} private fun FirTypeRef.approximated( toSuper: Boolean, @@ -197,4 +191,4 @@ class FirJvmClassCodegen( state.globalSerializationBindings.put(FirJvmSerializerExtension.FIELD_FOR_PROPERTY, metadata.property, fieldType to fieldName) } } -} \ No newline at end of file +} 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 68a494e041e..a9265c5cb09 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 @@ -7,10 +7,8 @@ package org.jetbrains.kotlin.fir.resolve.inference import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.PrivateForInline -import org.jetbrains.kotlin.fir.diagnostics.ConeIntermediateDiagnostic import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator -import org.jetbrains.kotlin.fir.types.ConeClassErrorType import org.jetbrains.kotlin.fir.types.ConeInferenceContext import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintIncorporator import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintInjector @@ -19,7 +17,6 @@ import org.jetbrains.kotlin.resolve.calls.inference.components.TrivialConstraint import org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintSystemImpl import org.jetbrains.kotlin.types.AbstractTypeApproximator import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner -import org.jetbrains.kotlin.types.model.SimpleTypeMarker class InferenceComponents( val ctx: ConeInferenceContext, @@ -27,11 +24,7 @@ class InferenceComponents( val returnTypeCalculator: ReturnTypeCalculator, val scopeSession: ScopeSession ) { - val approximator: AbstractTypeApproximator = object : AbstractTypeApproximator(ctx) { - override fun createErrorType(message: String): SimpleTypeMarker { - return ConeClassErrorType(ConeIntermediateDiagnostic(message)) - } - } + val approximator: AbstractTypeApproximator = object : AbstractTypeApproximator(ctx) {} val trivialConstraintTypeInferenceOracle = TrivialConstraintTypeInferenceOracle.create(ctx) private val incorporator = ConstraintIncorporator(approximator, trivialConstraintTypeInferenceOracle) private val injector = ConstraintInjector(incorporator, approximator, KotlinTypeRefiner.Default) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeInferenceContext.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeInferenceContext.kt index 53636c0e757..e293af86084 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeInferenceContext.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeInferenceContext.kt @@ -334,6 +334,10 @@ interface ConeInferenceContext : TypeSystemInferenceExtensionContext, ConeTypeCo return type } + override fun createErrorType(debugName: String): ConeClassErrorType { + return ConeClassErrorType(ConeIntermediateDiagnostic(debugName)) + } + override fun createErrorTypeWithCustomConstructor(debugName: String, constructor: TypeConstructorMarker): KotlinTypeMarker { return ConeKotlinErrorType(ConeIntermediateDiagnostic("$debugName c: $constructor")) } @@ -358,8 +362,6 @@ interface ConeInferenceContext : TypeSystemInferenceExtensionContext, ConeTypeCo return createErrorType("Unknown reason") } - private fun createErrorType(reason: String) = ConeClassErrorType(ConeIntermediateDiagnostic(reason)) - override fun findCommonIntegerLiteralTypesSuperType(explicitSupertypes: List): SimpleTypeMarker? { return ConeIntegerLiteralTypeImpl.findCommonSuperType(explicitSupertypes) } 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 2c0baea3eb0..87e3e873234 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 @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.resolve.TemporaryBindingTrace import org.jetbrains.kotlin.resolve.calls.ArgumentTypeResolver import org.jetbrains.kotlin.resolve.calls.NewCommonSuperTypeCalculator import org.jetbrains.kotlin.resolve.calls.checkers.CallCheckerContext +import org.jetbrains.kotlin.resolve.calls.commonSuperType import org.jetbrains.kotlin.resolve.calls.components.CallableReferenceAdaptation import org.jetbrains.kotlin.resolve.calls.components.SuspendConversionStrategy import org.jetbrains.kotlin.resolve.calls.components.isVararg diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/OperatorExpressionGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/OperatorExpressionGenerator.kt index 284ee3a6280..271bc57a357 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/OperatorExpressionGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/OperatorExpressionGenerator.kt @@ -39,6 +39,7 @@ import org.jetbrains.kotlin.psi2ir.findSingleFunction import org.jetbrains.kotlin.psi2ir.intermediate.safeCallOnDispatchReceiver import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.NewCommonSuperTypeCalculator +import org.jetbrains.kotlin.resolve.calls.commonSuperType import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.checkers.PrimitiveNumericComparisonInfo import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt index 9e64d4e4bdb..89b7ef2eb31 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt @@ -282,6 +282,10 @@ interface IrTypeSystemContext : TypeSystemContext, TypeSystemCommonSuperTypesCon override fun SimpleTypeMarker.isPrimitiveType(): Boolean = this is IrSimpleType && irTypePredicates_isPrimitiveType() + override fun createErrorType(debugName: String): SimpleTypeMarker { + TODO("IrTypeSystemContext doesn't support constraint system resolution") + } + override fun createErrorTypeWithCustomConstructor(debugName: String, constructor: TypeConstructorMarker): KotlinTypeMarker = TODO("IrTypeSystemContext doesn't support constraint system resolution") diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/CommonSuperTypeUtils.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/CommonSuperTypeUtils.kt new file mode 100644 index 00000000000..305cd42103b --- /dev/null +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/CommonSuperTypeUtils.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.resolve.calls + +import org.jetbrains.kotlin.types.UnwrappedType +import org.jetbrains.kotlin.types.checker.SimpleClassicTypeSystemContext + +fun NewCommonSuperTypeCalculator.commonSuperType(types: List): UnwrappedType { + return SimpleClassicTypeSystemContext.commonSuperType(types) as UnwrappedType +} diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/NewCommonSuperTypeCalculator.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/NewCommonSuperTypeCalculator.kt index 0fe5c24788a..938c00e0f01 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/NewCommonSuperTypeCalculator.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/NewCommonSuperTypeCalculator.kt @@ -16,18 +16,14 @@ package org.jetbrains.kotlin.resolve.calls -import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.AbstractFlexibilityChecker.hasDifferentFlexibilityAtDepth +import org.jetbrains.kotlin.types.AbstractNullabilityChecker import org.jetbrains.kotlin.types.AbstractNullabilityChecker.hasPathByNotMarkedNullableNodes -import org.jetbrains.kotlin.types.checker.SimpleClassicTypeSystemContext +import org.jetbrains.kotlin.types.AbstractTypeChecker +import org.jetbrains.kotlin.types.AbstractTypeCheckerContext import org.jetbrains.kotlin.types.model.* object NewCommonSuperTypeCalculator { - // TODO: Bridge for old calls - fun commonSuperType(types: List): UnwrappedType { - return SimpleClassicTypeSystemContext.commonSuperType(types) as UnwrappedType - } - fun TypeSystemCommonSuperTypesContext.commonSuperType(types: List): KotlinTypeMarker { val maxDepth = types.maxOfOrNull { it.typeDepth() } ?: 0 return commonSuperType(types, -maxDepth, true) @@ -96,8 +92,8 @@ object NewCommonSuperTypeCalculator { contextStubTypesEqualToAnything: AbstractTypeCheckerContext, contextStubTypesNotEqual: AbstractTypeCheckerContext ): SimpleTypeMarker { - if (types.any { it is ErrorType }) { - return ErrorUtils.createErrorType("CST(${types.joinToString()}") + if (types.any { it.isError() }) { + return createErrorType("CST(${types.joinToString()}") } // i.e. result type also should be marked nullable diff --git a/compiler/resolution/src/org/jetbrains/kotlin/types/AbstractTypeApproximator.kt b/compiler/resolution/src/org/jetbrains/kotlin/types/AbstractTypeApproximator.kt index 30729fe7eb2..1dff6729d95 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/types/AbstractTypeApproximator.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/types/AbstractTypeApproximator.kt @@ -25,8 +25,6 @@ abstract class AbstractTypeApproximator(val ctx: TypeSystemInferenceExtensionCon const val CACHE_FOR_INCORPORATION_MAX_SIZE = 500 } - abstract fun createErrorType(message: String): SimpleTypeMarker - // null means that this input type is the result, i.e. input type not contains not-allowed kind of types // type <: resultType fun approximateToSuperType(type: KotlinTypeMarker, conf: TypeApproximatorConfiguration): KotlinTypeMarker? = diff --git a/compiler/resolution/src/org/jetbrains/kotlin/types/TypeApproximator.kt b/compiler/resolution/src/org/jetbrains/kotlin/types/TypeApproximator.kt index 080e933fa1a..20cfd25dd1c 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/types/TypeApproximator.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/types/TypeApproximator.kt @@ -20,7 +20,6 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.resolve.calls.components.ClassicTypeSystemContextForCS -import org.jetbrains.kotlin.types.model.SimpleTypeMarker class TypeApproximator(builtIns: KotlinBuiltIns) : AbstractTypeApproximator(ClassicTypeSystemContextForCS(builtIns)) { fun approximateDeclarationType(baseType: KotlinType, local: Boolean, languageVersionSettings: LanguageVersionSettings): UnwrappedType { @@ -39,9 +38,5 @@ class TypeApproximator(builtIns: KotlinBuiltIns) : AbstractTypeApproximator(Clas // resultType <: type fun approximateToSubType(type: UnwrappedType, conf: TypeApproximatorConfiguration): UnwrappedType? = super.approximateToSubType(type, conf) as UnwrappedType? - - override fun createErrorType(message: String): SimpleTypeMarker { - return ErrorUtils.createErrorType(message) - } } 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 f7418e26fd1..c8aa999f3b4 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 @@ -68,6 +68,7 @@ interface TypeSystemTypeFactoryContext { fun createTypeArgument(type: KotlinTypeMarker, variance: TypeVariance): TypeArgumentMarker fun createStarProjection(typeParameter: TypeParameterMarker): TypeArgumentMarker + fun createErrorType(debugName: String): SimpleTypeMarker fun createErrorTypeWithCustomConstructor(debugName: String, constructor: TypeConstructorMarker): KotlinTypeMarker } diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt b/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt index 170dfbb2011..495c6148f3a 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt @@ -561,6 +561,10 @@ interface ClassicTypeSystemContext : TypeSystemInferenceExtensionContext, TypeSy return captureFromExpressionInternal(type as UnwrappedType) } + override fun createErrorType(debugName: String): SimpleTypeMarker { + return ErrorUtils.createErrorType(debugName) + } + override fun createErrorTypeWithCustomConstructor(debugName: String, constructor: TypeConstructorMarker): KotlinTypeMarker { require(constructor is TypeConstructor, constructor::errorMessage) return ErrorUtils.createErrorTypeWithCustomConstructor(debugName, constructor)