Abstract FIR cli pipeline from core environment and related entities

This commit is contained in:
Ilya Chernikov
2021-08-03 12:17:22 +02:00
committed by TeamCityServer
parent 40614507d3
commit caa44e413d
21 changed files with 497 additions and 211 deletions
@@ -0,0 +1,32 @@
/*
* 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.fir.pipeline
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.collectors.FirDiagnosticsCollector
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporterFactory
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.FirTotalResolveProcessor
fun FirSession.runResolution(firFiles: List<FirFile>): Pair<ScopeSession, List<FirFile>> {
val resolveProcessor = FirTotalResolveProcessor(this)
resolveProcessor.process(firFiles)
return resolveProcessor.scopeSession to firFiles
}
@OptIn(ExperimentalStdlibApi::class)
fun FirSession.runCheckers(scopeSession: ScopeSession, firFiles: List<FirFile>): Map<FirFile, List<FirDiagnostic>> {
val collector = FirDiagnosticsCollector.create(this, scopeSession)
return buildMap {
for (file in firFiles) {
val reporter = DiagnosticReporterFactory.createReporter()
collector.collectDiagnostics(file, reporter)
put(file, reporter.diagnostics)
}
}
}
@@ -0,0 +1,36 @@
/*
* 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.fir.pipeline
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.builder.PsiHandlingMode
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir
import org.jetbrains.kotlin.fir.resolve.firProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl
import org.jetbrains.kotlin.psi.KtFile
import java.io.File
fun FirSession.buildFirViaLightTree(files: Collection<File>): List<FirFile> {
val firProvider = (firProvider as FirProviderImpl)
val builder = LightTree2Fir(this, firProvider.kotlinScopeProvider)
return files.map {
builder.buildFirFile(it).also { firFile ->
firProvider.recordFile(firFile)
}
}
}
fun FirSession.buildFirFromKtFiles(ktFiles: Collection<KtFile>): List<FirFile> {
val firProvider = (firProvider as FirProviderImpl)
val builder = RawFirBuilder(this, firProvider.kotlinScopeProvider, PsiHandlingMode.COMPILER)
return ktFiles.map {
builder.buildFirFile(it).also { firFile ->
firProvider.recordFile(firFile)
}
}
}
@@ -0,0 +1,40 @@
/*
* 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.fir.pipeline
import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.backend.Fir2IrConverter
import org.jetbrains.kotlin.fir.backend.Fir2IrResult
import org.jetbrains.kotlin.fir.backend.jvm.Fir2IrJvmSpecialAnnotationSymbolProvider
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmKotlinMangler
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmVisibilityConverter
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.languageVersionSettings
import org.jetbrains.kotlin.fir.moduleData
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.firProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmDescriptorMangler
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
import org.jetbrains.kotlin.psi2ir.generators.GeneratorExtensions
fun FirSession.convertToIr(scopeSession: ScopeSession, firFiles: List<FirFile>, extensions: GeneratorExtensions): Fir2IrResult {
val signaturer = JvmIdSignatureDescriptor(JvmDescriptorMangler(null))
val commonFirFiles = moduleData.dependsOnDependencies
.map { it.session }
.filter { it.kind == FirSession.Kind.Source }
.flatMap { (it.firProvider as FirProviderImpl).getAllFirFiles() }
return Fir2IrConverter.createModuleFragment(
this, scopeSession, firFiles + commonFirFiles,
languageVersionSettings, signaturer,
extensions, FirJvmKotlinMangler(this), IrFactoryImpl,
FirJvmVisibilityConverter,
Fir2IrJvmSpecialAnnotationSymbolProvider()
)
}
@@ -5,8 +5,6 @@
package org.jetbrains.kotlin.fir.session
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElementFinder
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.config.LanguageVersionSettings
@@ -25,7 +23,8 @@ import org.jetbrains.kotlin.fir.deserialization.SingleModuleDataProvider
import org.jetbrains.kotlin.fir.extensions.BunchOfRegisteredExtensions
import org.jetbrains.kotlin.fir.extensions.extensionService
import org.jetbrains.kotlin.fir.extensions.registerExtensions
import org.jetbrains.kotlin.fir.java.*
import org.jetbrains.kotlin.fir.java.FirCliSession
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.java.deserialization.KotlinDeserializedJvmSymbolsProvider
import org.jetbrains.kotlin.fir.resolve.providers.FirDependenciesSymbolProvider
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
@@ -33,10 +32,10 @@ import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
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
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope
import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.load.java.JavaClassFinderImpl
import org.jetbrains.kotlin.load.kotlin.PackagePartProvider
import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
@@ -73,7 +72,7 @@ object FirSessionFactory {
data class ProviderAndScopeForIncrementalCompilation(
val packagePartProvider: PackagePartProvider,
val scope: GlobalSearchScope
val scope: AbstractProjectFileSearchScope
)
inline fun createSessionWithDependencies(
@@ -81,13 +80,12 @@ object FirSessionFactory {
platform: TargetPlatform,
analyzerServices: PlatformDependentAnalyzerServices,
externalSessionProvider: FirProjectSessionProvider?,
project: Project,
projectEnvironment: AbstractProjectEnvironment,
languageVersionSettings: LanguageVersionSettings,
sourceScope: GlobalSearchScope,
librariesScope: GlobalSearchScope,
sourceScope: AbstractProjectFileSearchScope,
librariesScope: AbstractProjectFileSearchScope,
lookupTracker: LookupTracker?,
providerAndScopeForIncrementalCompilation: ProviderAndScopeForIncrementalCompilation?,
getPackagePartProvider: (GlobalSearchScope) -> PackagePartProvider,
dependenciesConfigurator: DependencyListForCliModule.Builder.() -> Unit = {},
noinline sessionConfigurator: FirSessionConfigurator.() -> Unit = {},
): FirSession {
@@ -98,8 +96,8 @@ object FirSessionFactory {
sessionProvider,
dependencyList.moduleDataProvider,
librariesScope,
project,
getPackagePartProvider(librariesScope),
projectEnvironment,
projectEnvironment.getPackagePartProvider(librariesScope),
languageVersionSettings
)
@@ -115,7 +113,7 @@ object FirSessionFactory {
mainModuleData,
sessionProvider,
sourceScope,
project,
projectEnvironment,
providerAndScopeForIncrementalCompilation,
languageVersionSettings = languageVersionSettings,
lookupTracker = lookupTracker,
@@ -126,8 +124,8 @@ object FirSessionFactory {
fun createJavaModuleBasedSession(
moduleData: FirModuleData,
sessionProvider: FirProjectSessionProvider,
scope: GlobalSearchScope,
project: Project,
scope: AbstractProjectFileSearchScope,
projectEnvironment: AbstractProjectEnvironment,
providerAndScopeForIncrementalCompilation: ProviderAndScopeForIncrementalCompilation?,
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
lookupTracker: LookupTracker? = null,
@@ -149,16 +147,16 @@ object FirSessionFactory {
register(FirProvider::class, firProvider)
val symbolProviderForBinariesFromIncrementalCompilation = providerAndScopeForIncrementalCompilation?.let {
val javaSymbolProvider = JavaSymbolProvider(this, moduleData, project, it.scope)
val javaSymbolProvider = projectEnvironment.getJavaSymbolProvider(this, moduleData, it.scope)
makeDeserializedJvmSymbolsProvider(
KotlinDeserializedJvmSymbolsProvider(
this@session,
SingleModuleDataProvider(moduleData),
project,
it.scope,
kotlinScopeProvider,
it.packagePartProvider,
projectEnvironment.getKotlinClassFinder(it.scope),
javaSymbolProvider,
kotlinScopeProvider
projectEnvironment.getJavaClassFinder(it.scope)
)
}
@@ -170,7 +168,7 @@ object FirSessionFactory {
listOfNotNull(
firProvider.symbolProvider,
symbolProviderForBinariesFromIncrementalCompilation,
JavaSymbolProvider(this, moduleData, project, scope),
projectEnvironment.getJavaSymbolProvider(this, moduleData, scope),
dependenciesSymbolProvider,
)
)
@@ -187,7 +185,7 @@ object FirSessionFactory {
registerJvmCheckers()
init()
}.configure()
PsiElementFinder.EP.getPoint(project).registerExtension(FirJavaElementFinder(this, project), project)
projectEnvironment.registerAsJavaElementFinder(this)
}
}
@@ -195,8 +193,8 @@ object FirSessionFactory {
mainModuleName: Name,
sessionProvider: FirProjectSessionProvider,
moduleDataProvider: ModuleDataProvider,
scope: GlobalSearchScope,
project: Project,
scope: AbstractProjectFileSearchScope,
projectEnvironment: AbstractProjectEnvironment,
packagePartProvider: PackagePartProvider,
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
): FirSession {
@@ -210,18 +208,18 @@ object FirSessionFactory {
registerCommonComponents(languageVersionSettings)
registerCommonJavaComponents()
val javaSymbolProvider = JavaSymbolProvider(this, moduleDataProvider.allModuleData.last(), project, scope)
val javaSymbolProvider = projectEnvironment.getJavaSymbolProvider(this, moduleDataProvider.allModuleData.last(), scope)
val kotlinScopeProvider = FirKotlinScopeProvider(::wrapScopeWithJvmMapped)
val deserializedProviderForIncrementalCompilation = makeDeserializedJvmSymbolsProvider(
librarySession = this,
moduleDataProvider,
project,
scope,
packagePartProvider,
javaSymbolProvider,
kotlinScopeProvider
val deserializedProviderForIncrementalCompilation = KotlinDeserializedJvmSymbolsProvider(
session = this,
moduleDataProvider = moduleDataProvider,
kotlinScopeProvider = kotlinScopeProvider,
packagePartProvider = packagePartProvider,
kotlinClassFinder = projectEnvironment.getKotlinClassFinder(scope),
javaSymbolProvider = javaSymbolProvider,
javaClassFinder = projectEnvironment.getJavaClassFinder(scope)
)
val builtinsModuleData = createModuleDataForBuiltins(
@@ -245,33 +243,6 @@ object FirSessionFactory {
}
}
private fun makeDeserializedJvmSymbolsProvider(
librarySession: FirSession,
moduleDataProvider: ModuleDataProvider,
project: Project,
scope: GlobalSearchScope,
packagePartProvider: PackagePartProvider,
javaSymbolProvider: JavaSymbolProvider,
kotlinScopeProvider: FirKotlinScopeProvider
): KotlinDeserializedJvmSymbolsProvider {
val kotlinClassFinder = VirtualFileFinderFactory.getInstance(project).create(scope)
val javaClassFinder = JavaClassFinderImpl().apply {
this.setProjectInstance(project)
this.setScope(scope)
}
return KotlinDeserializedJvmSymbolsProvider(
librarySession,
moduleDataProvider,
kotlinScopeProvider,
packagePartProvider,
kotlinClassFinder,
javaSymbolProvider,
javaClassFinder
)
}
@TestOnly
fun createEmptySession(): FirSession {
return object : FirSession(null, Kind.Source) {}.apply {
@@ -0,0 +1,62 @@
/*
* 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.fir.session.environment
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.java.JavaSymbolProvider
import org.jetbrains.kotlin.load.java.JavaClassFinder
import org.jetbrains.kotlin.load.kotlin.KotlinClassFinder
import org.jetbrains.kotlin.load.kotlin.PackagePartProvider
import java.io.File
interface AbstractProjectFileSearchScope {
val isEmpty: Boolean
operator fun minus(other: AbstractProjectFileSearchScope): AbstractProjectFileSearchScope
operator fun plus(other: AbstractProjectFileSearchScope): AbstractProjectFileSearchScope
operator fun not(): AbstractProjectFileSearchScope
object EMPTY : AbstractProjectFileSearchScope {
override val isEmpty: Boolean = true
override fun minus(other: AbstractProjectFileSearchScope): AbstractProjectFileSearchScope = this
override fun plus(other: AbstractProjectFileSearchScope): AbstractProjectFileSearchScope = other
override fun not(): AbstractProjectFileSearchScope = ANY
}
object ANY : AbstractProjectFileSearchScope {
override val isEmpty: Boolean = false
override fun minus(other: AbstractProjectFileSearchScope): AbstractProjectFileSearchScope = error("Operation not implemented")
override fun plus(other: AbstractProjectFileSearchScope): AbstractProjectFileSearchScope = this
override fun not(): AbstractProjectFileSearchScope = EMPTY
}
}
interface AbstractProjectEnvironment {
fun getKotlinClassFinder(fileSearchScope: AbstractProjectFileSearchScope): KotlinClassFinder
fun getJavaClassFinder(fileSearchScope: AbstractProjectFileSearchScope): JavaClassFinder
fun getJavaSymbolProvider(
firSession: FirSession,
baseModuleData: FirModuleData,
fileSearchScope: AbstractProjectFileSearchScope
): JavaSymbolProvider
fun getPackagePartProvider(fileSearchScope: AbstractProjectFileSearchScope): PackagePartProvider
fun registerAsJavaElementFinder(firSession: FirSession)
fun getSearchScopeByIoFiles(files: Iterable<File>, allowOutOfProjectRoots: Boolean = false): AbstractProjectFileSearchScope
fun getSearchScopeForProjectLibraries(): AbstractProjectFileSearchScope
fun getSearchScopeForProjectJavaSources(): AbstractProjectFileSearchScope
}