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 24c660fafa6..27e138827d2 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 @@ -39,7 +39,6 @@ import org.jetbrains.kotlin.load.java.getOverriddenBuiltinReflectingJvmDescripto 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.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodGenericSignature import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodParameterKind import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature @@ -105,7 +104,7 @@ class MethodSignatureMapper(private val context: JvmBackendContext) { if (function.isTopLevel) { if (Visibilities.isPrivate(function.visibility) && newName != "" && - function.parentAsClass.attributeOwnerId in context.multifileFacadeForPart + (function.parent as? IrClass)?.attributeOwnerId in context.multifileFacadeForPart ) { return "$newName$${function.parentAsClass.name.asString()}" } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt index 80df12a24ed..99d4b85e17c 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt @@ -129,6 +129,7 @@ private fun generateMultifileFacades( }.apply { parent = file createImplicitParameterDeclarationWithWrappedDescriptor() + origin = IrDeclarationOrigin.FILE_CLASS if (jvmClassName.packageFqName != kotlinPackageFqName) { context.classNameOverride[this] = jvmClassName } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/WrappedDescriptors.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/WrappedDescriptors.kt index 327f6e207a2..a5f2afd82ba 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/WrappedDescriptors.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/WrappedDescriptors.kt @@ -12,7 +12,6 @@ import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.descriptors.IrBasedDeclarationDescriptor import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.types.classifierOrFail import org.jetbrains.kotlin.ir.types.toKotlinType @@ -1056,11 +1055,12 @@ open class WrappedFieldDescriptor( private fun getContainingDeclaration(declaration: IrDeclarationWithName): DeclarationDescriptor { val parent = declaration.parent - return if (parent is IrClass && parent.origin == IrDeclarationOrigin.FILE_CLASS && parent.parent is IrExternalPackageFragment) { - // JVM IR adds facade classes for IR of functions/properties loaded from dependencies. However, these shouldn't exist - // in the descriptor hierarchy, since this is what the old backend (dealing with descriptors) expects. - return (parent.parent as IrExternalPackageFragment).packageFragmentDescriptor + val parentDescriptor = (parent as IrSymbolOwner).symbol.descriptor + return if (parent is IrClass && parent.origin == IrDeclarationOrigin.FILE_CLASS) { + // JVM IR adds facade classes for IR of functions/properties loaded both from sources and dependencies. However, these shouldn't + // exist in the descriptor hierarchy, since this is what the old backend (dealing with descriptors) expects. + parentDescriptor.containingDeclaration!! } else { - (parent as IrSymbolOwner).symbol.descriptor + parentDescriptor } } diff --git a/compiler/testData/codegen/box/multifileClasses/optimized/internalFunction.kt b/compiler/testData/codegen/box/multifileClasses/optimized/internalFunction.kt new file mode 100644 index 00000000000..69d159e1929 --- /dev/null +++ b/compiler/testData/codegen/box/multifileClasses/optimized/internalFunction.kt @@ -0,0 +1,19 @@ +// TARGET_BACKEND: JVM +// IGNORE_LIGHT_ANALYSIS +// WITH_RUNTIME +// !INHERIT_MULTIFILE_PARTS + +// FILE: test.kt + +@file:JvmMultifileClass +@file:JvmName("Test") + +internal fun List.first(): T = get(0) + +fun test(): String { + return listOf("OK").first() +} + +// FILE: box.kt + +fun box(): String = test() diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 28f05f53ea9..9a85d0330ee 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -16517,6 +16517,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/multifileClasses/optimized/calls.kt"); } + @TestMetadata("internalFunction.kt") + public void testInternalFunction() throws Exception { + runTest("compiler/testData/codegen/box/multifileClasses/optimized/internalFunction.kt"); + } + @TestMetadata("overlappingFuns.kt") public void testOverlappingFuns() throws Exception { runTest("compiler/testData/codegen/box/multifileClasses/optimized/overlappingFuns.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 7a68adf29da..426dda2d402 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -16517,6 +16517,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/multifileClasses/optimized/calls.kt"); } + @TestMetadata("internalFunction.kt") + public void testInternalFunction() throws Exception { + runTest("compiler/testData/codegen/box/multifileClasses/optimized/internalFunction.kt"); + } + @TestMetadata("overlappingFuns.kt") public void testOverlappingFuns() throws Exception { runTest("compiler/testData/codegen/box/multifileClasses/optimized/overlappingFuns.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 5b1eb2abe52..23d3379c3c4 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -15392,6 +15392,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/multifileClasses/optimized/calls.kt"); } + @TestMetadata("internalFunction.kt") + public void testInternalFunction() throws Exception { + runTest("compiler/testData/codegen/box/multifileClasses/optimized/internalFunction.kt"); + } + @TestMetadata("overlappingFuns.kt") public void testOverlappingFuns() throws Exception { runTest("compiler/testData/codegen/box/multifileClasses/optimized/overlappingFuns.kt");