[K/N] Remove module-wide ObsoleteDescriptorBasedApi opt-in
This commit is contained in:
committed by
Space Team
parent
046b629baa
commit
cd3237295b
@@ -169,11 +169,6 @@ fun IrMemberAccessExpression<*>.addArguments(args: Map<ParameterDescriptor, IrEx
|
||||
}
|
||||
}
|
||||
|
||||
@ObsoleteDescriptorBasedAPI
|
||||
@Suppress("unused") // Used in kotlin-native
|
||||
fun IrMemberAccessExpression<*>.addArguments(args: List<Pair<ParameterDescriptor, IrExpression>>) =
|
||||
this.addArguments(args.toMap())
|
||||
|
||||
fun IrExpression.isNullConst() = this is IrConst<*> && this.kind == IrConstKind.Null
|
||||
|
||||
fun IrExpression.isTrueConst() = this is IrConst<*> && this.kind == IrConstKind.Boolean && this.value == true
|
||||
|
||||
@@ -36,7 +36,6 @@ compileCompilerKotlin {
|
||||
kotlinOptions.jvmTarget = "1.8"
|
||||
kotlinOptions.freeCompilerArgs += [
|
||||
'-opt-in=kotlin.RequiresOptIn',
|
||||
'-opt-in=org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI',
|
||||
"-opt-in=kotlinx.cinterop.BetaInteropApi",
|
||||
"-opt-in=kotlinx.cinterop.ExperimentalForeignApi",
|
||||
'-Xskip-prerelease-check']
|
||||
|
||||
+4
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
|
||||
import org.jetbrains.kotlin.builtins.functions.FunctionTypeKind
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.declarations.impl.*
|
||||
import org.jetbrains.kotlin.ir.descriptors.IrAbstractDescriptorBasedFunctionFactory
|
||||
@@ -34,10 +35,12 @@ import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
|
||||
internal object DECLARATION_ORIGIN_FUNCTION_CLASS : IrDeclarationOriginImpl("DECLARATION_ORIGIN_FUNCTION_CLASS")
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
val IrPackageFragment.isFunctionInterfaceFile get() = packageFragmentDescriptor is FunctionInterfacePackageFragment
|
||||
|
||||
abstract class KonanIrAbstractDescriptorBasedFunctionFactory : IrProvider, IrAbstractDescriptorBasedFunctionFactory()
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
internal class LazyIrFunctionFactory(
|
||||
private val symbolTable: SymbolTable,
|
||||
private val stubGenerator: DeclarationStubGenerator,
|
||||
@@ -90,6 +93,7 @@ internal class LazyIrFunctionFactory(
|
||||
builtClassesMap.getOrPut(descriptor) { createClass(descriptor, declarator) }
|
||||
}
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
internal class BuiltInFictitiousFunctionIrClassFactory(
|
||||
private val symbolTable: SymbolTable,
|
||||
private val irBuiltIns: IrBuiltInsOverDescriptors,
|
||||
|
||||
+4
-3
@@ -6,11 +6,12 @@
|
||||
package org.jetbrains.kotlin.backend.konan
|
||||
|
||||
import org.jetbrains.kotlin.backend.common.atMostOne
|
||||
import org.jetbrains.kotlin.backend.konan.descriptors.isFromInteropLibrary
|
||||
import org.jetbrains.kotlin.backend.konan.descriptors.isInteropLibrary
|
||||
import org.jetbrains.kotlin.backend.konan.ir.isFromInteropLibrary
|
||||
import org.jetbrains.kotlin.backend.konan.llvm.FunctionOrigin
|
||||
import org.jetbrains.kotlin.backend.konan.llvm.llvmSymbolOrigin
|
||||
import org.jetbrains.kotlin.backend.konan.llvm.standardLlvmSymbolsOrigin
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.util.getPackageFragment
|
||||
import org.jetbrains.kotlin.konan.library.KonanLibrary
|
||||
@@ -116,13 +117,13 @@ internal class DependenciesTrackerImpl(
|
||||
return if (packageFragment.isFunctionInterfaceFile)
|
||||
FileOrigin.StdlibKFunctionImpl
|
||||
else {
|
||||
val library = when (val origin = packageFragment.packageFragmentDescriptor.llvmSymbolOrigin) {
|
||||
val library = when (val origin = packageFragment.llvmSymbolOrigin) {
|
||||
CurrentKlibModuleOrigin -> config.libraryToCache?.klib?.takeIf { config.producePerFileCache }
|
||||
else -> (origin as DeserializedKlibModuleOrigin).library
|
||||
}
|
||||
when {
|
||||
library == null -> FileOrigin.CurrentFile
|
||||
packageFragment.packageFragmentDescriptor.containingDeclaration.isFromInteropLibrary() ->
|
||||
packageFragment.isFromInteropLibrary() ->
|
||||
FileOrigin.EntireModule(library)
|
||||
else -> FileOrigin.CertainFile(library, packageFragment.packageFqName.asString(), filePathGetter())
|
||||
}
|
||||
|
||||
-1
@@ -6,7 +6,6 @@
|
||||
package org.jetbrains.kotlin.backend.konan
|
||||
|
||||
import org.jetbrains.kotlin.backend.konan.ir.konanLibrary
|
||||
import org.jetbrains.kotlin.builtins.FunctionInterfacePackageFragment
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.util.fileOrNull
|
||||
|
||||
+7
-5
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.konan.ir.parentDeclarationsWithSelf
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.descriptors.IrBasedClassConstructorDescriptor
|
||||
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
|
||||
@@ -180,7 +181,7 @@ private fun IrSimpleFunction.getObjCMethodInfo(onlyExternal: Boolean): ObjCMetho
|
||||
}
|
||||
|
||||
return overriddenSymbols.firstNotNullOfOrNull {
|
||||
assert(it.owner != this) { "Function ${it.owner.descriptor.fqNameSafe}() is wrongly contained in its own overriddenSymbols"}
|
||||
assert(it.owner != this) { "Function ${it.owner.fqNameWhenAvailable}() is wrongly contained in its own overriddenSymbols"}
|
||||
it.owner.getObjCMethodInfo(onlyExternal)
|
||||
}
|
||||
}
|
||||
@@ -290,6 +291,7 @@ fun IrConstructor.getObjCInitMethod(): IrSimpleFunction? {
|
||||
}
|
||||
}
|
||||
|
||||
@ObsoleteDescriptorBasedAPI
|
||||
fun ConstructorDescriptor.getObjCInitMethod(): FunctionDescriptor? {
|
||||
if (this is IrBasedClassConstructorDescriptor) {
|
||||
// E.g. in case of K2.
|
||||
@@ -341,13 +343,13 @@ fun inferObjCSelector(descriptor: FunctionDescriptor): String = if (descriptor.v
|
||||
}
|
||||
}
|
||||
|
||||
fun ClassDescriptor.getExternalObjCClassBinaryName(): String =
|
||||
fun IrClass.getExternalObjCClassBinaryName(): String =
|
||||
this.getExplicitExternalObjCClassBinaryName()
|
||||
?: this.name.asString()
|
||||
|
||||
fun ClassDescriptor.getExternalObjCMetaClassBinaryName(): String =
|
||||
fun IrClass.getExternalObjCMetaClassBinaryName(): String =
|
||||
this.getExplicitExternalObjCClassBinaryName()
|
||||
?: this.name.asString().removeSuffix("Meta")
|
||||
|
||||
private fun ClassDescriptor.getExplicitExternalObjCClassBinaryName() =
|
||||
this.annotations.findAnnotation(externalObjCClassFqName)!!.getStringValueOrNull("binaryName")
|
||||
private fun IrClass.getExplicitExternalObjCClassBinaryName() =
|
||||
this.annotations.findAnnotation(externalObjCClassFqName)!!.getAnnotationValueOrNull<String>("binaryName")
|
||||
|
||||
+2
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.builders.TranslationPluginContext
|
||||
import org.jetbrains.kotlin.ir.linkage.IrDeserializer
|
||||
import org.jetbrains.kotlin.ir.linkage.partial.partialLinkageConfig
|
||||
@@ -46,6 +47,7 @@ object KonanStubGeneratorExtensions : StubGeneratorExtensions() {
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
internal fun PsiToIrContext.psiToIr(
|
||||
input: PsiToIrInput,
|
||||
useLinkerWhenProducingLibrary: Boolean
|
||||
|
||||
+2
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.config.CommonConfigurationKeys.USE_FIR
|
||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.util.referenceFunction
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -119,6 +120,7 @@ internal class ExportedElementScope(val kind: ScopeKind, val name: String) {
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
internal class ExportedElement(
|
||||
val kind: ElementKind,
|
||||
val scope: ExportedElementScope,
|
||||
|
||||
+2
-4
@@ -36,7 +36,6 @@ import org.jetbrains.kotlin.konan.target.Family
|
||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.types.Variance
|
||||
import org.jetbrains.kotlin.types.checker.SimpleClassicTypeSystemContext.getClassFqNameUnsafe
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
|
||||
internal interface KotlinStubs {
|
||||
@@ -417,8 +416,7 @@ internal fun KotlinStubs.generateObjCCall(
|
||||
}
|
||||
|
||||
internal fun IrBuilderWithScope.getObjCClass(symbols: KonanSymbols, symbol: IrClassSymbol): IrExpression {
|
||||
val classDescriptor = symbol.descriptor
|
||||
require(!classDescriptor.isObjCMetaClass())
|
||||
require(!symbol.owner.isObjCMetaClass())
|
||||
return irCall(symbols.interopGetObjCClass, symbols.nativePtrType, listOf(symbol.starProjectedType))
|
||||
}
|
||||
|
||||
@@ -553,7 +551,7 @@ internal fun KotlinStubs.generateCFunctionPointer(
|
||||
)
|
||||
addKotlin(fakeFunction)
|
||||
|
||||
return IrFunctionReferenceImpl.fromSymbolDescriptor(
|
||||
return IrFunctionReferenceImpl.fromSymbolOwner(
|
||||
expression.startOffset,
|
||||
expression.endOffset,
|
||||
expression.type,
|
||||
|
||||
+2
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.backend.konan.KonanFqNames
|
||||
import org.jetbrains.kotlin.backend.konan.RuntimeNames
|
||||
import org.jetbrains.kotlin.backend.konan.ir.*
|
||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.types.*
|
||||
import org.jetbrains.kotlin.ir.util.fqNameForIrSerialization
|
||||
@@ -32,6 +33,7 @@ internal fun IrType.isCEnumType(): Boolean {
|
||||
private val cCall = RuntimeNames.cCall
|
||||
|
||||
// Make sure external stubs always get proper annotaions.
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
fun IrDeclaration.hasCCallAnnotation(name: String): Boolean =
|
||||
this.annotations.hasAnnotation(cCall.child(Name.identifier(name)))
|
||||
// LazyIr doesn't pass annotations from descriptor to IrValueParameter.
|
||||
|
||||
+1
-1
@@ -370,7 +370,7 @@ internal class ClassLayoutBuilder(val irClass: IrClass, val context: Context) {
|
||||
fun vtableIndex(function: IrSimpleFunction): Int {
|
||||
val bridgeDirections = function.target.bridgeDirectionsTo(function)
|
||||
val index = vtableEntries.indexOfFirst { it.function == function && it.bridgeDirections == bridgeDirections }
|
||||
if (index < 0) throw Error(function.render() + " $function " + " (${function.symbol.descriptor}) not in vtable of " + irClass.render())
|
||||
require(index >= 0) { "${function.render()} is not found in vtable of ${irClass.render()}" }
|
||||
return index
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.backend.konan.ir
|
||||
|
||||
import org.jetbrains.kotlin.backend.konan.*
|
||||
import org.jetbrains.kotlin.backend.konan.llvm.llvmSymbolOrigin
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.types.IrType
|
||||
import org.jetbrains.kotlin.ir.types.toKotlinType
|
||||
@@ -15,7 +16,7 @@ import org.jetbrains.kotlin.ir.util.getPackageFragment
|
||||
// This file contains some IR utilities which actually use descriptors.
|
||||
// TODO: port this code to IR.
|
||||
|
||||
internal val IrDeclaration.llvmSymbolOrigin get() = getPackageFragment().packageFragmentDescriptor.llvmSymbolOrigin
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
internal fun IrType.isObjCObjectType() = this.toKotlinType().isObjCObjectType()
|
||||
|
||||
|
||||
+2
@@ -9,11 +9,13 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
||||
|
||||
@ObsoleteDescriptorBasedAPI
|
||||
class ModuleIndex(val module: IrModuleFragment) {
|
||||
|
||||
/**
|
||||
|
||||
+19
-14
@@ -8,14 +8,15 @@ package org.jetbrains.kotlin.backend.konan.ir
|
||||
import org.jetbrains.kotlin.backend.common.atMostOne
|
||||
import org.jetbrains.kotlin.backend.konan.DECLARATION_ORIGIN_INLINE_CLASS_SPECIAL_FUNCTION
|
||||
import org.jetbrains.kotlin.backend.konan.descriptors.allOverriddenFunctions
|
||||
import org.jetbrains.kotlin.backend.konan.descriptors.isFromInteropLibrary
|
||||
import org.jetbrains.kotlin.backend.konan.descriptors.isInteropLibrary
|
||||
import org.jetbrains.kotlin.backend.konan.llvm.KonanMetadata
|
||||
import org.jetbrains.kotlin.backend.konan.serialization.KonanFileMetadataSource
|
||||
import org.jetbrains.kotlin.backend.konan.serialization.KonanIrModuleFragmentImpl
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyDeclarationBase
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl
|
||||
@@ -47,10 +48,6 @@ fun IrClass.isNothing() = this.isClassTypeWithSignature(IdSignatureValues.nothin
|
||||
|
||||
fun IrClass.getSuperInterfaces() = this.superClasses.map { it.owner }.filter { it.isInterface }
|
||||
|
||||
// Note: psi2ir doesn't set `origin = FAKE_OVERRIDE` for fields and properties yet.
|
||||
val IrProperty.isReal: Boolean get() = this.descriptor.kind.isReal
|
||||
val IrField.isReal: Boolean get() = this.descriptor.kind.isReal
|
||||
|
||||
fun IrClass.isSpecialClassWithNoSupertypes() = this.isAny() || this.isNothing()
|
||||
|
||||
inline fun <reified T> IrDeclaration.getAnnotationArgumentValue(fqName: FqName, argumentName: String): T? {
|
||||
@@ -105,22 +102,30 @@ private fun IrClass.getOverridingOf(function: IrFunction) = (function as? IrSimp
|
||||
val ModuleDescriptor.konanLibrary get() = (this.klibModuleOrigin as? DeserializedKlibModuleOrigin)?.library
|
||||
val IrModuleFragment.konanLibrary
|
||||
get() = (this as? KonanIrModuleFragmentImpl)?.konanLibrary ?: descriptor.konanLibrary
|
||||
val IrPackageFragment.konanLibrary
|
||||
get() = if (this is IrFile)
|
||||
this.konanLibrary
|
||||
else
|
||||
this.packageFragmentDescriptor.containingDeclaration.konanLibrary
|
||||
val IrFile.konanLibrary
|
||||
get() = (metadata as? KonanFileMetadataSource)?.module?.konanLibrary ?: packageFragmentDescriptor.containingDeclaration.konanLibrary
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
val IrPackageFragment.konanLibrary : KotlinLibrary?
|
||||
get() {
|
||||
if (this is IrFile) {
|
||||
(metadata as? KonanFileMetadataSource)?.module?.konanLibrary?.let { return it }
|
||||
}
|
||||
return this.packageFragmentDescriptor.containingDeclaration.konanLibrary
|
||||
}
|
||||
val IrDeclaration.konanLibrary: KotlinLibrary?
|
||||
get() {
|
||||
((this as? IrMetadataSourceOwner)?.metadata as? KonanMetadata)?.let { return it.konanLibrary }
|
||||
return when (val parent = parent) {
|
||||
is IrFile -> parent.konanLibrary
|
||||
is IrPackageFragment -> parent.packageFragmentDescriptor.containingDeclaration.konanLibrary
|
||||
is IrPackageFragment -> parent.konanLibrary
|
||||
is IrDeclaration -> parent.konanLibrary
|
||||
else -> TODO("Unexpected declaration parent: $parent")
|
||||
}
|
||||
}
|
||||
|
||||
fun IrDeclaration.isFromInteropLibrary() = konanLibrary?.isInteropLibrary() == true
|
||||
fun IrPackageFragment.isFromInteropLibrary() = konanLibrary?.isInteropLibrary() == true
|
||||
|
||||
/**
|
||||
* This function should be equivalent to [IrDeclaration.isFromInteropLibrary], but in fact it is not for declarations
|
||||
* from Fir modules. This should be fixed in the future.
|
||||
*/
|
||||
@ObsoleteDescriptorBasedAPI
|
||||
fun IrDeclaration.isFromInteropLibraryByDescriptor() = descriptor.isFromInteropLibrary()
|
||||
+4
@@ -8,6 +8,7 @@ import org.jetbrains.kotlin.backend.konan.InteropFqNames
|
||||
import org.jetbrains.kotlin.backend.konan.RuntimeNames
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.builders.IrBuilder
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl
|
||||
@@ -30,6 +31,7 @@ internal inline fun <reified T: DeclarationDescriptor> ClassDescriptor.findDecla
|
||||
* Provides a set of functions and properties that helps
|
||||
* to translate descriptor declarations to corresponding IR.
|
||||
*/
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
internal interface DescriptorToIrTranslationMixin {
|
||||
|
||||
val symbolTable: SymbolTable
|
||||
@@ -161,6 +163,7 @@ internal fun ClassDescriptor.inheritsFromCStructVar(): Boolean =
|
||||
* This function checks that given symbol located in subtree of
|
||||
* CEnum inheritor.
|
||||
*/
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
internal fun IrSymbol.findCEnumDescriptor(): ClassDescriptor? =
|
||||
descriptor.findCEnumDescriptor()
|
||||
|
||||
@@ -172,6 +175,7 @@ internal fun DeclarationDescriptor.findCEnumDescriptor(): ClassDescriptor? =
|
||||
* This function checks that given symbol located in subtree of
|
||||
* CStructVar inheritor.
|
||||
*/
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
internal fun IrSymbol.findCStructDescriptor(): ClassDescriptor? =
|
||||
descriptor.findCStructDescriptor()
|
||||
|
||||
|
||||
+2
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.backend.konan.ir.interop.cenum.CEnumVarClassGenerato
|
||||
import org.jetbrains.kotlin.backend.konan.ir.interop.cstruct.CStructVarClassGenerator
|
||||
import org.jetbrains.kotlin.backend.konan.ir.interop.cstruct.CStructVarCompanionGenerator
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.symbols.*
|
||||
import org.jetbrains.kotlin.ir.util.*
|
||||
@@ -31,6 +32,7 @@ import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
||||
* 2. It is an easier and more obvious approach. Since implementation of metadata-based
|
||||
* libraries generation already took too much time we take an easier approach here.
|
||||
*/
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
internal class IrProviderForCEnumAndCStructStubs(
|
||||
context: GeneratorContext,
|
||||
symbols: KonanSymbols
|
||||
|
||||
+2
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.konan.ir.interop.DescriptorToIrTranslationMi
|
||||
import org.jetbrains.kotlin.backend.konan.ir.interop.findDeclarationByName
|
||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.builders.*
|
||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||
@@ -24,6 +25,7 @@ import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
/**
|
||||
* Generate IR for function that returns appropriate enum entry for the provided integral value.
|
||||
*/
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
internal class CEnumByValueFunctionGenerator(
|
||||
context: GeneratorContext,
|
||||
private val symbols: KonanSymbols
|
||||
|
||||
+2
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.builders.*
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||
@@ -40,6 +41,7 @@ private val cEnumEntryValueTypes = setOf(
|
||||
"UByte", "UShort", "UInt", "ULong"
|
||||
)
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
internal class CEnumClassGenerator(
|
||||
val context: GeneratorContext,
|
||||
private val cEnumCompanionGenerator: CEnumCompanionGenerator,
|
||||
|
||||
+2
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.backend.konan.ir.interop.irInstanceInitializer
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.builders.irBlockBody
|
||||
import org.jetbrains.kotlin.ir.builders.irReturn
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
@@ -24,6 +25,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
|
||||
|
||||
private val cEnumEntryAliasAnnonation = FqName("kotlinx.cinterop.internal.CEnumEntryAlias")
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
internal class CEnumCompanionGenerator(
|
||||
context: GeneratorContext,
|
||||
private val cEnumByValueFunctionGenerator: CEnumByValueFunctionGenerator
|
||||
|
||||
+2
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.konan.ir.interop.irInstanceInitializer
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.builders.irBlockBody
|
||||
import org.jetbrains.kotlin.ir.builders.irGet
|
||||
import org.jetbrains.kotlin.ir.builders.irInt
|
||||
@@ -29,6 +30,7 @@ import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
|
||||
|
||||
private val typeSizeAnnotation = FqName("kotlinx.cinterop.internal.CEnumVarTypeSize")
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
internal class CEnumVarClassGenerator(
|
||||
context: GeneratorContext,
|
||||
private val symbols: KonanSymbols
|
||||
|
||||
+2
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.backend.konan.ir.interop.DescriptorToIrTranslationMi
|
||||
import org.jetbrains.kotlin.backend.konan.ir.interop.irInstanceInitializer
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.builders.*
|
||||
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
|
||||
import org.jetbrains.kotlin.ir.builders.declarations.buildValueParameter
|
||||
@@ -26,6 +27,7 @@ import org.jetbrains.kotlin.ir.util.*
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
internal class CStructVarClassGenerator(
|
||||
context: GeneratorContext,
|
||||
private val companionGenerator: CStructVarCompanionGenerator,
|
||||
|
||||
+2
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
|
||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.builders.irBlockBody
|
||||
import org.jetbrains.kotlin.ir.builders.irInt
|
||||
import org.jetbrains.kotlin.ir.builders.irLong
|
||||
@@ -27,6 +28,7 @@ import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
|
||||
|
||||
private val varTypeAnnotationFqName = FqName("kotlinx.cinterop.internal.CStruct.VarType")
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
internal class CStructVarCompanionGenerator(
|
||||
context: GeneratorContext,
|
||||
private val symbols: KonanSymbols
|
||||
|
||||
+2
-2
@@ -1294,7 +1294,7 @@ internal abstract class FunctionGenerationContext(
|
||||
return if (irClass.isExternalObjCClass()) {
|
||||
generationState.dependenciesTracker.add(irClass)
|
||||
if (irClass.isObjCMetaClass()) {
|
||||
val name = irClass.descriptor.getExternalObjCMetaClassBinaryName()
|
||||
val name = irClass.getExternalObjCMetaClassBinaryName()
|
||||
val objCClass = getObjCClass(name)
|
||||
|
||||
val getClass = llvm.externalNativeRuntimeFunction(
|
||||
@@ -1304,7 +1304,7 @@ internal abstract class FunctionGenerationContext(
|
||||
)
|
||||
call(getClass, listOf(objCClass), exceptionHandler = exceptionHandler)
|
||||
} else {
|
||||
getObjCClass(irClass.descriptor.getExternalObjCClassBinaryName())
|
||||
getObjCClass(irClass.getExternalObjCClassBinaryName())
|
||||
}
|
||||
} else {
|
||||
if (irClass.isObjCMetaClass()) {
|
||||
|
||||
+6
@@ -8,6 +8,8 @@ package org.jetbrains.kotlin.backend.konan.llvm
|
||||
import org.jetbrains.kotlin.backend.konan.Context
|
||||
import org.jetbrains.kotlin.backend.konan.descriptors.isExpectMember
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.declarations.IrPackageFragment
|
||||
import org.jetbrains.kotlin.library.metadata.CompiledKlibModuleOrigin
|
||||
import org.jetbrains.kotlin.library.metadata.SyntheticModulesOrigin
|
||||
import org.jetbrains.kotlin.library.metadata.klibModuleOrigin
|
||||
@@ -26,3 +28,7 @@ internal val DeclarationDescriptor.llvmSymbolOrigin: CompiledKlibModuleOrigin
|
||||
}
|
||||
|
||||
internal val Context.standardLlvmSymbolsOrigin: CompiledKlibModuleOrigin get() = this.stdlibModule.llvmSymbolOrigin
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
internal val IrPackageFragment.llvmSymbolOrigin
|
||||
get() = packageFragmentDescriptor.llvmSymbolOrigin
|
||||
+1
-2
@@ -416,8 +416,7 @@ internal class IntrinsicGenerator(private val environment: IntrinsicGeneratorEnv
|
||||
}
|
||||
|
||||
private fun FunctionGenerationContext.emitCreateUninitializedInstance(callSite: IrCall, resultSlot: LLVMValueRef?): LLVMValueRef {
|
||||
val typeParameterT = context.ir.symbols.createUninitializedInstance.descriptor.typeParameters[0]
|
||||
val enumClass = callSite.getTypeArgument(typeParameterT.index)!!
|
||||
val enumClass = callSite.getTypeArgument(0)!!
|
||||
val enumIrClass = enumClass.getClass()!!
|
||||
return allocInstance(enumIrClass, environment.calculateLifetime(callSite), resultSlot)
|
||||
}
|
||||
|
||||
+7
-9
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.backend.konan.llvm.coverage.LLVMCoverageInstrumentat
|
||||
import org.jetbrains.kotlin.backend.konan.lower.*
|
||||
import org.jetbrains.kotlin.builtins.UnsignedType
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
|
||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.IrStatement
|
||||
@@ -860,7 +859,7 @@ internal class CodeGeneratorVisitor(
|
||||
}
|
||||
|
||||
if (context.shouldVerifyBitCode())
|
||||
verifyModule(llvm.module, "${declaration.descriptor.containingDeclaration}::${ir2string(declaration)}")
|
||||
verifyModule(llvm.module, "${ir2string(declaration.parent)}::${ir2string(declaration)}")
|
||||
}
|
||||
|
||||
private fun IrFunction.location(start: Boolean) =
|
||||
@@ -898,7 +897,7 @@ internal class CodeGeneratorVisitor(
|
||||
}
|
||||
|
||||
private fun needGlobalInit(field: IrField): Boolean {
|
||||
if (field.descriptor.containingDeclaration !is PackageFragmentDescriptor) return field.isStatic
|
||||
if (field.parent !is IrPackageFragment) return field.isStatic
|
||||
// TODO: add some smartness here. Maybe if package of the field is in never accessed
|
||||
// assume its global init can be actually omitted.
|
||||
return true
|
||||
@@ -1181,7 +1180,7 @@ internal class CodeGeneratorVisitor(
|
||||
}
|
||||
}
|
||||
|
||||
if (catch.catchParameter.descriptor.type == context.builtIns.throwable.defaultType) {
|
||||
if (catch.catchParameter.type == context.irBuiltIns.throwableType) {
|
||||
genCatchBlock()
|
||||
return // Remaining catch clauses are unreachable.
|
||||
} else {
|
||||
@@ -1482,7 +1481,7 @@ internal class CodeGeneratorVisitor(
|
||||
}
|
||||
|
||||
private fun IrType.isUnsignedInteger(): Boolean = !isNullable() &&
|
||||
UnsignedType.values().any { it.classId == this.getClass()?.descriptor?.classId }
|
||||
UnsignedType.values().any { it.classId == this.getClass()?.classId }
|
||||
|
||||
private fun evaluateIntegerCoercion(value: IrTypeOperatorCall): LLVMValueRef {
|
||||
context.log{"evaluateIntegerCoercion : ${ir2string(value)}"}
|
||||
@@ -2349,11 +2348,11 @@ internal class CodeGeneratorVisitor(
|
||||
|
||||
private fun evaluateFunctionReference(expression: IrFunctionReference): LLVMValueRef {
|
||||
// TODO: consider creating separate IR element for pointer to function.
|
||||
assert (expression.type.getClass()?.descriptor?.fqNameUnsafe == InteropFqNames.cPointer) {
|
||||
"assert: ${expression.type.getClass()?.descriptor?.fqNameUnsafe} == ${InteropFqNames.cPointer}"
|
||||
assert (expression.type.getClass()?.symbol?.hasEqualFqName(InteropFqNames.cPointer.toSafe()) == true) {
|
||||
"assert: should be ${InteropFqNames.cPointer}, ${expression.type.render()} found"
|
||||
}
|
||||
|
||||
assert (expression.getArguments().isEmpty())
|
||||
assert (expression.getArgumentsWithIr().isEmpty())
|
||||
|
||||
val function = expression.symbol.owner
|
||||
assert (function.dispatchReceiverParameter == null)
|
||||
@@ -2965,7 +2964,6 @@ private val doubleUnderscoreThisName = Name.identifier("__this")
|
||||
* 2. this is reserved name and compiled in special way.
|
||||
*/
|
||||
private fun IrValueDeclaration.debugNameConversion(): Name {
|
||||
val name = descriptor.name
|
||||
if (name == thisName) {
|
||||
return when (origin) {
|
||||
IrDeclarationOrigin.IR_TEMPORARY_VARIABLE_FOR_INLINED_EXTENSION_RECEIVER -> doubleUnderscoreThisName
|
||||
|
||||
+1
-1
@@ -27,7 +27,7 @@ internal class KotlinObjCClassInfoGenerator(override val generationState: Native
|
||||
|
||||
val superclassName = irClass.getSuperClassNotAny()!!.let {
|
||||
llvm.dependenciesTracker.add(it)
|
||||
it.descriptor.getExternalObjCClassBinaryName()
|
||||
it.getExternalObjCClassBinaryName()
|
||||
}
|
||||
val protocolNames = irClass.getSuperInterfaces().map {
|
||||
llvm.dependenciesTracker.add(it)
|
||||
|
||||
+1
-1
@@ -230,7 +230,7 @@ internal class RTTIGenerator(
|
||||
|
||||
val objOffsetsPtr = staticData.placeGlobalConstArray("krefs:$className", llvm.int32Type, objOffsets)
|
||||
|
||||
val objOffsetsCount = if (irClass.descriptor == context.builtIns.array) {
|
||||
val objOffsetsCount = if (irClass.symbol == context.irBuiltIns.arrayClass) {
|
||||
1 // To mark it as non-leaf.
|
||||
} else {
|
||||
objOffsets.size
|
||||
|
||||
+2
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.konan.*
|
||||
import org.jetbrains.kotlin.backend.konan.llvm.LlvmCallable
|
||||
import org.jetbrains.kotlin.backend.konan.reportCompilationError
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
||||
@@ -72,6 +73,7 @@ internal class CoverageManager(val generationState: NativeGenerationState) {
|
||||
coveredLibs + coveredSources
|
||||
}
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
private fun fileCoverageFilter(file: IrFile) =
|
||||
file.packageFragmentDescriptor.module in coveredModules
|
||||
|
||||
|
||||
+2
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.backend.konan.serialization.resolveFakeOverrideMaybe
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.expressions.IrClassReference
|
||||
import org.jetbrains.kotlin.ir.expressions.IrVararg
|
||||
@@ -803,6 +804,7 @@ private fun ObjCExportCodeGenerator.generateUnitContinuationToRetainedCompletion
|
||||
}
|
||||
|
||||
// TODO: find out what to use instead here and in the dependent code
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
private val ObjCExportBlockCodeGenerator.mappedFunctionNClasses get() =
|
||||
// failed attempt to migrate to descriptor-less IrBuiltIns
|
||||
((context.irBuiltIns as IrBuiltInsOverDescriptors).functionFactory as BuiltInFictitiousFunctionIrClassFactory).builtFunctionNClasses
|
||||
|
||||
+6
-3
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.backend.konan.llvm.computeFunctionName
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.IrStatement
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.builders.*
|
||||
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
@@ -36,6 +37,9 @@ import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||
import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature
|
||||
import org.jetbrains.kotlin.load.java.SpecialGenericSignatures
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
internal fun IrFunction.getDefaultValueForOverriddenBuiltinFunction() = BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(descriptor)
|
||||
|
||||
internal class BridgesSupport(mapping: NativeMapping, val irBuiltIns: IrBuiltIns, val irFactory: IrFactory) {
|
||||
private val bridges = mapping.bridges
|
||||
|
||||
@@ -207,8 +211,7 @@ internal class BridgesBuilding(val context: Context) : ClassLoweringPass {
|
||||
|
||||
val body = declaration.body ?: return declaration
|
||||
|
||||
val descriptor = declaration.descriptor
|
||||
val typeSafeBarrierDescription = BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(descriptor)
|
||||
val typeSafeBarrierDescription = declaration.getDefaultValueForOverriddenBuiltinFunction()
|
||||
if (typeSafeBarrierDescription == null || builtBridges.contains(declaration))
|
||||
return declaration
|
||||
|
||||
@@ -295,7 +298,7 @@ private fun Context.buildBridge(startOffset: Int, endOffset: Int,
|
||||
|
||||
val irBuilder = createIrBuilder(bridge.symbol, startOffset, endOffset)
|
||||
bridge.body = irBuilder.irBlockBody(bridge) {
|
||||
val typeSafeBarrierDescription = BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(overriddenFunction.overriddenFunction.descriptor)
|
||||
val typeSafeBarrierDescription = overriddenFunction.overriddenFunction.getDefaultValueForOverriddenBuiltinFunction()
|
||||
typeSafeBarrierDescription?.let { buildTypeSafeBarrier(bridge, overriddenFunction.function, it) }
|
||||
|
||||
val delegatingCall = IrCallImpl.fromSymbolOwner(
|
||||
|
||||
+2
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.backend.konan.descriptors.propertyIfAccessor
|
||||
import org.jetbrains.kotlin.backend.konan.ir.ModuleIndex
|
||||
import org.jetbrains.kotlin.descriptors.MemberDescriptor
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl
|
||||
@@ -42,6 +43,7 @@ internal class ExpectDeclarationsRemoving(val context: Context) : FileLoweringPa
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
internal class ExpectToActualDefaultValueCopier(private val irModule: IrModuleFragment) {
|
||||
|
||||
// Note: local declarations aren't required here; TODO: use more lightweight index.
|
||||
|
||||
+4
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.IrStatement
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.builders.*
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
||||
@@ -64,6 +65,7 @@ internal class InteropLowering(generationState: NativeGenerationState) : FileLow
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
private abstract class BaseInteropIrTransformer(
|
||||
private val generationState: NativeGenerationState
|
||||
) : IrBuildingTransformer(generationState.context) {
|
||||
@@ -136,6 +138,7 @@ private abstract class BaseInteropIrTransformer(
|
||||
protected abstract fun addTopLevel(declaration: IrDeclaration)
|
||||
}
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
private class InteropLoweringPart1(val generationState: NativeGenerationState) : BaseInteropIrTransformer(generationState), FileLoweringPass {
|
||||
private val context = generationState.context
|
||||
|
||||
@@ -778,6 +781,7 @@ private class InteropLoweringPart2(val generationState: NativeGenerationState) :
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
private class InteropTransformer(
|
||||
val generationState: NativeGenerationState,
|
||||
override val irFile: IrFile
|
||||
|
||||
+20
-20
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.backend.konan.llvm.tryGetIntrinsicType
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
||||
@@ -142,9 +143,9 @@ private class BackendChecker(
|
||||
}
|
||||
|
||||
private fun IrConstructor.overridesConstructor(other: IrConstructor) =
|
||||
this.descriptor.valueParameters.size == other.descriptor.valueParameters.size &&
|
||||
this.descriptor.valueParameters.all {
|
||||
val otherParameter = other.descriptor.valueParameters[it.index]
|
||||
this.valueParameters.size == other.valueParameters.size &&
|
||||
this.valueParameters.all {
|
||||
val otherParameter = other.valueParameters[it.index]
|
||||
it.name == otherParameter.name && it.type == otherParameter.type
|
||||
}
|
||||
|
||||
@@ -156,7 +157,7 @@ private class BackendChecker(
|
||||
}
|
||||
|
||||
function.valueParameters.forEach {
|
||||
val kotlinType = it.descriptor.type
|
||||
val kotlinType = it.type
|
||||
if (!kotlinType.isObjCObjectType())
|
||||
reportError(it, "Unexpected $action method parameter type: ${it.type.classFqName}\n" +
|
||||
"Only Objective-C object types are supported here")
|
||||
@@ -170,19 +171,19 @@ private class BackendChecker(
|
||||
checkCanGenerateFunctionImp(function)
|
||||
}
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
private fun checkCanGenerateOutletSetterImp(property: IrProperty) {
|
||||
val descriptor = property.descriptor
|
||||
|
||||
val outlet = "@${InteropFqNames.objCOutlet}"
|
||||
|
||||
if (!descriptor.isVar)
|
||||
if (!property.isVar)
|
||||
reportError(property, "$outlet property must be var")
|
||||
|
||||
property.getter?.extensionReceiverParameter?.let {
|
||||
reportError(it, "$outlet must not have extension receiver")
|
||||
}
|
||||
|
||||
val type = descriptor.type
|
||||
val type = property.descriptor.type
|
||||
if (!type.isObjCObjectType())
|
||||
reportError(property, "Unexpected $outlet type: ${property.getter?.returnType?.classFqName}\n" +
|
||||
"Only Objective-C object types are supported here")
|
||||
@@ -225,11 +226,11 @@ private class BackendChecker(
|
||||
}
|
||||
}
|
||||
|
||||
val kind = irClass.descriptor.kind
|
||||
val kind = irClass.kind
|
||||
if (kind != ClassKind.CLASS && kind != ClassKind.OBJECT)
|
||||
reportError(irClass, "Only classes are supported as subtypes of Objective-C types")
|
||||
|
||||
if (!irClass.descriptor.isFinalClass)
|
||||
if (!irClass.isFinalClass)
|
||||
reportError(irClass, "Non-final Kotlin subclasses of Objective-C classes are not yet supported")
|
||||
|
||||
irClass.companionObject()?.let {
|
||||
@@ -242,12 +243,12 @@ private class BackendChecker(
|
||||
}
|
||||
|
||||
var hasObjCClassSupertype = false
|
||||
irClass.descriptor.defaultType.constructor.supertypes.forEach {
|
||||
val descriptor = it.constructor.declarationDescriptor as ClassDescriptor
|
||||
if (!descriptor.isObjCClass())
|
||||
irClass.defaultType.superTypes().forEach {
|
||||
val clazz = it.classOrFail.owner
|
||||
if (!clazz.isObjCClass())
|
||||
reportError(irClass, "Mixing Kotlin and Objective-C supertypes is not supported")
|
||||
|
||||
if (descriptor.kind == ClassKind.CLASS)
|
||||
if (clazz.kind == ClassKind.CLASS)
|
||||
hasObjCClassSupertype = true
|
||||
}
|
||||
|
||||
@@ -269,10 +270,9 @@ private class BackendChecker(
|
||||
else -> "corresponding Objective-C method"
|
||||
}
|
||||
|
||||
context.report(
|
||||
reportError(
|
||||
method,
|
||||
"can't override '${method.name}', override $correspondingObjCMethod instead",
|
||||
isError = true
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -412,10 +412,10 @@ private class BackendChecker(
|
||||
val signatureTypes = target.allParameters.map { it.type } + target.returnType
|
||||
|
||||
callee.typeParameters.indices.forEach { index ->
|
||||
val typeArgument = expression.getTypeArgument(index)!!.toKotlinType()
|
||||
val signatureType = signatureTypes[index].toKotlinType()
|
||||
if (typeArgument.constructor != signatureType.constructor ||
|
||||
typeArgument.isMarkedNullable != signatureType.isMarkedNullable
|
||||
val typeArgument = expression.getTypeArgument(index)!!
|
||||
val signatureType = signatureTypes[index]
|
||||
if (typeArgument.classifierOrNull != signatureType.classifierOrNull ||
|
||||
typeArgument.isMarkedNullable() != signatureType.isMarkedNullable()
|
||||
) {
|
||||
reportError(expression, "C function signature element mismatch: " +
|
||||
"expected '${signatureTypes[index].classFqName}', got '${expression.getTypeArgument(index)!!.classFqName}'")
|
||||
@@ -541,7 +541,7 @@ private class BackendChecker(
|
||||
|
||||
private fun getUnboundReferencedFunction(expression: IrExpression) = when (expression) {
|
||||
is IrFunctionReference -> {
|
||||
val arguments = expression.getArguments()
|
||||
val arguments = expression.getArgumentsWithIr()
|
||||
val capturedVariables = captures(expression.symbol.owner)
|
||||
ReferencedFunctionWithCapture(
|
||||
expression.symbol.owner.takeIf { arguments.isEmpty() && capturedVariables.isEmpty() },
|
||||
|
||||
+2
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.IrStatement
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.builders.*
|
||||
import org.jetbrains.kotlin.ir.builders.declarations.buildField
|
||||
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
|
||||
@@ -678,6 +679,7 @@ internal class TestProcessor (val context: Context) {
|
||||
}
|
||||
// endregion
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
private fun shouldProcessFile(irFile: IrFile): Boolean = irFile.packageFragmentDescriptor.module.let {
|
||||
// Process test annotations in source libraries too.
|
||||
it in context.sourcesModules
|
||||
|
||||
+2
@@ -11,10 +11,12 @@ import org.jetbrains.kotlin.backend.konan.descriptors.isArray
|
||||
import org.jetbrains.kotlin.backend.konan.descriptors.isInterface
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.symbols.*
|
||||
import org.jetbrains.kotlin.ir.util.SymbolTable
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
internal fun ObjCExportedInterface.createCodeSpec(symbolTable: SymbolTable): ObjCExportCodeSpec {
|
||||
|
||||
fun createObjCMethods(methods: List<FunctionDescriptor>) = methods.map {
|
||||
|
||||
+12
-18
@@ -25,7 +25,6 @@ import org.jetbrains.kotlin.ir.util.*
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
import org.jetbrains.kotlin.backend.konan.llvm.*
|
||||
|
||||
@@ -187,7 +186,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
|
||||
"Class constructor has empty body"
|
||||
}
|
||||
context.logMultiple {
|
||||
+"Analysing function ${declaration.descriptor}"
|
||||
+"Analysing function ${declaration.render()}"
|
||||
+"IR: ${ir2stringWhole(declaration)}"
|
||||
}
|
||||
analyze(declaration, body)
|
||||
@@ -200,7 +199,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
|
||||
symbolTable.mapFunction(declaration)
|
||||
} else {
|
||||
context.logMultiple {
|
||||
+"Analysing function ${declaration.descriptor}"
|
||||
+"Analysing function ${declaration.render()}"
|
||||
+"IR: ${ir2stringWhole(declaration)}"
|
||||
}
|
||||
analyze(declaration, body)
|
||||
@@ -211,7 +210,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
|
||||
if (declaration.isStatic)
|
||||
declaration.initializer?.let {
|
||||
context.logMultiple {
|
||||
+"Analysing global field ${declaration.descriptor}"
|
||||
+"Analysing global field ${declaration.render()}"
|
||||
+"IR: ${ir2stringWhole(declaration)}"
|
||||
}
|
||||
analyze(declaration, IrSetFieldImpl(it.startOffset, it.endOffset, declaration.symbol, null,
|
||||
@@ -262,7 +261,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
|
||||
context.logMultiple {
|
||||
+"SYMBOL TABLE:"
|
||||
symbolTable.classMap.forEach { (irClass, type) ->
|
||||
+" DESCRIPTOR: ${irClass.descriptor}"
|
||||
+" IR CLASS: ${irClass.render()}"
|
||||
+" TYPE: $type"
|
||||
if (type !is DataFlowIR.Type.Declared)
|
||||
return@forEach
|
||||
@@ -323,7 +322,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
|
||||
}
|
||||
if (expression.symbol == executeImplSymbol) {
|
||||
// Producer and job of executeImpl are called externally, we need to reflect this somehow.
|
||||
val producerInvocation = IrCallImpl.fromSymbolDescriptor(expression.startOffset, expression.endOffset,
|
||||
val producerInvocation = IrCallImpl.fromSymbolOwner(expression.startOffset, expression.endOffset,
|
||||
executeImplProducerInvoke.returnType,
|
||||
executeImplProducerInvoke.symbol,
|
||||
executeImplProducerInvoke.symbol.owner.typeParameters.size,
|
||||
@@ -335,7 +334,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
|
||||
|
||||
val jobFunctionReference = expression.getValueArgument(3) as? IrFunctionReference
|
||||
?: error("A function reference expected")
|
||||
val jobInvocation = IrCallImpl.fromSymbolDescriptor(expression.startOffset, expression.endOffset,
|
||||
val jobInvocation = IrCallImpl.fromSymbolOwner(expression.startOffset, expression.endOffset,
|
||||
jobFunctionReference.symbol.owner.returnType,
|
||||
jobFunctionReference.symbol as IrSimpleFunctionSymbol,
|
||||
jobFunctionReference.symbol.owner.typeParameters.size,
|
||||
@@ -372,7 +371,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
|
||||
// See ObjC instanceOf code generation for details.
|
||||
if (expression is IrTypeOperatorCall && expression.operator.callsInstanceOf()
|
||||
&& expression.typeOperand.isObjCObjectType()) {
|
||||
val objcObjGetter = IrCallImpl.fromSymbolDescriptor(expression.startOffset, expression.endOffset,
|
||||
val objcObjGetter = IrCallImpl.fromSymbolOwner(expression.startOffset, expression.endOffset,
|
||||
objCObjectRawValueGetter.owner.returnType,
|
||||
objCObjectRawValueGetter,
|
||||
objCObjectRawValueGetter.owner.typeParameters.size,
|
||||
@@ -717,7 +716,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
|
||||
|
||||
is IrConstructorCall -> {
|
||||
val callee = value.symbol.owner
|
||||
val arguments = value.getArguments().map { expressionToEdge(it.second) }
|
||||
val arguments = value.getArgumentsWithIr().map { expressionToEdge(it.second) }
|
||||
DataFlowIR.Node.NewObject(
|
||||
symbolTable.mapFunction(callee),
|
||||
arguments,
|
||||
@@ -758,7 +757,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
|
||||
initInstanceSymbol -> {
|
||||
val thiz = expressionToEdge(value.getValueArgument(0)!!)
|
||||
val initializer = value.getValueArgument(1) as IrConstructorCall
|
||||
val arguments = listOf(thiz) + initializer.getArguments().map { expressionToEdge(it.second) }
|
||||
val arguments = listOf(thiz) + initializer.getArgumentsWithIr().map { expressionToEdge(it.second) }
|
||||
val callee = initializer.symbol.owner
|
||||
DataFlowIR.Node.StaticCall(
|
||||
symbolTable.mapFunction(callee),
|
||||
@@ -771,7 +770,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
|
||||
|
||||
else -> {
|
||||
val callee = value.symbol.owner
|
||||
val arguments = value.getArguments()
|
||||
val arguments = value.getArgumentsWithIr()
|
||||
.map { expressionToEdge(it.second) }
|
||||
|
||||
if (value.isVirtualCall) {
|
||||
@@ -784,12 +783,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
|
||||
|| !callee.isReal /* Could be a bridge. */)
|
||||
symbolTable.mapClassReferenceType(owner)
|
||||
else {
|
||||
val actualClassAtCallsite =
|
||||
(actualReceiverClassifier as IrClassSymbol).descriptor
|
||||
// assert (DescriptorUtils.isSubclass(actualClassAtCallsite, owner.descriptor)) {
|
||||
// "Expected an inheritor of ${owner.descriptor}, but was $actualClassAtCallsite"
|
||||
// }
|
||||
if (DescriptorUtils.isSubclass(actualClassAtCallsite, owner.descriptor)) {
|
||||
if ((actualReceiverClassifier as IrClassSymbol).owner.isSubclassOf(owner)) {
|
||||
symbolTable.mapClassReferenceType(actualReceiverClassifier.owner) // Box if inline class.
|
||||
} else {
|
||||
symbolTable.mapClassReferenceType(owner)
|
||||
@@ -839,7 +833,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
|
||||
val thisReceiver = (declaration as IrConstructor).constructedClass.thisReceiver!!
|
||||
val thiz = IrGetValueImpl(SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, thisReceiver.type,
|
||||
thisReceiver.symbol)
|
||||
val arguments = listOf(thiz) + value.getArguments().map { it.second }
|
||||
val arguments = listOf(thiz) + value.getArgumentsWithIr().map { it.second }
|
||||
DataFlowIR.Node.StaticCall(
|
||||
symbolTable.mapFunction(value.symbol.owner),
|
||||
arguments.map { expressionToEdge(it) },
|
||||
|
||||
+4
-2
@@ -14,9 +14,11 @@ import org.jetbrains.kotlin.backend.konan.llvm.isExported
|
||||
import org.jetbrains.kotlin.backend.konan.llvm.localHash
|
||||
import org.jetbrains.kotlin.backend.konan.lower.DECLARATION_ORIGIN_BRIDGE_METHOD
|
||||
import org.jetbrains.kotlin.backend.konan.lower.bridgeTarget
|
||||
import org.jetbrains.kotlin.backend.konan.lower.getDefaultValueForOverriddenBuiltinFunction
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.types.IrType
|
||||
@@ -26,7 +28,6 @@ import org.jetbrains.kotlin.ir.types.isUnit
|
||||
import org.jetbrains.kotlin.ir.util.*
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
||||
import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
@@ -479,6 +480,7 @@ internal object DataFlowIR {
|
||||
}, data = null)
|
||||
}
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
fun mapClassReferenceType(irClass: IrClass): Type {
|
||||
// Do not try to devirtualize ObjC classes.
|
||||
if (irClass.module.name == Name.special("<forward declarations>") || irClass.isObjCClass())
|
||||
@@ -622,7 +624,7 @@ internal object DataFlowIR {
|
||||
val irClass = it.parent as? IrClass
|
||||
val bridgeTarget = it.bridgeTarget
|
||||
val isSpecialBridge = bridgeTarget.let {
|
||||
it != null && BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(it.descriptor) != null
|
||||
it != null && it.getDefaultValueForOverriddenBuiltinFunction() != null
|
||||
}
|
||||
val bridgeTargetSymbol = if (isSpecialBridge || bridgeTarget == null) null else mapFunction(bridgeTarget)
|
||||
val placeToFunctionsTable = !isAbstract && it !is IrConstructor && irClass != null
|
||||
|
||||
+10
-10
@@ -1325,15 +1325,15 @@ internal object DevirtualizationAnalysis {
|
||||
if (coercion == null)
|
||||
value
|
||||
else irCall(coercion).apply {
|
||||
addArguments(listOf(coercion.descriptor.explicitParameters.single() to value))
|
||||
require(coercion.owner.dispatchReceiverParameter == null &&
|
||||
coercion.owner.extensionReceiverParameter == null &&
|
||||
coercion.owner.valueParameters.size == 1
|
||||
) { "Coercion function must be static with one value parameter" }
|
||||
putValueArgument(0, value)
|
||||
}
|
||||
|
||||
private fun IrBuilderWithScope.irCoerce(value: IrExpression, coercion: DataFlowIR.FunctionSymbol.Declared?) =
|
||||
if (coercion == null)
|
||||
value
|
||||
else irCall(coercion.irFunction!!).apply {
|
||||
putValueArgument(0, value)
|
||||
}
|
||||
irCoerce(value, coercion?.let { it.irFunction?.symbol!! })
|
||||
|
||||
sealed class PossiblyCoercedValue(private val coercion: IrFunctionSymbol?) {
|
||||
abstract fun getValue(irBuilder: IrBuilderWithScope): IrExpression
|
||||
@@ -1537,17 +1537,17 @@ internal object DevirtualizationAnalysis {
|
||||
|
||||
optimize && possibleCallees.size == 1 -> { // Monomorphic callsite.
|
||||
irBlock(expression) {
|
||||
val parameters = expression.getArgumentsWithSymbols().map { arg ->
|
||||
val parameters = expression.getArgumentsWithIr().map { arg ->
|
||||
// Temporary val is not required here for a parameter, since each one is used for only one devirtualized callsite
|
||||
irSplitCoercion(caller, arg.second, tempName = null, arg.first.owner.type)
|
||||
irSplitCoercion(caller, arg.second, tempName = null, arg.first.type)
|
||||
}
|
||||
+irDevirtualizedCall(expression, type, possibleCallees[0].first, parameters)
|
||||
}
|
||||
}
|
||||
|
||||
else -> irBlock(expression) {
|
||||
val arguments = expression.getArgumentsWithSymbols().mapIndexed { index, arg ->
|
||||
irSplitCoercion(caller, arg.second, "arg$index", arg.first.owner.type)
|
||||
val arguments = expression.getArgumentsWithIr().mapIndexed { index, arg ->
|
||||
irSplitCoercion(caller, arg.second, "arg$index", arg.first.type)
|
||||
}
|
||||
val receiver = irTemporary(arguments[0].getFullValue(this@irBlock))
|
||||
val typeInfo by lazy {
|
||||
|
||||
+4
-3
@@ -3,11 +3,11 @@ package org.jetbrains.kotlin.backend.konan.serialization
|
||||
import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable
|
||||
import org.jetbrains.kotlin.backend.common.serialization.GlobalDeclarationTable
|
||||
import org.jetbrains.kotlin.backend.common.serialization.signature.DescToIrIdSignatureComputer
|
||||
import org.jetbrains.kotlin.backend.konan.descriptors.isFromInteropLibrary
|
||||
import org.jetbrains.kotlin.backend.konan.ir.isFromInteropLibraryByDescriptor
|
||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
||||
import org.jetbrains.kotlin.ir.util.IdSignature
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
||||
|
||||
class KonanGlobalDeclarationTable(builtIns: IrBuiltIns) : GlobalDeclarationTable(KonanManglerIr) {
|
||||
init {
|
||||
@@ -22,8 +22,9 @@ class KonanDeclarationTable(
|
||||
private val signatureIdComposer = DescToIrIdSignatureComputer(KonanIdSignaturer(KonanManglerDesc))
|
||||
|
||||
// TODO: We should get rid of this extension point in favor of proper support in IR-based mangler.
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
override fun tryComputeBackendSpecificSignature(declaration: IrDeclaration): IdSignature? =
|
||||
if (declaration.descriptor.isFromInteropLibrary()) {
|
||||
if (declaration.isFromInteropLibraryByDescriptor()) {
|
||||
signatureIdComposer.computeSignature(declaration)
|
||||
} else null
|
||||
}
|
||||
+7
-1
@@ -33,10 +33,13 @@ import org.jetbrains.kotlin.backend.konan.descriptors.isFromInteropLibrary
|
||||
import org.jetbrains.kotlin.backend.konan.descriptors.isInteropLibrary
|
||||
import org.jetbrains.kotlin.backend.konan.ir.interop.IrProviderForCEnumAndCStructStubs
|
||||
import org.jetbrains.kotlin.backend.konan.ir.konanLibrary
|
||||
import org.jetbrains.kotlin.backend.konan.ir.isFromInteropLibrary
|
||||
import org.jetbrains.kotlin.backend.konan.ir.isFromInteropLibraryByDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.konan.isNativeStdlib
|
||||
import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyClass
|
||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.builders.TranslationPluginContext
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl
|
||||
@@ -428,11 +431,12 @@ object KonanFakeOverrideClassFilter : FakeOverrideClassFilter {
|
||||
IdSignature.Flags.IS_NATIVE_INTEROP_LIBRARY.test()
|
||||
}
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
private fun IrClassSymbol.isInterop(): Boolean {
|
||||
if (this is IrPublicSymbolBase<*> && this.signature.isInteropSignature()) return true
|
||||
|
||||
// K2 doesn't properly put signatures into such symbols yet, workaround:
|
||||
return this.isBound && this.owner is Fir2IrLazyClass && this.descriptor.isFromInteropLibrary()
|
||||
return this.isBound && this.owner is Fir2IrLazyClass && this.owner.isFromInteropLibraryByDescriptor()
|
||||
}
|
||||
|
||||
// This is an alternative to .isObjCClass that doesn't need to walk up all the class heirarchy,
|
||||
@@ -448,6 +452,7 @@ object KonanFakeOverrideClassFilter : FakeOverrideClassFilter {
|
||||
|
||||
internal data class DeserializedInlineFunction(val firstAccess: Boolean, val function: InlineFunctionOriginInfo)
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
internal class KonanIrLinker(
|
||||
private val currentModule: ModuleDescriptor,
|
||||
override val translationPluginContext: TranslationPluginContext?,
|
||||
@@ -580,6 +585,7 @@ internal class KonanIrLinker(
|
||||
|
||||
private val InvalidIndex = -1
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
inner class KonanPartialModuleDeserializer(
|
||||
moduleDescriptor: ModuleDescriptor,
|
||||
override val klib: KotlinLibrary,
|
||||
|
||||
+3
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.common.serialization.mangle.ir.IrExportCheck
|
||||
import org.jetbrains.kotlin.backend.common.serialization.mangle.ir.IrMangleComputer
|
||||
import org.jetbrains.kotlin.backend.konan.*
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.types.getClass
|
||||
import org.jetbrains.kotlin.ir.util.hasAnnotation
|
||||
@@ -147,6 +148,8 @@ abstract class AbstractKonanDescriptorMangler : DescriptorBasedKotlinManglerImpl
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
private class KonanDescriptorMangleComputer(builder: StringBuilder, mode: MangleMode) : DescriptorMangleComputer(builder, mode) {
|
||||
override fun copy(newMode: MangleMode): DescriptorMangleComputer = KonanDescriptorMangleComputer(builder, newMode)
|
||||
|
||||
|
||||
+3
-32
@@ -15,10 +15,7 @@ import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||
import org.jetbrains.kotlin.descriptors.ParameterDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl
|
||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.IrFileEntry
|
||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||
import org.jetbrains.kotlin.ir.*
|
||||
import org.jetbrains.kotlin.ir.builders.*
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl
|
||||
@@ -124,22 +121,6 @@ tailrec fun IrDeclaration.getContainingFile(): IrFile? {
|
||||
}
|
||||
}
|
||||
|
||||
internal fun ErrorReportingContext.report(declaration: IrDeclaration, message: String, isError: Boolean) {
|
||||
val irFile = declaration.getContainingFile()
|
||||
this.report(
|
||||
declaration,
|
||||
irFile,
|
||||
if (irFile != null) {
|
||||
message
|
||||
} else {
|
||||
val renderer = org.jetbrains.kotlin.renderer.DescriptorRenderer.COMPACT_WITH_SHORT_TYPES
|
||||
"$message\n${renderer.render(declaration.descriptor)}"
|
||||
},
|
||||
isError
|
||||
)
|
||||
if (isError) throw KonanCompilationException()
|
||||
}
|
||||
|
||||
fun IrFunctionAccessExpression.addArguments(args: Map<IrValueParameter, IrExpression>) {
|
||||
val unhandledParameters = args.keys.toMutableSet()
|
||||
fun getArg(parameter: IrValueParameter) = args[parameter]?.also { unhandledParameters -= parameter }
|
||||
@@ -209,7 +190,7 @@ fun IrBuilderWithScope.irCall(irFunction: IrFunction, typeArguments: List<IrType
|
||||
irCall(irFunction.symbol, typeArguments)
|
||||
|
||||
internal fun irCall(startOffset: Int, endOffset: Int, irFunction: IrSimpleFunction, typeArguments: List<IrType>): IrCall =
|
||||
IrCallImpl.fromSymbolDescriptor(
|
||||
IrCallImpl.fromSymbolOwner(
|
||||
startOffset, endOffset, irFunction.substitutedReturnType(typeArguments),
|
||||
irFunction.symbol, typeArguments.size, irFunction.valueParameters.size
|
||||
).apply {
|
||||
@@ -279,17 +260,6 @@ fun IrMemberAccessExpression<*>.getArgumentsWithIr(): List<Pair<IrValueParameter
|
||||
return res
|
||||
}
|
||||
|
||||
fun ReferenceSymbolTable.translateErased(type: KotlinType): IrSimpleType {
|
||||
val descriptor = TypeUtils.getClassDescriptor(type)
|
||||
if (descriptor == null) return translateErased(type.immediateSupertypes().first())
|
||||
val classSymbol = this.referenceClass(descriptor)
|
||||
|
||||
val nullable = type.isMarkedNullable
|
||||
val arguments = type.arguments.map { IrStarProjectionImpl }
|
||||
|
||||
return classSymbol.createType(nullable, arguments)
|
||||
}
|
||||
|
||||
fun CommonBackendContext.createArrayOfExpression(
|
||||
startOffset: Int, endOffset: Int,
|
||||
arrayElementType: IrType,
|
||||
@@ -347,6 +317,7 @@ fun IrValueParameter.copy(newDescriptor: ParameterDescriptor): IrValueParameter
|
||||
fun IrClass.defaultOrNullableType(hasQuestionMark: Boolean) =
|
||||
if (hasQuestionMark) this.defaultType.makeNullable() else this.defaultType
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
fun IrFunction.isRestrictedSuspendFunction(): Boolean =
|
||||
this.descriptor.extensionReceiverParameter?.type?.isRestrictsSuspensionReceiver() == true
|
||||
|
||||
|
||||
Reference in New Issue
Block a user