From 8f8e33f25136e92092c4a2c123b812d962097db8 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Thu, 18 Apr 2019 14:41:24 +0300 Subject: [PATCH] [NI] Strip only `Exact`-annotation preserving others during inference --- .../AbstractTypeCheckerContextForConstraintSystem.kt | 4 ++-- .../org/jetbrains/kotlin/resolve/annotationsForResolve.kt | 2 ++ .../kotlin/types/checker/ClassicTypeSystemContext.kt | 8 ++++++++ .../org/jetbrains/kotlin/types/model/TypeSystemContext.kt | 1 + 4 files changed, 13 insertions(+), 2 deletions(-) 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 653d0ae2714..f3726f9eadf 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 @@ -45,8 +45,8 @@ abstract class AbstractTypeCheckerContextForConstraintSystem : AbstractTypeCheck val hasExact = subType.isTypeVariableWithExact() || superType.isTypeVariableWithExact() // we should strip annotation's because we have incorporation operation and they should be not affected - val mySubType = if (hasExact) subType.removeAnnotations() else subType - val mySuperType = if (hasExact) superType.removeAnnotations() else superType + val mySubType = if (hasExact) subType.removeExactAnnotation() else subType + val mySuperType = if (hasExact) superType.removeExactAnnotation() else superType val result = internalAddSubtypeConstraint(mySubType, mySuperType) if (!hasExact) return result diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/annotationsForResolve.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/annotationsForResolve.kt index dd4480c070c..53f1bb76106 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/annotationsForResolve.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/annotationsForResolve.kt @@ -28,6 +28,8 @@ fun KotlinType.hasNoInferAnnotation(): Boolean = annotations.hasAnnotation(NO_IN fun KotlinType.hasExactAnnotation(): Boolean = annotations.hasAnnotation(EXACT_ANNOTATION_FQ_NAME) +fun AnnotationDescriptor.isExactAnnotation(): Boolean = this.fqName == EXACT_ANNOTATION_FQ_NAME + fun Annotations.hasInternalAnnotationForResolve(): Boolean = hasAnnotation(NO_INFER_ANNOTATION_FQ_NAME) || hasAnnotation(EXACT_ANNOTATION_FQ_NAME) 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 74be1735287..e955ce1163a 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt @@ -8,11 +8,13 @@ package org.jetbrains.kotlin.types.checker import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns.FQ_NAMES 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.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 @@ -343,6 +345,12 @@ interface ClassicTypeSystemContext : TypeSystemInferenceExtensionContext { return this.replaceAnnotations(Annotations.EMPTY) } + override fun KotlinTypeMarker.removeExactAnnotation(): KotlinTypeMarker { + require(this is UnwrappedType, this::errorMessage) + val annotationsWithoutExact = this.annotations.filterNot(AnnotationDescriptor::isExactAnnotation) + return this.replaceAnnotations(Annotations.create(annotationsWithoutExact)) + } + override fun KotlinTypeMarker.hasExactAnnotation(): Boolean { require(this is UnwrappedType, this::errorMessage) return hasExactInternal(this) 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 e1018cbcd38..fe2b0d2aa82 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 @@ -107,6 +107,7 @@ interface TypeSystemInferenceExtensionContext : TypeSystemContext, TypeSystemBui fun KotlinTypeMarker.removeAnnotations(): KotlinTypeMarker + fun KotlinTypeMarker.removeExactAnnotation(): KotlinTypeMarker fun SimpleTypeMarker.replaceArguments(newArguments: List): SimpleTypeMarker