From 76f8109ff60fdc7bd20395f29665ef0193e8f755 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Sch=C3=A4fer?= Date: Tue, 4 Feb 2020 15:07:02 +0100 Subject: [PATCH] JVM IR: Implement LookupLocation in IrSourceCompilerForInline This is used when compiling calls to inline functions with a different @JvmName for incremental compilation. --- .../jvm/codegen/IrSourceCompilerForInline.kt | 30 +++++++++++++++---- .../inlinePropertyInClass/directives.txt | 1 - .../inlinePropertyOnTopLevel/directives.txt | 1 - .../directives.txt | 1 - .../directives.txt | 1 - 5 files changed, 25 insertions(+), 9 deletions(-) delete mode 100644 jps-plugin/testData/incremental/pureKotlin/inlinePropertyInClass/directives.txt delete mode 100644 jps-plugin/testData/incremental/pureKotlin/inlinePropertyOnTopLevel/directives.txt delete mode 100644 jps-plugin/testData/incremental/withJava/other/inlineTopLevelFunctionWithJvmName/directives.txt delete mode 100644 jps-plugin/testData/incremental/withJava/other/inlineTopLevelValPropertyWithJvmName/directives.txt diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt index 1cf0d1e165c..accdf2d0676 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.backend.jvm.codegen +import com.intellij.openapi.util.TextRange import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import org.jetbrains.kotlin.backend.common.CodegenUtil @@ -13,7 +14,6 @@ import org.jetbrains.kotlin.backend.jvm.lower.getOrCreateSuspendFunctionViewIfNe import org.jetbrains.kotlin.codegen.BaseExpressionCodegen import org.jetbrains.kotlin.codegen.ClassBuilder import org.jetbrains.kotlin.codegen.OwnerKind -import org.jetbrains.kotlin.codegen.coroutines.INVOKE_SUSPEND_METHOD_NAME import org.jetbrains.kotlin.codegen.inline.* import org.jetbrains.kotlin.codegen.inline.coroutines.FOR_INLINE_SUFFIX import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings @@ -21,15 +21,20 @@ import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithSource import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.diagnostics.DiagnosticUtils +import org.jetbrains.kotlin.incremental.components.LocationInfo import org.jetbrains.kotlin.incremental.components.LookupLocation -import org.jetbrains.kotlin.incremental.components.NoLookupLocation +import org.jetbrains.kotlin.incremental.components.Position import org.jetbrains.kotlin.ir.declarations.IrAttributeContainer import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression -import org.jetbrains.kotlin.ir.util.* +import org.jetbrains.kotlin.ir.util.functions +import org.jetbrains.kotlin.ir.util.isSuspend +import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.psi.KtElement +import org.jetbrains.kotlin.psi.doNotAnalyze import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm.SUSPENSION_POINT_INSIDE_MONITOR import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin @@ -49,9 +54,24 @@ class IrSourceCompilerForInline( private val data: BlockInfo ) : SourceCompilerForInline { - //TODO: KotlinLookupLocation(callElement) override val lookupLocation: LookupLocation - get() = NoLookupLocation.FROM_BACKEND + get() = object : LookupLocation { + override val location: LocationInfo? + get() { + val ktFile = codegen.classCodegen.context.psiSourceManager.getKtFile(codegen.irFunction.fileParent) + ?.takeUnless { it.doNotAnalyze != null } ?: return null + + return object : LocationInfo { + override val filePath = ktFile.virtualFilePath + + override val position: Position + get() = DiagnosticUtils.getLineAndColumnInPsiFile( + ktFile, + TextRange(callElement.startOffset, callElement.endOffset) + ).let { Position(it.line, it.column) } + } + } + } override val callElementText: String get() = ir2string(callElement) diff --git a/jps-plugin/testData/incremental/pureKotlin/inlinePropertyInClass/directives.txt b/jps-plugin/testData/incremental/pureKotlin/inlinePropertyInClass/directives.txt deleted file mode 100644 index 5099b2ad971..00000000000 --- a/jps-plugin/testData/incremental/pureKotlin/inlinePropertyInClass/directives.txt +++ /dev/null @@ -1 +0,0 @@ -// IGNORE_BACKEND: JVM_IR diff --git a/jps-plugin/testData/incremental/pureKotlin/inlinePropertyOnTopLevel/directives.txt b/jps-plugin/testData/incremental/pureKotlin/inlinePropertyOnTopLevel/directives.txt deleted file mode 100644 index 5099b2ad971..00000000000 --- a/jps-plugin/testData/incremental/pureKotlin/inlinePropertyOnTopLevel/directives.txt +++ /dev/null @@ -1 +0,0 @@ -// IGNORE_BACKEND: JVM_IR diff --git a/jps-plugin/testData/incremental/withJava/other/inlineTopLevelFunctionWithJvmName/directives.txt b/jps-plugin/testData/incremental/withJava/other/inlineTopLevelFunctionWithJvmName/directives.txt deleted file mode 100644 index 5099b2ad971..00000000000 --- a/jps-plugin/testData/incremental/withJava/other/inlineTopLevelFunctionWithJvmName/directives.txt +++ /dev/null @@ -1 +0,0 @@ -// IGNORE_BACKEND: JVM_IR diff --git a/jps-plugin/testData/incremental/withJava/other/inlineTopLevelValPropertyWithJvmName/directives.txt b/jps-plugin/testData/incremental/withJava/other/inlineTopLevelValPropertyWithJvmName/directives.txt deleted file mode 100644 index 5099b2ad971..00000000000 --- a/jps-plugin/testData/incremental/withJava/other/inlineTopLevelValPropertyWithJvmName/directives.txt +++ /dev/null @@ -1 +0,0 @@ -// IGNORE_BACKEND: JVM_IR