K2: support implicit integer to unsigned conversions...

with dedicated opt-in language feature and special
annotation or module capability.
Not intended for a general use, solves specific K/N
scenario with interop libs.
#KT-55902 fixed
This commit is contained in:
Ilya Chernikov
2023-02-04 13:21:58 +01:00
committed by Space Team
parent 3e2f8b834c
commit be2a85be71
30 changed files with 581 additions and 29 deletions
@@ -0,0 +1,43 @@
/*
* Copyright 2010-2023 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.
*/
package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.fir.util.ConeTypeRegistry
import org.jetbrains.kotlin.util.AttributeArrayOwner
import org.jetbrains.kotlin.util.TypeRegistry
import kotlin.reflect.KClass
abstract class FirModuleCapability {
abstract val key: KClass<out FirModuleCapability>
}
class FirModuleCapabilities private constructor(
capabilities: List<FirModuleCapability>
) : AttributeArrayOwner<FirModuleCapability, FirModuleCapability>() {
companion object : ConeTypeRegistry<FirModuleCapability, FirModuleCapability>() {
val Empty: FirModuleCapabilities = FirModuleCapabilities(emptyList())
fun create(attributes: List<FirModuleCapability>): FirModuleCapabilities {
return if (attributes.isEmpty()) {
Empty
} else {
FirModuleCapabilities(attributes)
}
}
}
init {
for (capability in capabilities) {
registerComponent(capability.key, capability)
}
}
override val typeRegistry: TypeRegistry<FirModuleCapability, FirModuleCapability>
get() = Companion
}
@@ -50,6 +50,9 @@ abstract class FirModuleData : FirSessionComponent {
// refactor them to make API clearer
abstract val analyzerServices: PlatformDependentAnalyzerServices
open val capabilities: FirModuleCapabilities
get() = FirModuleCapabilities.Empty
private var _session: FirSession? = null
val session: FirSession
get() = _session
@@ -73,7 +76,8 @@ class FirModuleDataImpl(
override val dependsOnDependencies: List<FirModuleData>,
override val friendDependencies: List<FirModuleData>,
override val platform: TargetPlatform,
override val analyzerServices: PlatformDependentAnalyzerServices
override val analyzerServices: PlatformDependentAnalyzerServices,
override val capabilities: FirModuleCapabilities = FirModuleCapabilities.Empty
) : FirModuleData()
val FirSession.nullableModuleData: FirModuleData? by FirSession.nullableSessionComponentAccessor()
@@ -31,6 +31,9 @@ val FirTypeRef.coneType: ConeKotlinType
get() = coneTypeSafe()
?: error("Expected FirResolvedTypeRef with ConeKotlinType but was ${this::class.simpleName} ${render()}")
val FirTypeRef.coneTypeOrNull: ConeKotlinType?
get() = coneTypeSafe()
val FirTypeRef.isAny: Boolean get() = isBuiltinType(StandardClassIds.Any, false)
val FirTypeRef.isNullableAny: Boolean get() = isBuiltinType(StandardClassIds.Any, true)
val FirTypeRef.isNothing: Boolean get() = isBuiltinType(StandardClassIds.Nothing, false)