Introduce KtReferenceSearch to use LocalSearchScope, when possible

This fixes a set of problems in J2K tests in 183
#KT-28368 Fixed
This commit is contained in:
Mikhail Glukhikh
2018-11-16 18:23:13 +03:00
parent ef08110354
commit 3e936f64bf
4 changed files with 23 additions and 10 deletions
@@ -21,13 +21,18 @@ import com.intellij.find.findUsages.FindUsagesOptions
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiReference import com.intellij.psi.PsiReference
import com.intellij.psi.impl.light.LightMemberReference import com.intellij.psi.impl.light.LightMemberReference
import com.intellij.psi.search.LocalSearchScope
import com.intellij.psi.search.SearchScope
import com.intellij.psi.search.searches.ReferencesSearch
import com.intellij.usageView.UsageInfo import com.intellij.usageView.UsageInfo
import com.intellij.usages.UsageViewManager import com.intellij.usages.UsageViewManager
import com.intellij.util.Query
import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.asJava.toLightElements import org.jetbrains.kotlin.asJava.toLightElements
import org.jetbrains.kotlin.idea.references.KtReference import org.jetbrains.kotlin.idea.references.KtReference
import org.jetbrains.kotlin.psi.KtConstructor import org.jetbrains.kotlin.psi.KtConstructor
import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtPsiUtil
import org.jetbrains.kotlin.utils.SmartList import org.jetbrains.kotlin.utils.SmartList
fun PsiElement.processAllExactUsages( fun PsiElement.processAllExactUsages(
@@ -75,3 +80,14 @@ fun KtDeclaration.processAllUsages(
options options
) )
} }
object ReferencesSearchScopeHelper {
fun search(declaration: KtDeclaration, defaultScope: SearchScope? = null): Query<PsiReference> {
val enclosingElement = KtPsiUtil.getEnclosingElementForLocalDeclaration(declaration)
return when {
enclosingElement != null -> ReferencesSearch.search(declaration, LocalSearchScope(enclosingElement))
defaultScope != null -> ReferencesSearch.search(declaration, defaultScope)
else -> ReferencesSearch.search(declaration)
}
}
}
@@ -20,7 +20,6 @@ import com.intellij.openapi.editor.Editor
import com.intellij.openapi.util.TextRange import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiReference import com.intellij.psi.PsiReference
import com.intellij.psi.search.searches.ReferencesSearch
import com.intellij.util.Processor import com.intellij.util.Processor
import com.intellij.util.Query import com.intellij.util.Query
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
@@ -32,6 +31,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
import org.jetbrains.kotlin.idea.core.KotlinNameSuggester import org.jetbrains.kotlin.idea.core.KotlinNameSuggester
import org.jetbrains.kotlin.idea.core.NewDeclarationNameValidator import org.jetbrains.kotlin.idea.core.NewDeclarationNameValidator
import org.jetbrains.kotlin.idea.core.isVisible import org.jetbrains.kotlin.idea.core.isVisible
import org.jetbrains.kotlin.idea.findUsages.ReferencesSearchScopeHelper
import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection
import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.project.languageVersionSettings
import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.incremental.components.NoLookupLocation
@@ -204,7 +204,7 @@ class DestructureIntention : SelfTargetingRangeIntention<KtDeclaration>(
Name.identifier(it), NoLookupLocation.FROM_BUILTINS).single()) Name.identifier(it), NoLookupLocation.FROM_BUILTINS).single())
} }
ReferencesSearch.search(declaration).iterateOverMapEntryPropertiesUsages( ReferencesSearchScopeHelper.search(declaration).iterateOverMapEntryPropertiesUsages(
context, context,
{ index, usageData -> noBadUsages = usagesToRemove[index].add(usageData, index) && noBadUsages }, { index, usageData -> noBadUsages = usagesToRemove[index].add(usageData, index) && noBadUsages },
{ noBadUsages = false } { noBadUsages = false }
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.idea.refactoring.inline
import com.intellij.lang.findUsages.DescriptiveNameUtil import com.intellij.lang.findUsages.DescriptiveNameUtil
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.search.searches.ReferencesSearch
import com.intellij.refactoring.BaseRefactoringProcessor import com.intellij.refactoring.BaseRefactoringProcessor
import com.intellij.refactoring.RefactoringBundle import com.intellij.refactoring.RefactoringBundle
import com.intellij.refactoring.util.CommonRefactoringUtil import com.intellij.refactoring.util.CommonRefactoringUtil
@@ -28,6 +27,7 @@ import com.intellij.usageView.UsageViewBundle
import com.intellij.usageView.UsageViewDescriptor import com.intellij.usageView.UsageViewDescriptor
import org.jetbrains.kotlin.idea.codeInliner.UsageReplacementStrategy import org.jetbrains.kotlin.idea.codeInliner.UsageReplacementStrategy
import org.jetbrains.kotlin.idea.codeInliner.replaceUsages import org.jetbrains.kotlin.idea.codeInliner.replaceUsages
import org.jetbrains.kotlin.idea.findUsages.ReferencesSearchScopeHelper
import org.jetbrains.kotlin.idea.refactoring.pullUp.deleteWithCompanion import org.jetbrains.kotlin.idea.refactoring.pullUp.deleteWithCompanion
import org.jetbrains.kotlin.idea.references.KtSimpleNameReference import org.jetbrains.kotlin.idea.references.KtSimpleNameReference
import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.idea.util.application.runReadAction
@@ -55,7 +55,7 @@ class KotlinInlineCallableProcessor(
if (inlineThisOnly && reference != null) return arrayOf(UsageInfo(reference)) if (inlineThisOnly && reference != null) return arrayOf(UsageInfo(reference))
val usages = runReadAction { val usages = runReadAction {
val searchScope = GlobalSearchScope.projectScope(myProject) val searchScope = GlobalSearchScope.projectScope(myProject)
ReferencesSearch.search(declaration, searchScope) ReferencesSearchScopeHelper.search(declaration, searchScope)
} }
return usages.map(::UsageInfo).toTypedArray() return usages.map(::UsageInfo).toTypedArray()
} }
@@ -23,7 +23,6 @@ import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.wm.WindowManager import com.intellij.openapi.wm.WindowManager
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.search.searches.ReferencesSearch
import com.intellij.refactoring.HelpID import com.intellij.refactoring.HelpID
import com.intellij.refactoring.RefactoringBundle import com.intellij.refactoring.RefactoringBundle
import com.intellij.refactoring.util.CommonRefactoringUtil import com.intellij.refactoring.util.CommonRefactoringUtil
@@ -33,15 +32,13 @@ import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.idea.caches.resolve.unsafeResolveToDescriptor import org.jetbrains.kotlin.idea.caches.resolve.unsafeResolveToDescriptor
import org.jetbrains.kotlin.idea.codeInliner.CodeToInline import org.jetbrains.kotlin.idea.codeInliner.CodeToInline
import org.jetbrains.kotlin.idea.codeInliner.PropertyUsageReplacementStrategy import org.jetbrains.kotlin.idea.codeInliner.PropertyUsageReplacementStrategy
import org.jetbrains.kotlin.idea.findUsages.ReferencesSearchScopeHelper
import org.jetbrains.kotlin.idea.project.builtIns import org.jetbrains.kotlin.idea.project.builtIns
import org.jetbrains.kotlin.idea.refactoring.checkConflictsInteractively import org.jetbrains.kotlin.idea.refactoring.checkConflictsInteractively
import org.jetbrains.kotlin.idea.references.ReferenceAccess import org.jetbrains.kotlin.idea.references.ReferenceAccess
import org.jetbrains.kotlin.idea.references.readWriteAccess import org.jetbrains.kotlin.idea.references.readWriteAccess
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.psi.psiUtil.getAssignmentByLHS import org.jetbrains.kotlin.psi.psiUtil.getAssignmentByLHS
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelectorOrThis import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelectorOrThis
@@ -118,7 +115,7 @@ class KotlinInlineValHandler(private val withPrompt: Boolean) : InlineActionHand
private data class Usages(val referenceExpressions: Collection<KtExpression>, val conflicts: MultiMap<PsiElement, String>) private data class Usages(val referenceExpressions: Collection<KtExpression>, val conflicts: MultiMap<PsiElement, String>)
private fun findUsages(declaration: KtProperty): Usages { private fun findUsages(declaration: KtProperty): Usages {
val references = ReferencesSearch.search(declaration) val references = ReferencesSearchScopeHelper.search(declaration)
val referenceExpressions = mutableListOf<KtExpression>() val referenceExpressions = mutableListOf<KtExpression>()
val conflictUsages = MultiMap.create<PsiElement, String>() val conflictUsages = MultiMap.create<PsiElement, String>()
for (ref in references) { for (ref in references) {