[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 {
val ktModule = ProjectStructureProvider.getModule(useSiteElement, contextualModule = null)
return KtFe10AnalysisHandlerExtension.getInstance(ktModule.project, ktModule)
val project = useSiteElement.project
val ktModule = ProjectStructureProvider.getModule(project, useSiteElement, contextualModule = null)
return KtFe10AnalysisHandlerExtension.getInstance(project, ktModule)
}
}
@@ -5,6 +5,7 @@
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.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.components.*
@@ -26,9 +27,9 @@ class KtFe10AnalysisSession(
val analysisContext: Fe10AnalysisContext,
override val useSiteModule: KtModule
) : KtAnalysisSession(analysisContext.token) {
constructor(contextElement: KtElement, token: KtLifetimeToken) : this(
Fe10AnalysisContext(Fe10AnalysisFacade.getInstance(contextElement.project), contextElement, token),
ProjectStructureProvider.getModule(contextElement, contextualModule = null)
constructor(project: Project, contextElement: KtElement, token: KtLifetimeToken) : this(
Fe10AnalysisContext(Fe10AnalysisFacade.getInstance(project), contextElement, token),
ProjectStructureProvider.getModule(project, contextElement, contextualModule = null)
)
@@ -70,6 +71,6 @@ class KtFe10AnalysisSession(
override fun createContextDependentCopy(originalKtFile: KtFile, elementToReanalyze: KtElement): KtAnalysisSession =
withValidityAssertion {
KtFe10AnalysisSession(elementToReanalyze, token)
KtFe10AnalysisSession(originalKtFile.project, elementToReanalyze, token)
}
}
@@ -18,7 +18,7 @@ import java.lang.UnsupportedOperationException
@OptIn(KtAnalysisApiInternals::class)
class KtFe10AnalysisSessionProvider(project: Project) : KtAnalysisSessionProvider(project) {
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 {
@@ -36,7 +36,7 @@ class KtFirAnalysisSessionProvider(project: Project) : KtAnalysisSessionProvider
}
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)
}
@@ -32,8 +32,9 @@ abstract class AbstractSymbolRestoreFromDifferentModuleTest : AbstractAnalysisAp
caretTag = "restoreAt"
).single().first
val declarationModule = ProjectStructureProvider.getModule(declaration, contextualModule = null)
val restoreAtModule = ProjectStructureProvider.getModule(restoreAt, contextualModule = null)
val project = declaration.project
val declarationModule = ProjectStructureProvider.getModule(project, declaration, contextualModule = null)
val restoreAtModule = ProjectStructureProvider.getModule(project, restoreAt, contextualModule = null)
val (debugRendered, prettyRendered, pointer) = analyseForTest(declaration) {
val symbol = declaration.getSymbol()
@@ -182,5 +182,5 @@ public abstract class KtAnalysisSession(final override val token: KtLifetimeToke
}
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?
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 pluginPresenceService = project.getService(KtCompilerPluginsProvider::class.java)
?: error("KtAssignResolutionPresenceService is not available as a service")
@@ -61,5 +61,5 @@ abstract class LLFirResolveSession {
}
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) {
withPsiEntry("psi", psi, ProjectStructureProvider.getModule(psi, contextualModule = null))
withPsiEntry("psi", psi, ProjectStructureProvider.getModule(psi.project, psi, contextualModule = null))
}
if (coneType != null) {
@@ -102,7 +102,7 @@ abstract class AbstractFileStructureTest : AbstractLowLevelApiSingleFileTest() {
}
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)
check(moduleFirResolveSession.isSourceSession)
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 {
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)
return action(resolveSession)
}
@@ -29,8 +29,8 @@ public abstract class ProjectStructureProvider {
return project.getService(ProjectStructureProvider::class.java)
}
public fun getModule(element: PsiElement, contextualModule: KtModule?): KtModule {
return getInstance(element.project).getModule(element, contextualModule)
public fun getModule(project: Project, element: PsiElement, contextualModule: KtModule?): KtModule {
return getInstance(project).getModule(element, contextualModule)
}
}
}
@@ -94,7 +94,7 @@ class SymbolKotlinAsJavaSupport(project: Project) : KotlinAsJavaSupportBase<KtMo
.map { fqn.child(it) }
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)
}