From 3c8ed21e59d6ed46ebd8b4cc1d187b7a96323945 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 5 Jun 2019 14:51:13 +0300 Subject: [PATCH] Optimize ConstraintInjector::isMyTypeVariable Do not look into the map for constructors that are not type variables --- .../kotlin/fir/resolve/calls/ConeInferenceContext.kt | 7 ++++++- .../calls/components/ClassicTypeSystemContextForCS.kt | 8 +++++++- .../calls/inference/components/ConstraintInjector.kt | 5 +++-- .../kotlin/types/checker/ClassicTypeSystemContext.kt | 11 +++++++---- .../jetbrains/kotlin/types/model/TypeSystemContext.kt | 1 + 5 files changed, 24 insertions(+), 8 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 8855c11fecf..c0f742d7f61 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 @@ -246,6 +246,11 @@ interface ConeInferenceContext : TypeSystemInferenceExtensionContext, return this.typeConstructor } + override fun KotlinTypeMarker.mayBeTypeVariable(): Boolean { + require(this is ConeKotlinType) + return this is ConeTypeVariableType + } + override fun CapturedTypeMarker.typeConstructorProjection(): TypeArgumentMarker { require(this is ConeCapturedType) return this.constructor.projection @@ -310,4 +315,4 @@ interface ConeInferenceContext : TypeSystemInferenceExtensionContext, override fun TypeConstructorMarker.isCapturedTypeConstructor(): Boolean { return this is ConeCapturedTypeConstructor } -} \ No newline at end of file +} 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 df4b05c2ca3..0defce5d5af 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 @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.resolve.calls.inference.components.NewTypeSubstituto import org.jetbrains.kotlin.resolve.calls.inference.components.NewTypeSubstitutorByConstructorMap import org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintSystemImpl import org.jetbrains.kotlin.resolve.calls.inference.model.NewTypeVariable +import org.jetbrains.kotlin.resolve.calls.inference.model.TypeVariableTypeConstructor import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.checker.ClassicTypeSystemContext import org.jetbrains.kotlin.types.checker.NewCapturedType @@ -32,6 +33,11 @@ class ClassicTypeSystemContextForCS(override val builtIns: KotlinBuiltIns) : Typ return this.freshTypeConstructor } + override fun KotlinTypeMarker.mayBeTypeVariable(): Boolean { + require(this is KotlinType, this::errorMessage) + return this.constructor is TypeVariableTypeConstructor + } + override fun createCapturedType( constructorProjection: TypeArgumentMarker, constructorSupertypes: List, @@ -84,4 +90,4 @@ fun NewConstraintSystemImpl( builtIns: KotlinBuiltIns ): NewConstraintSystemImpl { return NewConstraintSystemImpl(constraintInjector, ClassicTypeSystemContextForCS(builtIns)) -} \ No newline at end of file +} diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintInjector.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintInjector.kt index ccfebe53e9f..eeea3f95307 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintInjector.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintInjector.kt @@ -143,7 +143,8 @@ class ConstraintInjector(val constraintIncorporator: ConstraintIncorporator, val } // from AbstractTypeCheckerContextForConstraintSystem - override fun isMyTypeVariable(type: SimpleTypeMarker): Boolean = c.allTypeVariables.containsKey(type.typeConstructor()) + override fun isMyTypeVariable(type: SimpleTypeMarker): Boolean = + type.mayBeTypeVariable() && c.allTypeVariables.containsKey(type.typeConstructor()) override fun addUpperConstraint(typeVariable: TypeConstructorMarker, superType: KotlinTypeMarker) = addConstraint(typeVariable, superType, UPPER) @@ -244,4 +245,4 @@ class ConstraintInjector(val constraintIncorporator: ConstraintIncorporator, val } } -data class ConstraintContext(val kind: ConstraintKind, val derivedFrom: Set) \ No newline at end of file +data class ConstraintContext(val kind: ConstraintKind, val derivedFrom: Set) 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 058f1296209..47c63f4d496 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt @@ -11,18 +11,17 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.resolve.calls.inference.CapturedType +import org.jetbrains.kotlin.resolve.constants.IntegerLiteralTypeConstructor import org.jetbrains.kotlin.resolve.descriptorUtil.hasExactAnnotation import org.jetbrains.kotlin.resolve.descriptorUtil.hasNoInferAnnotation -import org.jetbrains.kotlin.resolve.constants.IntegerLiteralTypeConstructor import org.jetbrains.kotlin.resolve.descriptorUtil.isExactAnnotation import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.model.* -import org.jetbrains.kotlin.types.model.CaptureStatus import org.jetbrains.kotlin.types.typeUtil.asTypeProjection import org.jetbrains.kotlin.types.typeUtil.contains -import kotlin.math.max import kotlin.contracts.ExperimentalContracts import kotlin.contracts.contract +import kotlin.math.max interface ClassicTypeSystemContext : TypeSystemInferenceExtensionContext { override fun TypeConstructorMarker.isDenotable(): Boolean { @@ -376,6 +375,10 @@ interface ClassicTypeSystemContext : TypeSystemInferenceExtensionContext { errorSupportedOnlyInTypeInference() } + override fun KotlinTypeMarker.mayBeTypeVariable(): Boolean { + errorSupportedOnlyInTypeInference() + } + override fun CapturedTypeMarker.typeConstructorProjection(): TypeArgumentMarker { require(this is NewCapturedType, this::errorMessage) return this.constructor.projection @@ -563,4 +566,4 @@ fun requireOrDescribe(condition: Boolean, value: Any?) { } else "" "Unexpected: value = '$value'$typeInfo" } -} \ No newline at end of file +} 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 39ff35c9caf..2be3853c31b 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 @@ -122,6 +122,7 @@ interface TypeSystemInferenceExtensionContext : TypeSystemContext, TypeSystemBui fun TypeVariableMarker.freshTypeConstructor(): TypeConstructorMarker + fun KotlinTypeMarker.mayBeTypeVariable(): Boolean fun CapturedTypeMarker.typeConstructorProjection(): TypeArgumentMarker fun CapturedTypeMarker.captureStatus(): CaptureStatus