mirror of
https://github.com/jlengrand/kotlin.git
synced 2026-03-10 08:31:29 +00:00
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.state.GenerationState
|
||||
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
|
||||
import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
||||
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.Name
|
||||
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
||||
@@ -87,12 +90,9 @@ abstract class InlineCodegen<out T : BaseExpressionCodegen>(
|
||||
isSameModule = sourceCompiler.isCallInsideSameModuleAsDeclared(functionDescriptor)
|
||||
|
||||
if (functionDescriptor !is FictitiousArrayConstructor) {
|
||||
val functionOrAccessorName = jvmSignature.asmMethod.name
|
||||
//track changes for property accessor and @JvmName inline functions/property accessors
|
||||
if (functionOrAccessorName != functionDescriptor.name.asString()) {
|
||||
val scope = getMemberScope(functionDescriptor)
|
||||
//Fake lookup to track track changes for property accessors and @JvmName functions/property accessors
|
||||
scope?.getContributedFunctions(Name.identifier(functionOrAccessorName), sourceCompiler.lookupLocation)
|
||||
if (jvmSignature.asmMethod.name != functionDescriptor.name.asString()) {
|
||||
trackLookup(functionDescriptor)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -500,19 +500,24 @@ abstract class InlineCodegen<out T : BaseExpressionCodegen>(
|
||||
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 {
|
||||
|
||||
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(
|
||||
functionDescriptor: FunctionDescriptor,
|
||||
methodOwner: Type,
|
||||
|
||||
@@ -1949,6 +1949,11 @@ public class IncrementalJvmCompilerRunnerTestGenerated extends AbstractIncrement
|
||||
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")
|
||||
public void testInlineTopLevelFunctionWithJvmName() throws Exception {
|
||||
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")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
|
||||
@@ -1949,6 +1949,11 @@ public class IrIncrementalJvmCompilerRunnerTestGenerated extends AbstractIrIncre
|
||||
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")
|
||||
public void testInlineTopLevelFunctionWithJvmName() throws Exception {
|
||||
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")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
|
||||
@@ -2139,6 +2139,11 @@ public class IncrementalJvmJpsTestGenerated extends AbstractIncrementalJvmJpsTes
|
||||
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")
|
||||
public void testInlineTopLevelFunctionWithJvmName() throws Exception {
|
||||
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")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
|
||||
22
jps-plugin/testData/incremental/withJava/other/inlineFunctionWithJvmNameInClass/build.log
vendored
Normal file
22
jps-plugin/testData/incremental/withJava/other/inlineFunctionWithJvmNameInClass/build.log
vendored
Normal file
@@ -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
jps-plugin/testData/incremental/withJava/other/inlineFunctionWithJvmNameInClass/dummy.kt
vendored
Normal file
3
jps-plugin/testData/incremental/withJava/other/inlineFunctionWithJvmNameInClass/dummy.kt
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
package test
|
||||
|
||||
fun dummy() {}
|
||||
8
jps-plugin/testData/incremental/withJava/other/inlineFunctionWithJvmNameInClass/inline.kt
vendored
Normal file
8
jps-plugin/testData/incremental/withJava/other/inlineFunctionWithJvmNameInClass/inline.kt
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
package inline
|
||||
|
||||
class A {
|
||||
var z = 0
|
||||
|
||||
@JvmName("fff")
|
||||
inline fun f(): Int = 0
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package inline
|
||||
|
||||
class A {
|
||||
var z = 0
|
||||
|
||||
@JvmName("fff")
|
||||
inline fun f(): Int = 1
|
||||
}
|
||||
3
jps-plugin/testData/incremental/withJava/other/inlineFunctionWithJvmNameInClass/usage.kt
vendored
Normal file
3
jps-plugin/testData/incremental/withJava/other/inlineFunctionWithJvmNameInClass/usage.kt
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
package usage
|
||||
|
||||
fun use() = inline.A().f()
|
||||
Reference in New Issue
Block a user