diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt index b6b4af5a7ea..46faee117cd 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt @@ -65,7 +65,7 @@ fun prepareJvmSessions( return prepareSessions( files, configuration, rootModuleName, JvmPlatforms.unspecifiedJvmPlatform, - JvmPlatformAnalyzerServices, libraryList, isCommonSource, fileBelongsToModule, + JvmPlatformAnalyzerServices, metadataCompilationMode = false, libraryList, isCommonSource, fileBelongsToModule, createLibrarySession = { sessionProvider -> FirJvmSessionFactory.createLibrarySession( rootModuleName, @@ -116,7 +116,7 @@ fun prepareJsSessions( ): List> { return prepareSessions( files, configuration, rootModuleName, JsPlatforms.defaultJsPlatform, JsPlatformAnalyzerServices, - libraryList, isCommonSource, fileBelongsToModule, + metadataCompilationMode = false, libraryList, isCommonSource, fileBelongsToModule, createLibrarySession = { sessionProvider -> FirJsSessionFactory.createLibrarySession( rootModuleName, @@ -161,7 +161,7 @@ fun prepareNativeSessions( ): List> { return prepareSessions( files, configuration, rootModuleName, NativePlatforms.unspecifiedNativePlatform, NativePlatformAnalyzerServices, - libraryList, isCommonSource, fileBelongsToModule, createLibrarySession = { sessionProvider -> + metadataCompilationMode = false, libraryList, isCommonSource, fileBelongsToModule, createLibrarySession = { sessionProvider -> FirNativeSessionFactory.createLibrarySession( rootModuleName, resolvedLibraries, @@ -186,10 +186,8 @@ fun prepareNativeSessions( /** * Creates library session and sources session for Common platform (for metadata compilation) - * Number of created session depends on mode of MPP: - * - disabled - * - legacy (one platform and one common module) - * - HMPP (multiple number of modules) + * Number of created sessions is always one, in this mode modules are compiled against compiled + * metadata of dependent modules */ fun prepareCommonSessions( files: List, @@ -206,7 +204,7 @@ fun prepareCommonSessions( ): List> { return prepareSessions( files, configuration, rootModuleName, CommonPlatforms.defaultCommonPlatform, CommonPlatformAnalyzerServices, - libraryList, isCommonSource, fileBelongsToModule, createLibrarySession = { sessionProvider -> + metadataCompilationMode = true, libraryList, isCommonSource, fileBelongsToModule, createLibrarySession = { sessionProvider -> FirCommonSessionFactory.createLibrarySession( rootModuleName, sessionProvider, @@ -246,6 +244,7 @@ private inline fun prepareSessions( rootModuleName: Name, targetPlatform: TargetPlatform, analyzerServices: PlatformDependentAnalyzerServices, + metadataCompilationMode: Boolean, libraryList: DependencyListForCliModule, isCommonSource: (F) -> Boolean, fileBelongsToModule: (F, String) -> Boolean, @@ -267,8 +266,8 @@ private inline fun prepareSessions( } return when { - !isMppEnabled -> listOf( - createSessionForNonMppProject( + metadataCompilationMode || !isMppEnabled -> listOf( + createSingleSession( files, rootModuleName, libraryList, targetPlatform, analyzerServices, sessionProvider, sessionConfigurator, createSourceSession ) @@ -286,7 +285,7 @@ private inline fun prepareSessions( } } -private inline fun createSessionForNonMppProject( +private inline fun createSingleSession( files: List, rootModuleName: Name, libraryList: DependencyListForCliModule, @@ -299,7 +298,7 @@ private inline fun createSessionForNonMppProject( val platformModuleData = FirModuleDataImpl( rootModuleName, libraryList.regularDependencies, - dependsOnDependencies = emptyList(), + libraryList.dependsOnDependencies, libraryList.friendsDependencies, targetPlatform, analyzerServices diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/FirMetadataSerializer.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/FirMetadataSerializer.kt index 375b5f8ec00..c674599fb36 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/FirMetadataSerializer.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/FirMetadataSerializer.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.cli.jvm.compiler.pipeline.createContextForIncrementa import org.jetbrains.kotlin.cli.jvm.compiler.pipeline.createIncrementalCompilationScope import org.jetbrains.kotlin.cli.jvm.compiler.toAbstractProjectEnvironment import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot +import org.jetbrains.kotlin.cli.jvm.config.K2MetadataConfigurationKeys import org.jetbrains.kotlin.cli.jvm.config.jvmClasspathRoots import org.jetbrains.kotlin.cli.jvm.config.jvmModularRoots import org.jetbrains.kotlin.config.CommonConfigurationKeys @@ -66,9 +67,11 @@ internal class FirMetadataSerializer( CommonPlatformAnalyzerServices ) val libraryList = DependencyListForCliModule.build(binaryModuleData) { - dependencies(configuration.jvmClasspathRoots.map { it.toPath() }) + val refinedPaths = configuration.get(K2MetadataConfigurationKeys.REFINES_PATHS)?.map { File(it) }.orEmpty() + dependencies(configuration.jvmClasspathRoots.filter { it !in refinedPaths }.map { it.toPath() }) dependencies(configuration.jvmModularRoots.map { it.toPath() }) - friendDependencies(configuration[JVMConfigurationKeys.FRIEND_PATHS] ?: emptyList()) + friendDependencies(configuration[K2MetadataConfigurationKeys.FRIEND_PATHS] ?: emptyList()) + dependsOnDependencies(refinedPaths.map { it.toPath() }) } val diagnosticsReporter = DiagnosticReporterFactory.createPendingReporter() @@ -193,4 +196,4 @@ internal class FirMetadataSerializer( buildKotlinMetadataLibrary(configuration, serializedMetadata, destDir) } -} \ No newline at end of file +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/K2Tests.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/K2Tests.kt index bbb72d8c0de..7e0ff6a01ed 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/K2Tests.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/K2Tests.kt @@ -53,7 +53,7 @@ class CustomK2Tests : KGPBaseTest() { } @GradleTest - @DisplayName("HMPP compilation without JS target. KT-57376, KT-57635") + @DisplayName("HMPP compilation without JS target. KT-57376, KT-57377, KT-57635") fun testHmppCompilationWithoutJsTarget(gradleVersion: GradleVersion) { with(project("k2-mpp-without-js", gradleVersion)) { val taskToExecute = ":compileIntermediateMainKotlinMetadata" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-mpp-without-js/src/commonMain/kotlin/kt57377.common.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-mpp-without-js/src/commonMain/kotlin/kt57377.common.kt new file mode 100644 index 00000000000..ce4d6c02f46 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-mpp-without-js/src/commonMain/kotlin/kt57377.common.kt @@ -0,0 +1,5 @@ +// ISSUE: KT-57377 +package kt57377 + +internal class StringBox(val value: String) +internal fun createBox(value: String): StringBox = StringBox(value) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-mpp-without-js/src/intermediateMain/kotlin/kt57377.intermediate.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-mpp-without-js/src/intermediateMain/kotlin/kt57377.intermediate.kt new file mode 100644 index 00000000000..f17f4d6cfc8 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-mpp-without-js/src/intermediateMain/kotlin/kt57377.intermediate.kt @@ -0,0 +1,5 @@ +// ISSUE: KT-57377 +package kt57377 + +internal val testInternal1 = StringBox("foo") +internal val testInternal2 = createBox("foo")