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

^KT-65307 fixed
diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/CliFe10AnalysisFacade.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/CliFe10AnalysisFacade.kt
index b74b3e5..71b206f 100644
--- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/CliFe10AnalysisFacade.kt
+++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/CliFe10AnalysisFacade.kt
@@ -8,6 +8,7 @@
 import com.intellij.openapi.extensions.AreaInstance
 import com.intellij.openapi.project.Project
 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.project.structure.KtModule
 import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
@@ -35,33 +36,32 @@
 import org.jetbrains.kotlin.util.CancellationChecker
 
 class CliFe10AnalysisFacade : Fe10AnalysisFacade {
-    override fun getResolveSession(element: KtElement): ResolveSession {
-        return getHandler(element).resolveSession ?: error("Resolution is not performed")
+    override fun getAnalysisContext(element: KtElement, token: KtLifetimeToken): Fe10AnalysisContext {
+        val handler = getHandler(element)
+        return getAnalysisContext(handler, token)
     }
 
-    override fun getDeprecationResolver(element: KtElement): DeprecationResolver {
-        return getHandler(element).deprecationResolver ?: error("Resolution is not performed")
+    override fun getAnalysisContext(ktModule: KtModule, token: KtLifetimeToken): Fe10AnalysisContext {
+        val handler = KtFe10AnalysisHandlerExtension.getInstance(ktModule.project, ktModule)
+        return getAnalysisContext(handler, token)
     }
 
-    override fun getCallResolver(element: KtElement): CallResolver {
-        return getHandler(element).callResolver ?: error("Resolution is not performed")
-    }
-
-    override fun getKotlinToResolvedCallTransformer(element: KtElement): KotlinToResolvedCallTransformer {
-        return getHandler(element).kotlinToResolvedCallTransformer ?: error("Resolution is not performed")
-    }
-
-    override fun getOverloadingConflictResolver(element: KtElement): OverloadingConflictResolver<ResolvedCall<*>> {
-        return getHandler(element).overloadingConflictResolver ?: error("Resolution is not performed")
-    }
-
-    override fun getKotlinTypeRefiner(element: KtElement): KotlinTypeRefiner {
-        return getHandler(element).kotlinTypeRefiner ?: error("Resolution is not performed")
+    private fun getAnalysisContext(handler: KtFe10AnalysisHandlerExtension, token: KtLifetimeToken): Fe10AnalysisContext {
+        return Fe10AnalysisContext(
+            facade = this,
+            handler.resolveSession.orThrowResolutionNotPerformedError(),
+            handler.deprecationResolver.orThrowResolutionNotPerformedError(),
+            handler.callResolver.orThrowResolutionNotPerformedError(),
+            handler.kotlinToResolvedCallTransformer.orThrowResolutionNotPerformedError(),
+            handler.overloadingConflictResolver.orThrowResolutionNotPerformedError(),
+            handler.kotlinTypeRefiner.orThrowResolutionNotPerformedError(),
+            token,
+        )
     }
 
     override fun analyze(elements: List<KtElement>, mode: Fe10AnalysisFacade.AnalysisMode): BindingContext {
         val element = elements.firstOrNull() ?: return BindingContext.EMPTY
-        return getResolveSession(element).bindingContext
+        return getHandler(element).resolveSession.orThrowResolutionNotPerformedError().bindingContext
     }
 
     override fun getOrigin(file: VirtualFile): KtSymbolOrigin {
@@ -73,6 +73,9 @@
         val ktModule = ProjectStructureProvider.getModule(project, useSiteElement, contextualModule = null)
         return KtFe10AnalysisHandlerExtension.getInstance(project, ktModule)
     }
+
+    private fun <T : Any> T?.orThrowResolutionNotPerformedError(): T =
+        this ?: error("Resolution is not performed")
 }
 
 class KtFe10AnalysisHandlerExtension(
diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/Fe10AnalysisFacade.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/Fe10AnalysisFacade.kt
index b550351..ebf1639 100644
--- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/Fe10AnalysisFacade.kt
+++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/Fe10AnalysisFacade.kt
@@ -7,8 +7,9 @@
 
 import com.intellij.openapi.project.Project
 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.symbols.KtSymbolOrigin
+import org.jetbrains.kotlin.analysis.project.structure.KtModule
 import org.jetbrains.kotlin.builtins.KotlinBuiltIns
 import org.jetbrains.kotlin.config.LanguageVersionSettings
 import org.jetbrains.kotlin.psi.KtElement
@@ -28,12 +29,9 @@
         }
     }
 
-    fun getResolveSession(element: KtElement): ResolveSession
-    fun getDeprecationResolver(element: KtElement): DeprecationResolver
-    fun getCallResolver(element: KtElement): CallResolver
-    fun getKotlinToResolvedCallTransformer(element: KtElement): KotlinToResolvedCallTransformer
-    fun getOverloadingConflictResolver(element: KtElement): OverloadingConflictResolver<ResolvedCall<*>>
-    fun getKotlinTypeRefiner(element: KtElement): KotlinTypeRefiner
+    fun getAnalysisContext(element: KtElement, token: KtLifetimeToken): Fe10AnalysisContext
+
+    fun getAnalysisContext(ktModule: KtModule, token: KtLifetimeToken): Fe10AnalysisContext
 
     fun analyze(elements: List<KtElement>, mode: AnalysisMode = AnalysisMode.FULL): BindingContext
 
@@ -53,16 +51,14 @@
 
 class Fe10AnalysisContext(
     facade: Fe10AnalysisFacade,
-    val contextElement: KtElement,
-    val token: KtLifetimeToken
+    val resolveSession: ResolveSession,
+    val deprecationResolver: DeprecationResolver,
+    val callResolver: CallResolver,
+    val kotlinToResolvedCallTransformer: KotlinToResolvedCallTransformer,
+    val overloadingConflictResolver: OverloadingConflictResolver<ResolvedCall<*>>,
+    val kotlinTypeRefiner: KotlinTypeRefiner,
+    val token: KtLifetimeToken,
 ) : 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
         get() = resolveSession.moduleDescriptor.builtIns
 
diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10AnalysisSession.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10AnalysisSession.kt
index ea6d218..9c8ec39 100644
--- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10AnalysisSession.kt
+++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10AnalysisSession.kt
@@ -5,7 +5,6 @@
 
 package org.jetbrains.kotlin.analysis.api.descriptors
 
-import com.intellij.openapi.project.Project
 import com.intellij.psi.search.GlobalSearchScope
 import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals
 import org.jetbrains.kotlin.analysis.api.KtAnalysisNonPublicApi
@@ -19,20 +18,14 @@
 import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolProvider
 import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolProviderByJavaPsi
 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)
 @Suppress("LeakingThis")
 class KtFe10AnalysisSession(
     val analysisContext: Fe10AnalysisContext,
-    override val useSiteModule: KtModule
-) : KtAnalysisSession(analysisContext.token) {
-    constructor(project: Project, contextElement: KtElement, token: KtLifetimeToken) : this(
-        Fe10AnalysisContext(Fe10AnalysisFacade.getInstance(project), contextElement, token),
-        ProjectStructureProvider.getModule(project, contextElement, contextualModule = null)
-    )
-
+    override val useSiteModule: KtModule,
+    token: KtLifetimeToken,
+) : KtAnalysisSession(token) {
 
     override val smartCastProviderImpl: KtSmartCastProvider = KtFe10SmartCastProvider(this)
     override val diagnosticProviderImpl: KtDiagnosticProvider = KtFe10DiagnosticProvider(this)
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 e3974ef..6fc89d4 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,19 +10,25 @@
 import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
 import org.jetbrains.kotlin.analysis.api.session.KtAnalysisSessionProvider
 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 java.lang.UnsupportedOperationException
 
 
 @OptIn(KtAnalysisApiInternals::class)
 class KtFe10AnalysisSessionProvider(project: Project) : KtAnalysisSessionProvider(project) {
     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 {
-        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() {}