[Analysis API] add support for generated declarations to KtFirPackageScope

^KT-58262
This commit is contained in:
Ilya Kirillov
2023-04-25 18:55:25 +02:00
committed by teamcity
parent 2abe9ac1ef
commit aa4fe51945
6 changed files with 41 additions and 9 deletions
@@ -18,9 +18,15 @@ import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LowLevelFirApiFacadeForResolveOnAir import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LowLevelFirApiFacadeForResolveOnAir
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.CompositeKotlinDeclarationProvider
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.CompositeKotlinPackageProvider
import org.jetbrains.kotlin.analysis.low.level.api.fir.resolve.extensions.llResolveExtensionTool
import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.analysis.project.structure.allDirectDependencies
import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider
import org.jetbrains.kotlin.analysis.providers.KotlinPackageProvider
import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider
import org.jetbrains.kotlin.analysis.providers.createPackageProvider
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.moduleData import org.jetbrains.kotlin.fir.moduleData
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
@@ -29,6 +35,7 @@ import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.utils.addIfNotNull
@OptIn(KtAnalysisApiInternals::class) @OptIn(KtAnalysisApiInternals::class)
@Suppress("AnalysisApiMissingLifetimeCheck") @Suppress("AnalysisApiMissingLifetimeCheck")
@@ -142,7 +149,32 @@ private constructor(
internal val targetPlatform: TargetPlatform get() = useSiteSession.moduleData.platform internal val targetPlatform: TargetPlatform get() = useSiteSession.moduleData.platform
val useSiteAnalysisScope: GlobalSearchScope = analysisScopeProviderImpl.getAnalysisScope() val useSiteAnalysisScope: GlobalSearchScope = analysisScopeProviderImpl.getAnalysisScope()
val useSiteScopeDeclarationProvider: KotlinDeclarationProvider = project.createDeclarationProvider(useSiteAnalysisScope)
val useSiteScopeDeclarationProvider: KotlinDeclarationProvider
val useSitePackageProvider: KotlinPackageProvider
init {
val extensionTools = buildList {
addIfNotNull(useSiteSession.llResolveExtensionTool)
useSiteModule.allDirectDependencies().mapNotNullTo(this) { dependency ->
firResolveSession.getSessionFor(dependency).llResolveExtensionTool
}
}
useSiteScopeDeclarationProvider = CompositeKotlinDeclarationProvider.create(
buildList {
add(project.createDeclarationProvider(useSiteAnalysisScope))
extensionTools.mapTo(this) { it.declarationProvider }
}
)
useSitePackageProvider = CompositeKotlinPackageProvider.create(
buildList {
add(project.createPackageProvider(useSiteAnalysisScope))
extensionTools.mapTo(this) { it.packageProvider }
}
)
}
fun getScopeSessionFor(session: FirSession): ScopeSession = withValidityAssertion { firResolveSession.getScopeSessionFor(session) } fun getScopeSessionFor(session: FirSession): ScopeSession = withValidityAssertion { firResolveSession.getScopeSessionFor(session) }
@@ -252,6 +252,7 @@ internal class KtFirScopeProvider(
builder, builder,
analysisSession.useSiteAnalysisScope, analysisSession.useSiteAnalysisScope,
analysisSession.useSiteScopeDeclarationProvider, analysisSession.useSiteScopeDeclarationProvider,
analysisSession.useSitePackageProvider,
analysisSession.targetPlatform analysisSession.targetPlatform
) )
} }
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtClassifierSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol
import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider
import org.jetbrains.kotlin.analysis.providers.createPackageProvider import org.jetbrains.kotlin.analysis.providers.KotlinPackageProvider
import org.jetbrains.kotlin.fir.extensions.FirExtensionService import org.jetbrains.kotlin.fir.extensions.FirExtensionService
import org.jetbrains.kotlin.fir.extensions.declarationGenerators import org.jetbrains.kotlin.fir.extensions.declarationGenerators
import org.jetbrains.kotlin.fir.extensions.extensionService import org.jetbrains.kotlin.fir.extensions.extensionService
@@ -33,12 +33,11 @@ internal class KtFirPackageScope(
private val builder: KtSymbolByFirBuilder, private val builder: KtSymbolByFirBuilder,
private val searchScope: GlobalSearchScope, private val searchScope: GlobalSearchScope,
private val declarationProvider: KotlinDeclarationProvider, private val declarationProvider: KotlinDeclarationProvider,
private val packageProvider: KotlinPackageProvider,
private val targetPlatform: TargetPlatform, private val targetPlatform: TargetPlatform,
) : KtScope { ) : KtScope {
override val token: KtLifetimeToken get() = builder.token override val token: KtLifetimeToken get() = builder.token
private val packageProvider = project.createPackageProvider(searchScope)
private val firScope: FirPackageMemberScope by lazy(LazyThreadSafetyMode.PUBLICATION) { private val firScope: FirPackageMemberScope by lazy(LazyThreadSafetyMode.PUBLICATION) {
FirPackageMemberScope(fqName, builder.rootSession) FirPackageMemberScope(fqName, builder.rootSession)
} }
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
internal class CompositeKotlinDeclarationProvider class CompositeKotlinDeclarationProvider
private constructor( private constructor(
private val providers: List<KotlinDeclarationProvider> private val providers: List<KotlinDeclarationProvider>
) : KotlinDeclarationProvider() { ) : KotlinDeclarationProvider() {
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.TargetPlatform
internal class CompositeKotlinPackageProvider class CompositeKotlinPackageProvider
private constructor( private constructor(
private val providers: List<KotlinPackageProvider> private val providers: List<KotlinPackageProvider>
) : KotlinPackageProvider() { ) : KotlinPackageProvider() {
@@ -34,14 +34,14 @@ import java.util.concurrent.ConcurrentHashMap
* *
* Caches generated [KtResolveExtensionFile]s, creates [KotlinDeclarationProvider], [KotlinPackageProvider], [LLFirSymbolProviderNameCache] needed for the [org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider]. * Caches generated [KtResolveExtensionFile]s, creates [KotlinDeclarationProvider], [KotlinPackageProvider], [LLFirSymbolProviderNameCache] needed for the [org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider].
*/ */
internal abstract class LLFirResolveExtensionTool : FirSessionComponent { abstract class LLFirResolveExtensionTool : FirSessionComponent {
abstract val modificationTrackers: List<ModificationTracker> abstract val modificationTrackers: List<ModificationTracker>
abstract val declarationProvider: KotlinDeclarationProvider abstract val declarationProvider: KotlinDeclarationProvider
abstract val packageProvider: KotlinPackageProvider abstract val packageProvider: KotlinPackageProvider
abstract val symbolNameCache: LLFirSymbolProviderNameCache internal abstract val symbolNameCache: LLFirSymbolProviderNameCache
} }
internal val FirSession.llResolveExtensionTool: LLFirResolveExtensionTool? by FirSession.nullableSessionComponentAccessor() val FirSession.llResolveExtensionTool: LLFirResolveExtensionTool? by FirSession.nullableSessionComponentAccessor()
internal class LLFirNonEmptyResolveExtensionTool( internal class LLFirNonEmptyResolveExtensionTool(
session: LLFirSession, session: LLFirSession,