From de5b475f7a832d4444c041f279d1da8f6adea90f Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Wed, 1 Mar 2023 14:20:49 +0100 Subject: [PATCH] [FIR] Use KlibBasedSymbolProvider in FirCommonSessionFactory Unify logic of KLib resolving (Common and JS) ^KT-56354 Fixed --- .../jetbrains/kotlin/cli/js/K2JsIrCompiler.kt | 3 +- .../cli/common/FirSessionConstructionUtils.kt | 2 + .../cli/metadata/FirMetadataSerializer.kt | 20 ++-- .../fir/session/FirCommonSessionFactory.kt | 13 ++- .../kotlin/ir/backend/js/ic/CacheUpdater.kt | 4 +- .../backend/common/CommonJsKLibResolver.kt} | 97 ++++++++++--------- .../jetbrains/kotlin/ir/backend/js/klib.kt | 3 +- .../frontend/classic/ClassicFrontendFacade.kt | 4 +- .../frontend/fir/TestFirJsSessionFactory.kt | 7 +- .../kotlin/klib/AbstractKlibTextTestCase.kt | 4 +- .../kotlin/klib/FilePathsInKlibTest.kt | 3 +- .../test/converters/FirJsKlibBackendFacade.kt | 4 +- .../js/test/converters/JsKlibBackendFacade.kt | 6 +- .../gradle/KotlinxSerializationMppK2IT.kt | 26 +++++ .../build.gradle.kts | 34 +++++++ .../settings.gradle.kts | 1 + .../src/commonMain/kotlin/Platform.kt | 6 ++ 17 files changed, 163 insertions(+), 74 deletions(-) rename compiler/ir/{serialization.js/src/org/jetbrains/kotlin/ir/backend/js/JsLibraryResolver.kt => serialization.common/src/org/jetbrains/kotlin/backend/common/CommonJsKLibResolver.kt} (53%) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinxSerializationMppK2IT.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationMppK2/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationMppK2/settings.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationMppK2/src/commonMain/kotlin/Platform.kt diff --git a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt index b58252e5cd4..e2cab0bd500 100644 --- a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt +++ b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt @@ -9,6 +9,7 @@ import com.intellij.openapi.Disposable import com.intellij.openapi.util.text.StringUtil import org.jetbrains.kotlin.KtSourceFile import org.jetbrains.kotlin.backend.common.CompilationException +import org.jetbrains.kotlin.backend.common.CommonJsKLibResolver import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig import org.jetbrains.kotlin.backend.wasm.compileToLoweredIr @@ -512,7 +513,7 @@ class K2JsIrCompiler : CLICompiler() { } val logger = configuration.resolverLogger - val resolvedLibraries = jsResolveLibraries(libraries + friendLibraries, logger).getFullResolvedList() + val resolvedLibraries = CommonJsKLibResolver.resolve(libraries + friendLibraries, logger).getFullResolvedList() val sessionsWithSources = prepareJsSessions( ktFiles, configuration, escapedMainModuleName.asString(), resolvedLibraries, dependencyList, 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 66401c2c315..33b6f2a14a8 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt @@ -197,6 +197,7 @@ fun prepareCommonSessions( extensionRegistrars: List, librariesScope: AbstractProjectFileSearchScope, libraryList: DependencyListForCliModule, + resolvedLibraries: List, isCommonSource: (F) -> Boolean, fileBelongsToModule: (F, String) -> Boolean, createProviderAndScopeForIncrementalCompilation: (List) -> IncrementalCompilationContext?, @@ -210,6 +211,7 @@ fun prepareCommonSessions( libraryList.moduleDataProvider, projectEnvironment, librariesScope, + resolvedLibraries, projectEnvironment.getPackagePartProvider(librariesScope) as PackageAndMetadataPartProvider, configuration.languageVersionSettings, registerExtraComponents = {}, 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 f1f3f7481a2..0920d3b19fb 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/FirMetadataSerializer.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/FirMetadataSerializer.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.cli.metadata import com.intellij.openapi.vfs.StandardFileSystems import com.intellij.openapi.vfs.VirtualFileManager import org.jetbrains.kotlin.analyzer.common.CommonPlatformAnalyzerServices +import org.jetbrains.kotlin.backend.common.CommonJsKLibResolver import org.jetbrains.kotlin.cli.common.* import org.jetbrains.kotlin.cli.common.fir.FirDiagnosticsCompilerResultsReporter import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment @@ -17,6 +18,7 @@ import org.jetbrains.kotlin.cli.jvm.compiler.pipeline.collectSources import org.jetbrains.kotlin.cli.jvm.compiler.pipeline.createContextForIncrementalCompilation 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.jvmClasspathRoots import org.jetbrains.kotlin.cli.jvm.config.jvmModularRoots import org.jetbrains.kotlin.config.CommonConfigurationKeys @@ -36,12 +38,13 @@ import org.jetbrains.kotlin.fir.pipeline.resolveAndCheckFir import org.jetbrains.kotlin.fir.serialization.FirElementAwareSerializableStringTable import org.jetbrains.kotlin.fir.serialization.FirKLibSerializerExtension import org.jetbrains.kotlin.fir.serialization.serializeSingleFirFile -import org.jetbrains.kotlin.library.SerializedMetadata +import org.jetbrains.kotlin.library.* import org.jetbrains.kotlin.library.metadata.KlibMetadataHeaderFlags import org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf import org.jetbrains.kotlin.modules.TargetId import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.platform.CommonPlatforms +import org.jetbrains.kotlin.util.DummyLogger import java.io.File internal class FirMetadataSerializer( @@ -71,6 +74,12 @@ internal class FirMetadataSerializer( val diagnosticsReporter = DiagnosticReporterFactory.createPendingReporter() + val klibFiles = configuration.get(CLIConfigurationKeys.CONTENT_ROOTS).orEmpty() + .filterIsInstance() + .filter { it.file.isDirectory || it.file.extension == "klib" } + .map { it.file.absolutePath } + val resolvedLibraries = CommonJsKLibResolver.resolve(klibFiles, DummyLogger).getFullResolvedList() + val outputs = if (isLightTree) { val projectEnvironment = environment.toAbstractProjectEnvironment() as VfsBasedProjectEnvironment var librariesScope = projectEnvironment.getSearchScopeForProjectLibraries() @@ -83,8 +92,8 @@ internal class FirMetadataSerializer( incrementalExcludesScope = null )?.also { librariesScope -= it } val sessionsWithSources = prepareCommonSessions( - ltFiles, configuration, projectEnvironment, rootModuleName, extensionRegistrars, - librariesScope, libraryList, groupedSources.isCommonSourceForLt, groupedSources.fileBelongsToModuleForLt, + ltFiles, configuration, projectEnvironment, rootModuleName, extensionRegistrars, librariesScope, + libraryList, resolvedLibraries, groupedSources.isCommonSourceForLt, groupedSources.fileBelongsToModuleForLt, createProviderAndScopeForIncrementalCompilation = { files -> createContextForIncrementalCompilation( configuration, @@ -121,7 +130,7 @@ internal class FirMetadataSerializer( } val sessionsWithSources = prepareCommonSessions( psiFiles, configuration, projectEnvironment, rootModuleName, extensionRegistrars, - librariesScope, libraryList, isCommonSourceForPsi, fileBelongsToModuleForPsi, + librariesScope, libraryList, resolvedLibraries, isCommonSourceForPsi, fileBelongsToModuleForPsi, createProviderAndScopeForIncrementalCompilation = { providerAndScopeForIncrementalCompilation } ) @@ -184,5 +193,4 @@ internal class FirMetadataSerializer( buildKotlinMetadataLibrary(configuration, serializedMetadata, destDir) } -} - +} \ No newline at end of file diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirCommonSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirCommonSessionFactory.kt index 674a14548d3..90f78cd2d27 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirCommonSessionFactory.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirCommonSessionFactory.kt @@ -25,9 +25,11 @@ import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope import org.jetbrains.kotlin.incremental.components.EnumWhenTracker import org.jetbrains.kotlin.incremental.components.LookupTracker +import org.jetbrains.kotlin.library.metadata.resolver.KotlinResolvedLibrary import org.jetbrains.kotlin.load.kotlin.PackageAndMetadataPartProvider import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.serialization.deserialization.KotlinMetadataFinder +import org.jetbrains.kotlin.utils.addToStdlib.runIf object FirCommonSessionFactory : FirAbstractSessionFactory() { fun createLibrarySession( @@ -36,6 +38,7 @@ object FirCommonSessionFactory : FirAbstractSessionFactory() { moduleDataProvider: ModuleDataProvider, projectEnvironment: AbstractProjectEnvironment, librariesScope: AbstractProjectFileSearchScope, + resolvedKLibs: List, packageAndMetadataPartProvider: PackageAndMetadataPartProvider, languageVersionSettings: LanguageVersionSettings, registerExtraComponents: ((FirSession) -> Unit), @@ -50,7 +53,7 @@ object FirCommonSessionFactory : FirAbstractSessionFactory() { }, createKotlinScopeProvider = { FirKotlinScopeProvider { _, declaredMemberScope, _, _ -> declaredMemberScope } }, createProviders = { session, builtinsModuleData, kotlinScopeProvider -> - listOf( + listOfNotNull( MetadataSymbolProvider( session, moduleDataProvider, @@ -58,6 +61,14 @@ object FirCommonSessionFactory : FirAbstractSessionFactory() { packageAndMetadataPartProvider, projectEnvironment.getKotlinClassFinder(librariesScope) ), + runIf(resolvedKLibs.isNotEmpty()) { + KlibBasedSymbolProvider( + session, + moduleDataProvider, + kotlinScopeProvider, + resolvedKLibs + ) + }, FirBuiltinSymbolProvider(session, builtinsModuleData, kotlinScopeProvider), FirCloneableSymbolProvider(session, builtinsModuleData, kotlinScopeProvider), ) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/CacheUpdater.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/CacheUpdater.kt index 505755314ad..5874a69827a 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/CacheUpdater.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/CacheUpdater.kt @@ -4,6 +4,7 @@ package org.jetbrains.kotlin.ir.backend.js.ic +import org.jetbrains.kotlin.backend.common.CommonJsKLibResolver import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig import org.jetbrains.kotlin.backend.common.serialization.cityHash64 import org.jetbrains.kotlin.config.CompilerConfiguration @@ -12,7 +13,6 @@ import org.jetbrains.kotlin.ir.backend.js.codegen.JsGenerationGranularity import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.JsIrProgramFragment import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.util.* -import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.konan.properties.propertyList import org.jetbrains.kotlin.library.KLIB_PROPERTY_DEPENDS import org.jetbrains.kotlin.library.KotlinLibrary @@ -87,7 +87,7 @@ class CacheUpdater( // libraries in topological order: [stdlib, ..., main] val libraryDependencies = stopwatch.measure("Resolving and loading klib dependencies") { - val allResolvedDependencies = jsResolveLibraries(allModules, compilerConfiguration.resolverLogger) + val allResolvedDependencies = CommonJsKLibResolver.resolve(allModules, compilerConfiguration.resolverLogger) val libraries = allResolvedDependencies.getFullList(TopologicalLibraryOrder).let { resolvedLibraries -> val mainLibraryIndex = resolvedLibraries.indexOfLast { diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/JsLibraryResolver.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/CommonJsKLibResolver.kt similarity index 53% rename from compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/JsLibraryResolver.kt rename to compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/CommonJsKLibResolver.kt index 5e6b6a3b0b8..4571ecbc457 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/JsLibraryResolver.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/CommonJsKLibResolver.kt @@ -1,9 +1,9 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -package org.jetbrains.kotlin.ir.backend.js +package org.jetbrains.kotlin.backend.common import org.jetbrains.kotlin.konan.file.File import org.jetbrains.kotlin.library.KotlinLibrary @@ -15,7 +15,53 @@ import org.jetbrains.kotlin.library.metadata.resolver.KotlinLibraryResolver import org.jetbrains.kotlin.library.metadata.resolver.impl.libraryResolver import org.jetbrains.kotlin.util.Logger -class JsLibraryResolver( +object CommonJsKLibResolver { + fun resolve(libraries: Collection, logger: Logger): KotlinLibraryResolveResult = + resolveWithoutDependencies( + libraries, + logger + ).resolveWithDependencies() + + fun resolveWithoutDependencies( + libraries: Collection, + logger: Logger + ): KLibResolution { + val unresolvedLibraries = libraries.map { UnresolvedLibrary(it, null) } + val libraryAbsolutePaths = libraries.map { File(it).absolutePath } + // Configure the resolver to only work with absolute paths for now. + val libraryResolver = KLibResolverHelper( + repositories = emptyList(), + directLibs = libraryAbsolutePaths, + distributionKlib = null, + localKotlinDir = null, + skipCurrentDir = false, + logger = logger + ).libraryResolver() + + return KLibResolution( + libraryResolver, + libraryResolver.resolveWithoutDependencies( + unresolvedLibraries = unresolvedLibraries, + noStdLib = true, + noDefaultLibs = true, + noEndorsedLibs = true + ) + ) + } +} + +class KLibResolution( + private val libraryResolver: KotlinLibraryResolver, + val libraries: List +) { + fun resolveWithDependencies(): KotlinLibraryResolveResult { + return with(libraryResolver) { + libraries.resolveDependencies() + } + } +} + +private class KLibResolverHelper( repositories: List, directLibs: List, distributionKlib: String?, @@ -33,49 +79,4 @@ class JsLibraryResolver( ) { // Stick with the default KotlinLibrary for now. override fun libraryComponentBuilder(file: File, isDefault: Boolean) = createKotlinLibraryComponents(file, isDefault) -} - -// TODO: This is a temporary set of library resolver policies for js compiler. -fun jsResolveLibraries(libraries: Collection, logger: Logger): KotlinLibraryResolveResult = - jsResolveLibrariesWithoutDependencies( - libraries, - logger - ).resolveWithDependencies() - -fun jsResolveLibrariesWithoutDependencies( - libraries: Collection, - logger: Logger -): JsResolution { - val unresolvedLibraries = libraries.map { UnresolvedLibrary(it, null) } - val libraryAbsolutePaths = libraries.map { File(it).absolutePath } - // Configure the resolver to only work with absolute paths for now. - val libraryResolver = JsLibraryResolver( - repositories = emptyList(), - directLibs = libraryAbsolutePaths, - distributionKlib = null, - localKotlinDir = null, - skipCurrentDir = false, - logger = logger - ).libraryResolver() - - return JsResolution( - libraryResolver, - libraryResolver.resolveWithoutDependencies( - unresolvedLibraries = unresolvedLibraries, - noStdLib = true, - noDefaultLibs = true, - noEndorsedLibs = true - ) - ) -} - -class JsResolution( - private val libraryResolver: KotlinLibraryResolver, - val libraries: List -) { - fun resolveWithDependencies(): KotlinLibraryResolveResult { - return with(libraryResolver) { - libraries.resolveDependencies() - } - } } \ No newline at end of file diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt index 48cb5318d5d..52b20b491c4 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.KtVirtualFileSourceFile import org.jetbrains.kotlin.analyzer.AbstractAnalyzerWithCompilerReport import org.jetbrains.kotlin.analyzer.AnalysisResult import org.jetbrains.kotlin.analyzer.CompilationErrorException +import org.jetbrains.kotlin.backend.common.CommonJsKLibResolver import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext import org.jetbrains.kotlin.backend.common.extensions.IrPluginContextImpl @@ -469,7 +470,7 @@ class ModulesStructure( friendDependenciesPaths: Collection, ) { - val allDependenciesResolution = jsResolveLibrariesWithoutDependencies( + val allDependenciesResolution = CommonJsKLibResolver.resolveWithoutDependencies( dependencies, compilerConfiguration.resolverLogger ) diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/classic/ClassicFrontendFacade.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/classic/ClassicFrontendFacade.kt index 42cc467f7e5..b44fc1b4042 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/classic/ClassicFrontendFacade.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/classic/ClassicFrontendFacade.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.analyzer.common.CommonDependenciesContainer import org.jetbrains.kotlin.analyzer.common.CommonPlatformAnalyzerServices import org.jetbrains.kotlin.analyzer.common.CommonResolverForModuleFactory +import org.jetbrains.kotlin.backend.common.CommonJsKLibResolver import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.jvm.JvmBuiltIns @@ -69,7 +70,6 @@ import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.test.directives.ConfigurationDirectives import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives -import org.jetbrains.kotlin.test.directives.MultiplatformDiagnosticsDirectives.ENABLE_MULTIPLATFORM_COMPOSITE_ANALYSIS_MODE import org.jetbrains.kotlin.test.model.DependencyRelation import org.jetbrains.kotlin.test.model.FrontendFacade import org.jetbrains.kotlin.test.model.FrontendKinds @@ -274,7 +274,7 @@ class ClassicFrontendFacade( } private fun loadKlib(names: List, configuration: CompilerConfiguration): List { - val resolvedLibraries = jsResolveLibraries( + val resolvedLibraries = CommonJsKLibResolver.resolve( names, configuration.resolverLogger ).getFullResolvedList() diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/TestFirJsSessionFactory.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/TestFirJsSessionFactory.kt index e2daa5edf27..c1a84e2a9e4 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/TestFirJsSessionFactory.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/TestFirJsSessionFactory.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.test.frontend.fir +import org.jetbrains.kotlin.backend.common.CommonJsKLibResolver import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.fir.FirModuleData @@ -15,9 +16,7 @@ import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider import org.jetbrains.kotlin.fir.session.FirJsSessionFactory import org.jetbrains.kotlin.fir.session.FirSessionConfigurator import org.jetbrains.kotlin.incremental.components.LookupTracker -import org.jetbrains.kotlin.ir.backend.js.jsResolveLibraries import org.jetbrains.kotlin.ir.backend.js.resolverLogger -import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.library.metadata.resolver.KotlinResolvedLibrary import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.test.model.DependencyRelation @@ -39,7 +38,7 @@ object TestFirJsSessionFactory { ): FirSession { val logger = configuration.resolverLogger val libraries = getAllJsDependenciesPaths(module, testServices) - val resolvedLibraries = jsResolveLibraries(libraries, logger).getFullResolvedList() + val resolvedLibraries = CommonJsKLibResolver.resolve(libraries, logger).getFullResolvedList() return FirJsSessionFactory.createLibrarySession( mainModuleName, @@ -75,7 +74,7 @@ fun resolveJsLibraries( ): List { val paths = getAllJsDependenciesPaths(module, testServices) val logger = configuration.resolverLogger - return jsResolveLibraries(paths, logger).getFullResolvedList() + return CommonJsKLibResolver.resolve(paths, logger).getFullResolvedList() } fun getAllJsDependenciesPaths(module: TestModule, testServices: TestServices): List { diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/klib/AbstractKlibTextTestCase.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/klib/AbstractKlibTextTestCase.kt index 9517a23a2e7..7734f0494b7 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/klib/AbstractKlibTextTestCase.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/klib/AbstractKlibTextTestCase.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.klib import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement import junit.framework.TestCase +import org.jetbrains.kotlin.backend.common.CommonJsKLibResolver import org.jetbrains.kotlin.backend.common.serialization.CompatibilityMode import org.jetbrains.kotlin.backend.common.serialization.DeserializationStrategy import org.jetbrains.kotlin.backend.common.serialization.linkerissues.checkNoUnboundSymbols @@ -26,7 +27,6 @@ import org.jetbrains.kotlin.ir.AbstractIrGeneratorTestCase import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.backend.js.JsFactories import org.jetbrains.kotlin.ir.backend.js.KotlinFileSerializedData -import org.jetbrains.kotlin.ir.backend.js.jsResolveLibraries import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsIrLinker import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsIrModuleSerializer import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsManglerDesc @@ -234,7 +234,7 @@ abstract class AbstractKlibTextTestCase : CodegenTestCase() { } private fun loadKlibFromPath(paths: List): List { - val result = jsResolveLibraries(paths, DummyLogger) + val result = CommonJsKLibResolver.resolve(paths, DummyLogger) return result.getFullList(TopologicalLibraryOrder) } diff --git a/compiler/tests/org/jetbrains/kotlin/klib/FilePathsInKlibTest.kt b/compiler/tests/org/jetbrains/kotlin/klib/FilePathsInKlibTest.kt index e01e771c9bd..68e233a6422 100644 --- a/compiler/tests/org/jetbrains/kotlin/klib/FilePathsInKlibTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/klib/FilePathsInKlibTest.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.klib import com.intellij.openapi.vfs.StandardFileSystems import com.intellij.openapi.vfs.VirtualFileManager import com.intellij.psi.PsiManager +import org.jetbrains.kotlin.backend.common.CommonJsKLibResolver import org.jetbrains.kotlin.backend.common.serialization.codedInputStream import org.jetbrains.kotlin.backend.common.serialization.proto.IrFile import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport @@ -102,7 +103,7 @@ class FilePathsInKlibTest : CodegenTestCase() { private fun File.md5(): Long = readBytes().md5() private fun File.loadKlibFilePaths(): List { - val libs = jsResolveLibraries(listOf(runtimeKlibPath, canonicalPath), DummyLogger).getFullList() + val libs = CommonJsKLibResolver.resolve(listOf(runtimeKlibPath, canonicalPath), DummyLogger).getFullList() val lib = libs.last() val fileSize = lib.fileCount() val extReg = ExtensionRegistryLite.newInstance() diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/FirJsKlibBackendFacade.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/FirJsKlibBackendFacade.kt index 1ea2fed700e..f0c7f3fafd5 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/FirJsKlibBackendFacade.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/FirJsKlibBackendFacade.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.js.test.converters +import org.jetbrains.kotlin.backend.common.CommonJsKLibResolver import org.jetbrains.kotlin.backend.common.actualizer.IrActualizer import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.LanguageFeature @@ -12,7 +13,6 @@ import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.ir.backend.js.JsFactories -import org.jetbrains.kotlin.ir.backend.js.jsResolveLibraries import org.jetbrains.kotlin.ir.backend.js.resolverLogger import org.jetbrains.kotlin.ir.backend.js.serializeModuleIntoKlib import org.jetbrains.kotlin.ir.util.IrMessageLogger @@ -85,7 +85,7 @@ class FirJsKlibBackendFacade( } // TODO: consider avoiding repeated libraries resolution - val lib = jsResolveLibraries( + val lib = CommonJsKLibResolver.resolve( getAllJsDependenciesPaths(module, testServices) + listOf(outputFile), configuration.resolverLogger ).getFullResolvedList().last().library diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/JsKlibBackendFacade.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/JsKlibBackendFacade.kt index 79d1452dfd2..b2d2b436bab 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/JsKlibBackendFacade.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/JsKlibBackendFacade.kt @@ -5,14 +5,12 @@ package org.jetbrains.kotlin.js.test.converters +import org.jetbrains.kotlin.backend.common.CommonJsKLibResolver import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.ir.backend.js.* -import org.jetbrains.kotlin.ir.util.IrMessageLogger import org.jetbrains.kotlin.ir.util.irMessageLogger -import org.jetbrains.kotlin.js.config.ErrorTolerancePolicy -import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.js.test.utils.JsIrIncrementalDataProvider import org.jetbrains.kotlin.js.test.utils.jsIrIncrementalDataProvider import org.jetbrains.kotlin.library.KotlinAbiVersion @@ -69,7 +67,7 @@ class JsKlibBackendFacade( } val dependencies = JsEnvironmentConfigurator.getAllRecursiveDependenciesFor(module, testServices).toList() - val lib = jsResolveLibraries( + val lib = CommonJsKLibResolver.resolve( dependencies.map { testServices.jsLibraryProvider.getPathByDescriptor(it) } + listOf(outputFile), configuration.resolverLogger ).getFullResolvedList().last().library diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinxSerializationMppK2IT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinxSerializationMppK2IT.kt new file mode 100644 index 00000000000..2668cabdb94 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinxSerializationMppK2IT.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle + +import org.gradle.util.GradleVersion +import org.jetbrains.kotlin.gradle.testbase.* +import org.junit.jupiter.api.DisplayName + +@OtherGradlePluginTests +class KotlinxSerializationMppK2IT : KGPBaseTest() { + private val gradleVersion = GradleVersion.version(TestVersions.Gradle.MAX_SUPPORTED) + + @DisplayName("Compile common code to metadata with kotlinx.serialization and K2") + @GradleTest + fun `test kotlinxSerializationMppK2`() { + project("kotlinxSerializationMppK2", gradleVersion) { + build(":compileCommonMainKotlinMetadata") { + assertTasksExecuted(":compileCommonMainKotlinMetadata") + assertOutputContains("BUILD SUCCESSFUL") + } + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationMppK2/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationMppK2/build.gradle.kts new file mode 100644 index 00000000000..ca08c518cff --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationMppK2/build.gradle.kts @@ -0,0 +1,34 @@ +plugins { + kotlin("multiplatform") + kotlin("plugin.serialization") +} + +repositories { + mavenLocal() + mavenCentral() +} + +kotlin { + jvm() + js(IR) { + browser { + commonWebpackConfig { + cssSupport { + enabled.set(true) + } + } + } + } + sourceSets { + all { + languageSettings.apply { + languageVersion = "2.0" + } + } + val commonMain by getting { + dependencies{ + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0-RC") + } + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationMppK2/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationMppK2/settings.gradle.kts new file mode 100644 index 00000000000..dd98779d96f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationMppK2/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "kotlinxSerializationMppK2" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationMppK2/src/commonMain/kotlin/Platform.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationMppK2/src/commonMain/kotlin/Platform.kt new file mode 100644 index 00000000000..b0bf97c9c70 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationMppK2/src/commonMain/kotlin/Platform.kt @@ -0,0 +1,6 @@ +import kotlinx.serialization.Serializable + +@Serializable +data class ValidateViolation( + val filed: String, +) \ No newline at end of file