AA: cache PackagePartProvider per scope

This commit is contained in:
Jinseong Jeon
2022-09-12 14:27:38 -07:00
committed by Ilya Kirillov
parent 2580a5c233
commit e5b75dcd72
5 changed files with 29 additions and 20 deletions
@@ -0,0 +1,23 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.analysis.api.standalone
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.util.containers.ContainerUtil
import org.jetbrains.kotlin.analysis.providers.PackagePartProviderFactory
import org.jetbrains.kotlin.load.kotlin.PackagePartProvider
internal class KotlinStaticPackagePartProviderFactory(
private val packagePartProvider: (GlobalSearchScope) -> PackagePartProvider,
) : PackagePartProviderFactory() {
private val cache = ContainerUtil.createConcurrentSoftMap<GlobalSearchScope, PackagePartProvider>()
override fun createPackagePartProvider(scope: GlobalSearchScope): PackagePartProvider {
return cache.getOrPut(scope) {
packagePartProvider(scope)
}
}
}
@@ -139,11 +139,7 @@ public class StandaloneAnalysisAPISessionBuilder(
RegisterComponentService.registerLLFirResolveSessionService(this)
registerService(
PackagePartProviderFactory::class.java,
object : PackagePartProviderFactory() {
override fun createPackagePartProvider(scope: GlobalSearchScope): PackagePartProvider {
return packagePartProvider(scope)
}
}
KotlinStaticPackagePartProviderFactory(packagePartProvider)
)
registerService(ClsJavaStubByVirtualFileCache::class.java, ClsJavaStubByVirtualFileCache())
@@ -157,16 +153,13 @@ public class StandaloneAnalysisAPISessionBuilder(
PsiElementFinder.EP.getPoint(project).registerExtension(PsiElementFinderImpl(project))
}
private fun registerPsiDeclarationFromBinaryModuleProvider(
packagePartProvider: (GlobalSearchScope) -> PackagePartProvider,
) {
private fun registerPsiDeclarationFromBinaryModuleProvider() {
val ktModuleProviderImpl = projectStructureProvider as KtModuleProviderImpl
kotlinCoreProjectEnvironment.project.apply {
registerService(
KotlinPsiDeclarationProviderFactory::class.java,
KotlinStaticPsiDeclarationProviderFactory(
this,
packagePartProvider,
ktModuleProviderImpl.binaryModules,
kotlinCoreProjectEnvironment.environment.jarFileSystem as CoreJarFileSystem
)
@@ -212,7 +205,7 @@ public class StandaloneAnalysisAPISessionBuilder(
createPackagePartProvider,
)
if (withPsiDeclarationFromBinaryModuleProvider) {
registerPsiDeclarationFromBinaryModuleProvider(createPackagePartProvider)
registerPsiDeclarationFromBinaryModuleProvider()
}
return StandaloneAnalysisAPISession(
@@ -165,11 +165,7 @@ internal fun configureProjectEnvironment(
)
project.picoContainer.registerComponentInstance(
PackagePartProviderFactory::class.qualifiedName,
object : PackagePartProviderFactory() {
override fun createPackagePartProvider(scope: GlobalSearchScope): PackagePartProvider {
return packagePartProvider(scope)
}
}
KotlinStaticPackagePartProviderFactory(packagePartProvider)
)
}
@@ -9,7 +9,6 @@ import com.intellij.mock.MockApplication
import com.intellij.mock.MockProject
import com.intellij.openapi.vfs.impl.jar.CoreJarFileSystem
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtStaticModuleProvider
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.StandaloneProjectFactory
import org.jetbrains.kotlin.analysis.decompiled.light.classes.ClsJavaStubByVirtualFileCache
import org.jetbrains.kotlin.analysis.project.structure.KtBinaryModule
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
@@ -29,14 +28,12 @@ object StandaloneModeTestServiceRegistrar : AnalysisApiTestServiceRegistrar() {
(projectStructureProvider as? KtStaticModuleProvider)?.projectStructure?.allKtModules()?.filterIsInstance<KtBinaryModule>()
?: emptyList()
val projectEnvironment = testServices.environmentManager.getProjectEnvironment()
val binaryRoots = StandaloneProjectFactory.getAllBinaryRoots(binaryModules, projectEnvironment)
project.apply {
registerService(ClsJavaStubByVirtualFileCache::class.java, ClsJavaStubByVirtualFileCache())
registerService(
KotlinPsiDeclarationProviderFactory::class.java,
KotlinStaticPsiDeclarationProviderFactory(
this,
StandaloneProjectFactory.createPackagePartsProvider(project, binaryRoots),
binaryModules,
projectEnvironment.environment.jarFileSystem as CoreJarFileSystem
)
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.analysis.decompiled.light.classes.ClsJavaStubByVirtu
import org.jetbrains.kotlin.analysis.project.structure.KtBinaryModule
import org.jetbrains.kotlin.analysis.providers.KotlinPsiDeclarationProvider
import org.jetbrains.kotlin.analysis.providers.KotlinPsiDeclarationProviderFactory
import org.jetbrains.kotlin.analysis.providers.createPackagePartProvider
import org.jetbrains.kotlin.asJava.builder.ClsWrapperStubPsiFactory
import org.jetbrains.kotlin.load.kotlin.PackagePartProvider
import org.jetbrains.kotlin.name.CallableId
@@ -111,7 +112,6 @@ private class KotlinStaticPsiDeclarationFromBinaryModuleProvider(
// We need a session or facade that maintains such information
class KotlinStaticPsiDeclarationProviderFactory(
private val project: Project,
private val createPackagePartProvider: (GlobalSearchScope) -> PackagePartProvider,
private val binaryModules: Collection<KtBinaryModule>,
private val jarFileSystem: CoreJarFileSystem,
) : KotlinPsiDeclarationProviderFactory() {
@@ -119,7 +119,7 @@ class KotlinStaticPsiDeclarationProviderFactory(
return KotlinStaticPsiDeclarationFromBinaryModuleProvider(
project,
searchScope,
createPackagePartProvider.invoke(searchScope),
project.createPackagePartProvider(searchScope),
binaryModules,
jarFileSystem,
)