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:
committed by
Space Team
parent
3e2f8b834c
commit
be2a85be71
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user