AA: cache PackagePartProvider per scope
This commit is contained in:
committed by
Ilya Kirillov
parent
2580a5c233
commit
e5b75dcd72
+23
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+3
-10
@@ -139,11 +139,7 @@ public class StandaloneAnalysisAPISessionBuilder(
|
|||||||
RegisterComponentService.registerLLFirResolveSessionService(this)
|
RegisterComponentService.registerLLFirResolveSessionService(this)
|
||||||
registerService(
|
registerService(
|
||||||
PackagePartProviderFactory::class.java,
|
PackagePartProviderFactory::class.java,
|
||||||
object : PackagePartProviderFactory() {
|
KotlinStaticPackagePartProviderFactory(packagePartProvider)
|
||||||
override fun createPackagePartProvider(scope: GlobalSearchScope): PackagePartProvider {
|
|
||||||
return packagePartProvider(scope)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
registerService(ClsJavaStubByVirtualFileCache::class.java, ClsJavaStubByVirtualFileCache())
|
registerService(ClsJavaStubByVirtualFileCache::class.java, ClsJavaStubByVirtualFileCache())
|
||||||
@@ -157,16 +153,13 @@ public class StandaloneAnalysisAPISessionBuilder(
|
|||||||
PsiElementFinder.EP.getPoint(project).registerExtension(PsiElementFinderImpl(project))
|
PsiElementFinder.EP.getPoint(project).registerExtension(PsiElementFinderImpl(project))
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun registerPsiDeclarationFromBinaryModuleProvider(
|
private fun registerPsiDeclarationFromBinaryModuleProvider() {
|
||||||
packagePartProvider: (GlobalSearchScope) -> PackagePartProvider,
|
|
||||||
) {
|
|
||||||
val ktModuleProviderImpl = projectStructureProvider as KtModuleProviderImpl
|
val ktModuleProviderImpl = projectStructureProvider as KtModuleProviderImpl
|
||||||
kotlinCoreProjectEnvironment.project.apply {
|
kotlinCoreProjectEnvironment.project.apply {
|
||||||
registerService(
|
registerService(
|
||||||
KotlinPsiDeclarationProviderFactory::class.java,
|
KotlinPsiDeclarationProviderFactory::class.java,
|
||||||
KotlinStaticPsiDeclarationProviderFactory(
|
KotlinStaticPsiDeclarationProviderFactory(
|
||||||
this,
|
this,
|
||||||
packagePartProvider,
|
|
||||||
ktModuleProviderImpl.binaryModules,
|
ktModuleProviderImpl.binaryModules,
|
||||||
kotlinCoreProjectEnvironment.environment.jarFileSystem as CoreJarFileSystem
|
kotlinCoreProjectEnvironment.environment.jarFileSystem as CoreJarFileSystem
|
||||||
)
|
)
|
||||||
@@ -212,7 +205,7 @@ public class StandaloneAnalysisAPISessionBuilder(
|
|||||||
createPackagePartProvider,
|
createPackagePartProvider,
|
||||||
)
|
)
|
||||||
if (withPsiDeclarationFromBinaryModuleProvider) {
|
if (withPsiDeclarationFromBinaryModuleProvider) {
|
||||||
registerPsiDeclarationFromBinaryModuleProvider(createPackagePartProvider)
|
registerPsiDeclarationFromBinaryModuleProvider()
|
||||||
}
|
}
|
||||||
|
|
||||||
return StandaloneAnalysisAPISession(
|
return StandaloneAnalysisAPISession(
|
||||||
|
|||||||
+1
-5
@@ -165,11 +165,7 @@ internal fun configureProjectEnvironment(
|
|||||||
)
|
)
|
||||||
project.picoContainer.registerComponentInstance(
|
project.picoContainer.registerComponentInstance(
|
||||||
PackagePartProviderFactory::class.qualifiedName,
|
PackagePartProviderFactory::class.qualifiedName,
|
||||||
object : PackagePartProviderFactory() {
|
KotlinStaticPackagePartProviderFactory(packagePartProvider)
|
||||||
override fun createPackagePartProvider(scope: GlobalSearchScope): PackagePartProvider {
|
|
||||||
return packagePartProvider(scope)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
-3
@@ -9,7 +9,6 @@ import com.intellij.mock.MockApplication
|
|||||||
import com.intellij.mock.MockProject
|
import com.intellij.mock.MockProject
|
||||||
import com.intellij.openapi.vfs.impl.jar.CoreJarFileSystem
|
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.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.decompiled.light.classes.ClsJavaStubByVirtualFileCache
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtBinaryModule
|
import org.jetbrains.kotlin.analysis.project.structure.KtBinaryModule
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
|
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
|
||||||
@@ -29,14 +28,12 @@ object StandaloneModeTestServiceRegistrar : AnalysisApiTestServiceRegistrar() {
|
|||||||
(projectStructureProvider as? KtStaticModuleProvider)?.projectStructure?.allKtModules()?.filterIsInstance<KtBinaryModule>()
|
(projectStructureProvider as? KtStaticModuleProvider)?.projectStructure?.allKtModules()?.filterIsInstance<KtBinaryModule>()
|
||||||
?: emptyList()
|
?: emptyList()
|
||||||
val projectEnvironment = testServices.environmentManager.getProjectEnvironment()
|
val projectEnvironment = testServices.environmentManager.getProjectEnvironment()
|
||||||
val binaryRoots = StandaloneProjectFactory.getAllBinaryRoots(binaryModules, projectEnvironment)
|
|
||||||
project.apply {
|
project.apply {
|
||||||
registerService(ClsJavaStubByVirtualFileCache::class.java, ClsJavaStubByVirtualFileCache())
|
registerService(ClsJavaStubByVirtualFileCache::class.java, ClsJavaStubByVirtualFileCache())
|
||||||
registerService(
|
registerService(
|
||||||
KotlinPsiDeclarationProviderFactory::class.java,
|
KotlinPsiDeclarationProviderFactory::class.java,
|
||||||
KotlinStaticPsiDeclarationProviderFactory(
|
KotlinStaticPsiDeclarationProviderFactory(
|
||||||
this,
|
this,
|
||||||
StandaloneProjectFactory.createPackagePartsProvider(project, binaryRoots),
|
|
||||||
binaryModules,
|
binaryModules,
|
||||||
projectEnvironment.environment.jarFileSystem as CoreJarFileSystem
|
projectEnvironment.environment.jarFileSystem as CoreJarFileSystem
|
||||||
)
|
)
|
||||||
|
|||||||
+2
-2
@@ -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.project.structure.KtBinaryModule
|
||||||
import org.jetbrains.kotlin.analysis.providers.KotlinPsiDeclarationProvider
|
import org.jetbrains.kotlin.analysis.providers.KotlinPsiDeclarationProvider
|
||||||
import org.jetbrains.kotlin.analysis.providers.KotlinPsiDeclarationProviderFactory
|
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.asJava.builder.ClsWrapperStubPsiFactory
|
||||||
import org.jetbrains.kotlin.load.kotlin.PackagePartProvider
|
import org.jetbrains.kotlin.load.kotlin.PackagePartProvider
|
||||||
import org.jetbrains.kotlin.name.CallableId
|
import org.jetbrains.kotlin.name.CallableId
|
||||||
@@ -111,7 +112,6 @@ private class KotlinStaticPsiDeclarationFromBinaryModuleProvider(
|
|||||||
// We need a session or facade that maintains such information
|
// We need a session or facade that maintains such information
|
||||||
class KotlinStaticPsiDeclarationProviderFactory(
|
class KotlinStaticPsiDeclarationProviderFactory(
|
||||||
private val project: Project,
|
private val project: Project,
|
||||||
private val createPackagePartProvider: (GlobalSearchScope) -> PackagePartProvider,
|
|
||||||
private val binaryModules: Collection<KtBinaryModule>,
|
private val binaryModules: Collection<KtBinaryModule>,
|
||||||
private val jarFileSystem: CoreJarFileSystem,
|
private val jarFileSystem: CoreJarFileSystem,
|
||||||
) : KotlinPsiDeclarationProviderFactory() {
|
) : KotlinPsiDeclarationProviderFactory() {
|
||||||
@@ -119,7 +119,7 @@ class KotlinStaticPsiDeclarationProviderFactory(
|
|||||||
return KotlinStaticPsiDeclarationFromBinaryModuleProvider(
|
return KotlinStaticPsiDeclarationFromBinaryModuleProvider(
|
||||||
project,
|
project,
|
||||||
searchScope,
|
searchScope,
|
||||||
createPackagePartProvider.invoke(searchScope),
|
project.createPackagePartProvider(searchScope),
|
||||||
binaryModules,
|
binaryModules,
|
||||||
jarFileSystem,
|
jarFileSystem,
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user