From 1f11a2865fdafd6c188a1239cd261fcf8e8995a6 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Tue, 9 Aug 2022 16:43:27 +0200 Subject: [PATCH] FIR: refactor session factory to better support JS scenarios --- compiler/cli/build.gradle.kts | 2 +- .../fir/session/FirAbstractSessionFactory.kt | 5 ++ .../session}/JsConeConflictResolverFactory.kt | 2 +- .../test/frontend/fir/FirFrontendFacade.kt | 4 +- .../test/frontend/fir/FirJsSessionFactory.kt | 81 ------------------- .../frontend/fir/TestFirJsSessionFactory.kt | 51 ++++++++++++ 6 files changed, 60 insertions(+), 85 deletions(-) rename compiler/{tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir => fir/entrypoint/src/org/jetbrains/kotlin/fir/session}/JsConeConflictResolverFactory.kt (97%) delete mode 100644 compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirJsSessionFactory.kt create mode 100644 compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/TestFirJsSessionFactory.kt diff --git a/compiler/cli/build.gradle.kts b/compiler/cli/build.gradle.kts index 8a3bab4bca6..0f820b31897 100644 --- a/compiler/cli/build.gradle.kts +++ b/compiler/cli/build.gradle.kts @@ -26,7 +26,7 @@ dependencies { api(project(":compiler:fir:providers")) api(project(":compiler:fir:semantics")) api(project(":compiler:fir:java")) - implementation(project(":compiler:fir:entrypoint")) + api(project(":compiler:fir:entrypoint")) api(project(":compiler:fir:fir2ir")) api(project(":compiler:fir:fir2ir:jvm-backend")) api(project(":compiler:fir:checkers")) diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirAbstractSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirAbstractSessionFactory.kt index 690f8860661..cb09803c778 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirAbstractSessionFactory.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirAbstractSessionFactory.kt @@ -6,13 +6,17 @@ package org.jetbrains.kotlin.fir.session import org.jetbrains.kotlin.config.LanguageVersionSettings +import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.fir.* +import org.jetbrains.kotlin.fir.analysis.FirOverridesBackwardCompatibilityHelper import org.jetbrains.kotlin.fir.checkers.registerCommonCheckers +import org.jetbrains.kotlin.fir.checkers.registerJsCheckers import org.jetbrains.kotlin.fir.deserialization.ModuleDataProvider import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar import org.jetbrains.kotlin.fir.extensions.FirSwitchableExtensionDeclarationsSymbolProvider import org.jetbrains.kotlin.fir.java.FirCliSession import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider +import org.jetbrains.kotlin.fir.resolve.calls.ConeCallConflictResolverFactory import org.jetbrains.kotlin.fir.resolve.providers.FirDependenciesSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider @@ -21,6 +25,7 @@ import org.jetbrains.kotlin.fir.resolve.providers.impl.FirDependenciesSymbolProv import org.jetbrains.kotlin.fir.resolve.providers.impl.FirLibrarySessionProvider import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider +import org.jetbrains.kotlin.fir.scopes.FirPlatformClassMapper import org.jetbrains.kotlin.incremental.components.EnumWhenTracker import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.name.Name diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/JsConeConflictResolverFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/JsConeConflictResolverFactory.kt similarity index 97% rename from compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/JsConeConflictResolverFactory.kt rename to compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/JsConeConflictResolverFactory.kt index c6632c4c031..437bce620bc 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/JsConeConflictResolverFactory.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/JsConeConflictResolverFactory.kt @@ -3,7 +3,7 @@ * 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.test.frontend.fir +package org.jetbrains.kotlin.fir.session import org.jetbrains.kotlin.fir.NoMutableState import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt index 42285d505e6..79e0f2ce815 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt @@ -131,7 +131,7 @@ class FirFrontendFacade( } module.targetPlatform.isJs() -> { projectEnvironment = null - FirJsSessionFactory.createLibrarySession( + TestFirJsSessionFactory.createLibrarySession( moduleName, moduleInfoProvider.firSessionProvider, dependencyList, @@ -179,7 +179,7 @@ class FirFrontendFacade( ) } module.targetPlatform.isJs() -> { - FirJsSessionFactory.createModuleBasedSession( + TestFirJsSessionFactory.createModuleBasedSession( mainModuleData, moduleInfoProvider.firSessionProvider, extensionRegistrars, diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirJsSessionFactory.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirJsSessionFactory.kt deleted file mode 100644 index d9dc476120a..00000000000 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirJsSessionFactory.kt +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2010-2021 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.test.frontend.fir - -import org.jetbrains.kotlin.config.CompilerConfiguration -import org.jetbrains.kotlin.config.LanguageVersionSettings -import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl -import org.jetbrains.kotlin.fir.* -import org.jetbrains.kotlin.fir.analysis.FirOverridesBackwardCompatibilityHelper -import org.jetbrains.kotlin.fir.checkers.registerJsCheckers -import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar -import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider -import org.jetbrains.kotlin.fir.resolve.calls.ConeCallConflictResolverFactory -import org.jetbrains.kotlin.fir.resolve.providers.impl.FirBuiltinSymbolProvider -import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCloneableSymbolProvider -import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider -import org.jetbrains.kotlin.fir.scopes.FirPlatformClassMapper -import org.jetbrains.kotlin.fir.session.FirAbstractSessionFactory -import org.jetbrains.kotlin.fir.session.FirSessionConfigurator -import org.jetbrains.kotlin.fir.session.FirSessionFactory -import org.jetbrains.kotlin.fir.session.KlibBasedSymbolProvider -import org.jetbrains.kotlin.incremental.components.LookupTracker -import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.test.model.TestModule -import org.jetbrains.kotlin.test.services.TestServices - -object FirJsSessionFactory : FirAbstractSessionFactory() { - fun createLibrarySession( - mainModuleName: Name, - sessionProvider: FirProjectSessionProvider, - dependencyListForCliModule: DependencyListForCliModule, - module: TestModule, - testServices: TestServices, - configuration: CompilerConfiguration, - languageVersionSettings: LanguageVersionSettings, - ): FirSession = FirSessionFactory.createJsLibrarySession( - mainModuleName, - getAllJsDependenciesPaths(module, testServices), - configuration, sessionProvider, dependencyListForCliModule.moduleDataProvider, languageVersionSettings - ) - - fun createModuleBasedSession( - moduleData: FirModuleData, - sessionProvider: FirProjectSessionProvider, - extensionRegistrars: List, - languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT, - lookupTracker: LookupTracker?, - init: FirSessionConfigurator.() -> Unit - ): FirSession { - return createModuleBasedSession( - moduleData, - sessionProvider, - extensionRegistrars, - languageVersionSettings, - lookupTracker, - null, - init, - registerExtraComponents = { it.registerJsSpecificResolveComponents() }, - registerExtraCheckers = { it.registerJsCheckers() }, - createKotlinScopeProvider = { FirKotlinScopeProvider { _, declaredMemberScope, _, _ -> declaredMemberScope } }, - createProviders = { _, _, symbolProvider, generatedSymbolsProvider, dependenciesSymbolProvider -> - listOfNotNull( - symbolProvider, - generatedSymbolsProvider, - dependenciesSymbolProvider, - ) - } - ) - } - - @OptIn(SessionConfiguration::class) - fun FirSession.registerJsSpecificResolveComponents() { - register(FirVisibilityChecker::class, FirVisibilityChecker.Default) - register(ConeCallConflictResolverFactory::class, JsCallConflictResolverFactory) - register(FirPlatformClassMapper::class, FirPlatformClassMapper.Default) - register(FirOverridesBackwardCompatibilityHelper::class, FirOverridesBackwardCompatibilityHelper.Default()) - } -} \ No newline at end of file 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 new file mode 100644 index 00000000000..73e9094f3ed --- /dev/null +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/TestFirJsSessionFactory.kt @@ -0,0 +1,51 @@ +/* + * Copyright 2010-2021 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.test.frontend.fir + +import org.jetbrains.kotlin.config.CompilerConfiguration +import org.jetbrains.kotlin.config.LanguageVersionSettings +import org.jetbrains.kotlin.fir.* +import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar +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.name.Name +import org.jetbrains.kotlin.test.model.TestModule +import org.jetbrains.kotlin.test.services.TestServices + +object TestFirJsSessionFactory { + fun createLibrarySession( + mainModuleName: Name, + sessionProvider: FirProjectSessionProvider, + dependencyListForCliModule: DependencyListForCliModule, + module: TestModule, + testServices: TestServices, + configuration: CompilerConfiguration, + languageVersionSettings: LanguageVersionSettings, + ): FirSession { + val repositories = configuration[JSConfigurationKeys.REPOSITORIES] ?: emptyList() + val logger = configuration.resolverLogger + val libraries = getAllJsDependenciesPaths(module, testServices) + val resolvedLibraries = jsResolveLibraries(libraries, repositories, logger).getFullResolvedList() + + return FirJsSessionFactory.createJsLibrarySession( + mainModuleName, resolvedLibraries, sessionProvider, dependencyListForCliModule.moduleDataProvider, languageVersionSettings + ) + } + + fun createModuleBasedSession( + mainModuleData: FirModuleDataImpl, sessionProvider: FirProjectSessionProvider, extensionRegistrars: List, + languageVersionSettings: LanguageVersionSettings, lookupTracker: LookupTracker?, + sessionConfigurator: FirSessionConfigurator.() -> Unit + ): FirSession = + FirJsSessionFactory.createJsModuleBasedSession( + mainModuleData, sessionProvider, extensionRegistrars, languageVersionSettings, lookupTracker, sessionConfigurator + ) +} \ No newline at end of file