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(
|
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(
|
||||||
|
|||||||
+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.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
|
||||||
|
|||||||
+10
-7
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user