JVM_IR: avoid descriptors when tracking inline properties
Preparing to use wrapped properties in InlineCodegen.
This commit is contained in:
@@ -15,7 +15,10 @@ import org.jetbrains.kotlin.codegen.inline.coroutines.FOR_INLINE_SUFFIX
|
|||||||
import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicArrayConstructors
|
import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicArrayConstructors
|
||||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||||
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
|
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
|
||||||
|
import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
|
import org.jetbrains.kotlin.incremental.components.Position
|
||||||
|
import org.jetbrains.kotlin.incremental.components.ScopeKind
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
||||||
@@ -87,12 +90,9 @@ abstract class InlineCodegen<out T : BaseExpressionCodegen>(
|
|||||||
isSameModule = sourceCompiler.isCallInsideSameModuleAsDeclared(functionDescriptor)
|
isSameModule = sourceCompiler.isCallInsideSameModuleAsDeclared(functionDescriptor)
|
||||||
|
|
||||||
if (functionDescriptor !is FictitiousArrayConstructor) {
|
if (functionDescriptor !is FictitiousArrayConstructor) {
|
||||||
val functionOrAccessorName = jvmSignature.asmMethod.name
|
|
||||||
//track changes for property accessor and @JvmName inline functions/property accessors
|
//track changes for property accessor and @JvmName inline functions/property accessors
|
||||||
if (functionOrAccessorName != functionDescriptor.name.asString()) {
|
if (jvmSignature.asmMethod.name != functionDescriptor.name.asString()) {
|
||||||
val scope = getMemberScope(functionDescriptor)
|
trackLookup(functionDescriptor)
|
||||||
//Fake lookup to track track changes for property accessors and @JvmName functions/property accessors
|
|
||||||
scope?.getContributedFunctions(Name.identifier(functionOrAccessorName), sourceCompiler.lookupLocation)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -500,19 +500,24 @@ abstract class InlineCodegen<out T : BaseExpressionCodegen>(
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun trackLookup(functionOrAccessor: FunctionDescriptor) {
|
||||||
|
val functionOrAccessorName = jvmSignature.asmMethod.name
|
||||||
|
val lookupTracker = state.configuration.get(CommonConfigurationKeys.LOOKUP_TRACKER) ?: return
|
||||||
|
val location = sourceCompiler.lookupLocation.location ?: return
|
||||||
|
val position = if (lookupTracker.requiresPosition) location.position else Position.NO_POSITION
|
||||||
|
val classOrPackageFragment = functionOrAccessor.containingDeclaration
|
||||||
|
lookupTracker.record(
|
||||||
|
location.filePath,
|
||||||
|
position,
|
||||||
|
DescriptorUtils.getFqName(classOrPackageFragment).asString(),
|
||||||
|
ScopeKind.CLASSIFIER,
|
||||||
|
functionOrAccessorName
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
private fun getMemberScope(functionOrAccessor: FunctionDescriptor): MemberScope? {
|
|
||||||
val callableMemberDescriptor = JvmCodegenUtil.getDirectMember(functionOrAccessor)
|
|
||||||
val classOrPackageFragment = callableMemberDescriptor.containingDeclaration
|
|
||||||
return when (classOrPackageFragment) {
|
|
||||||
is ClassDescriptor -> classOrPackageFragment.unsubstitutedMemberScope
|
|
||||||
is PackageFragmentDescriptor -> classOrPackageFragment.getMemberScope()
|
|
||||||
else -> null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal fun createInlineMethodNode(
|
internal fun createInlineMethodNode(
|
||||||
functionDescriptor: FunctionDescriptor,
|
functionDescriptor: FunctionDescriptor,
|
||||||
methodOwner: Type,
|
methodOwner: Type,
|
||||||
|
|||||||
+18
@@ -1949,6 +1949,11 @@ public class IncrementalJvmCompilerRunnerTestGenerated extends AbstractIncrement
|
|||||||
runTest("jps-plugin/testData/incremental/withJava/other/defaultValueInConstructorAdded/");
|
runTest("jps-plugin/testData/incremental/withJava/other/defaultValueInConstructorAdded/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("inlineFunctionWithJvmNameInClass")
|
||||||
|
public void testInlineFunctionWithJvmNameInClass() throws Exception {
|
||||||
|
runTest("jps-plugin/testData/incremental/withJava/other/inlineFunctionWithJvmNameInClass/");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("inlineTopLevelFunctionWithJvmName")
|
@TestMetadata("inlineTopLevelFunctionWithJvmName")
|
||||||
public void testInlineTopLevelFunctionWithJvmName() throws Exception {
|
public void testInlineTopLevelFunctionWithJvmName() throws Exception {
|
||||||
runTest("jps-plugin/testData/incremental/withJava/other/inlineTopLevelFunctionWithJvmName/");
|
runTest("jps-plugin/testData/incremental/withJava/other/inlineTopLevelFunctionWithJvmName/");
|
||||||
@@ -2142,6 +2147,19 @@ public class IncrementalJvmCompilerRunnerTestGenerated extends AbstractIncrement
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("jps-plugin/testData/incremental/withJava/other/inlineFunctionWithJvmNameInClass")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public static class InlineFunctionWithJvmNameInClass extends AbstractIncrementalJvmCompilerRunnerTest {
|
||||||
|
private void runTest(String testDataFilePath) throws Exception {
|
||||||
|
KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testAllFilesPresentInInlineFunctionWithJvmNameInClass() throws Exception {
|
||||||
|
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("jps-plugin/testData/incremental/withJava/other/inlineFunctionWithJvmNameInClass"), Pattern.compile("^([^\\.]+)$"), null, TargetBackend.JVM, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("jps-plugin/testData/incremental/withJava/other/inlineTopLevelFunctionWithJvmName")
|
@TestMetadata("jps-plugin/testData/incremental/withJava/other/inlineTopLevelFunctionWithJvmName")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
+18
@@ -1949,6 +1949,11 @@ public class IrIncrementalJvmCompilerRunnerTestGenerated extends AbstractIrIncre
|
|||||||
runTest("jps-plugin/testData/incremental/withJava/other/defaultValueInConstructorAdded/");
|
runTest("jps-plugin/testData/incremental/withJava/other/defaultValueInConstructorAdded/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("inlineFunctionWithJvmNameInClass")
|
||||||
|
public void testInlineFunctionWithJvmNameInClass() throws Exception {
|
||||||
|
runTest("jps-plugin/testData/incremental/withJava/other/inlineFunctionWithJvmNameInClass/");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("inlineTopLevelFunctionWithJvmName")
|
@TestMetadata("inlineTopLevelFunctionWithJvmName")
|
||||||
public void testInlineTopLevelFunctionWithJvmName() throws Exception {
|
public void testInlineTopLevelFunctionWithJvmName() throws Exception {
|
||||||
runTest("jps-plugin/testData/incremental/withJava/other/inlineTopLevelFunctionWithJvmName/");
|
runTest("jps-plugin/testData/incremental/withJava/other/inlineTopLevelFunctionWithJvmName/");
|
||||||
@@ -2142,6 +2147,19 @@ public class IrIncrementalJvmCompilerRunnerTestGenerated extends AbstractIrIncre
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("jps-plugin/testData/incremental/withJava/other/inlineFunctionWithJvmNameInClass")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public static class InlineFunctionWithJvmNameInClass extends AbstractIrIncrementalJvmCompilerRunnerTest {
|
||||||
|
private void runTest(String testDataFilePath) throws Exception {
|
||||||
|
KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM_IR, testDataFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testAllFilesPresentInInlineFunctionWithJvmNameInClass() throws Exception {
|
||||||
|
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("jps-plugin/testData/incremental/withJava/other/inlineFunctionWithJvmNameInClass"), Pattern.compile("^([^\\.]+)$"), null, TargetBackend.JVM_IR, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("jps-plugin/testData/incremental/withJava/other/inlineTopLevelFunctionWithJvmName")
|
@TestMetadata("jps-plugin/testData/incremental/withJava/other/inlineTopLevelFunctionWithJvmName")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
Generated
+18
@@ -2139,6 +2139,11 @@ public class IncrementalJvmJpsTestGenerated extends AbstractIncrementalJvmJpsTes
|
|||||||
runTest("jps-plugin/testData/incremental/withJava/other/defaultValueInConstructorAdded/");
|
runTest("jps-plugin/testData/incremental/withJava/other/defaultValueInConstructorAdded/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("inlineFunctionWithJvmNameInClass")
|
||||||
|
public void testInlineFunctionWithJvmNameInClass() throws Exception {
|
||||||
|
runTest("jps-plugin/testData/incremental/withJava/other/inlineFunctionWithJvmNameInClass/");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("inlineTopLevelFunctionWithJvmName")
|
@TestMetadata("inlineTopLevelFunctionWithJvmName")
|
||||||
public void testInlineTopLevelFunctionWithJvmName() throws Exception {
|
public void testInlineTopLevelFunctionWithJvmName() throws Exception {
|
||||||
runTest("jps-plugin/testData/incremental/withJava/other/inlineTopLevelFunctionWithJvmName/");
|
runTest("jps-plugin/testData/incremental/withJava/other/inlineTopLevelFunctionWithJvmName/");
|
||||||
@@ -2332,6 +2337,19 @@ public class IncrementalJvmJpsTestGenerated extends AbstractIncrementalJvmJpsTes
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("jps-plugin/testData/incremental/withJava/other/inlineFunctionWithJvmNameInClass")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public static class InlineFunctionWithJvmNameInClass extends AbstractIncrementalJvmJpsTest {
|
||||||
|
private void runTest(String testDataFilePath) throws Exception {
|
||||||
|
KotlinTestUtils.runTest(this::doTest, this, testDataFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testAllFilesPresentInInlineFunctionWithJvmNameInClass() throws Exception {
|
||||||
|
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("jps-plugin/testData/incremental/withJava/other/inlineFunctionWithJvmNameInClass"), Pattern.compile("^([^\\.]+)$"), null, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("jps-plugin/testData/incremental/withJava/other/inlineTopLevelFunctionWithJvmName")
|
@TestMetadata("jps-plugin/testData/incremental/withJava/other/inlineTopLevelFunctionWithJvmName")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
+22
@@ -0,0 +1,22 @@
|
|||||||
|
================ Step #1 =================
|
||||||
|
|
||||||
|
Cleaning output files:
|
||||||
|
out/production/module/META-INF/module.kotlin_module
|
||||||
|
out/production/module/inline/A.class
|
||||||
|
End of files
|
||||||
|
Compiling files:
|
||||||
|
src/inline.kt
|
||||||
|
End of files
|
||||||
|
Marked as dirty by Kotlin:
|
||||||
|
src/usage.kt
|
||||||
|
Exit code: ADDITIONAL_PASS_REQUIRED
|
||||||
|
------------------------------------------
|
||||||
|
Cleaning output files:
|
||||||
|
out/production/module/META-INF/module.kotlin_module
|
||||||
|
out/production/module/usage/UsageKt.class
|
||||||
|
End of files
|
||||||
|
Compiling files:
|
||||||
|
src/usage.kt
|
||||||
|
End of files
|
||||||
|
Exit code: OK
|
||||||
|
------------------------------------------
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
fun dummy() {}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
package inline
|
||||||
|
|
||||||
|
class A {
|
||||||
|
var z = 0
|
||||||
|
|
||||||
|
@JvmName("fff")
|
||||||
|
inline fun f(): Int = 0
|
||||||
|
}
|
||||||
Vendored
+8
@@ -0,0 +1,8 @@
|
|||||||
|
package inline
|
||||||
|
|
||||||
|
class A {
|
||||||
|
var z = 0
|
||||||
|
|
||||||
|
@JvmName("fff")
|
||||||
|
inline fun f(): Int = 1
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
package usage
|
||||||
|
|
||||||
|
fun use() = inline.A().f()
|
||||||
Reference in New Issue
Block a user