From e5b75dcd72a066429b2032a09f9a5bccbbec5b84 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Mon, 12 Sep 2022 14:27:38 -0700 Subject: [PATCH] AA: cache PackagePartProvider per scope --- .../KotlinStaticPackagePartProviderFactory.kt | 23 +++++++++++++++++++ .../StandaloneAnalysisAPISessionBuilder.kt | 13 +++-------- .../api/standalone/StandaloneUtils.kt | 6 +---- .../StandaloneModeTestServiceRegistrar.kt | 3 --- ...cPsiDeclarationFromBinaryModuleProvider.kt | 4 ++-- 5 files changed, 29 insertions(+), 20 deletions(-) create mode 100644 analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/KotlinStaticPackagePartProviderFactory.kt diff --git a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/KotlinStaticPackagePartProviderFactory.kt b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/KotlinStaticPackagePartProviderFactory.kt new file mode 100644 index 00000000000..bbf3fd4a02b --- /dev/null +++ b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/KotlinStaticPackagePartProviderFactory.kt @@ -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() + + override fun createPackagePartProvider(scope: GlobalSearchScope): PackagePartProvider { + return cache.getOrPut(scope) { + packagePartProvider(scope) + } + } +} \ No newline at end of file diff --git a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneAnalysisAPISessionBuilder.kt b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneAnalysisAPISessionBuilder.kt index f63ad29d1e2..79064a2cd1f 100644 --- a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneAnalysisAPISessionBuilder.kt +++ b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneAnalysisAPISessionBuilder.kt @@ -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( diff --git a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneUtils.kt b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneUtils.kt index 53e1d224165..87589e9d27a 100644 --- a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneUtils.kt +++ b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneUtils.kt @@ -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) ) } diff --git a/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/StandaloneModeTestServiceRegistrar.kt b/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/StandaloneModeTestServiceRegistrar.kt index 191f838e4e3..67a65340f50 100644 --- a/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/StandaloneModeTestServiceRegistrar.kt +++ b/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/StandaloneModeTestServiceRegistrar.kt @@ -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() ?: 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 ) diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticPsiDeclarationFromBinaryModuleProvider.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticPsiDeclarationFromBinaryModuleProvider.kt index 6d24e1e3c20..446245c586f 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticPsiDeclarationFromBinaryModuleProvider.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticPsiDeclarationFromBinaryModuleProvider.kt @@ -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, private val jarFileSystem: CoreJarFileSystem, ) : KotlinPsiDeclarationProviderFactory() { @@ -119,7 +119,7 @@ class KotlinStaticPsiDeclarationProviderFactory( return KotlinStaticPsiDeclarationFromBinaryModuleProvider( project, searchScope, - createPackagePartProvider.invoke(searchScope), + project.createPackagePartProvider(searchScope), binaryModules, jarFileSystem, )