IR: remove unnecessary reliance on the PSI in inliner
This commit is contained in:
@@ -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(
|
||||
|
||||
+2
-1
@@ -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
|
||||
|
||||
+10
-7
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user