diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt index c15968ba21c..814a63e1904 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt @@ -6,7 +6,10 @@ package org.jetbrains.kotlin.backend.common.lower import org.jetbrains.kotlin.backend.common.* -import org.jetbrains.kotlin.backend.common.descriptors.* +import org.jetbrains.kotlin.backend.common.descriptors.WrappedClassConstructorDescriptor +import org.jetbrains.kotlin.backend.common.descriptors.WrappedClassDescriptor +import org.jetbrains.kotlin.backend.common.descriptors.WrappedFieldDescriptor +import org.jetbrains.kotlin.backend.common.descriptors.WrappedSimpleFunctionDescriptor import org.jetbrains.kotlin.backend.common.ir.* import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality @@ -14,15 +17,23 @@ import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.declarations.impl.* +import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl +import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl +import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl +import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl import org.jetbrains.kotlin.ir.expressions.* -import org.jetbrains.kotlin.ir.expressions.impl.* -import org.jetbrains.kotlin.ir.symbols.* -import org.jetbrains.kotlin.ir.symbols.impl.* -import org.jetbrains.kotlin.ir.types.* +import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl +import org.jetbrains.kotlin.ir.symbols.IrClassSymbol +import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol +import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl +import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl +import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl +import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl +import org.jetbrains.kotlin.ir.types.IrType +import org.jetbrains.kotlin.ir.types.classifierOrFail import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl +import org.jetbrains.kotlin.ir.types.typeWith import org.jetbrains.kotlin.ir.util.* -import org.jetbrains.kotlin.ir.util.defaultType import org.jetbrains.kotlin.ir.visitors.* import org.jetbrains.kotlin.name.Name @@ -73,7 +84,7 @@ abstract class AbstractSuspendFunctionsLowering(val co // Suppress since it is used in native @Suppress("MemberVisibilityCanBePrivate") protected fun IrCall.isReturnIfSuspendedCall() = - symbol.owner.run { fqNameSafe == context.internalPackageFqn.child(Name.identifier("returnIfSuspended")) } + symbol.owner.run { fqNameWhenAvailable == context.internalPackageFqn.child(Name.identifier("returnIfSuspended")) } private fun tryTransformSuspendFunction(element: IrElement) = if (element is IrSimpleFunction && element.isSuspend && element.modality != Modality.ABSTRACT) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/TestGenerator.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/TestGenerator.kt index 8b5c3561387..83eac2eb73c 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/TestGenerator.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/TestGenerator.kt @@ -18,7 +18,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl import org.jetbrains.kotlin.ir.util.defaultType -import org.jetbrains.kotlin.ir.util.fqNameSafe +import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable import org.jetbrains.kotlin.ir.util.isEffectivelyExternal import org.jetbrains.kotlin.name.FqName @@ -158,5 +158,5 @@ class TestGenerator(val context: JsIrBackendContext) : FileLoweringPass { get() = hasAnnotation("kotlin.test.AfterTest") private fun IrAnnotationContainer.hasAnnotation(fqName: String) = - annotations.any { it.symbol.owner.parent.fqNameSafe == FqName(fqName) } + annotations.any { it.symbol.owner.fqNameWhenAvailable?.parent()?.asString() == fqName } } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/IrTypeUtils.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/IrTypeUtils.kt index 5d96c2a87e1..f980575bfb4 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/IrTypeUtils.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/IrTypeUtils.kt @@ -9,7 +9,7 @@ import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.types.* -import org.jetbrains.kotlin.ir.util.fqNameSafe +import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty @@ -35,6 +35,6 @@ private fun IrTypeArgument.asString(): String = when(this) { private fun IrClassifierSymbol.asString() = when (this) { is IrTypeParameterSymbol -> this.owner.name.asString() - is IrClassSymbol -> this.owner.fqNameSafe.asString() + is IrClassSymbol -> this.owner.fqNameWhenAvailable!!.asString() else -> error("Unexpected kind of IrClassifierSymbol: " + javaClass.typeName) } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SingleAbstractMethodLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SingleAbstractMethodLowering.kt index 08127aea9f2..247b353c396 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SingleAbstractMethodLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SingleAbstractMethodLowering.kt @@ -79,7 +79,7 @@ class SingleAbstractMethodLowering(val context: CommonBackendContext) : ClassLow // the `irDelegatingConstructorCall` in the constructor below would need to be modified. assert(superClass.kind == ClassKind.INTERFACE) { "SAM conversion to an abstract class not allowed" } - val superClassName = superClass.fqNameSafe.pathSegments().joinToString("_") { it.toString() } + val superClassName = superClass.fqNameWhenAvailable!!.pathSegments().joinToString("_") { it.toString() } val subclass = buildClass { // TODO this is not the name some tests (e.g. kt11519) expect name = Name.identifier("sam\$$superClassName\$${cachedImplementations.size + localImplementations.size}") diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt index b97743e9181..5c24090b9dd 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.ir.util -import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.ir.SourceManager import org.jetbrains.kotlin.ir.SourceRangeInfo import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET @@ -18,42 +17,45 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.module import java.io.File - val IrConstructor.constructedClass get() = this.parent as IrClass val T.original get() = this -val IrDeclarationParent.fqNameSafe: FqName +val IrDeclarationParent.fqNameForIrSerialization: FqName get() = when (this) { is IrPackageFragment -> this.fqName - is IrDeclaration -> this.parent.fqNameSafe.child(this.name) - + is IrDeclaration -> this.parent.fqNameForIrSerialization.child(this.nameForIrSerialization) else -> error(this) } +@Deprecated( + "Use fqNameForIrSerialization instead.", + ReplaceWith("fqNameForIrSerialization", "org.jetbrains.kotlin.ir.util.fqNameForIrSerialization"), + DeprecationLevel.ERROR +) +val IrDeclarationParent.fqNameSafe: FqName + get() = fqNameForIrSerialization + val IrClass.classId: ClassId? - get() { - val parent = this.parent - return when (parent) { - is IrClass -> parent.classId?.createNestedClassId(this.name) - is IrPackageFragment -> ClassId.topLevel(parent.fqName.child(this.name)) - else -> null - } + get() = when (val parent = this.parent) { + is IrClass -> parent.classId?.createNestedClassId(this.name) + is IrPackageFragment -> ClassId.topLevel(parent.fqName.child(this.name)) + else -> null } -val IrDeclaration.name: Name +val IrDeclaration.nameForIrSerialization: Name get() = when (this) { - is IrSimpleFunction -> this.name - is IrClass -> this.name - is IrEnumEntry -> this.name - is IrProperty -> this.name - is IrLocalDelegatedProperty -> this.name - is IrField -> this.name - is IrVariable -> this.name + is IrDeclarationWithName -> this.name is IrConstructor -> SPECIAL_INIT_NAME - is IrValueParameter -> this.name else -> error(this) } +@Deprecated( + "Use nameForIrSerialization instead.", + ReplaceWith("nameForIrSerialization", "org.jetbrains.kotlin.ir.util.nameForIrSerialization"), + DeprecationLevel.ERROR +) +val IrDeclaration.name: Name + get() = nameForIrSerialization private val SPECIAL_INIT_NAME = Name.special("") @@ -79,10 +81,10 @@ private val IrConstructorCall.annotationClass get() = this.symbol.owner.constructedClass fun List.hasAnnotation(fqName: FqName): Boolean = - any { it.annotationClass.fqNameSafe == fqName } + any { it.annotationClass.fqNameWhenAvailable == fqName } fun List.findAnnotation(fqName: FqName): IrConstructorCall? = - firstOrNull { it.annotationClass.fqNameSafe == fqName } + firstOrNull { it.annotationClass.fqNameWhenAvailable == fqName } val IrDeclaration.fileEntry: SourceManager.FileEntry get() = parent.let { diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinMangler.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinMangler.kt index 810a33cd201..03ebe94d494 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinMangler.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinMangler.kt @@ -110,7 +110,7 @@ abstract class KotlinManglerImpl: KotlinMangler { return "#GENERIC${if (type.isMarkedNullable()) "?" else ""}$upperBounds" } - var hashString = type.getClass()?.run { fqNameSafe.asString() } ?: "" + var hashString = type.getClass()?.run { fqNameForIrSerialization.asString() } ?: "" when (type) { is IrSimpleType -> { @@ -185,7 +185,7 @@ abstract class KotlinManglerImpl: KotlinMangler { val IrField.symbolName: String get() { - val containingDeclarationPart = parent.fqNameSafe.let { + val containingDeclarationPart = parent.fqNameForIrSerialization.let { if (it.isRoot) "" else "$it." } return "kfield:$containingDeclarationPart$name" @@ -195,12 +195,12 @@ abstract class KotlinManglerImpl: KotlinMangler { val IrClass.typeInfoSymbolName: String get() { assert(this.isExported()) - return "ktype:" + this.fqNameSafe.toString() + return "ktype:" + this.fqNameForIrSerialization.toString() } val IrTypeParameter.symbolName: String get() { - val containingDeclarationPart = parent.fqNameSafe + val containingDeclarationPart = parent.fqNameForIrSerialization return "ktypeparam:$containingDeclarationPart$name" } @@ -233,14 +233,14 @@ abstract class KotlinManglerImpl: KotlinMangler { private val IrDeclaration.uniqName: Name get() = when (this) { is IrSimpleFunction -> Name.special("<${this.uniqFunctionName}>") - else -> this.name + else -> this.nameForIrSerialization } private val IrProperty.symbolName: String get() { val extensionReceiver: String = getter!!.extensionReceiverParameter?.extensionReceiverNamePart ?: "" - val containingDeclarationPart = parent.fqNameSafe.let { + val containingDeclarationPart = parent.fqNameForIrSerialization.let { if (it.isRoot) "" else "$it." } return "kprop:$containingDeclarationPart$extensionReceiver$name" @@ -248,7 +248,7 @@ abstract class KotlinManglerImpl: KotlinMangler { private val IrEnumEntry.symbolName: String get() { - val containingDeclarationPart = parent.fqNameSafe.let { + val containingDeclarationPart = parent.fqNameForIrSerialization.let { if (it.isRoot) "" else "$it." } return "kenumentry:$containingDeclarationPart$name" diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsDeclarationTableUtils.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsDeclarationTableUtils.kt index c6a9fea081a..312c44387ab 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsDeclarationTableUtils.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsDeclarationTableUtils.kt @@ -12,8 +12,8 @@ import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction -import org.jetbrains.kotlin.ir.util.fqNameSafe -import org.jetbrains.kotlin.ir.util.name +import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable +import org.jetbrains.kotlin.ir.util.nameForIrSerialization import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -33,11 +33,11 @@ internal val BUILT_IN_UNIQ_ID_GAP = 2 * BUILT_IN_FUNCTION_ARITY_COUNT * BUILT_IN internal val BUILT_IN_UNIQ_ID_CLASS_OFFSET = BUILT_IN_FUNCTION_CLASS_COUNT * BUILT_IN_FUNCTION_ARITY_COUNT internal fun isBuiltInFunction(value: IrDeclaration): Boolean = when (value) { - is IrSimpleFunction -> value.name.asString() == "invoke" && (value.parent as? IrClass)?.let { isBuiltInFunction(it) } == true - is IrClass -> { - val fqn = value.parent.fqNameSafe - functionalPackages.any { it == fqn } && value.name.asString().let { functionPattern.matcher(it).find() } - } + is IrSimpleFunction -> + value.name.asString() == "invoke" && (value.parent as? IrClass)?.let { isBuiltInFunction(it) } == true + is IrClass -> + value.fqNameWhenAvailable?.parent() in functionalPackages && + value.name.asString().let { functionPattern.matcher(it).find() } else -> false } @@ -57,7 +57,7 @@ internal fun builtInFunctionId(value: IrDeclaration): Long = when (value) { value.run { valueParameters.size + builtInOffset(value) * BUILT_IN_FUNCTION_ARITY_COUNT }.toLong() } is IrClass -> { - BUILT_IN_UNIQ_ID_CLASS_OFFSET + builtInFunctionId(value.declarations.first { it.name.asString() == "invoke" }) + BUILT_IN_UNIQ_ID_CLASS_OFFSET + builtInFunctionId(value.declarations.first { it.nameForIrSerialization.asString() == "invoke" }) } else -> error("Only class or function is expected") }