IR: remove unnecessary reliance on the PSI in inliner

This commit is contained in:
Ilya Chernikov
2021-11-08 12:59:03 +01:00
committed by teamcity
parent 17bbaf27ea
commit 5cca01a7d2
5 changed files with 23 additions and 11 deletions
@@ -37,7 +37,7 @@ abstract class ObjectTransformer<out T : TransformationInfo>(@JvmField val trans
val classBuilder = state.factory.newVisitor(
JvmDeclarationOrigin.NO_ORIGIN,
Type.getObjectType(transformationInfo.newClassName),
inliningContext.callSiteInfo.file!!
listOf(inliningContext.callSiteInfo.file!!)
)
return RemappingClassBuilder(
@@ -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
)
}
@@ -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
@@ -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) }
})
}
}
@@ -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 {