201: Processors changed for UsageInfo and SliceUsage

This commit is contained in:
Nikolay Krasko
2020-01-29 17:23:30 +03:00
parent e23f3b54c6
commit 9f6f8088e3
9 changed files with 52 additions and 31 deletions
@@ -24,8 +24,6 @@ import com.intellij.openapi.actionSystem.DataContext
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiMethod import com.intellij.psi.PsiMethod
import com.intellij.psi.PsiParameter import com.intellij.psi.PsiParameter
import com.intellij.usageView.UsageInfo
import com.intellij.util.Processor
import org.jetbrains.kotlin.idea.findUsages.KotlinCallableFindUsagesOptions import org.jetbrains.kotlin.idea.findUsages.KotlinCallableFindUsagesOptions
import org.jetbrains.kotlin.idea.findUsages.KotlinFindUsagesHandlerFactory import org.jetbrains.kotlin.idea.findUsages.KotlinFindUsagesHandlerFactory
import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.idea.util.application.runReadAction
@@ -75,7 +73,7 @@ class DelegatingFindMemberUsagesHandler(
return kotlinHandler.getFindUsagesOptions(dataContext) return kotlinHandler.getFindUsagesOptions(dataContext)
} }
override fun processElementUsages(element: PsiElement, processor: Processor<UsageInfo>, options: FindUsagesOptions): Boolean { override fun processElementUsages(element: PsiElement, processor: UsageInfoProcessor, options: FindUsagesOptions): Boolean {
val (handler, handlerOptions) = runReadAction { getHandlerAndOptions(element, options) } ?: return true val (handler, handlerOptions) = runReadAction { getHandlerAndOptions(element, options) } ?: return true
return handler.processElementUsages(element, processor, handlerOptions!!) return handler.processElementUsages(element, processor, handlerOptions!!)
} }
@@ -26,7 +26,6 @@ import com.intellij.psi.search.PsiElementProcessor
import com.intellij.psi.search.PsiElementProcessorAdapter import com.intellij.psi.search.PsiElementProcessorAdapter
import com.intellij.psi.search.searches.MethodReferencesSearch import com.intellij.psi.search.searches.MethodReferencesSearch
import com.intellij.psi.search.searches.ReferencesSearch import com.intellij.psi.search.searches.ReferencesSearch
import com.intellij.usageView.UsageInfo
import com.intellij.util.FilteredQuery import com.intellij.util.FilteredQuery
import com.intellij.util.Processor import com.intellij.util.Processor
import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.asJava.elements.KtLightMethod
@@ -71,12 +70,12 @@ class KotlinFindClassUsagesHandler(
) )
} }
override fun createSearcher(element: PsiElement, processor: Processor<UsageInfo>, options: FindUsagesOptions): Searcher { override fun createSearcher(element: PsiElement, processor: UsageInfoProcessor, options: FindUsagesOptions): Searcher {
return MySearcher(element, processor, options) return MySearcher(element, processor, options)
} }
private class MySearcher( private class MySearcher(
element: PsiElement, processor: Processor<UsageInfo>, options: FindUsagesOptions element: PsiElement, processor: UsageInfoProcessor, options: FindUsagesOptions
) : Searcher(element, processor, options) { ) : Searcher(element, processor, options) {
private val kotlinOptions = options as KotlinClassFindUsagesOptions private val kotlinOptions = options as KotlinClassFindUsagesOptions
@@ -30,6 +30,7 @@ import com.intellij.openapi.progress.ProgressManager
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.MessageType import com.intellij.openapi.ui.MessageType
import com.intellij.openapi.util.Disposer import com.intellij.openapi.util.Disposer
import com.intellij.openapi.util.Key
import com.intellij.openapi.wm.ToolWindowId import com.intellij.openapi.wm.ToolWindowId
import com.intellij.openapi.wm.ToolWindowManager import com.intellij.openapi.wm.ToolWindowManager
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
@@ -37,7 +38,6 @@ import com.intellij.psi.PsiReference
import com.intellij.psi.search.SearchScope import com.intellij.psi.search.SearchScope
import com.intellij.psi.search.searches.MethodReferencesSearch import com.intellij.psi.search.searches.MethodReferencesSearch
import com.intellij.psi.search.searches.ReferencesSearch import com.intellij.psi.search.searches.ReferencesSearch
import com.intellij.usageView.UsageInfo
import com.intellij.util.* import com.intellij.util.*
import org.jetbrains.annotations.TestOnly import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.asJava.toLightMethods import org.jetbrains.kotlin.asJava.toLightMethods
@@ -67,7 +67,6 @@ import org.jetbrains.kotlin.resolve.findOriginalTopMostOverriddenDescriptors
import org.jetbrains.kotlin.resolve.source.getPsi import org.jetbrains.kotlin.resolve.source.getPsi
import javax.swing.event.HyperlinkEvent import javax.swing.event.HyperlinkEvent
import javax.swing.event.HyperlinkListener import javax.swing.event.HyperlinkListener
import com.intellij.openapi.util.Key
abstract class KotlinFindMemberUsagesHandler<T : KtNamedDeclaration> protected constructor( abstract class KotlinFindMemberUsagesHandler<T : KtNamedDeclaration> protected constructor(
declaration: T, declaration: T,
@@ -120,7 +119,7 @@ abstract class KotlinFindMemberUsagesHandler<T : KtNamedDeclaration> protected c
factory: KotlinFindUsagesHandlerFactory factory: KotlinFindUsagesHandlerFactory
) : KotlinFindMemberUsagesHandler<KtNamedDeclaration>(propertyDeclaration, elementsToSearch, factory) { ) : KotlinFindMemberUsagesHandler<KtNamedDeclaration>(propertyDeclaration, elementsToSearch, factory) {
override fun processElementUsages(element: PsiElement, processor: Processor<UsageInfo>, options: FindUsagesOptions): Boolean { override fun processElementUsages(element: PsiElement, processor: UsageInfoProcessor, options: FindUsagesOptions): Boolean {
if (ApplicationManager.getApplication().isUnitTestMode || if (ApplicationManager.getApplication().isUnitTestMode ||
!isPropertyOfDataClass || !isPropertyOfDataClass ||
@@ -218,12 +217,12 @@ abstract class KotlinFindMemberUsagesHandler<T : KtNamedDeclaration> protected c
} }
} }
override fun createSearcher(element: PsiElement, processor: Processor<UsageInfo>, options: FindUsagesOptions): Searcher { override fun createSearcher(element: PsiElement, processor: UsageInfoProcessor, options: FindUsagesOptions): Searcher {
return MySearcher(element, processor, options) return MySearcher(element, processor, options)
} }
private inner class MySearcher( private inner class MySearcher(
element: PsiElement, processor: Processor<UsageInfo>, options: FindUsagesOptions element: PsiElement, processor: UsageInfoProcessor, options: FindUsagesOptions
) : Searcher(element, processor, options) { ) : Searcher(element, processor, options) {
private val kotlinOptions = options as KotlinCallableFindUsagesOptions private val kotlinOptions = options as KotlinCallableFindUsagesOptions
@@ -54,7 +54,7 @@ abstract class KotlinFindUsagesHandler<T : PsiElement>(
elementsToSearch.toTypedArray() elementsToSearch.toTypedArray()
} }
private fun searchTextOccurrences(element: PsiElement, processor: Processor<UsageInfo>, options: FindUsagesOptions): Boolean { private fun searchTextOccurrences(element: PsiElement, processor: UsageInfoProcessor, options: FindUsagesOptions): Boolean {
if (!options.isSearchForTextOccurrences) return false if (!options.isSearchForTextOccurrences) return false
val scope = options.searchScope val scope = options.searchScope
@@ -70,13 +70,13 @@ abstract class KotlinFindUsagesHandler<T : PsiElement>(
return true return true
} }
override fun processElementUsages(element: PsiElement, processor: Processor<UsageInfo>, options: FindUsagesOptions): Boolean { override fun processElementUsages(element: PsiElement, processor: UsageInfoProcessor, options: FindUsagesOptions): Boolean {
return searchReferences(element, processor, options, forHighlight = false) && searchTextOccurrences(element, processor, options) return searchReferences(element, processor, options, forHighlight = false) && searchTextOccurrences(element, processor, options)
} }
private fun searchReferences( private fun searchReferences(
element: PsiElement, element: PsiElement,
processor: Processor<UsageInfo>, processor: UsageInfoProcessor,
options: FindUsagesOptions, options: FindUsagesOptions,
forHighlight: Boolean forHighlight: Boolean
): Boolean { ): Boolean {
@@ -85,7 +85,7 @@ abstract class KotlinFindUsagesHandler<T : PsiElement>(
return searcher.executeTasks() return searcher.executeTasks()
} }
protected abstract fun createSearcher(element: PsiElement, processor: Processor<UsageInfo>, options: FindUsagesOptions): Searcher protected abstract fun createSearcher(element: PsiElement, processor: UsageInfoProcessor, options: FindUsagesOptions): Searcher
override fun findReferencesToHighlight(target: PsiElement, searchScope: SearchScope): Collection<PsiReference> { override fun findReferencesToHighlight(target: PsiElement, searchScope: SearchScope): Collection<PsiReference> {
val results = Collections.synchronizedList(arrayListOf<PsiReference>()) val results = Collections.synchronizedList(arrayListOf<PsiReference>())
@@ -101,7 +101,7 @@ abstract class KotlinFindUsagesHandler<T : PsiElement>(
return results return results
} }
protected abstract class Searcher(val element: PsiElement, val processor: Processor<UsageInfo>, val options: FindUsagesOptions) { protected abstract class Searcher(val element: PsiElement, val processor: UsageInfoProcessor, val options: FindUsagesOptions) {
private val tasks = ArrayList<() -> Boolean>() private val tasks = ArrayList<() -> Boolean>()
/** /**
@@ -127,7 +127,7 @@ abstract class KotlinFindUsagesHandler<T : PsiElement>(
companion object { companion object {
val LOG = Logger.getInstance(KotlinFindUsagesHandler::class.java) val LOG = Logger.getInstance(KotlinFindUsagesHandler::class.java)
internal fun processUsage(processor: Processor<UsageInfo>, ref: PsiReference): Boolean = internal fun processUsage(processor: UsageInfoProcessor, ref: PsiReference): Boolean =
processor.processIfNotNull { processor.processIfNotNull {
when { when {
ref is LightMemberReference -> KotlinReferencePreservingUsageInfo(ref) ref is LightMemberReference -> KotlinReferencePreservingUsageInfo(ref)
@@ -136,15 +136,15 @@ abstract class KotlinFindUsagesHandler<T : PsiElement>(
} }
} }
internal fun processUsage(processor: Processor<UsageInfo>, element: PsiElement): Boolean = internal fun processUsage(processor: UsageInfoProcessor, element: PsiElement): Boolean =
processor.processIfNotNull { if (element.isValid) UsageInfo(element) else null } processor.processIfNotNull { if (element.isValid) UsageInfo(element) else null }
private fun Processor<UsageInfo>.processIfNotNull(callback: () -> UsageInfo?): Boolean { private fun UsageInfoProcessor.processIfNotNull(callback: () -> UsageInfo?): Boolean {
val usageInfo = runReadAction(callback) val usageInfo = runReadAction(callback)
return if (usageInfo != null) process(usageInfo) else true return if (usageInfo != null) process(usageInfo) else true
} }
internal fun createReferenceProcessor(usageInfoProcessor: Processor<UsageInfo>): Processor<PsiReference> { internal fun createReferenceProcessor(usageInfoProcessor: UsageInfoProcessor): Processor<PsiReference> {
val uniqueProcessor = CommonProcessors.UniqueProcessor(usageInfoProcessor) val uniqueProcessor = CommonProcessors.UniqueProcessor(usageInfoProcessor)
return Processor { processUsage(uniqueProcessor, it) } return Processor { processUsage(uniqueProcessor, it) }
@@ -21,8 +21,6 @@ import com.intellij.find.findUsages.FindUsagesOptions
import com.intellij.openapi.actionSystem.DataContext import com.intellij.openapi.actionSystem.DataContext
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.search.searches.ReferencesSearch import com.intellij.psi.search.searches.ReferencesSearch
import com.intellij.usageView.UsageInfo
import com.intellij.util.Processor
import org.jetbrains.kotlin.idea.findUsages.KotlinFindUsagesHandlerFactory import org.jetbrains.kotlin.idea.findUsages.KotlinFindUsagesHandlerFactory
import org.jetbrains.kotlin.idea.findUsages.dialogs.KotlinTypeParameterFindUsagesDialog import org.jetbrains.kotlin.idea.findUsages.dialogs.KotlinTypeParameterFindUsagesDialog
import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtNamedDeclaration
@@ -39,7 +37,7 @@ class KotlinTypeParameterFindUsagesHandler(
) )
} }
override fun createSearcher(element: PsiElement, processor: Processor<UsageInfo>, options: FindUsagesOptions): Searcher { override fun createSearcher(element: PsiElement, processor: UsageInfoProcessor, options: FindUsagesOptions): Searcher {
return object : Searcher(element, processor, options) { return object : Searcher(element, processor, options) {
override fun buildTaskList(forHighlight: Boolean): Boolean { override fun buildTaskList(forHighlight: Boolean): Boolean {
addTask { addTask {
@@ -0,0 +1,14 @@
/*
* 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.findUsages.handlers
import com.intellij.slicer.SliceUsage
import com.intellij.usageView.UsageInfo
import com.intellij.util.Processor
// BUNCH: 193
typealias UsageInfoProcessor = Processor<UsageInfo>
typealias SliceUsageProcessor = Processor<SliceUsage>
@@ -0,0 +1,14 @@
/*
* 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.findUsages.handlers
import com.intellij.slicer.SliceUsage
import com.intellij.usageView.UsageInfo
import com.intellij.util.Processor
// BUNCH: 193
typealias UsageInfoProcessor = Processor<in UsageInfo>
typealias SliceUsageProcessor = Processor<in SliceUsage>
@@ -20,7 +20,7 @@ import com.intellij.psi.PsiElement
import com.intellij.slicer.SliceAnalysisParams import com.intellij.slicer.SliceAnalysisParams
import com.intellij.slicer.SliceUsage import com.intellij.slicer.SliceUsage
import com.intellij.usageView.UsageInfo import com.intellij.usageView.UsageInfo
import com.intellij.util.Processor import org.jetbrains.kotlin.idea.findUsages.handlers.SliceUsageProcessor
import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtExpression
open class KotlinSliceUsage : SliceUsage { open class KotlinSliceUsage : SliceUsage {
@@ -57,11 +57,11 @@ open class KotlinSliceUsage : SliceUsage {
override fun canBeLeaf() = element != null && lambdaLevel == 0 override fun canBeLeaf() = element != null && lambdaLevel == 0
public override fun processUsagesFlownDownTo(element: PsiElement, uniqueProcessor: Processor<SliceUsage>) { public override fun processUsagesFlownDownTo(element: PsiElement, uniqueProcessor: SliceUsageProcessor) {
InflowSlicer(element as? KtExpression ?: return, uniqueProcessor, this).processChildren() InflowSlicer(element as? KtExpression ?: return, uniqueProcessor, this).processChildren()
} }
public override fun processUsagesFlownFromThe(element: PsiElement, uniqueProcessor: Processor<SliceUsage>) { public override fun processUsagesFlownFromThe(element: PsiElement, uniqueProcessor: SliceUsageProcessor) {
OutflowSlicer(element as? KtExpression ?: return, uniqueProcessor, this).processChildren() OutflowSlicer(element as? KtExpression ?: return, uniqueProcessor, this).processChildren()
} }
} }
@@ -16,9 +16,7 @@ import com.intellij.psi.search.LocalSearchScope
import com.intellij.psi.search.SearchScope import com.intellij.psi.search.SearchScope
import com.intellij.psi.search.searches.ReferencesSearch import com.intellij.psi.search.searches.ReferencesSearch
import com.intellij.slicer.JavaSliceUsage import com.intellij.slicer.JavaSliceUsage
import com.intellij.slicer.SliceUsage
import com.intellij.usageView.UsageInfo import com.intellij.usageView.UsageInfo
import com.intellij.util.Processor
import org.jetbrains.kotlin.asJava.namedUnwrappedElement import org.jetbrains.kotlin.asJava.namedUnwrappedElement
import org.jetbrains.kotlin.builtins.functions.FunctionInvokeDescriptor import org.jetbrains.kotlin.builtins.functions.FunctionInvokeDescriptor
import org.jetbrains.kotlin.cfg.pseudocode.PseudoValue import org.jetbrains.kotlin.cfg.pseudocode.PseudoValue
@@ -36,6 +34,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.*
import org.jetbrains.kotlin.idea.core.isOverridable import org.jetbrains.kotlin.idea.core.isOverridable
import org.jetbrains.kotlin.idea.findUsages.KotlinFunctionFindUsagesOptions import org.jetbrains.kotlin.idea.findUsages.KotlinFunctionFindUsagesOptions
import org.jetbrains.kotlin.idea.findUsages.KotlinPropertyFindUsagesOptions import org.jetbrains.kotlin.idea.findUsages.KotlinPropertyFindUsagesOptions
import org.jetbrains.kotlin.idea.findUsages.handlers.SliceUsageProcessor
import org.jetbrains.kotlin.idea.findUsages.processAllExactUsages import org.jetbrains.kotlin.idea.findUsages.processAllExactUsages
import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinValVar import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinValVar
import org.jetbrains.kotlin.idea.refactoring.changeSignature.toValVar import org.jetbrains.kotlin.idea.refactoring.changeSignature.toValVar
@@ -122,7 +121,7 @@ private fun KtParameter.canProcess() = !isVarArg
abstract class Slicer( abstract class Slicer(
protected val element: KtExpression, protected val element: KtExpression,
protected val processor: Processor<SliceUsage>, protected val processor: SliceUsageProcessor,
protected val parentUsage: KotlinSliceUsage protected val parentUsage: KotlinSliceUsage
) { ) {
protected class PseudocodeCache { protected class PseudocodeCache {
@@ -151,7 +150,7 @@ abstract class Slicer(
class InflowSlicer( class InflowSlicer(
element: KtExpression, element: KtExpression,
processor: Processor<SliceUsage>, processor: SliceUsageProcessor,
parentUsage: KotlinSliceUsage parentUsage: KotlinSliceUsage
) : Slicer(element, processor, parentUsage) { ) : Slicer(element, processor, parentUsage) {
private fun PsiElement.processHierarchyDownwardAndPass() { private fun PsiElement.processHierarchyDownwardAndPass() {
@@ -382,7 +381,7 @@ class InflowSlicer(
class OutflowSlicer( class OutflowSlicer(
element: KtExpression, element: KtExpression,
processor: Processor<SliceUsage>, processor: SliceUsageProcessor,
parentUsage: KotlinSliceUsage parentUsage: KotlinSliceUsage
) : Slicer(element, processor, parentUsage) { ) : Slicer(element, processor, parentUsage) {
private fun KtDeclaration.processVariable() { private fun KtDeclaration.processVariable() {