diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ObjectTransformer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ObjectTransformer.kt index 23057ccc16f..fe27b8aeada 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ObjectTransformer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ObjectTransformer.kt @@ -37,7 +37,7 @@ abstract class ObjectTransformer(@JvmField val trans val classBuilder = state.factory.newVisitor( JvmDeclarationOrigin.NO_ORIGIN, Type.getObjectType(transformationInfo.newClassName), - inliningContext.callSiteInfo.file!! + listOf(inliningContext.callSiteInfo.file!!) ) return RemappingClassBuilder( diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/PsiSourceCompilerForInline.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/PsiSourceCompilerForInline.kt index 189c27fbfb5..2aff91ca18c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/PsiSourceCompilerForInline.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/PsiSourceCompilerForInline.kt @@ -36,6 +36,7 @@ import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.commons.Method import org.jetbrains.org.objectweb.asm.tree.MethodNode +import java.io.File class PsiSourceCompilerForInline( private val codegen: ExpressionCodegen, @@ -75,7 +76,7 @@ class PsiSourceCompilerForInline( parentCodegen.className, signature.asmMethod, context.functionDescriptor.getInlineCallSiteVisibility(), - callElement.containingFile, + callElement.containingFile?.virtualFile?.let { File(it.path) }, CodegenUtil.getLineNumberForElement(callElement, false) ?: 0 ) } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SourceCompilerForInline.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SourceCompilerForInline.kt index 01be5cee076..abaf1d07832 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SourceCompilerForInline.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SourceCompilerForInline.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.codegen.inline -import com.intellij.psi.PsiFile import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.inline.coroutines.FOR_INLINE_SUFFIX import org.jetbrains.kotlin.codegen.state.GenerationState @@ -22,12 +21,13 @@ import org.jetbrains.org.objectweb.asm.Label import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.commons.Method import org.jetbrains.org.objectweb.asm.tree.MethodNode +import java.io.File class InlineCallSiteInfo( val ownerClassName: String, val method: Method, val inlineScopeVisibility: DescriptorVisibility?, - val file: PsiFile?, + val file: File?, val lineNumber: Int ) { val isInlineOrInsideInline: Boolean diff --git a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt index 7974a87e22e..92aef5e436e 100644 --- a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt +++ b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.incremental.components.Position import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrFunction +import org.jetbrains.kotlin.ir.declarations.name import org.jetbrains.kotlin.ir.descriptors.toIrBasedDescriptor import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression import org.jetbrains.kotlin.ir.expressions.IrLoop @@ -50,7 +51,7 @@ class IrSourceCompilerForInline( root.classCodegen.type.internalName, root.signature.asmMethod, root.irFunction.inlineScopeVisibility, - root.irFunction.fileParent.getKtFile(), + root.irFunction.fileParent.getIoFile(), callElement.psiElement?.let { CodegenUtil.getLineNumberForElement(it, false) } ?: 0 ) } @@ -74,15 +75,17 @@ class IrSourceCompilerForInline( } if (jvmSignature.asmMethod.name != callee.name.asString()) { val ktFile = codegen.irFunction.fileParent.getKtFile() - if (ktFile != null && ktFile.doNotAnalyze == null) { + if ((ktFile != null && ktFile.doNotAnalyze == null) || ktFile == null) { state.trackLookup(callee.parentAsClass.kotlinFqName, jvmSignature.asmMethod.name, object : LocationInfo { - override val filePath = ktFile.virtualFilePath + override val filePath = ktFile?.virtualFile?.path ?: codegen.irFunction.fileParent.fileEntry.name override val position: Position - get() = DiagnosticUtils.getLineAndColumnInPsiFile( - ktFile, - TextRange(callElement.startOffset, callElement.endOffset) - ).let { Position(it.line, it.column) } + get() = + if (ktFile == null) Position.NO_POSITION + else DiagnosticUtils.getLineAndColumnInPsiFile( + ktFile, + TextRange(callElement.startOffset, callElement.endOffset) + ).let { Position(it.line, it.column) } }) } } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrUtils.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrUtils.kt index d42fa3af148..66118e6572a 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrUtils.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrUtils.kt @@ -69,6 +69,8 @@ import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.multiplatform.OptionalAnnotationUtil import org.jetbrains.kotlin.resolve.source.PsiSourceElement import org.jetbrains.kotlin.utils.DFS +import org.jetbrains.kotlin.utils.addToStdlib.safeAs +import java.io.File import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.commons.Method @@ -280,6 +282,12 @@ fun IrClass.getSingleAbstractMethod(): IrSimpleFunction? = fun IrFile.getKtFile(): KtFile? = (fileEntry as? PsiIrFileEntry)?.psiFile as KtFile? +fun IrFile.getIoFile(): File? = + when (val fe = fileEntry) { + is PsiIrFileEntry -> fe.psiFile.virtualFile?.path?.let(::File) + else -> File(fe.name).takeIf { it.exists() } + } + inline fun IrElement.hasChild(crossinline block: (IrElement) -> Boolean): Boolean { var result = false acceptChildren(object : IrElementVisitorVoid {