diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt index 1819ca62d87..6382c11be1a 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.codegen.state.extractTypeMappingModeFromAnnotation import org.jetbrains.kotlin.codegen.state.isMethodWithDeclarationSiteWildcardsFqName import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.ir.declarations.* +import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyClass import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyFunctionBase import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrConst @@ -35,10 +36,10 @@ import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.load.java.* import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor -import org.jetbrains.kotlin.load.kotlin.TypeMappingMode -import org.jetbrains.kotlin.load.kotlin.forceSingleValueParameterBoxing -import org.jetbrains.kotlin.load.kotlin.getJvmModuleNameForDeserializedDescriptor -import org.jetbrains.kotlin.load.kotlin.signatures +import org.jetbrains.kotlin.load.kotlin.* +import org.jetbrains.kotlin.metadata.deserialization.getExtensionOrNull +import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf +import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodGenericSignature import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodParameterKind import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature @@ -113,9 +114,8 @@ class MethodSignatureMapper(private val context: JvmBackendContext) { } private fun getModuleName(function: IrFunction): String = - // TODO: get rid of descriptors here (if (function is IrLazyFunctionBase) - getJvmModuleNameForDeserializedDescriptor(function.descriptor) + getJvmModuleNameForDeserialized(function) else null) ?: context.state.moduleName private fun IrFunction.isPublishedApi(): Boolean = @@ -387,4 +387,26 @@ class MethodSignatureMapper(private val context: JvmBackendContext) { val signature = mapSignature(this@computeJvmSignature, skipGenericSignature = false, skipSpecial = true).toString() return signature(classPart, signature) } + + // From org.jetbrains.kotlin.load.kotlin.getJvmModuleNameForDeserializedDescriptor + private fun getJvmModuleNameForDeserialized(function: IrLazyFunctionBase): String? { + var current: IrDeclarationParent? = function.parent + while (current != null) { + when (current) { + is IrLazyClass -> { + val classProto = current.classProto ?: return null + val nameResolver = current.nameResolver ?: return null + return classProto.getExtensionOrNull(JvmProtoBuf.classModuleName) + ?.let(nameResolver::getString) + ?: JvmProtoBufUtil.DEFAULT_MODULE_NAME + } + is IrExternalPackageFragment -> { + val source = current.containerSource ?: return null + return (source as? JvmPackagePartSource)?.moduleName + } + else -> current = (current as? IrDeclaration)?.parent ?: return null + } + } + return null + } } \ No newline at end of file diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFile.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFile.kt index 211e4616739..124d8501695 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFile.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFile.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.ir.symbols.IrFileSymbol import org.jetbrains.kotlin.ir.symbols.IrPackageFragmentSymbol import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import java.io.File interface IrPackageFragment : IrElement, IrDeclarationContainer, IrSymbolOwner { @@ -36,6 +37,7 @@ interface IrPackageFragment : IrElement, IrDeclarationContainer, IrSymbolOwner { interface IrExternalPackageFragment : IrPackageFragment { override val symbol: IrExternalPackageFragmentSymbol + val containerSource: DeserializedContainerSource? } interface IrFile : IrPackageFragment, IrMutableAnnotationContainer, IrMetadataSourceOwner { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrExternalPackageFragmentImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrExternalPackageFragmentImpl.kt index 428f3c80f2f..e36ce85d3e9 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrExternalPackageFragmentImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrExternalPackageFragmentImpl.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.ir.symbols.impl.IrExternalPackageFragmentSymbolImpl import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedMemberDescriptor class IrExternalPackageFragmentImpl( override val symbol: IrExternalPackageFragmentSymbol, @@ -43,6 +44,8 @@ class IrExternalPackageFragmentImpl( override val declarations: MutableList = ArrayList() + override val containerSource get() = (symbol.descriptor as? DeserializedMemberDescriptor)?.containerSource + override fun accept(visitor: IrElementVisitor, data: D): R = visitor.visitExternalPackageFragment(this, data) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyClass.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyClass.kt index 1574d1852aa..1324ee20531 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyClass.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyClass.kt @@ -18,7 +18,10 @@ import org.jetbrains.kotlin.ir.util.transform import org.jetbrains.kotlin.ir.util.mapOptimized import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor +import org.jetbrains.kotlin.metadata.ProtoBuf +import org.jetbrains.kotlin.metadata.deserialization.NameResolver import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor class IrLazyClass( startOffset: Int, @@ -85,6 +88,9 @@ class IrLazyClass( override var attributeOwnerId: IrAttributeContainer = this + val classProto: ProtoBuf.Class? get() = (descriptor as? DeserializedClassDescriptor)?.classProto + val nameResolver: NameResolver? get() = (descriptor as? DeserializedClassDescriptor)?.c?.nameResolver + override fun accept(visitor: IrElementVisitor, data: D): R = visitor.visitClass(this, data)