From c0cf8e508a411a68bee892eb8bcd20e270fa9a4b Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Tue, 16 Aug 2022 12:05:28 +0200 Subject: [PATCH] FIR JS: prepare session factory for JS/KLib usage --- compiler/fir/entrypoint/build.gradle.kts | 2 + .../fir/session/FirAbstractSessionFactory.kt | 2 +- .../kotlin/fir/session/FirJsSessionFactory.kt | 91 +++++++++++++++++++ .../fir/session/FirJvmSessionFactory.kt | 7 +- .../test/frontend/fir/FirJsSessionFactory.kt | 24 ++--- 5 files changed, 104 insertions(+), 22 deletions(-) create mode 100644 compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJsSessionFactory.kt diff --git a/compiler/fir/entrypoint/build.gradle.kts b/compiler/fir/entrypoint/build.gradle.kts index 83f52b5a23a..ca0fafadc0d 100644 --- a/compiler/fir/entrypoint/build.gradle.kts +++ b/compiler/fir/entrypoint/build.gradle.kts @@ -14,6 +14,7 @@ dependencies { api(project(":compiler:fir:checkers:checkers.jvm")) api(project(":compiler:fir:checkers:checkers.js")) api(project(":compiler:fir:checkers:checkers.native")) + api(project(":js:js.frontend")) // TODO: do not use GeneratorExtensions in `FirAnalyzerFacade.convertToIr`, and make this an 'implementation' dependency. api(project(":compiler:ir.psi2ir")) @@ -23,6 +24,7 @@ dependencies { implementation(project(":compiler:backend.jvm")) implementation(project(":compiler:ir.serialization.common")) implementation(project(":compiler:ir.serialization.jvm")) + implementation(project(":compiler:ir.serialization.js")) implementation(project(":compiler:ir.tree")) compileOnly(intellijCore()) 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 4a7e731c343..690f8860661 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 @@ -50,7 +50,7 @@ abstract class FirAbstractSessionFactory { register(FirKotlinScopeProvider::class, kotlinScopeProvider) val builtinsModuleData = DependencyListForCliModule.createDependencyModuleData( - Name.special(", + 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, + ) + } + ) + } + + fun createJsLibrarySession( + mainModuleName: Name, + resolvedLibraries: List, + sessionProvider: FirProjectSessionProvider, + moduleDataProvider: ModuleDataProvider, + languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT, + ) = createLibrarySession( + mainModuleName, + sessionProvider, + moduleDataProvider, + languageVersionSettings, + registerExtraComponents = { it.registerJsSpecificResolveComponents() }, + createKotlinScopeProvider = { FirKotlinScopeProvider { _, declaredMemberScope, _, _ -> declaredMemberScope } }, + createProviders = { session, builtinsModuleData, kotlinScopeProvider -> + val klibProviders = resolvedLibraries.map { + KlibBasedSymbolProvider(session, moduleDataProvider, kotlinScopeProvider, it) + } + + klibProviders + + listOf( + FirCloneableSymbolProvider(session, builtinsModuleData, kotlinScopeProvider), + // (Most) builtins should be taken from the dependencies in JS compilation, therefore builtins provider is the last one + // TODO: consider using "poisoning" provider for builtins to ensure that proper ones are taken from dependencies + // NOTE: it requires precise filtering for true nuiltins, like Function* + FirBuiltinSymbolProvider(session, builtinsModuleData, kotlinScopeProvider), + ) + } + ) + + @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()) + } +} + diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmSessionFactory.kt index d6a6f7d8c62..a00c0a4dbf9 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmSessionFactory.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmSessionFactory.kt @@ -15,8 +15,7 @@ import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider import org.jetbrains.kotlin.fir.java.JavaSymbolProvider import org.jetbrains.kotlin.fir.java.deserialization.JvmClassFileBasedSymbolProvider import org.jetbrains.kotlin.fir.java.deserialization.OptionalAnnotationClassesProvider -import org.jetbrains.kotlin.fir.resolve.providers.impl.FirBuiltinSymbolProvider -import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCloneableSymbolProvider +import org.jetbrains.kotlin.fir.resolve.providers.impl.* import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment @@ -116,7 +115,8 @@ object FirJvmSessionFactory : FirAbstractSessionFactory() { } } - val javaSymbolProvider = JavaSymbolProvider(session, projectEnvironment.getFirJavaFacade(session, moduleData, javaSourcesScope)) + val javaSymbolProvider = + JavaSymbolProvider(session, projectEnvironment.getFirJavaFacade(session, moduleData, javaSourcesScope)) session.register(JavaSymbolProvider::class, javaSymbolProvider) listOfNotNull( @@ -136,3 +136,4 @@ object FirJvmSessionFactory : FirAbstractSessionFactory() { } } } + 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 index b993cf0007f..d9dc476120a 100644 --- 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 @@ -20,6 +20,7 @@ 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 @@ -35,24 +36,11 @@ object FirJsSessionFactory : FirAbstractSessionFactory() { testServices: TestServices, configuration: CompilerConfiguration, languageVersionSettings: LanguageVersionSettings, - ): FirSession { - val moduleDataProvider = dependencyListForCliModule.moduleDataProvider - return createLibrarySession( - mainModuleName, - sessionProvider, - moduleDataProvider, - languageVersionSettings, - null, - createKotlinScopeProvider = { FirKotlinScopeProvider { _, declaredMemberScope, _, _ -> declaredMemberScope } }, - createProviders = { session, builtinsModuleData, kotlinScopeProvider -> - listOf( - FirBuiltinSymbolProvider(session, builtinsModuleData, kotlinScopeProvider), - FirCloneableSymbolProvider(session, builtinsModuleData, kotlinScopeProvider), - ) + resolveJsLibraries(module, testServices, configuration).map { - KlibBasedSymbolProvider(session, moduleDataProvider, kotlinScopeProvider, it) - } - }) - } + ): FirSession = FirSessionFactory.createJsLibrarySession( + mainModuleName, + getAllJsDependenciesPaths(module, testServices), + configuration, sessionProvider, dependencyListForCliModule.moduleDataProvider, languageVersionSettings + ) fun createModuleBasedSession( moduleData: FirModuleData,