find usages and implementations should start in a transaction

This commit is contained in:
peter
2016-11-04 09:26:59 +01:00
parent 56d9e6667e
commit db479037bf
5 changed files with 35 additions and 7 deletions
@@ -20,9 +20,9 @@ import com.intellij.find.FindBundle;
import com.intellij.ide.util.SuperMethodWarningUtil;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.TransactionGuard;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Condition;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.codeStyle.VariableKind;
@@ -90,6 +90,7 @@ public class JavaFindUsagesHandler extends FindUsagesHandler{
}
private static boolean askWhetherShouldSearchForParameterInOverridingMethods(@NotNull PsiElement psiElement, @NotNull PsiParameter parameter) {
assertInTransaction();
return Messages.showOkCancelDialog(psiElement.getProject(),
FindBundle.message("find.parameter.usages.in.overriding.methods.prompt", parameter.getName()),
FindBundle.message("find.parameter.usages.in.overriding.methods.title"),
@@ -164,12 +165,7 @@ public class JavaFindUsagesHandler extends FindUsagesHandler{
accessors.addAll(PropertyUtil.getAccessors(containingClass, fieldName));
if (!accessors.isEmpty()) {
boolean containsPhysical = ContainerUtil.find(accessors, psiMethod -> psiMethod.isPhysical()) != null;
final boolean doSearch = !containsPhysical ||
Messages.showOkCancelDialog(FindBundle.message("find.field.accessors.prompt", fieldName),
FindBundle.message("find.field.accessors.title"),
CommonBundle.getYesButtonText(),
CommonBundle.getNoButtonText(), Messages.getQuestionIcon()) ==
Messages.OK;
final boolean doSearch = !containsPhysical || askShouldSearchAccessors(fieldName);
if (doSearch) {
final Set<PsiElement> elements = new THashSet<>();
for (PsiMethod accessor : accessors) {
@@ -183,6 +179,18 @@ public class JavaFindUsagesHandler extends FindUsagesHandler{
return super.getSecondaryElements();
}
private static boolean askShouldSearchAccessors(String fieldName) {
assertInTransaction();
return Messages.showOkCancelDialog(FindBundle.message("find.field.accessors.prompt", fieldName),
FindBundle.message("find.field.accessors.title"),
CommonBundle.getYesButtonText(),
CommonBundle.getNoButtonText(), Messages.getQuestionIcon()) == Messages.OK;
}
private static void assertInTransaction() {
LOG.assertTrue(TransactionGuard.getInstance().getContextTransaction() != null, "Find Usages should be shown in a transaction, see AnAction#startInTransaction");
}
@Override
@NotNull
public FindUsagesOptions getFindUsagesOptions(@Nullable final DataContext dataContext) {