diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolProvider.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolProvider.kt index f16442ad685..75ce4b21c4e 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolProvider.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolProvider.kt @@ -166,7 +166,10 @@ abstract class AbstractFirDeserializedSymbolProvider( return getPackageParts(callableId.packageName).flatMap { part -> val functionIds = part.topLevelFunctionNameIndex[callableId.callableName] ?: return@flatMap emptyList() functionIds.map { - part.context.memberDeserializer.loadFunction(part.proto.getFunction(it)).symbol + part.context.memberDeserializer.loadFunction( + part.proto.getFunction(it), + deserializationOrigin = defaultDeserializationOrigin + ).symbol } } } diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt index d33f8cfd312..231b81e8c9a 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt @@ -428,7 +428,9 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { fun loadFunction( proto: ProtoBuf.Function, classProto: ProtoBuf.Class? = null, - classSymbol: FirClassSymbol<*>? = null + classSymbol: FirClassSymbol<*>? = null, + // TODO: introduce the similar changes for the other deserialized entities + deserializationOrigin: FirDeclarationOrigin = FirDeclarationOrigin.Library ): FirSimpleFunction { val flags = if (proto.hasFlags()) proto.flags else loadOldFlags(proto.oldFlags) @@ -447,7 +449,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { val simpleFunction = buildSimpleFunction { moduleData = c.moduleData - origin = FirDeclarationOrigin.Library + origin = deserializationOrigin returnTypeRef = proto.returnType(local.typeTable).toTypeRef(local) receiverTypeRef = proto.receiverType(local.typeTable)?.toTypeRef(local).apply { annotations += receiverAnnotations diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt index 4e84ff9d95b..7f48d2cbfe4 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt @@ -483,7 +483,7 @@ class Fir2IrClassifierStorage( val classId = firClassSymbol.classId val parentId = classId.outerClassId val parentClass = parentId?.let { session.symbolProvider.getClassLikeSymbolByClassId(it) } - val irParent = declarationStorage.findIrParent(classId.packageFqName, parentClass?.toLookupTag(), firClassSymbol)!! + val irParent = declarationStorage.findIrParent(classId.packageFqName, parentClass?.toLookupTag(), firClassSymbol, firClass.origin)!! val symbol = Fir2IrClassSymbol(signature) val irClass = firClass.convertWithOffsets { startOffset, endOffset -> symbolTable.declareClass(signature, { symbol }) { diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index efbdacc40cd..7f6c60f0f02 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -210,9 +210,9 @@ class Fir2IrDeclarationStorage( private fun ConeKotlinType.toIrType(typeContext: ConversionTypeContext = ConversionTypeContext.DEFAULT): IrType = with(typeConverter) { toIrType(typeContext) } - private fun getIrExternalOrBuiltInsPackageFragment(fqName: FqName): IrExternalPackageFragment { + private fun getIrExternalOrBuiltInsPackageFragment(fqName: FqName, firOrigin: FirDeclarationOrigin): IrExternalPackageFragment { val isBuiltIn = fqName in BUILT_INS_PACKAGE_FQ_NAMES - return if (isBuiltIn) getIrBuiltInsPackageFragment(fqName) else getIrExternalPackageFragment(fqName) + return if (isBuiltIn) getIrBuiltInsPackageFragment(fqName) else getIrExternalPackageFragment(fqName, firOrigin) } private fun getIrBuiltInsPackageFragment(fqName: FqName): IrExternalPackageFragment { @@ -221,11 +221,17 @@ class Fir2IrDeclarationStorage( } } - fun getIrExternalPackageFragment(fqName: FqName): IrExternalPackageFragment { + fun getIrExternalPackageFragment( + fqName: FqName, + firOrigin: FirDeclarationOrigin = FirDeclarationOrigin.Library + ): IrExternalPackageFragment { return fragmentCache.getOrPut(fqName) { // Make sure that external package fragments have a different module descriptor. The module descriptors are compared // to determine if objects need regeneration because they are from different modules. - val externalFragmentModuleDescriptor = FirModuleDescriptor(session) + // But keep original module descriptor for the fragments coming from parts compiled on the previous incremental step + val externalFragmentModuleDescriptor = + if (firOrigin == FirDeclarationOrigin.Precompiled) moduleDescriptor + else FirModuleDescriptor(session) return symbolTable.declareExternalPackageFragment(FirPackageFragmentDescriptor(fqName, externalFragmentModuleDescriptor)) } } @@ -245,7 +251,8 @@ class Fir2IrDeclarationStorage( internal fun findIrParent( packageFqName: FqName, parentLookupTag: ConeClassLikeLookupTag?, - firBasedSymbol: FirBasedSymbol<*> + firBasedSymbol: FirBasedSymbol<*>, + firOrigin: FirDeclarationOrigin ): IrDeclarationParent? { return if (parentLookupTag != null) { findIrClass(parentLookupTag) @@ -258,10 +265,10 @@ class Fir2IrDeclarationStorage( when { containerFile != null -> fileCache[containerFile] - firBasedSymbol is FirCallableSymbol -> getIrExternalPackageFragment(packageFqName) + firBasedSymbol is FirCallableSymbol -> getIrExternalPackageFragment(packageFqName, firOrigin) // TODO: All classes from BUILT_INS_PACKAGE_FQ_NAMES are considered built-ins now, // which is not exact and can lead to some problems - else -> getIrExternalOrBuiltInsPackageFragment(packageFqName) + else -> getIrExternalOrBuiltInsPackageFragment(packageFqName, firOrigin) } } } @@ -269,7 +276,8 @@ class Fir2IrDeclarationStorage( internal fun findIrParent(callableDeclaration: FirCallableDeclaration): IrDeclarationParent? { val firBasedSymbol = callableDeclaration.symbol val callableId = firBasedSymbol.callableId - return findIrParent(callableId.packageName, callableDeclaration.containingClass(), firBasedSymbol) + val callableOrigin = callableDeclaration.origin + return findIrParent(callableId.packageName, callableDeclaration.containingClass(), firBasedSymbol, callableOrigin) } private fun IrDeclaration.setAndModifyParent(irParent: IrDeclarationParent?) { diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalFirJvmCompilerRunnerTestGenerated.java b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalFirJvmCompilerRunnerTestGenerated.java index 02a3b5b8855..7a878406418 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalFirJvmCompilerRunnerTestGenerated.java +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalFirJvmCompilerRunnerTestGenerated.java @@ -923,6 +923,11 @@ public class IncrementalFirJvmCompilerRunnerTestGenerated extends AbstractIncrem runTest("jps/jps-plugin/testData/incremental/inlineFunCallSite/function/"); } + @TestMetadata("functionIndirect") + public void testFunctionIndirect() throws Exception { + runTest("jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect/"); + } + @TestMetadata("getter") public void testGetter() throws Exception { runTest("jps/jps-plugin/testData/incremental/inlineFunCallSite/getter/"); @@ -1025,6 +1030,19 @@ public class IncrementalFirJvmCompilerRunnerTestGenerated extends AbstractIncrem } } + @TestMetadata("jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class FunctionIndirect extends AbstractIncrementalFirJvmCompilerRunnerTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM_IR, testDataFilePath); + } + + public void testAllFilesPresentInFunctionIndirect() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect"), Pattern.compile("^([^\\.]+)$"), null, TargetBackend.JVM_IR, true); + } + } + @TestMetadata("jps/jps-plugin/testData/incremental/inlineFunCallSite/getter") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunnerTestGenerated.java b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunnerTestGenerated.java index 0fda462934b..8f4403df493 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunnerTestGenerated.java +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunnerTestGenerated.java @@ -923,6 +923,11 @@ public class IncrementalJvmCompilerRunnerTestGenerated extends AbstractIncrement runTest("jps/jps-plugin/testData/incremental/inlineFunCallSite/function/"); } + @TestMetadata("functionIndirect") + public void testFunctionIndirect() throws Exception { + runTest("jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect/"); + } + @TestMetadata("getter") public void testGetter() throws Exception { runTest("jps/jps-plugin/testData/incremental/inlineFunCallSite/getter/"); @@ -1025,6 +1030,19 @@ public class IncrementalJvmCompilerRunnerTestGenerated extends AbstractIncrement } } + @TestMetadata("jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class FunctionIndirect extends AbstractIncrementalJvmCompilerRunnerTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM_IR, testDataFilePath); + } + + public void testAllFilesPresentInFunctionIndirect() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect"), Pattern.compile("^([^\\.]+)$"), null, TargetBackend.JVM_IR, true); + } + } + @TestMetadata("jps/jps-plugin/testData/incremental/inlineFunCallSite/getter") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJvmOldBackendCompilerRunnerTestGenerated.java b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJvmOldBackendCompilerRunnerTestGenerated.java index 41b1bda0079..18abc9f05bb 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJvmOldBackendCompilerRunnerTestGenerated.java +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJvmOldBackendCompilerRunnerTestGenerated.java @@ -923,6 +923,11 @@ public class IncrementalJvmOldBackendCompilerRunnerTestGenerated extends Abstrac runTest("jps/jps-plugin/testData/incremental/inlineFunCallSite/function/"); } + @TestMetadata("functionIndirect") + public void testFunctionIndirect() throws Exception { + runTest("jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect/"); + } + @TestMetadata("getter") public void testGetter() throws Exception { runTest("jps/jps-plugin/testData/incremental/inlineFunCallSite/getter/"); @@ -1025,6 +1030,19 @@ public class IncrementalJvmOldBackendCompilerRunnerTestGenerated extends Abstrac } } + @TestMetadata("jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class FunctionIndirect extends AbstractIncrementalJvmOldBackendCompilerRunnerTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath); + } + + public void testAllFilesPresentInFunctionIndirect() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect"), Pattern.compile("^([^\\.]+)$"), null, TargetBackend.JVM, true); + } + } + @TestMetadata("jps/jps-plugin/testData/incremental/inlineFunCallSite/getter") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJvmJpsTestGenerated.java b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJvmJpsTestGenerated.java index 8bf8241f5cd..f37e445e92c 100644 --- a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJvmJpsTestGenerated.java +++ b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJvmJpsTestGenerated.java @@ -2802,6 +2802,11 @@ public class IncrementalJvmJpsTestGenerated extends AbstractIncrementalJvmJpsTes runTest("jps/jps-plugin/testData/incremental/inlineFunCallSite/function/"); } + @TestMetadata("functionIndirect") + public void testFunctionIndirect() throws Exception { + runTest("jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect/"); + } + @TestMetadata("getter") public void testGetter() throws Exception { runTest("jps/jps-plugin/testData/incremental/inlineFunCallSite/getter/"); @@ -2904,6 +2909,19 @@ public class IncrementalJvmJpsTestGenerated extends AbstractIncrementalJvmJpsTes } } + @TestMetadata("jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class FunctionIndirect extends AbstractIncrementalJvmJpsTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM_IR, testDataFilePath); + } + + public void testAllFilesPresentInFunctionIndirect() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect"), Pattern.compile("^([^\\.]+)$"), null, TargetBackend.JVM_IR, true); + } + } + @TestMetadata("jps/jps-plugin/testData/incremental/inlineFunCallSite/getter") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect/build.log b/jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect/build.log new file mode 100644 index 00000000000..d5cf23645ca --- /dev/null +++ b/jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect/build.log @@ -0,0 +1,11 @@ +================ Step #1 ================= + +Cleaning output files: + out/production/module/META-INF/module.kotlin_module + out/production/module/usage/Usage.class +End of files +Compiling files: + src/usage.kt +End of files +Exit code: OK +------------------------------------------ diff --git a/jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect/inline.kt b/jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect/inline.kt new file mode 100644 index 00000000000..a3f7852f997 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect/inline.kt @@ -0,0 +1,9 @@ +package inline + +private inline fun ps(): () -> String { val z = "Outer"; return { "OK" } } + +internal inline fun test(s: () -> () -> String = ::ps) = + s() + +val same = test() + diff --git a/jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect/other.kt b/jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect/other.kt new file mode 100644 index 00000000000..ba9f1988a49 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect/other.kt @@ -0,0 +1,3 @@ +package usage + +fun other() {} \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect/usage.kt b/jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect/usage.kt new file mode 100644 index 00000000000..d4501e33b29 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect/usage.kt @@ -0,0 +1,7 @@ +package usage + +internal class Usage { + val inlined = inline.test() + + val check = inline.same::class.java == inlined::class.java +} diff --git a/jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect/usage.kt.new b/jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect/usage.kt.new new file mode 100644 index 00000000000..4d2ee8e637a --- /dev/null +++ b/jps/jps-plugin/testData/incremental/inlineFunCallSite/functionIndirect/usage.kt.new @@ -0,0 +1,7 @@ +package usage + +internal class Usage { + private val inlined = inline.test() + + private val check = inline.same::class.java == inlined::class.java +}