From 0c3c8b64ce8626e4df2724183daa48b77e58d26f Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Tue, 21 Apr 2020 22:52:13 +0300 Subject: [PATCH] Optimization for faster search of references to top-level members --- .../KotlinReferenceScopeOptimizer.kt | 49 +++++++++++++++++++ .../KotlinReferenceScopeOptimizer.kt.201 | 49 +++++++++++++++++++ idea/resources/META-INF/plugin-common.xml | 1 + 3 files changed, 99 insertions(+) create mode 100644 idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferenceScopeOptimizer.kt create mode 100644 idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferenceScopeOptimizer.kt.201 diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferenceScopeOptimizer.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferenceScopeOptimizer.kt new file mode 100644 index 00000000000..4a72c824f0a --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferenceScopeOptimizer.kt @@ -0,0 +1,49 @@ +/* + * Copyright 2010-2020 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.idea.search.ideaExtensions + +import com.intellij.ide.highlighter.JavaFileType +import com.intellij.psi.PsiElement +import com.intellij.psi.impl.cache.CacheManager +import com.intellij.psi.search.GlobalSearchScope +import com.intellij.psi.search.ScopeOptimizer +import com.intellij.psi.search.SearchScope +import com.intellij.psi.search.UsageSearchContext +import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName +import org.jetbrains.kotlin.idea.KotlinFileType +import org.jetbrains.kotlin.idea.search.excludeFileTypes +import org.jetbrains.kotlin.psi.KtCallableDeclaration +import org.jetbrains.kotlin.psi.KtFile + +class KotlinReferenceScopeOptimizer : ScopeOptimizer { + override fun getRestrictedUseScope(element: PsiElement): SearchScope? { + if (element is KtCallableDeclaration && element.parent is KtFile) { + return getRestrictedScopeForTopLevelCallable(element) + } + return null + } + + private fun getRestrictedScopeForTopLevelCallable(callable: KtCallableDeclaration): GlobalSearchScope? { + val useScope = callable.useScope as? GlobalSearchScope ?: return null + val file = callable.parent as KtFile + val packageName = file.packageFqName.takeUnless { it.isRoot } ?: return null + val project = file.project + val cacheManager = CacheManager.SERVICE.getInstance(project) + + val kotlinScope = GlobalSearchScope.getScopeRestrictedByFileTypes(useScope, KotlinFileType.INSTANCE) + val javaScope = GlobalSearchScope.getScopeRestrictedByFileTypes(useScope, JavaFileType.INSTANCE) + val restScope = useScope.excludeFileTypes(KotlinFileType.INSTANCE, JavaFileType.INSTANCE) as GlobalSearchScope + + //TODO: use all components of package name? + val shortPackageName = packageName.shortName().identifier + val kotlinFiles = cacheManager.getVirtualFilesWithWord(shortPackageName, UsageSearchContext.IN_CODE, kotlinScope, true) + + val javaFacadeName = file.javaFileFacadeFqName.shortName().identifier + val javaFiles = cacheManager.getVirtualFilesWithWord(javaFacadeName, UsageSearchContext.IN_CODE, javaScope, true) + + return GlobalSearchScope.filesScope(project, (kotlinFiles + javaFiles).asList()).uniteWith(restScope) + } +} \ No newline at end of file diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferenceScopeOptimizer.kt.201 b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferenceScopeOptimizer.kt.201 new file mode 100644 index 00000000000..65c73521073 --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferenceScopeOptimizer.kt.201 @@ -0,0 +1,49 @@ +/* + * Copyright 2010-2020 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.idea.search.ideaExtensions + +import com.intellij.ide.highlighter.JavaFileType +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.psi.PsiElement +import com.intellij.psi.search.* +import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName +import org.jetbrains.kotlin.idea.KotlinFileType +import org.jetbrains.kotlin.idea.search.excludeFileTypes +import org.jetbrains.kotlin.psi.KtCallableDeclaration +import org.jetbrains.kotlin.psi.KtFile + +class KotlinReferenceScopeOptimizer : ScopeOptimizer { + override fun getRestrictedUseScope(element: PsiElement): SearchScope? { + if (element is KtCallableDeclaration && element.parent is KtFile) { + return getRestrictedScopeForTopLevelCallable(element) + } + return null + } + + private fun getRestrictedScopeForTopLevelCallable(callable: KtCallableDeclaration): GlobalSearchScope? { + val useScope = callable.useScope as? GlobalSearchScope ?: return null + val file = callable.parent as KtFile + val packageName = file.packageFqName.takeUnless { it.isRoot } ?: return null + val project = file.project + val searchHelper = PsiSearchHelper.getInstance(project) + + val kotlinScope = GlobalSearchScope.getScopeRestrictedByFileTypes(useScope, KotlinFileType.INSTANCE) + val javaScope = GlobalSearchScope.getScopeRestrictedByFileTypes(useScope, JavaFileType.INSTANCE) + val restScope = useScope.excludeFileTypes(KotlinFileType.INSTANCE, JavaFileType.INSTANCE) as GlobalSearchScope + + val kotlinFiles = mutableListOf() + searchHelper.processCandidateFilesForText(kotlinScope, UsageSearchContext.IN_CODE, true, packageName.asString()) { + kotlinFiles.add(it) + } + + val javaFiles = mutableListOf() + searchHelper.processCandidateFilesForText(javaScope, UsageSearchContext.IN_CODE, true, file.javaFileFacadeFqName.asString()) { + javaFiles.add(it) + } + + return GlobalSearchScope.filesScope(project, kotlinFiles + javaFiles).uniteWith(restScope) + } +} \ No newline at end of file diff --git a/idea/resources/META-INF/plugin-common.xml b/idea/resources/META-INF/plugin-common.xml index 4879ad886c2..edca335fe9a 100644 --- a/idea/resources/META-INF/plugin-common.xml +++ b/idea/resources/META-INF/plugin-common.xml @@ -704,6 +704,7 @@ +