From 527c5a771d39eccf3fc3f8bfdebb3174bef6ab10 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 25 Aug 2020 18:39:45 +0300 Subject: [PATCH] [NI] Get rid of FE 1.0 types in AbstractTypeCheckerContextForConstraintSystem --- .../kotlin/fir/types/ConeInferenceContext.kt | 8 ++++++++ .../components/ClassicTypeSystemContextForCS.kt | 9 +++++++++ .../AbstractTypeCheckerContextForConstraintSystem.kt | 12 +++++++----- .../kotlin/types/model/TypeSystemContext.kt | 3 +++ .../kotlin/types/checker/ClassicTypeSystemContext.kt | 8 ++++++++ 5 files changed, 35 insertions(+), 5 deletions(-) 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 1b94c70a7ec..c92b0f51ab6 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 @@ -316,6 +316,14 @@ interface ConeInferenceContext : TypeSystemInferenceExtensionContext, ConeTypeCo return this.defaultType } + override fun TypeConstructorMarker.isTypeVariable(): Boolean { + return this is ConeTypeVariableTypeConstructor + } + + override fun TypeVariableTypeConstructorMarker.isContainedInInvariantOrContravariantPositions(): Boolean { + return false + } + override fun captureFromExpression(type: KotlinTypeMarker): KotlinTypeMarker? { return 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 e13bc9acb51..026b0232b30 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 @@ -76,6 +76,15 @@ class ClassicTypeSystemContextForCS(override val builtIns: KotlinBuiltIns) : Typ override fun createStubType(typeVariable: TypeVariableMarker): StubTypeMarker { return StubType(typeVariable.freshTypeConstructor() as TypeConstructor, typeVariable.defaultType().isMarkedNullable()) } + + override fun TypeConstructorMarker.isTypeVariable(): Boolean { + return this is TypeVariableTypeConstructor + } + + override fun TypeVariableTypeConstructorMarker.isContainedInInvariantOrContravariantPositions(): Boolean { + require(this is TypeVariableTypeConstructor) + return isContainedInInvariantOrContravariantPositions + } } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/AbstractTypeCheckerContextForConstraintSystem.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/AbstractTypeCheckerContextForConstraintSystem.kt index 055f6e06435..93be486e8b3 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/AbstractTypeCheckerContextForConstraintSystem.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/AbstractTypeCheckerContextForConstraintSystem.kt @@ -5,11 +5,9 @@ package org.jetbrains.kotlin.resolve.calls.inference.components -import org.jetbrains.kotlin.resolve.calls.inference.model.TypeVariableTypeConstructor import org.jetbrains.kotlin.types.AbstractNullabilityChecker import org.jetbrains.kotlin.types.AbstractTypeChecker import org.jetbrains.kotlin.types.AbstractTypeCheckerContext -import org.jetbrains.kotlin.types.checker.NewCapturedType import org.jetbrains.kotlin.types.model.* abstract class AbstractTypeCheckerContextForConstraintSystem : AbstractTypeCheckerContext(), TypeSystemInferenceExtensionContext { @@ -212,9 +210,13 @@ abstract class AbstractTypeCheckerContextForConstraintSystem : AbstractTypeCheck val typeVariableTypeConstructor = typeVariable.typeConstructor() val subTypeConstructor = subType.typeConstructor() - if (subTypeConstructor !is TypeVariableTypeConstructor && typeVariableTypeConstructor is TypeVariableTypeConstructor && typeVariableTypeConstructor.isContainedInInvariantOrContravariantPositions) { - if (subType is NewCapturedType) { - subType.withNotNullProjection() + if ( + !subTypeConstructor.isTypeVariable() && + typeVariableTypeConstructor.isTypeVariable() && + (typeVariableTypeConstructor as TypeVariableTypeConstructorMarker).isContainedInInvariantOrContravariantPositions() + ) { + if (subType.isCapturedType()) { + (subType as CapturedTypeMarker).withNotNullProjection() } else { subType.withNullability(false) } 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 7d5e706bd9c..31fbd5c2364 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 @@ -173,6 +173,9 @@ interface TypeSystemInferenceExtensionContext : TypeSystemContext, TypeSystemBui firstCandidate: KotlinTypeMarker, secondCandidate: KotlinTypeMarker ): KotlinTypeMarker + + fun TypeConstructorMarker.isTypeVariable(): Boolean + fun TypeVariableTypeConstructorMarker.isContainedInInvariantOrContravariantPositions(): Boolean } 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 48288e3952c..cb4dcd9e0d2 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt @@ -517,6 +517,14 @@ interface ClassicTypeSystemContext : TypeSystemInferenceExtensionContext, TypeSy errorSupportedOnlyInTypeInference() } + override fun TypeConstructorMarker.isTypeVariable(): Boolean { + errorSupportedOnlyInTypeInference() + } + + override fun TypeVariableTypeConstructorMarker.isContainedInInvariantOrContravariantPositions(): Boolean { + errorSupportedOnlyInTypeInference() + } + override fun findCommonIntegerLiteralTypesSuperType(explicitSupertypes: List): SimpleTypeMarker? { @Suppress("UNCHECKED_CAST") explicitSupertypes as List