Abstract FIR cli pipeline from core environment and related entities
This commit is contained in:
committed by
TeamCityServer
parent
40614507d3
commit
caa44e413d
@@ -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 {
|
||||
|
||||
+62
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user