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:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user