[LL API] Pass the project instance to ProjectStructureProvider

Eliminate unnecessary PSI tree traversal by providing the 'Project'
instance explicitly.
This commit is contained in:
Yan Zhulanow
2023-05-15 15:58:20 +09:00
committed by Space Team
parent bb37a959d4
commit c6d8876f9f
13 changed files with 26 additions and 19 deletions
@@ -68,8 +68,9 @@ class CliFe10AnalysisFacade : Fe10AnalysisFacade {
} }
private fun getHandler(useSiteElement: KtElement): KtFe10AnalysisHandlerExtension { private fun getHandler(useSiteElement: KtElement): KtFe10AnalysisHandlerExtension {
val ktModule = ProjectStructureProvider.getModule(useSiteElement, contextualModule = null) val project = useSiteElement.project
return KtFe10AnalysisHandlerExtension.getInstance(ktModule.project, ktModule) val ktModule = ProjectStructureProvider.getModule(project, useSiteElement, contextualModule = null)
return KtFe10AnalysisHandlerExtension.getInstance(project, ktModule)
} }
} }
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.analysis.api.descriptors package org.jetbrains.kotlin.analysis.api.descriptors
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals 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.components.* import org.jetbrains.kotlin.analysis.api.components.*
@@ -26,9 +27,9 @@ class KtFe10AnalysisSession(
val analysisContext: Fe10AnalysisContext, val analysisContext: Fe10AnalysisContext,
override val useSiteModule: KtModule override val useSiteModule: KtModule
) : KtAnalysisSession(analysisContext.token) { ) : KtAnalysisSession(analysisContext.token) {
constructor(contextElement: KtElement, token: KtLifetimeToken) : this( constructor(project: Project, contextElement: KtElement, token: KtLifetimeToken) : this(
Fe10AnalysisContext(Fe10AnalysisFacade.getInstance(contextElement.project), contextElement, token), Fe10AnalysisContext(Fe10AnalysisFacade.getInstance(project), contextElement, token),
ProjectStructureProvider.getModule(contextElement, contextualModule = null) ProjectStructureProvider.getModule(project, contextElement, contextualModule = null)
) )
@@ -70,6 +71,6 @@ class KtFe10AnalysisSession(
override fun createContextDependentCopy(originalKtFile: KtFile, elementToReanalyze: KtElement): KtAnalysisSession = override fun createContextDependentCopy(originalKtFile: KtFile, elementToReanalyze: KtElement): KtAnalysisSession =
withValidityAssertion { withValidityAssertion {
KtFe10AnalysisSession(elementToReanalyze, token) KtFe10AnalysisSession(originalKtFile.project, elementToReanalyze, token)
} }
} }
@@ -18,7 +18,7 @@ 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, factory: KtLifetimeTokenFactory): KtAnalysisSession { override fun getAnalysisSession(useSiteKtElement: KtElement, factory: KtLifetimeTokenFactory): KtAnalysisSession {
return KtFe10AnalysisSession(useSiteKtElement, factory.create(project)) return KtFe10AnalysisSession(project, useSiteKtElement, factory.create(project))
} }
override fun getAnalysisSessionByUseSiteKtModule(useSiteKtModule: KtModule, factory: KtLifetimeTokenFactory): KtAnalysisSession { override fun getAnalysisSessionByUseSiteKtModule(useSiteKtModule: KtModule, factory: KtLifetimeTokenFactory): KtAnalysisSession {
@@ -36,7 +36,7 @@ class KtFirAnalysisSessionProvider(project: Project) : KtAnalysisSessionProvider
} }
override fun getAnalysisSession(useSiteKtElement: KtElement, factory: KtLifetimeTokenFactory): KtAnalysisSession { override fun getAnalysisSession(useSiteKtElement: KtElement, factory: KtLifetimeTokenFactory): KtAnalysisSession {
val module = ProjectStructureProvider.getModule(useSiteKtElement, contextualModule = null) val module = ProjectStructureProvider.getModule(project, useSiteKtElement, contextualModule = null)
return getAnalysisSessionByUseSiteKtModule(module, factory) return getAnalysisSessionByUseSiteKtModule(module, factory)
} }
@@ -32,8 +32,9 @@ abstract class AbstractSymbolRestoreFromDifferentModuleTest : AbstractAnalysisAp
caretTag = "restoreAt" caretTag = "restoreAt"
).single().first ).single().first
val declarationModule = ProjectStructureProvider.getModule(declaration, contextualModule = null) val project = declaration.project
val restoreAtModule = ProjectStructureProvider.getModule(restoreAt, contextualModule = null) val declarationModule = ProjectStructureProvider.getModule(project, declaration, contextualModule = null)
val restoreAtModule = ProjectStructureProvider.getModule(project, restoreAt, contextualModule = null)
val (debugRendered, prettyRendered, pointer) = analyseForTest(declaration) { val (debugRendered, prettyRendered, pointer) = analyseForTest(declaration) {
val symbol = declaration.getSymbol() val symbol = declaration.getSymbol()
@@ -182,5 +182,5 @@ public abstract class KtAnalysisSession(final override val token: KtLifetimeToke
} }
public fun KtAnalysisSession.getModule(element: PsiElement): KtModule { public fun KtAnalysisSession.getModule(element: PsiElement): KtModule {
return ProjectStructureProvider.getModule(element, useSiteModule) return ProjectStructureProvider.getModule(useSiteModule.project, element, useSiteModule)
} }
@@ -94,7 +94,11 @@ abstract class KtSimpleNameReference(expression: KtSimpleNameExpression) : KtSim
abstract fun getImportAlias(): KtImportAlias? abstract fun getImportAlias(): KtImportAlias?
private fun isAssignmentResolved(project: Project, binaryExpression: KtBinaryExpression): Boolean { private fun isAssignmentResolved(project: Project, binaryExpression: KtBinaryExpression): Boolean {
val sourceModule = ProjectStructureProvider.getModule(binaryExpression, contextualModule = null) as? KtSourceModule ?: return false val sourceModule = ProjectStructureProvider.getModule(project, binaryExpression, contextualModule = null)
if (sourceModule !is KtSourceModule) {
return false
}
val reference = binaryExpression.operationReference.reference ?: return false val reference = binaryExpression.operationReference.reference ?: return false
val pluginPresenceService = project.getService(KtCompilerPluginsProvider::class.java) val pluginPresenceService = project.getService(KtCompilerPluginsProvider::class.java)
?: error("KtAssignResolutionPresenceService is not available as a service") ?: error("KtAssignResolutionPresenceService is not available as a service")
@@ -61,5 +61,5 @@ abstract class LLFirResolveSession {
} }
fun LLFirResolveSession.getModule(element: PsiElement): KtModule { fun LLFirResolveSession.getModule(element: PsiElement): KtModule {
return ProjectStructureProvider.getModule(element, useSiteKtModule) return ProjectStructureProvider.getModule(project, element, useSiteKtModule)
} }
@@ -66,7 +66,7 @@ fun errorWithFirSpecificEntries(
} }
if (psi != null) { if (psi != null) {
withPsiEntry("psi", psi, ProjectStructureProvider.getModule(psi, contextualModule = null)) withPsiEntry("psi", psi, ProjectStructureProvider.getModule(psi.project, psi, contextualModule = null))
} }
if (coneType != null) { if (coneType != null) {
@@ -102,7 +102,7 @@ abstract class AbstractFileStructureTest : AbstractLowLevelApiSingleFileTest() {
} }
private fun KtFile.getFileStructure(): FileStructure { private fun KtFile.getFileStructure(): FileStructure {
val module = ProjectStructureProvider.getModule(this, contextualModule = null) val module = ProjectStructureProvider.getModule(project, this, contextualModule = null)
val moduleFirResolveSession = module.getFirResolveSession(project) val moduleFirResolveSession = module.getFirResolveSession(project)
check(moduleFirResolveSession.isSourceSession) check(moduleFirResolveSession.isSourceSession)
val session = moduleFirResolveSession.getSessionFor(module) as LLFirResolvableModuleSession val session = moduleFirResolveSession.getSessionFor(module) as LLFirResolvableModuleSession
@@ -40,7 +40,7 @@ internal fun FirDeclaration.name(): String = symbol.name()
internal inline fun <R> resolveWithClearCaches(context: KtElement, action: (LLFirResolveSession) -> R): R { internal inline fun <R> resolveWithClearCaches(context: KtElement, action: (LLFirResolveSession) -> R): R {
val project = context.project val project = context.project
val module = ProjectStructureProvider.getModule(context, contextualModule = null) val module = ProjectStructureProvider.getModule(project, context, contextualModule = null)
val resolveSession = LLFirResolveSessionService.getInstance(project).getFirResolveSessionNoCaching(module) val resolveSession = LLFirResolveSessionService.getInstance(project).getFirResolveSessionNoCaching(module)
return action(resolveSession) return action(resolveSession)
} }
@@ -29,8 +29,8 @@ public abstract class ProjectStructureProvider {
return project.getService(ProjectStructureProvider::class.java) return project.getService(ProjectStructureProvider::class.java)
} }
public fun getModule(element: PsiElement, contextualModule: KtModule?): KtModule { public fun getModule(project: Project, element: PsiElement, contextualModule: KtModule?): KtModule {
return getInstance(element.project).getModule(element, contextualModule) return getInstance(project).getModule(element, contextualModule)
} }
} }
} }
@@ -94,7 +94,7 @@ class SymbolKotlinAsJavaSupport(project: Project) : KotlinAsJavaSupportBase<KtMo
.map { fqn.child(it) } .map { fqn.child(it) }
override fun createInstanceOfLightScript(script: KtScript): KtLightClass { override fun createInstanceOfLightScript(script: KtScript): KtLightClass {
val module = ProjectStructureProvider.getModule(script, contextualModule = null) val module = ProjectStructureProvider.getModule(project, script, contextualModule = null)
return SymbolLightClassForScript(script, module) return SymbolLightClassForScript(script, module)
} }