From 2d91917ac77ea30c6b3d8ae2033b91b6a94f0f8f Mon Sep 17 00:00:00 2001 From: Pavel Kirpichenkov Date: Fri, 16 Jul 2021 16:01:57 +0300 Subject: [PATCH] [MPP] Make type refinement capability aware of HMPP state Introduce intermediate state for cases when module doens't have a type refiner even though HMPP is enabled. KT-46691 --- .../kotlin/descriptors/impl/ModuleDescriptorImpl.kt | 7 +------ .../org/jetbrains/kotlin/resolve/DescriptorUtils.kt | 12 ++++++++---- .../jetbrains/kotlin/types/KotlinTypeRefinerImpl.kt | 5 +++-- .../kotlin/types/checker/KotlinTypeRefiner.kt | 10 ++++++++-- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt index e1d59c79715..6db91484af7 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt @@ -23,9 +23,6 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.storage.StorageManager -import org.jetbrains.kotlin.types.checker.REFINER_CAPABILITY -import org.jetbrains.kotlin.types.checker.Ref -import org.jetbrains.kotlin.types.refinement.TypeRefinement import org.jetbrains.kotlin.utils.sure class ModuleDescriptorImpl @JvmOverloads constructor( @@ -44,9 +41,7 @@ class ModuleDescriptorImpl @JvmOverloads constructor( if (!moduleName.isSpecial) { throw IllegalArgumentException("Module name must be special: $moduleName") } - this.capabilities = capabilities.toMutableMap() - @OptIn(TypeRefinement::class) - this.capabilities[REFINER_CAPABILITY] = Ref(null) + this.capabilities = capabilities packageViewDescriptorFactory = getCapability(PackageViewDescriptorFactory.CAPABILITY) ?: PackageViewDescriptorFactory.Default } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt index 60317aa1d6e..2f94f6b9034 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt @@ -25,12 +25,11 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils.getContainingClass import org.jetbrains.kotlin.resolve.constants.ConstantValue import org.jetbrains.kotlin.resolve.constants.EnumValue import org.jetbrains.kotlin.resolve.isInlineClass -import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter -import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.checker.KotlinTypeChecker import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner import org.jetbrains.kotlin.types.checker.REFINER_CAPABILITY +import org.jetbrains.kotlin.types.checker.TypeRefinementSupport import org.jetbrains.kotlin.types.refinement.TypeRefinement import org.jetbrains.kotlin.types.typeUtil.contains import org.jetbrains.kotlin.types.typeUtil.isAnyOrNullableAny @@ -419,10 +418,15 @@ fun DeclarationDescriptor.isPrimaryConstructorOfInlineClass(): Boolean = this is ConstructorDescriptor && this.isPrimary && this.constructedClass.isInlineClass() @TypeRefinement -fun ModuleDescriptor.getKotlinTypeRefiner(): KotlinTypeRefiner = getCapability(REFINER_CAPABILITY)?.value ?: KotlinTypeRefiner.Default +fun ModuleDescriptor.getKotlinTypeRefiner(): KotlinTypeRefiner = + when (val refinerCapability = getCapability(REFINER_CAPABILITY)?.value) { + is TypeRefinementSupport.Enabled -> refinerCapability.typeRefiner + else -> KotlinTypeRefiner.Default + } @OptIn(TypeRefinement::class) -fun ModuleDescriptor.isTypeRefinementEnabled(): Boolean = getCapability(REFINER_CAPABILITY)?.value != null +fun ModuleDescriptor.isTypeRefinementEnabled(): Boolean = + getCapability(REFINER_CAPABILITY)?.value?.isEnabled == true val VariableDescriptor.isUnderscoreNamed get() = !name.isSpecial && name.identifier == "_" diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/KotlinTypeRefinerImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/types/KotlinTypeRefinerImpl.kt index c06b2c5de4d..8523f7475cc 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/KotlinTypeRefinerImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/KotlinTypeRefinerImpl.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2021 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. */ @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner import org.jetbrains.kotlin.types.checker.NewCapturedTypeConstructor import org.jetbrains.kotlin.types.checker.REFINER_CAPABILITY +import org.jetbrains.kotlin.types.checker.TypeRefinementSupport import org.jetbrains.kotlin.types.refinement.TypeRefinement import org.jetbrains.kotlin.utils.DFS import org.jetbrains.kotlin.utils.addToStdlib.safeAs @@ -24,7 +25,7 @@ class KotlinTypeRefinerImpl( storageManager: StorageManager ) : KotlinTypeRefiner() { init { - moduleDescriptor.getCapability(REFINER_CAPABILITY)?.value = this + moduleDescriptor.getCapability(REFINER_CAPABILITY)?.value = TypeRefinementSupport.Enabled(this) } private val refinedTypeCache = storageManager.createCacheWithNotNullValues() diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/checker/KotlinTypeRefiner.kt b/core/descriptors/src/org/jetbrains/kotlin/types/checker/KotlinTypeRefiner.kt index a1e0a0a07e2..1b8d331e744 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/checker/KotlinTypeRefiner.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/checker/KotlinTypeRefiner.kt @@ -75,7 +75,13 @@ abstract class KotlinTypeRefiner { @TypeRefinement fun KotlinTypeRefiner.refineTypes(types: Iterable): List = types.map { refineType(it) } -class Ref(var value: T?) +class Ref(var value: T) @TypeRefinement -val REFINER_CAPABILITY = ModuleCapability>("KotlinTypeRefiner") +val REFINER_CAPABILITY = ModuleCapability>("KotlinTypeRefiner") + +sealed class TypeRefinementSupport(val isEnabled: Boolean) { + object Disabled : TypeRefinementSupport(isEnabled = false) + object EnabledUninitialized : TypeRefinementSupport(isEnabled = true) + class Enabled(val typeRefiner: KotlinTypeRefiner) : TypeRefinementSupport(isEnabled = true) +}