From c452934f5b941f686b2c89902ba54e618cba0279 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 27 Jun 2019 00:57:33 +0200 Subject: [PATCH] Pull isNullableType and related extensions up into TypeSystemContext --- .../fir/resolve/calls/ConeInferenceContext.kt | 15 --------------- .../kotlin/fir/resolve/calls/InferenceUtil.kt | 19 +++++++++++++------ .../kotlin/fir/types/ConeTypeContext.kt | 17 ++++++++++++++++- .../kotlin/types/model/TypeSystemContext.kt | 12 ++++++------ 4 files changed, 35 insertions(+), 28 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeInferenceContext.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeInferenceContext.kt index c0f742d7f61..aa7f192b78f 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeInferenceContext.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeInferenceContext.kt @@ -256,21 +256,6 @@ interface ConeInferenceContext : TypeSystemInferenceExtensionContext, return this.constructor.projection } - override fun KotlinTypeMarker.isNullableType(): Boolean { - require(this is ConeKotlinType) - if (this.isMarkedNullable) - return true - - if (this is ConeFlexibleType && this.upperBound.isNullableType()) - return true - - if (this is ConeTypeParameterType /* || is TypeVariable */) - return hasNullableSuperType(type) - - // TODO: Intersection types - return false - } - override fun DefinitelyNotNullTypeMarker.original(): SimpleTypeMarker { require(this is ConeDefinitelyNotNullType) return this.original() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/InferenceUtil.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/InferenceUtil.kt index da27933cc70..15c4b57a423 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/InferenceUtil.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/InferenceUtil.kt @@ -6,19 +6,26 @@ package org.jetbrains.kotlin.fir.resolve.calls import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.resolve.* +import org.jetbrains.kotlin.fir.resolve.ScopeSession +import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator -import org.jetbrains.kotlin.fir.symbols.* +import org.jetbrains.kotlin.fir.symbols.ConeClassifierLookupTag +import org.jetbrains.kotlin.fir.symbols.ConeSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.calls.inference.components.* +import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintIncorporator +import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintInjector +import org.jetbrains.kotlin.resolve.calls.inference.components.ResultTypeResolver +import org.jetbrains.kotlin.resolve.calls.inference.components.TrivialConstraintTypeInferenceOracle import org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintSystemImpl import org.jetbrains.kotlin.types.AbstractTypeApproximator -import org.jetbrains.kotlin.types.model.* +import org.jetbrains.kotlin.types.model.SimpleTypeMarker +import org.jetbrains.kotlin.types.model.TypeSystemInferenceExtensionContextDelegate +import org.jetbrains.kotlin.types.model.TypeVariableMarker +import org.jetbrains.kotlin.types.model.TypeVariableTypeConstructorMarker - -fun ConeInferenceContext.hasNullableSuperType(type: ConeKotlinType): Boolean { +fun ConeTypeContext.hasNullableSuperType(type: ConeKotlinType): Boolean { if (type is ConeClassLikeType) return false if (type !is ConeLookupTagBasedType) return false // TODO? diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt index 03a075c6e44..6e993e05c18 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.declarations.expandedConeType import org.jetbrains.kotlin.fir.declarations.superConeTypes import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.calls.ConeTypeVariableTypeConstructor +import org.jetbrains.kotlin.fir.resolve.calls.hasNullableSuperType import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe @@ -28,7 +29,6 @@ import org.jetbrains.kotlin.types.AbstractTypeCheckerContext import org.jetbrains.kotlin.types.checker.convertVariance import org.jetbrains.kotlin.types.model.* - class ErrorTypeConstructor(reason: String) : TypeConstructorMarker interface ConeTypeContext : TypeSystemContext, TypeSystemOptimizationContext { @@ -408,6 +408,21 @@ interface ConeTypeContext : TypeSystemContext, TypeSystemOptimizationContext { else -> type } } + + override fun KotlinTypeMarker.isNullableType(): Boolean { + require(this is ConeKotlinType) + if (this.isMarkedNullable) + return true + + if (this is ConeFlexibleType && this.upperBound.isNullableType()) + return true + + if (this is ConeTypeParameterType /* || is TypeVariable */) + return hasNullableSuperType(type) + + // TODO: Intersection types + return false + } } class ConeTypeCheckerContext(override val isErrorTypeEqualsToAnything: Boolean, override val session: FirSession) : diff --git a/core/type-system/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt b/core/type-system/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt index 124681119a9..38292954e84 100644 --- a/core/type-system/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt +++ b/core/type-system/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt @@ -127,12 +127,6 @@ interface TypeSystemInferenceExtensionContext : TypeSystemContext, TypeSystemBui fun CapturedTypeMarker.typeConstructorProjection(): TypeArgumentMarker fun CapturedTypeMarker.captureStatus(): CaptureStatus - fun KotlinTypeMarker.isNullableType(): Boolean - - fun KotlinTypeMarker.isNullableAny() = this.typeConstructor().isAnyConstructor() && this.isNullableType() - fun KotlinTypeMarker.isNothing() = this.typeConstructor().isNothingConstructor() && !this.isNullableType() - fun KotlinTypeMarker.isNullableNothing() = this.typeConstructor().isNothingConstructor() && this.isNullableType() - fun DefinitelyNotNullTypeMarker.original(): SimpleTypeMarker fun typeSubstitutorByTypeConstructor(map: Map): TypeSubstitutorMarker @@ -217,6 +211,12 @@ interface TypeSystemContext : TypeSystemOptimizationContext { fun KotlinTypeMarker.typeConstructor(): TypeConstructorMarker = (asSimpleType() ?: lowerBoundIfFlexible()).typeConstructor() + fun KotlinTypeMarker.isNullableType(): Boolean + + fun KotlinTypeMarker.isNullableAny() = this.typeConstructor().isAnyConstructor() && this.isNullableType() + fun KotlinTypeMarker.isNothing() = this.typeConstructor().isNothingConstructor() && !this.isNullableType() + fun KotlinTypeMarker.isNullableNothing() = this.typeConstructor().isNothingConstructor() && this.isNullableType() + fun SimpleTypeMarker.isClassType(): Boolean = typeConstructor().isClassTypeConstructor() fun SimpleTypeMarker.fastCorrespondingSupertypes(constructor: TypeConstructorMarker): List? = null