Find Usages: Show class-specific dialog for all Kotlin classes (including bultins)
#KT-7048 Fixed
This commit is contained in:
+60
-6
@@ -21,15 +21,24 @@ import com.intellij.find.findUsages.FindClassUsagesDialog;
|
|||||||
import com.intellij.find.findUsages.FindUsagesHandler;
|
import com.intellij.find.findUsages.FindUsagesHandler;
|
||||||
import com.intellij.find.findUsages.FindUsagesOptions;
|
import com.intellij.find.findUsages.FindUsagesOptions;
|
||||||
import com.intellij.find.findUsages.JavaClassFindUsagesOptions;
|
import com.intellij.find.findUsages.JavaClassFindUsagesOptions;
|
||||||
|
import com.intellij.openapi.diagnostic.Logger;
|
||||||
import com.intellij.openapi.project.Project;
|
import com.intellij.openapi.project.Project;
|
||||||
|
import com.intellij.openapi.util.Key;
|
||||||
import com.intellij.psi.PsiClass;
|
import com.intellij.psi.PsiClass;
|
||||||
|
import com.intellij.psi.PsiElement;
|
||||||
|
import com.intellij.psi.PsiElementFactory;
|
||||||
|
import com.intellij.psi.PsiModifier;
|
||||||
import com.intellij.ui.SimpleColoredComponent;
|
import com.intellij.ui.SimpleColoredComponent;
|
||||||
import com.intellij.ui.StateRestoringCheckBox;
|
import com.intellij.ui.StateRestoringCheckBox;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.kotlin.asJava.KotlinLightClassForExplicitDeclaration;
|
import org.jetbrains.kotlin.asJava.AsJavaPackage;
|
||||||
|
import org.jetbrains.kotlin.asJava.LightClassUtil;
|
||||||
import org.jetbrains.kotlin.idea.JetBundle;
|
import org.jetbrains.kotlin.idea.JetBundle;
|
||||||
import org.jetbrains.kotlin.idea.findUsages.KotlinClassFindUsagesOptions;
|
import org.jetbrains.kotlin.idea.findUsages.KotlinClassFindUsagesOptions;
|
||||||
import org.jetbrains.kotlin.idea.refactoring.JetRefactoringUtil;
|
import org.jetbrains.kotlin.idea.refactoring.JetRefactoringUtil;
|
||||||
|
import org.jetbrains.kotlin.psi.JetClass;
|
||||||
|
import org.jetbrains.kotlin.psi.JetClassOrObject;
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.PsiUtilPackage;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
|
|
||||||
@@ -39,7 +48,7 @@ public class KotlinFindClassUsagesDialog extends FindClassUsagesDialog {
|
|||||||
private StateRestoringCheckBox derivedTraits;
|
private StateRestoringCheckBox derivedTraits;
|
||||||
|
|
||||||
public KotlinFindClassUsagesDialog(
|
public KotlinFindClassUsagesDialog(
|
||||||
PsiClass klass,
|
JetClassOrObject classOrObject,
|
||||||
Project project,
|
Project project,
|
||||||
FindUsagesOptions findUsagesOptions,
|
FindUsagesOptions findUsagesOptions,
|
||||||
boolean toShowInNewTab,
|
boolean toShowInNewTab,
|
||||||
@@ -47,7 +56,47 @@ public class KotlinFindClassUsagesDialog extends FindClassUsagesDialog {
|
|||||||
boolean isSingleFile,
|
boolean isSingleFile,
|
||||||
FindUsagesHandler handler
|
FindUsagesHandler handler
|
||||||
) {
|
) {
|
||||||
super(klass, project, findUsagesOptions, toShowInNewTab, mustOpenInNewTab, isSingleFile, handler);
|
super(getRepresentingPsiClass(classOrObject), project, findUsagesOptions, toShowInNewTab, mustOpenInNewTab, isSingleFile, handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Key<JetClassOrObject> ORIGINAL_CLASS = Key.create("ORIGINAL_CLASS");
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private static PsiClass getRepresentingPsiClass(@NotNull JetClassOrObject classOrObject) {
|
||||||
|
PsiClass lightClass = LightClassUtil.getPsiClass(classOrObject);
|
||||||
|
if (lightClass != null) return lightClass;
|
||||||
|
|
||||||
|
// TODO: Remove this code when light classes are generated for builtins
|
||||||
|
PsiElementFactory factory = PsiElementFactory.SERVICE.getInstance(classOrObject.getProject());
|
||||||
|
|
||||||
|
String name = classOrObject.getName();
|
||||||
|
if (name == null || name.isEmpty()) {
|
||||||
|
name = "Anonymous";
|
||||||
|
}
|
||||||
|
|
||||||
|
PsiClass javaClass;
|
||||||
|
if (classOrObject instanceof JetClass) {
|
||||||
|
JetClass klass = (JetClass) classOrObject;
|
||||||
|
javaClass = !klass.isInterface()
|
||||||
|
? factory.createClass(name)
|
||||||
|
: klass.isAnnotation()
|
||||||
|
? factory.createAnnotationType(name)
|
||||||
|
: factory.createInterface(name);
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
javaClass = factory.createClass(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
//noinspection ConstantConditions
|
||||||
|
javaClass.getModifierList().setModifierProperty(
|
||||||
|
PsiModifier.FINAL,
|
||||||
|
!(classOrObject instanceof JetClass && PsiUtilPackage.isInheritable((JetClass) classOrObject))
|
||||||
|
);
|
||||||
|
|
||||||
|
javaClass.putUserData(ORIGINAL_CLASS, classOrObject);
|
||||||
|
|
||||||
|
return javaClass;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -98,9 +147,14 @@ public class KotlinFindClassUsagesDialog extends FindClassUsagesDialog {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void configureLabelComponent(@NotNull SimpleColoredComponent coloredComponent) {
|
public void configureLabelComponent(@NotNull SimpleColoredComponent coloredComponent) {
|
||||||
PsiClass klass = (PsiClass) getPsiElement();
|
PsiElement klass = AsJavaPackage.getUnwrapped(getPsiElement());
|
||||||
if (klass instanceof KotlinLightClassForExplicitDeclaration) {
|
//noinspection ConstantConditions
|
||||||
coloredComponent.append(JetRefactoringUtil.formatClass(((KotlinLightClassForExplicitDeclaration) klass).getOrigin()));
|
JetClassOrObject originalClass = klass instanceof JetClassOrObject
|
||||||
|
? (JetClassOrObject) klass
|
||||||
|
: klass.getUserData(ORIGINAL_CLASS);
|
||||||
|
|
||||||
|
if (originalClass != null) {
|
||||||
|
coloredComponent.append(JetRefactoringUtil.formatClass(originalClass));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+13
-11
@@ -19,8 +19,6 @@ package org.jetbrains.kotlin.idea.findUsages.handlers
|
|||||||
import com.intellij.find.findUsages.AbstractFindUsagesDialog
|
import com.intellij.find.findUsages.AbstractFindUsagesDialog
|
||||||
import com.intellij.find.findUsages.FindUsagesOptions
|
import com.intellij.find.findUsages.FindUsagesOptions
|
||||||
import com.intellij.openapi.actionSystem.DataContext
|
import com.intellij.openapi.actionSystem.DataContext
|
||||||
import com.intellij.psi.PsiClass
|
|
||||||
import com.intellij.psi.PsiElement
|
|
||||||
import com.intellij.psi.search.PsiElementProcessor
|
import com.intellij.psi.search.PsiElementProcessor
|
||||||
import com.intellij.psi.search.PsiElementProcessorAdapter
|
import com.intellij.psi.search.PsiElementProcessorAdapter
|
||||||
import com.intellij.usageView.UsageInfo
|
import com.intellij.usageView.UsageInfo
|
||||||
@@ -40,12 +38,14 @@ import org.jetbrains.kotlin.idea.util.application.runReadAction
|
|||||||
import java.util.Collections
|
import java.util.Collections
|
||||||
import com.intellij.find.findUsages.JavaFindUsagesHandler
|
import com.intellij.find.findUsages.JavaFindUsagesHandler
|
||||||
import com.intellij.find.findUsages.JavaFindUsagesHandlerFactory
|
import com.intellij.find.findUsages.JavaFindUsagesHandlerFactory
|
||||||
import com.intellij.psi.PsiMethod
|
import com.intellij.psi.*
|
||||||
import com.intellij.psi.search.searches.MethodReferencesSearch
|
import com.intellij.psi.search.searches.MethodReferencesSearch
|
||||||
import com.intellij.util.CommonProcessors
|
import com.intellij.util.CommonProcessors
|
||||||
import org.jetbrains.kotlin.asJava.KotlinLightMethod
|
import org.jetbrains.kotlin.asJava.KotlinLightMethod
|
||||||
import org.jetbrains.kotlin.asJava.toLightClass
|
import org.jetbrains.kotlin.asJava.toLightClass
|
||||||
import org.jetbrains.kotlin.idea.search.usagesSearch.processDelegationCallConstructorUsages
|
import org.jetbrains.kotlin.idea.search.usagesSearch.processDelegationCallConstructorUsages
|
||||||
|
import org.jetbrains.kotlin.psi.JetClass
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.isInheritable
|
||||||
|
|
||||||
public class KotlinFindClassUsagesHandler(
|
public class KotlinFindClassUsagesHandler(
|
||||||
jetClass: JetClassOrObject,
|
jetClass: JetClassOrObject,
|
||||||
@@ -54,20 +54,22 @@ public class KotlinFindClassUsagesHandler(
|
|||||||
public override fun getFindUsagesDialog(
|
public override fun getFindUsagesDialog(
|
||||||
isSingleFile: Boolean, toShowInNewTab: Boolean, mustOpenInNewTab: Boolean
|
isSingleFile: Boolean, toShowInNewTab: Boolean, mustOpenInNewTab: Boolean
|
||||||
): AbstractFindUsagesDialog {
|
): AbstractFindUsagesDialog {
|
||||||
val lightClass = LightClassUtil.getPsiClass(getElement())
|
return KotlinFindClassUsagesDialog(getElement(),
|
||||||
if (lightClass != null) {
|
getProject(),
|
||||||
return KotlinFindClassUsagesDialog(lightClass, getProject(), getFactory().findClassOptions, toShowInNewTab, mustOpenInNewTab, isSingleFile, this)
|
getFactory().findClassOptions,
|
||||||
}
|
toShowInNewTab,
|
||||||
|
mustOpenInNewTab,
|
||||||
return super.getFindUsagesDialog(isSingleFile, toShowInNewTab, mustOpenInNewTab)
|
isSingleFile,
|
||||||
|
this)
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override fun searchReferences(element: PsiElement, processor: Processor<UsageInfo>, options: FindUsagesOptions): Boolean {
|
protected override fun searchReferences(element: PsiElement, processor: Processor<UsageInfo>, options: FindUsagesOptions): Boolean {
|
||||||
val kotlinOptions = options as KotlinClassFindUsagesOptions
|
val kotlinOptions = options as KotlinClassFindUsagesOptions
|
||||||
|
|
||||||
fun processInheritors(): Boolean {
|
fun processInheritors(): Boolean {
|
||||||
val request = HierarchySearchRequest(element, options.searchScope!!, options.isCheckDeepInheritance)
|
val request = HierarchySearchRequest(element, options.searchScope, options.isCheckDeepInheritance)
|
||||||
return request.searchInheritors().forEach(
|
return request.searchInheritors().forEach(
|
||||||
PsiElementProcessorAdapter<PsiClass>(
|
PsiElementProcessorAdapter(
|
||||||
object : PsiElementProcessor<PsiClass> {
|
object : PsiElementProcessor<PsiClass> {
|
||||||
public override fun execute(element: PsiClass): Boolean {
|
public override fun execute(element: PsiClass): Boolean {
|
||||||
val traitOrInterface = element.isInterface()
|
val traitOrInterface = element.isInterface()
|
||||||
|
|||||||
Reference in New Issue
Block a user