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