Find Usages: Properly select primary element for Find Usages Dialog. Avoid delegating handler when there is only one primary element

#KT-7048 Fixed
This commit is contained in:
Alexey Sedunov
2015-03-23 15:11:19 +03:00
parent a57be6dcab
commit 461ae25239
2 changed files with 26 additions and 16 deletions
@@ -29,6 +29,7 @@ import com.intellij.find.findUsages.JavaFindUsagesHandlerFactory
import org.jetbrains.kotlin.idea.findUsages.handlers.DelegatingFindMemberUsagesHandler
import org.jetbrains.kotlin.plugin.findUsages.handlers.KotlinFindUsagesHandlerDecorator
import com.intellij.openapi.extensions.Extensions
import org.jetbrains.kotlin.asJava.unwrapped
import org.jetbrains.kotlin.psi.*
public class KotlinFindUsagesHandlerFactory(project: Project) : FindUsagesHandlerFactory() {
@@ -57,7 +58,19 @@ public class KotlinFindUsagesHandlerFactory(project: Project) : FindUsagesHandle
if (forHighlightUsages) return KotlinFindMemberUsagesHandler.getInstance(declaration, this)
JetRefactoringUtil.checkSuperMethods(declaration, null, "super.methods.action.key.find.usages")?.let { callables ->
if (callables.empty) FindUsagesHandler.NULL_HANDLER else DelegatingFindMemberUsagesHandler(declaration, callables, this)
when (callables.size()) {
0 -> FindUsagesHandler.NULL_HANDLER
1 -> {
val target = callables.first().unwrapped ?: return FindUsagesHandler.NULL_HANDLER
if (target is JetNamedDeclaration) {
KotlinFindMemberUsagesHandler.getInstance(target, this)
}
else {
javaHandlerFactory.createFindUsagesHandler(target, false)
}
}
else -> DelegatingFindMemberUsagesHandler(declaration, callables, this)
}
}
}
@@ -16,24 +16,20 @@
package org.jetbrains.kotlin.idea.findUsages.handlers
import com.intellij.find.findUsages.AbstractFindUsagesDialog
import com.intellij.find.findUsages.FindUsagesHandler
import com.intellij.find.findUsages.FindUsagesOptions
import com.intellij.find.findUsages.JavaFindUsagesHandler
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiMethod
import com.intellij.usageView.UsageInfo
import com.intellij.util.Processor
import com.intellij.find.findUsages.FindUsagesOptions
import org.jetbrains.kotlin.idea.findUsages.KotlinFindUsagesHandlerFactory
import kotlin.properties.Delegates
import org.jetbrains.kotlin.psi.JetNamedDeclaration
import com.intellij.psi.PsiMethod
import com.intellij.find.findUsages.JavaFindUsagesHandler
import org.jetbrains.kotlin.idea.findUsages.KotlinFunctionFindUsagesOptions
import org.jetbrains.kotlin.idea.findUsages.toJavaMethodOptions
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.components.ServiceManager
import com.intellij.psi.xml.XmlAttribute
import org.jetbrains.kotlin.psi.JetProperty
import com.intellij.find.findUsages.JavaVariableFindUsagesOptions
import java.util.ArrayList
import org.jetbrains.kotlin.psi.JetNamedDeclaration
import kotlin.properties.Delegates
class DelegatingFindMemberUsagesHandler(
val declaration: JetNamedDeclaration,
@@ -42,10 +38,6 @@ class DelegatingFindMemberUsagesHandler(
) : FindUsagesHandler(declaration) {
private val kotlinHandler = KotlinFindMemberUsagesHandler.getInstance(declaration, elementsToSearch, factory)
private val javaHandler: JavaFindUsagesHandler by Delegates.lazy {
JavaFindUsagesHandler(declaration, elementsToSearch.copyToArray(), factory.javaHandlerFactory)
}
private fun getHandler(element: PsiElement): FindUsagesHandler? =
when (element) {
is JetNamedDeclaration ->
@@ -57,6 +49,11 @@ class DelegatingFindMemberUsagesHandler(
else -> null
}
override fun getFindUsagesDialog(isSingleFile: Boolean, toShowInNewTab: Boolean, mustOpenInNewTab: Boolean): AbstractFindUsagesDialog {
return getHandler(getPsiElement())?.getFindUsagesDialog(isSingleFile, toShowInNewTab, mustOpenInNewTab)
?: super.getFindUsagesDialog(isSingleFile, toShowInNewTab, mustOpenInNewTab)
}
override fun getPrimaryElements(): Array<PsiElement> {
return kotlinHandler.getPrimaryElements()
}