AA: add analyzeWithKtModule API for analyzing without KtElement

This commit is contained in:
Jiaxiang Chen
2022-05-07 07:41:18 +02:00
committed by Ilya Kirillov
parent ef0160c026
commit 7b038860b5
4 changed files with 38 additions and 1 deletions
@@ -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() {}
}
@@ -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,
@@ -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<State : Any>(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<State : Any>(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
@@ -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 <R> analyzeWithSymbolAsContext(
contextSymbol: KtSymbol,
@@ -173,3 +177,14 @@ public inline fun <R> analyseInModalWindow(
task.queue()
return task.result
}
@OptIn(InvalidWayOfUsingAnalysisSession::class)
public inline fun <R> 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()
}