Add find usages option: search expected

This commit is contained in:
Mikhail Glukhikh
2018-06-20 18:16:08 +03:00
parent 69e420991a
commit abbfea357a
4 changed files with 92 additions and 7 deletions
@@ -30,6 +30,7 @@ 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.annotations.Nullable;
import org.jetbrains.kotlin.asJava.LightClassUtilsKt; import org.jetbrains.kotlin.asJava.LightClassUtilsKt;
import org.jetbrains.kotlin.idea.KotlinBundle; import org.jetbrains.kotlin.idea.KotlinBundle;
import org.jetbrains.kotlin.idea.core.PsiModificationUtilsKt; import org.jetbrains.kotlin.idea.core.PsiModificationUtilsKt;
@@ -37,6 +38,8 @@ import org.jetbrains.kotlin.idea.findUsages.KotlinClassFindUsagesOptions;
import org.jetbrains.kotlin.idea.refactoring.RenderingUtilsKt; import org.jetbrains.kotlin.idea.refactoring.RenderingUtilsKt;
import org.jetbrains.kotlin.psi.KtClass; import org.jetbrains.kotlin.psi.KtClass;
import org.jetbrains.kotlin.psi.KtClassOrObject; import org.jetbrains.kotlin.psi.KtClassOrObject;
import org.jetbrains.kotlin.psi.psiUtil.PsiUtilsKt;
import javax.swing.*; import javax.swing.*;
import static org.jetbrains.kotlin.asJava.LightClassUtilsKt.toLightClass; import static org.jetbrains.kotlin.asJava.LightClassUtilsKt.toLightClass;
@@ -45,6 +48,7 @@ public class KotlinFindClassUsagesDialog extends FindClassUsagesDialog {
private StateRestoringCheckBox constructorUsages; private StateRestoringCheckBox constructorUsages;
private StateRestoringCheckBox derivedClasses; private StateRestoringCheckBox derivedClasses;
private StateRestoringCheckBox derivedTraits; private StateRestoringCheckBox derivedTraits;
private StateRestoringCheckBox expectedUsages;
public KotlinFindClassUsagesDialog( public KotlinFindClassUsagesDialog(
KtClassOrObject classOrObject, KtClassOrObject classOrObject,
@@ -144,14 +148,36 @@ public class KotlinFindClassUsagesDialog extends FindClassUsagesDialog {
return (KotlinClassFindUsagesOptions) super.getFindUsagesOptions(); return (KotlinClassFindUsagesOptions) super.getFindUsagesOptions();
} }
@Override @Nullable
public void configureLabelComponent(@NotNull SimpleColoredComponent coloredComponent) { private KtClassOrObject getOriginalClass() {
PsiElement klass = LightClassUtilsKt.getUnwrapped(getPsiElement()); PsiElement klass = LightClassUtilsKt.getUnwrapped(getPsiElement());
//noinspection ConstantConditions //noinspection ConstantConditions
KtClassOrObject originalClass = klass instanceof KtClassOrObject return klass instanceof KtClassOrObject
? (KtClassOrObject) klass ? (KtClassOrObject) klass
: klass.getUserData(ORIGINAL_CLASS); : klass.getUserData(ORIGINAL_CLASS);
}
@Override
protected void addUsagesOptions(JPanel optionsPanel) {
super.addUsagesOptions(optionsPanel);
KtClassOrObject klass = getOriginalClass();
boolean isActual = klass != null && PsiUtilsKt.hasActualModifier(klass);
KotlinClassFindUsagesOptions options = getFindUsagesOptions();
if (isActual) {
expectedUsages = addCheckboxToPanel(
"Expected classes",
options.getSearchExpected(),
optionsPanel,
false
);
}
}
@Override
public void configureLabelComponent(@NotNull SimpleColoredComponent coloredComponent) {
KtClassOrObject originalClass = getOriginalClass();
if (originalClass != null) { if (originalClass != null) {
coloredComponent.append(RenderingUtilsKt.formatClass(originalClass)); coloredComponent.append(RenderingUtilsKt.formatClass(originalClass));
} }
@@ -173,5 +199,6 @@ public class KotlinFindClassUsagesDialog extends FindClassUsagesDialog {
kotlinOptions.setSearchConstructorUsages(constructorUsages.isSelected()); kotlinOptions.setSearchConstructorUsages(constructorUsages.isSelected());
kotlinOptions.isDerivedClasses = derivedClasses.isSelected(); kotlinOptions.isDerivedClasses = derivedClasses.isSelected();
kotlinOptions.isDerivedInterfaces = derivedTraits.isSelected(); kotlinOptions.isDerivedInterfaces = derivedTraits.isSelected();
kotlinOptions.setSearchExpected(isSelected(expectedUsages));
} }
} }
@@ -20,17 +20,27 @@ import com.intellij.find.FindBundle;
import com.intellij.find.FindSettings; import com.intellij.find.FindSettings;
import com.intellij.find.findUsages.FindMethodUsagesDialog; import com.intellij.find.findUsages.FindMethodUsagesDialog;
import com.intellij.find.findUsages.FindUsagesHandler; import com.intellij.find.findUsages.FindUsagesHandler;
import com.intellij.find.findUsages.JavaMethodFindUsagesOptions;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiMethod;
import com.intellij.ui.SimpleColoredComponent; import com.intellij.ui.SimpleColoredComponent;
import com.intellij.ui.StateRestoringCheckBox;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.asJava.LightClassUtilsKt;
import org.jetbrains.kotlin.asJava.elements.KtLightMethod;
import org.jetbrains.kotlin.idea.KotlinBundle; import org.jetbrains.kotlin.idea.KotlinBundle;
import org.jetbrains.kotlin.idea.findUsages.KotlinFunctionFindUsagesOptions; import org.jetbrains.kotlin.idea.findUsages.KotlinFunctionFindUsagesOptions;
import org.jetbrains.kotlin.idea.refactoring.RenderingUtilsKt; import org.jetbrains.kotlin.idea.refactoring.RenderingUtilsKt;
import org.jetbrains.kotlin.psi.KtDeclaration;
import org.jetbrains.kotlin.psi.KtNamedDeclaration;
import org.jetbrains.kotlin.psi.psiUtil.PsiUtilsKt;
import javax.swing.*; import javax.swing.*;
public class KotlinFindFunctionUsagesDialog extends FindMethodUsagesDialog { public class KotlinFindFunctionUsagesDialog extends FindMethodUsagesDialog {
private StateRestoringCheckBox expectedUsages;
public KotlinFindFunctionUsagesDialog( public KotlinFindFunctionUsagesDialog(
PsiMethod method, PsiMethod method,
Project project, Project project,
@@ -43,6 +53,7 @@ public class KotlinFindFunctionUsagesDialog extends FindMethodUsagesDialog {
super(method, project, findUsagesOptions, toShowInNewTab, mustOpenInNewTab, isSingleFile, handler); super(method, project, findUsagesOptions, toShowInNewTab, mustOpenInNewTab, isSingleFile, handler);
} }
@NotNull
@Override @Override
protected KotlinFunctionFindUsagesOptions getFindUsagesOptions() { protected KotlinFunctionFindUsagesOptions getFindUsagesOptions() {
return (KotlinFunctionFindUsagesOptions) myFindUsagesOptions; return (KotlinFunctionFindUsagesOptions) myFindUsagesOptions;
@@ -89,5 +100,29 @@ public class KotlinFindFunctionUsagesDialog extends FindMethodUsagesDialog {
false false
); );
} }
PsiElement element = LightClassUtilsKt.getUnwrapped(getPsiElement());
//noinspection ConstantConditions
KtDeclaration function = element instanceof KtNamedDeclaration
? (KtNamedDeclaration) element
: ((KtLightMethod) element).getKotlinOrigin();
boolean isActual = function != null && PsiUtilsKt.hasActualModifier(function);
KotlinFunctionFindUsagesOptions options = getFindUsagesOptions();
if (isActual) {
expectedUsages = addCheckboxToPanel(
"Expected functions",
options.getSearchExpected(),
optionsPanel,
false
);
}
}
@Override
public void calcFindUsagesOptions(JavaMethodFindUsagesOptions options) {
super.calcFindUsagesOptions(options);
KotlinFunctionFindUsagesOptions kotlinOptions = (KotlinFunctionFindUsagesOptions) options;
kotlinOptions.setSearchExpected(isSelected(expectedUsages));
} }
} }
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.idea.KotlinBundle;
import org.jetbrains.kotlin.idea.findUsages.KotlinPropertyFindUsagesOptions; import org.jetbrains.kotlin.idea.findUsages.KotlinPropertyFindUsagesOptions;
import org.jetbrains.kotlin.lexer.KtTokens; import org.jetbrains.kotlin.lexer.KtTokens;
import org.jetbrains.kotlin.psi.KtNamedDeclaration; import org.jetbrains.kotlin.psi.KtNamedDeclaration;
import org.jetbrains.kotlin.psi.psiUtil.PsiUtilsKt;
import javax.swing.*; import javax.swing.*;
@@ -49,7 +50,9 @@ public class KotlinFindPropertyUsagesDialog extends JavaFindUsagesDialog<KotlinP
private StateRestoringCheckBox cbReaders; private StateRestoringCheckBox cbReaders;
private StateRestoringCheckBox cbWriters; private StateRestoringCheckBox cbWriters;
private StateRestoringCheckBox cbOverrides; private StateRestoringCheckBox cbOverrides;
private StateRestoringCheckBox cbExpected;
@NotNull
@Override @Override
protected KotlinPropertyFindUsagesOptions getFindUsagesOptions() { protected KotlinPropertyFindUsagesOptions getFindUsagesOptions() {
return (KotlinPropertyFindUsagesOptions) myFindUsagesOptions; return (KotlinPropertyFindUsagesOptions) myFindUsagesOptions;
@@ -67,6 +70,7 @@ public class KotlinFindPropertyUsagesDialog extends JavaFindUsagesDialog<KotlinP
options.isReadAccess = isSelected(cbReaders); options.isReadAccess = isSelected(cbReaders);
options.isWriteAccess = isSelected(cbWriters); options.isWriteAccess = isSelected(cbWriters);
options.setSearchOverrides(isSelected(cbOverrides)); options.setSearchOverrides(isSelected(cbOverrides));
options.setSearchExpected(isSelected(cbExpected));
} }
@Override @Override
@@ -116,6 +120,16 @@ public class KotlinFindPropertyUsagesDialog extends JavaFindUsagesDialog<KotlinP
false false
); );
} }
boolean isActual = PsiUtilsKt.hasActualModifier(property);
KotlinPropertyFindUsagesOptions options = getFindUsagesOptions();
if (isActual) {
cbExpected = addCheckboxToPanel(
"Expected properties",
options.getSearchExpected(),
optionsPanel,
false
);
}
} }
@Override @Override
@@ -22,7 +22,13 @@ import com.intellij.find.findUsages.JavaMethodFindUsagesOptions
import com.intellij.find.findUsages.JavaVariableFindUsagesOptions import com.intellij.find.findUsages.JavaVariableFindUsagesOptions
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
class KotlinClassFindUsagesOptions(project: Project) : JavaClassFindUsagesOptions(project) { interface KotlinMemberFindUsagesOptions {
var searchExpected: Boolean
}
class KotlinClassFindUsagesOptions(project: Project) : KotlinMemberFindUsagesOptions, JavaClassFindUsagesOptions(project) {
override var searchExpected: Boolean = true
var searchConstructorUsages: Boolean = true var searchConstructorUsages: Boolean = true
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {
@@ -34,13 +40,15 @@ class KotlinClassFindUsagesOptions(project: Project) : JavaClassFindUsagesOption
} }
} }
interface KotlinCallableFindUsagesOptions { interface KotlinCallableFindUsagesOptions : KotlinMemberFindUsagesOptions {
var searchOverrides: Boolean var searchOverrides: Boolean
fun toJavaOptions(project: Project): FindUsagesOptions? fun toJavaOptions(project: Project): FindUsagesOptions?
} }
class KotlinFunctionFindUsagesOptions(project: Project) : KotlinCallableFindUsagesOptions, JavaMethodFindUsagesOptions(project) { class KotlinFunctionFindUsagesOptions(project: Project) : KotlinCallableFindUsagesOptions, JavaMethodFindUsagesOptions(project) {
override var searchExpected: Boolean = true
override var searchOverrides: Boolean override var searchOverrides: Boolean
get() = isOverridingMethods get() = isOverridingMethods
set(value) { set(value) {
@@ -67,6 +75,7 @@ class KotlinFunctionFindUsagesOptions(project: Project) : KotlinCallableFindUsag
class KotlinPropertyFindUsagesOptions( class KotlinPropertyFindUsagesOptions(
project: Project project: Project
) : KotlinCallableFindUsagesOptions, JavaVariableFindUsagesOptions(project) { ) : KotlinCallableFindUsagesOptions, JavaVariableFindUsagesOptions(project) {
override var searchExpected: Boolean = true
var isReadWriteAccess: Boolean = true var isReadWriteAccess: Boolean = true
override var searchOverrides: Boolean = false override var searchOverrides: Boolean = false