diff --git a/plugins/kotlin/base/fe10/analysis/src/org/jetbrains/kotlin/base/fe10/analysis/IdeFe10AnalysisFacade.kt b/plugins/kotlin/base/fe10/analysis/src/org/jetbrains/kotlin/base/fe10/analysis/IdeFe10AnalysisFacade.kt index b920adc4ed21..c2f259067624 100644 --- a/plugins/kotlin/base/fe10/analysis/src/org/jetbrains/kotlin/base/fe10/analysis/IdeFe10AnalysisFacade.kt +++ b/plugins/kotlin/base/fe10/analysis/src/org/jetbrains/kotlin/base/fe10/analysis/IdeFe10AnalysisFacade.kt @@ -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 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> { + 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::class.java), + kotlinToResolvedCallTransformer = getFrontendService(KotlinToResolvedCallTransformer::class.java), + overloadingConflictResolver = getOverloadingConflictResolver(), + kotlinTypeRefiner = getFrontendService(KotlinTypeRefiner::class.java), + token = token, + ) + } + + private fun ResolutionFacade.getOverloadingConflictResolver(): OverloadingConflictResolver> { + 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), ) } diff --git a/plugins/kotlin/base/fe10/analysis/src/org/jetbrains/kotlin/caches/resolve/KotlinCacheService.kt b/plugins/kotlin/base/fe10/analysis/src/org/jetbrains/kotlin/caches/resolve/KotlinCacheService.kt index a545ebe00ffd..37f9704efd35 100644 --- a/plugins/kotlin/base/fe10/analysis/src/org/jetbrains/kotlin/caches/resolve/KotlinCacheService.kt +++ b/plugins/kotlin/base/fe10/analysis/src/org/jetbrains/kotlin/caches/resolve/KotlinCacheService.kt @@ -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? } \ No newline at end of file diff --git a/plugins/kotlin/base/fe10/analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt b/plugins/kotlin/base/fe10/analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt index f26b4a249d65..5e9d9d47a68c 100644 --- a/plugins/kotlin/base/fe10/analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt +++ b/plugins/kotlin/base/fe10/analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt @@ -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) } diff --git a/plugins/kotlin/k2-fe10-bindings/src/org/jetbrains/kotlin/idea/fir/fe10/KtSymbolBasedResolutionFacade.kt b/plugins/kotlin/k2-fe10-bindings/src/org/jetbrains/kotlin/idea/fir/fe10/KtSymbolBasedResolutionFacade.kt index 07903b4ddea2..2d01b5f998ef 100644 --- a/plugins/kotlin/k2-fe10-bindings/src/org/jetbrains/kotlin/idea/fir/fe10/KtSymbolBasedResolutionFacade.kt +++ b/plugins/kotlin/k2-fe10-bindings/src/org/jetbrains/kotlin/idea/fir/fe10/KtSymbolBasedResolutionFacade.kt @@ -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") }