modifier fix: add progress as common names could be checked slowly

This commit is contained in:
Anna Kozlova
2017-09-19 09:28:42 +03:00
parent a2e276ba2f
commit 6e8bc5e4c1
@@ -17,6 +17,7 @@ package com.siyeh.ipp.modifiers;
import com.intellij.codeInsight.intention.LowPriorityAction;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.psi.*;
@@ -71,6 +72,10 @@ abstract class ModifierIntention extends Intention implements LowPriorityAction
return;
}
final MultiMap<PsiElement, String> conflicts = checkForConflicts(member);
if (conflicts == null) {
//canceled by user
return;
}
final Project project = member.getProject();
final boolean conflictsDialogOK;
if (conflicts.isEmpty()) {
@@ -142,27 +147,31 @@ abstract class ModifierIntention extends Intention implements LowPriorityAction
return MultiMap.emptyInstance();
}
final MultiMap<PsiElement, String> conflicts = new MultiMap<>();
if (member instanceof PsiMethod) {
JavaChangeSignatureUsageProcessor.ConflictSearcher.searchForHierarchyConflicts((PsiMethod)member, conflicts, getModifier());
if (!ProgressManager.getInstance().runProcessWithProgressSynchronously(() -> {
if (member instanceof PsiMethod) {
JavaChangeSignatureUsageProcessor.ConflictSearcher.searchForHierarchyConflicts((PsiMethod)member, conflicts, getModifier());
}
final PsiModifierList modifierListCopy = (PsiModifierList)modifierList.copy();
modifierListCopy.setModifierProperty(getModifier(), true);
final Query<PsiReference> search = ReferencesSearch.search(member, member.getUseScope());
search.forEach(reference -> {
final PsiElement element = reference.getElement();
if (JavaResolveUtil.isAccessible(member, member.getContainingClass(), modifierListCopy, element, null, null)) {
return true;
}
final PsiElement context = PsiTreeUtil.getParentOfType(element, PsiMethod.class, PsiField.class, PsiClass.class, PsiFile.class);
if (context == null) {
return true;
}
conflicts.putValue(element, RefactoringBundle.message("0.with.1.visibility.is.not.accessible.from.2",
RefactoringUIUtil.getDescription(member, false),
PsiBundle.visibilityPresentation(getModifier()),
RefactoringUIUtil.getDescription(context, true)));
return true;
});
}, RefactoringBundle.message("detecting.possible.conflicts"), true, member.getProject())) {
return null;
}
final PsiModifierList modifierListCopy = (PsiModifierList)modifierList.copy();
modifierListCopy.setModifierProperty(getModifier(), true);
final Query<PsiReference> search = ReferencesSearch.search(member, member.getUseScope());
search.forEach(reference -> {
final PsiElement element = reference.getElement();
if (JavaResolveUtil.isAccessible(member, member.getContainingClass(), modifierListCopy, element, null, null)) {
return true;
}
final PsiElement context = PsiTreeUtil.getParentOfType(element, PsiMethod.class, PsiField.class, PsiClass.class, PsiFile.class);
if (context == null) {
return true;
}
conflicts.putValue(element, RefactoringBundle.message("0.with.1.visibility.is.not.accessible.from.2",
RefactoringUIUtil.getDescription(member, false),
PsiBundle.visibilityPresentation(getModifier()),
RefactoringUIUtil.getDescription(context, true)));
return true;
});
return conflicts;
}