[Kotlin] support calling analyze with KtModule in FE10 implementation of Analysis API

^KT-65307 fixed

GitOrigin-RevId: 6dc9ef7a2a83c49e15f45d1398025e6b921ac6da
This commit is contained in:
Ilya Kirillov
2024-01-25 20:35:20 +01:00
committed by intellij-monorepo-bot
parent 5ee2359817
commit 2afd4db1ab
4 changed files with 43 additions and 18 deletions
@@ -3,14 +3,18 @@ package org.jetbrains.kotlin.base.fe10.analysis
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade.AnalysisMode
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.caches.resolve.KotlinCacheService
import org.jetbrains.kotlin.idea.FrontendInternals
import org.jetbrains.kotlin.idea.base.projectStructure.RootKindFilter
import org.jetbrains.kotlin.idea.base.projectStructure.matches
import org.jetbrains.kotlin.idea.base.projectStructure.moduleInfo
import org.jetbrains.kotlin.idea.base.util.Frontend10ApiUsage
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
import org.jetbrains.kotlin.idea.resolve.ResolutionFacade
import org.jetbrains.kotlin.psi.KtCodeFragment
@@ -31,28 +35,43 @@ import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
import org.jetbrains.kotlin.util.CancellationChecker
@OptIn(FrontendInternals::class)
internal class IdeFe10AnalysisFacade(private val project: Project): Fe10AnalysisFacade {
private inline fun <reified T: Any> getFe10Service(element: KtElement): T {
return element.getResolutionFacade().getFrontendService(T::class.java)
internal class IdeFe10AnalysisFacade(private val project: Project) : Fe10AnalysisFacade {
@OptIn(Frontend10ApiUsage::class)
override fun getAnalysisContext(ktModule: KtModule, token: KtLifetimeToken): Fe10AnalysisContext {
val moduleInfo = ktModule.moduleInfo
val resolutionFacade = KotlinCacheService.getInstance(project).getResolutionFacadeByModuleInfo(moduleInfo, ktModule.platform)
return resolutionFacade.getAnalysisContext(token)
}
override fun getResolveSession(element: KtElement): ResolveSession = getFe10Service(element)
override fun getDeprecationResolver(element: KtElement): DeprecationResolver = getFe10Service(element)
override fun getCallResolver(element: KtElement): CallResolver = getFe10Service(element)
override fun getKotlinToResolvedCallTransformer(element: KtElement): KotlinToResolvedCallTransformer = getFe10Service(element)
override fun getKotlinTypeRefiner(element: KtElement): KotlinTypeRefiner = getFe10Service(element)
override fun getOverloadingConflictResolver(element: KtElement): OverloadingConflictResolver<ResolvedCall<*>> {
override fun getAnalysisContext(element: KtElement, token: KtLifetimeToken): Fe10AnalysisContext {
val resolutionFacade = element.getResolutionFacade()
val moduleDescriptor = resolutionFacade.moduleDescriptor
return resolutionFacade.getAnalysisContext(token)
}
private fun ResolutionFacade.getAnalysisContext(token: KtLifetimeToken): Fe10AnalysisContext {
return Fe10AnalysisContext(
facade = this@IdeFe10AnalysisFacade,
resolveSession = getFrontendService(ResolveSession::class.java),
deprecationResolver = getFrontendService(DeprecationResolver::class.java),
callResolver = getFrontendService<CallResolver>(CallResolver::class.java),
kotlinToResolvedCallTransformer = getFrontendService(KotlinToResolvedCallTransformer::class.java),
overloadingConflictResolver = getOverloadingConflictResolver(),
kotlinTypeRefiner = getFrontendService(KotlinTypeRefiner::class.java),
token = token,
)
}
private fun ResolutionFacade.getOverloadingConflictResolver(): OverloadingConflictResolver<ResolvedCall<*>> {
val moduleDescriptor = moduleDescriptor
return createOverloadingConflictResolver(
moduleDescriptor.builtIns,
moduleDescriptor,
resolutionFacade.getFrontendService(TypeSpecificityComparator::class.java),
resolutionFacade.getFrontendService(PlatformOverloadsSpecificityComparator::class.java),
resolutionFacade.getFrontendService(CancellationChecker::class.java),
resolutionFacade.getFrontendService(KotlinTypeRefiner::class.java)
getFrontendService(TypeSpecificityComparator::class.java),
getFrontendService(PlatformOverloadsSpecificityComparator::class.java),
getFrontendService(CancellationChecker::class.java),
getFrontendService(KotlinTypeRefiner::class.java),
)
}
@@ -6,9 +6,10 @@ import com.intellij.openapi.components.service
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.idea.base.projectStructure.moduleInfo.IdeaModuleInfo
import org.jetbrains.kotlin.idea.resolve.ResolutionFacade
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.resolve.diagnostics.KotlinSuppressCache
interface KotlinCacheService {
@@ -34,6 +35,7 @@ interface KotlinCacheService {
fun getSuppressionCache(): KotlinSuppressCache
fun getResolutionFacadeByModuleInfo(moduleInfo: ModuleInfo, platform: TargetPlatform): ResolutionFacade?
fun getResolutionFacadeByModuleInfo(moduleInfo: IdeaModuleInfo, platform: TargetPlatform): ResolutionFacade
fun getResolutionFacadeByModuleInfo(moduleInfo: ModuleInfo, settings: PlatformAnalysisSettings): ResolutionFacade?
}
@@ -548,7 +548,7 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
return getResolutionFacadeByModuleInfo(moduleInfo, platform)
}
private fun getResolutionFacadeByModuleInfo(moduleInfo: IdeaModuleInfo, platform: TargetPlatform): ResolutionFacade {
override fun getResolutionFacadeByModuleInfo(moduleInfo: IdeaModuleInfo, platform: TargetPlatform): ResolutionFacade {
val settings = moduleInfo.platformSettings(platform)
return getResolutionFacadeByModuleInfoAndSettings(moduleInfo, settings)
}
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.diagnostics.DiagnosticSink
import org.jetbrains.kotlin.idea.FrontendInternals
import org.jetbrains.kotlin.idea.fir.fe10.binding.KtSymbolBasedBindingContext
import org.jetbrains.kotlin.idea.base.projectStructure.moduleInfo.IdeaModuleInfo
import org.jetbrains.kotlin.idea.resolve.ResolutionFacade
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.psi.KtDeclaration
@@ -106,6 +106,10 @@ class KtSymbolBasedKotlinCacheServiceImpl(private val project: Project) : Kotlin
override fun getResolutionFacadeByModuleInfo(moduleInfo: ModuleInfo, platform: TargetPlatform): ResolutionFacade =
TODO("Not yet implemented")
override fun getResolutionFacadeByModuleInfo(moduleInfo: IdeaModuleInfo, platform: TargetPlatform): ResolutionFacade {
TODO("Not yet implemented")
}
override fun getResolutionFacadeByModuleInfo(moduleInfo: ModuleInfo, settings: PlatformAnalysisSettings): ResolutionFacade? {
TODO("Not yet implemented")
}