JVM IR: fix containing declaration for top level members in wrapped descriptors

In addition to fixing getContainingDeclaration, change origin of
multifile facades to FILE_CLASS since the corresponding class descriptor
should also be skipped when computing containing declaration. This fixes
the problem with internal function calls in -Xmultifile-parts-inherit
mode (previously we incorrectly mangled the function name in
MethodSignatureMapper), and also fixes coroutine intrinsic calls when
compiling kotlin-stdlib with JVM IR. In the latter case, all intrinsics
(such as isBuiltInSuspendCoroutineUninterceptedOrReturn) are present in
sources, and were previously not detected as intrinsics by the code in
`generateInlineIntrinsic` because the FQ name didn't match: it had an
additional component for the file class name.
This commit is contained in:
Alexander Udalov
2019-11-12 18:32:00 +01:00
parent 59af967292
commit f47b67781d
7 changed files with 42 additions and 8 deletions
@@ -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
}
}