[Analysis API FE1.0] support calling analyze with KtModule in FE10 implementation

^KT-65307 fixed
This commit is contained in:
Ilya Kirillov
2024-01-25 20:32:58 +01:00
committed by Space Team
parent 0db8931026
commit db7e58ef35
4 changed files with 47 additions and 49 deletions
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.api.descriptors
import com.intellij.openapi.extensions.AreaInstance import com.intellij.openapi.extensions.AreaInstance
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
@@ -35,33 +36,32 @@ import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
import org.jetbrains.kotlin.util.CancellationChecker import org.jetbrains.kotlin.util.CancellationChecker
class CliFe10AnalysisFacade : Fe10AnalysisFacade { class CliFe10AnalysisFacade : Fe10AnalysisFacade {
override fun getResolveSession(element: KtElement): ResolveSession { override fun getAnalysisContext(element: KtElement, token: KtLifetimeToken): Fe10AnalysisContext {
return getHandler(element).resolveSession ?: error("Resolution is not performed") val handler = getHandler(element)
return getAnalysisContext(handler, token)
} }
override fun getDeprecationResolver(element: KtElement): DeprecationResolver { override fun getAnalysisContext(ktModule: KtModule, token: KtLifetimeToken): Fe10AnalysisContext {
return getHandler(element).deprecationResolver ?: error("Resolution is not performed") val handler = KtFe10AnalysisHandlerExtension.getInstance(ktModule.project, ktModule)
return getAnalysisContext(handler, token)
} }
override fun getCallResolver(element: KtElement): CallResolver { private fun getAnalysisContext(handler: KtFe10AnalysisHandlerExtension, token: KtLifetimeToken): Fe10AnalysisContext {
return getHandler(element).callResolver ?: error("Resolution is not performed") return Fe10AnalysisContext(
} facade = this,
handler.resolveSession.orThrowResolutionNotPerformedError(),
override fun getKotlinToResolvedCallTransformer(element: KtElement): KotlinToResolvedCallTransformer { handler.deprecationResolver.orThrowResolutionNotPerformedError(),
return getHandler(element).kotlinToResolvedCallTransformer ?: error("Resolution is not performed") handler.callResolver.orThrowResolutionNotPerformedError(),
} handler.kotlinToResolvedCallTransformer.orThrowResolutionNotPerformedError(),
handler.overloadingConflictResolver.orThrowResolutionNotPerformedError(),
override fun getOverloadingConflictResolver(element: KtElement): OverloadingConflictResolver<ResolvedCall<*>> { handler.kotlinTypeRefiner.orThrowResolutionNotPerformedError(),
return getHandler(element).overloadingConflictResolver ?: error("Resolution is not performed") token,
} )
override fun getKotlinTypeRefiner(element: KtElement): KotlinTypeRefiner {
return getHandler(element).kotlinTypeRefiner ?: error("Resolution is not performed")
} }
override fun analyze(elements: List<KtElement>, mode: Fe10AnalysisFacade.AnalysisMode): BindingContext { override fun analyze(elements: List<KtElement>, mode: Fe10AnalysisFacade.AnalysisMode): BindingContext {
val element = elements.firstOrNull() ?: return BindingContext.EMPTY val element = elements.firstOrNull() ?: return BindingContext.EMPTY
return getResolveSession(element).bindingContext return getHandler(element).resolveSession.orThrowResolutionNotPerformedError().bindingContext
} }
override fun getOrigin(file: VirtualFile): KtSymbolOrigin { override fun getOrigin(file: VirtualFile): KtSymbolOrigin {
@@ -73,6 +73,9 @@ class CliFe10AnalysisFacade : Fe10AnalysisFacade {
val ktModule = ProjectStructureProvider.getModule(project, useSiteElement, contextualModule = null) val ktModule = ProjectStructureProvider.getModule(project, useSiteElement, contextualModule = null)
return KtFe10AnalysisHandlerExtension.getInstance(project, ktModule) return KtFe10AnalysisHandlerExtension.getInstance(project, ktModule)
} }
private fun <T : Any> T?.orThrowResolutionNotPerformedError(): T =
this ?: error("Resolution is not performed")
} }
class KtFe10AnalysisHandlerExtension( class KtFe10AnalysisHandlerExtension(
@@ -7,8 +7,9 @@ package org.jetbrains.kotlin.analysis.api.descriptors
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
@@ -28,12 +29,9 @@ interface Fe10AnalysisFacade {
} }
} }
fun getResolveSession(element: KtElement): ResolveSession fun getAnalysisContext(element: KtElement, token: KtLifetimeToken): Fe10AnalysisContext
fun getDeprecationResolver(element: KtElement): DeprecationResolver
fun getCallResolver(element: KtElement): CallResolver fun getAnalysisContext(ktModule: KtModule, token: KtLifetimeToken): Fe10AnalysisContext
fun getKotlinToResolvedCallTransformer(element: KtElement): KotlinToResolvedCallTransformer
fun getOverloadingConflictResolver(element: KtElement): OverloadingConflictResolver<ResolvedCall<*>>
fun getKotlinTypeRefiner(element: KtElement): KotlinTypeRefiner
fun analyze(elements: List<KtElement>, mode: AnalysisMode = AnalysisMode.FULL): BindingContext fun analyze(elements: List<KtElement>, mode: AnalysisMode = AnalysisMode.FULL): BindingContext
@@ -53,16 +51,14 @@ interface Fe10AnalysisFacade {
class Fe10AnalysisContext( class Fe10AnalysisContext(
facade: Fe10AnalysisFacade, facade: Fe10AnalysisFacade,
val contextElement: KtElement, val resolveSession: ResolveSession,
val token: KtLifetimeToken val deprecationResolver: DeprecationResolver,
val callResolver: CallResolver,
val kotlinToResolvedCallTransformer: KotlinToResolvedCallTransformer,
val overloadingConflictResolver: OverloadingConflictResolver<ResolvedCall<*>>,
val kotlinTypeRefiner: KotlinTypeRefiner,
val token: KtLifetimeToken,
) : Fe10AnalysisFacade by facade { ) : Fe10AnalysisFacade by facade {
val resolveSession: ResolveSession = getResolveSession(contextElement)
val deprecationResolver: DeprecationResolver = getDeprecationResolver(contextElement)
val callResolver: CallResolver = getCallResolver(contextElement)
val kotlinToResolvedCallTransformer: KotlinToResolvedCallTransformer = getKotlinToResolvedCallTransformer(contextElement)
val overloadingConflictResolver: OverloadingConflictResolver<ResolvedCall<*>> = getOverloadingConflictResolver(contextElement)
val kotlinTypeRefiner: KotlinTypeRefiner = getKotlinTypeRefiner(contextElement)
val builtIns: KotlinBuiltIns val builtIns: KotlinBuiltIns
get() = resolveSession.moduleDescriptor.builtIns get() = resolveSession.moduleDescriptor.builtIns
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.analysis.api.descriptors package org.jetbrains.kotlin.analysis.api.descriptors
import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals
import org.jetbrains.kotlin.analysis.api.KtAnalysisNonPublicApi import org.jetbrains.kotlin.analysis.api.KtAnalysisNonPublicApi
@@ -19,20 +18,14 @@ import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolProvider import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolProvider
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolProviderByJavaPsi import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolProviderByJavaPsi
import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
import org.jetbrains.kotlin.psi.KtElement
@OptIn(KtAnalysisApiInternals::class, KtAnalysisNonPublicApi::class) @OptIn(KtAnalysisApiInternals::class, KtAnalysisNonPublicApi::class)
@Suppress("LeakingThis") @Suppress("LeakingThis")
class KtFe10AnalysisSession( class KtFe10AnalysisSession(
val analysisContext: Fe10AnalysisContext, val analysisContext: Fe10AnalysisContext,
override val useSiteModule: KtModule override val useSiteModule: KtModule,
) : KtAnalysisSession(analysisContext.token) { token: KtLifetimeToken,
constructor(project: Project, contextElement: KtElement, token: KtLifetimeToken) : this( ) : KtAnalysisSession(token) {
Fe10AnalysisContext(Fe10AnalysisFacade.getInstance(project), contextElement, token),
ProjectStructureProvider.getModule(project, contextElement, contextualModule = null)
)
override val smartCastProviderImpl: KtSmartCastProvider = KtFe10SmartCastProvider(this) override val smartCastProviderImpl: KtSmartCastProvider = KtFe10SmartCastProvider(this)
override val diagnosticProviderImpl: KtDiagnosticProvider = KtFe10DiagnosticProvider(this) override val diagnosticProviderImpl: KtDiagnosticProvider = KtFe10DiagnosticProvider(this)
@@ -10,19 +10,25 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.session.KtAnalysisSessionProvider import org.jetbrains.kotlin.analysis.api.session.KtAnalysisSessionProvider
import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeTokenFactory import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
import java.lang.UnsupportedOperationException
@OptIn(KtAnalysisApiInternals::class) @OptIn(KtAnalysisApiInternals::class)
class KtFe10AnalysisSessionProvider(project: Project) : KtAnalysisSessionProvider(project) { class KtFe10AnalysisSessionProvider(project: Project) : KtAnalysisSessionProvider(project) {
override fun getAnalysisSession(useSiteKtElement: KtElement): KtAnalysisSession { override fun getAnalysisSession(useSiteKtElement: KtElement): KtAnalysisSession {
return KtFe10AnalysisSession(project, useSiteKtElement, tokenFactory.create(project)) val facade = Fe10AnalysisFacade.getInstance(project)
val token = tokenFactory.create(project)
val context = facade.getAnalysisContext(useSiteKtElement, token)
val useSiteModule = ProjectStructureProvider.getModule(project, useSiteKtElement, contextualModule = null)
return KtFe10AnalysisSession(context, useSiteModule, token)
} }
override fun getAnalysisSessionByUseSiteKtModule(useSiteKtModule: KtModule): KtAnalysisSession { override fun getAnalysisSessionByUseSiteKtModule(useSiteKtModule: KtModule): KtAnalysisSession {
throw UnsupportedOperationException("getAnalysisSessionByModule() should not be used on KtFe10AnalysisSession") val facade = Fe10AnalysisFacade.getInstance(project)
val token = tokenFactory.create(project)
val context = facade.getAnalysisContext(useSiteKtModule, token)
return KtFe10AnalysisSession(context, useSiteKtModule, token)
} }
override fun clearCaches() {} override fun clearCaches() {}