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( val classBuilder = state.factory.newVisitor(
JvmDeclarationOrigin.NO_ORIGIN, JvmDeclarationOrigin.NO_ORIGIN,
Type.getObjectType(transformationInfo.newClassName), Type.getObjectType(transformationInfo.newClassName),
inliningContext.callSiteInfo.file!! listOf(inliningContext.callSiteInfo.file!!)
) )
return RemappingClassBuilder( 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.Type
import org.jetbrains.org.objectweb.asm.commons.Method import org.jetbrains.org.objectweb.asm.commons.Method
import org.jetbrains.org.objectweb.asm.tree.MethodNode import org.jetbrains.org.objectweb.asm.tree.MethodNode
import java.io.File
class PsiSourceCompilerForInline( class PsiSourceCompilerForInline(
private val codegen: ExpressionCodegen, private val codegen: ExpressionCodegen,
@@ -75,7 +76,7 @@ class PsiSourceCompilerForInline(
parentCodegen.className, parentCodegen.className,
signature.asmMethod, signature.asmMethod,
context.functionDescriptor.getInlineCallSiteVisibility(), context.functionDescriptor.getInlineCallSiteVisibility(),
callElement.containingFile, callElement.containingFile?.virtualFile?.let { File(it.path) },
CodegenUtil.getLineNumberForElement(callElement, false) ?: 0 CodegenUtil.getLineNumberForElement(callElement, false) ?: 0
) )
} }
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.codegen.inline package org.jetbrains.kotlin.codegen.inline
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.AsmUtil
import org.jetbrains.kotlin.codegen.inline.coroutines.FOR_INLINE_SUFFIX import org.jetbrains.kotlin.codegen.inline.coroutines.FOR_INLINE_SUFFIX
import org.jetbrains.kotlin.codegen.state.GenerationState 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.Type
import org.jetbrains.org.objectweb.asm.commons.Method import org.jetbrains.org.objectweb.asm.commons.Method
import org.jetbrains.org.objectweb.asm.tree.MethodNode import org.jetbrains.org.objectweb.asm.tree.MethodNode
import java.io.File
class InlineCallSiteInfo( class InlineCallSiteInfo(
val ownerClassName: String, val ownerClassName: String,
val method: Method, val method: Method,
val inlineScopeVisibility: DescriptorVisibility?, val inlineScopeVisibility: DescriptorVisibility?,
val file: PsiFile?, val file: File?,
val lineNumber: Int val lineNumber: Int
) { ) {
val isInlineOrInsideInline: Boolean 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.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrFunction 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.descriptors.toIrBasedDescriptor
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
import org.jetbrains.kotlin.ir.expressions.IrLoop import org.jetbrains.kotlin.ir.expressions.IrLoop
@@ -50,7 +51,7 @@ class IrSourceCompilerForInline(
root.classCodegen.type.internalName, root.classCodegen.type.internalName,
root.signature.asmMethod, root.signature.asmMethod,
root.irFunction.inlineScopeVisibility, root.irFunction.inlineScopeVisibility,
root.irFunction.fileParent.getKtFile(), root.irFunction.fileParent.getIoFile(),
callElement.psiElement?.let { CodegenUtil.getLineNumberForElement(it, false) } ?: 0 callElement.psiElement?.let { CodegenUtil.getLineNumberForElement(it, false) } ?: 0
) )
} }
@@ -74,15 +75,17 @@ class IrSourceCompilerForInline(
} }
if (jvmSignature.asmMethod.name != callee.name.asString()) { if (jvmSignature.asmMethod.name != callee.name.asString()) {
val ktFile = codegen.irFunction.fileParent.getKtFile() 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 { 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 override val position: Position
get() = DiagnosticUtils.getLineAndColumnInPsiFile( get() =
ktFile, if (ktFile == null) Position.NO_POSITION
TextRange(callElement.startOffset, callElement.endOffset) else DiagnosticUtils.getLineAndColumnInPsiFile(
).let { Position(it.line, it.column) } 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.multiplatform.OptionalAnnotationUtil
import org.jetbrains.kotlin.resolve.source.PsiSourceElement import org.jetbrains.kotlin.resolve.source.PsiSourceElement
import org.jetbrains.kotlin.utils.DFS 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.Type
import org.jetbrains.org.objectweb.asm.commons.Method import org.jetbrains.org.objectweb.asm.commons.Method
@@ -280,6 +282,12 @@ fun IrClass.getSingleAbstractMethod(): IrSimpleFunction? =
fun IrFile.getKtFile(): KtFile? = fun IrFile.getKtFile(): KtFile? =
(fileEntry as? PsiIrFileEntry)?.psiFile as 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 { inline fun IrElement.hasChild(crossinline block: (IrElement) -> Boolean): Boolean {
var result = false var result = false
acceptChildren(object : IrElementVisitorVoid { acceptChildren(object : IrElementVisitorVoid {