From 7b038860b5eeaf989e4dcfd22b76ce292a63f263 Mon Sep 17 00:00:00 2001 From: Jiaxiang Chen Date: Sat, 7 May 2022 07:41:18 +0200 Subject: [PATCH] AA: add analyzeWithKtModule API for analyzing without KtElement --- .../KtFe10CliAnalysisSessionProvider.kt | 5 +++++ .../api/fir/KtFirAnalysisSessionProvider.kt | 6 ++++++ .../base/CachingKtAnalysisSessionProvider.kt | 11 +++++++++++ .../analysis/api/KtAnalysisSessionProvider.kt | 17 ++++++++++++++++- 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10CliAnalysisSessionProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10CliAnalysisSessionProvider.kt index 780129b7b08..e7cd50f63a6 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10CliAnalysisSessionProvider.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10CliAnalysisSessionProvider.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.KtAnalysisSessionProvider import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.api.tokens.KtLifetimeTokenFactory import org.jetbrains.kotlin.analysis.project.structure.getKtModule import org.jetbrains.kotlin.psi.KtElement @@ -36,5 +37,9 @@ class KtFe10AnalysisSessionProvider : KtAnalysisSessionProvider() { throw UnsupportedOperationException("getAnalysisSessionBySymbol() should not be used on KtFe10AnalysisSession") } + override fun getAnalysisSessionByModule(ktModule: KtModule, factory: KtLifetimeTokenFactory): KtAnalysisSession { + throw UnsupportedOperationException("getAnalysisSessionByModule() should not be used on KtFe10AnalysisSession") + } + override fun clearCaches() {} } \ No newline at end of file diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSessionProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSessionProvider.kt index b1bb9eb355a..d0b8926791b 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSessionProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSessionProvider.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.tokens.KtLifetimeToken import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getFirResolveSession +import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.psi.KtElement @OptIn(InvalidWayOfUsingAnalysisSession::class) @@ -29,6 +30,11 @@ class KtFirAnalysisSessionProvider(project: Project) : CachingKtAnalysisSessionP } } + override fun getFirResolveSession(contextModule: KtModule): LLFirResolveSession { + checkNotNull(contextModule.project) + return contextModule.getFirResolveSession(contextModule.project!!) + } + override fun createAnalysisSession( firResolveSession: LLFirResolveSession, token: KtLifetimeToken, diff --git a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/CachingKtAnalysisSessionProvider.kt b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/CachingKtAnalysisSessionProvider.kt index 9d3b54a3329..0b9a5a19179 100644 --- a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/CachingKtAnalysisSessionProvider.kt +++ b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/CachingKtAnalysisSessionProvider.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.analysis.api.InvalidWayOfUsingAnalysisSession import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.KtAnalysisSessionProvider import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.api.tokens.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.tokens.KtLifetimeTokenFactory import org.jetbrains.kotlin.psi.KtElement @@ -29,6 +30,8 @@ abstract class CachingKtAnalysisSessionProvider(private val project protected abstract fun getFirResolveSession(contextElement: KtElement): State protected abstract fun getFirResolveSession(contextSymbol: KtSymbol): State + protected abstract fun getFirResolveSession(contextModule: KtModule): State + protected abstract fun createAnalysisSession( firResolveSession: State, token: KtLifetimeToken, @@ -43,6 +46,14 @@ abstract class CachingKtAnalysisSessionProvider(private val project } } + final override fun getAnalysisSessionByModule(ktModule: KtModule, factory: KtLifetimeTokenFactory): KtAnalysisSession { + val firResolveSession = getFirResolveSession(ktModule) + return cache.getAnalysisSession(firResolveSession to factory.identifier) { + val validityToken = factory.create(project) + createAnalysisSession(firResolveSession, validityToken) + } + } + final override fun getAnalysisSessionBySymbol(contextSymbol: KtSymbol): KtAnalysisSession { val firResolveSession = getFirResolveSession(contextSymbol) val token = contextSymbol.token diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/KtAnalysisSessionProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/KtAnalysisSessionProvider.kt index 9b78ef7244f..84e66f715de 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/KtAnalysisSessionProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/KtAnalysisSessionProvider.kt @@ -15,8 +15,9 @@ import com.intellij.openapi.util.Computable import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.tokens.KtAlwaysAccessibleLifetimeTokenFactory -import org.jetbrains.kotlin.analysis.api.tokens.ReadActionConfinementValidityTokenFactoryFactory import org.jetbrains.kotlin.analysis.api.tokens.KtLifetimeTokenFactory +import org.jetbrains.kotlin.analysis.api.tokens.ReadActionConfinementValidityTokenFactoryFactory +import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile @@ -42,6 +43,9 @@ public abstract class KtAnalysisSessionProvider : Disposable { @InvalidWayOfUsingAnalysisSession public abstract fun getAnalysisSessionBySymbol(contextSymbol: KtSymbol): KtAnalysisSession + @InvalidWayOfUsingAnalysisSession + public abstract fun getAnalysisSessionByModule(ktModule: KtModule, factory: KtLifetimeTokenFactory): KtAnalysisSession + @InvalidWayOfUsingAnalysisSession public inline fun analyzeWithSymbolAsContext( contextSymbol: KtSymbol, @@ -173,3 +177,14 @@ public inline fun analyseInModalWindow( task.queue() return task.result } + +@OptIn(InvalidWayOfUsingAnalysisSession::class) +public inline fun analyzeWithKtModule( + ktModule: KtModule, + tokenFactory: KtLifetimeTokenFactory, + crossinline action: KtAnalysisSession.() -> R +): R { + checkNotNull(ktModule.project) + val sessionProvider = KtAnalysisSessionProvider.getInstance(ktModule.project!!) + return sessionProvider.getAnalysisSessionByModule(ktModule, tokenFactory).action() +} \ No newline at end of file