Problems view: rename 'broken usages' to 'related problems'

GitOrigin-RevId: b1cfcd7a9d1c79697a4b17d05525f54c5c0d4b29
This commit is contained in:
Artemiy Sartakov
2020-06-09 11:03:35 +03:00
committed by intellij-monorepo-bot
parent d95632bb99
commit 83cb591257
8 changed files with 68 additions and 65 deletions
@@ -4,12 +4,12 @@ package com.intellij.codeInsight.daemon.impl.analysis;
public class JavaLensSettings {
private boolean showUsages;
private boolean showImplementations;
private boolean showBrokenUsages = true;
private boolean showRelatedProblems = true;
public JavaLensSettings(boolean showUsages, boolean showImplementations, boolean showBrokenUsages) {
public JavaLensSettings(boolean showUsages, boolean showImplementations, boolean showRelatedProblems) {
this.showUsages = showUsages;
this.showImplementations = showImplementations;
this.showBrokenUsages = showBrokenUsages;
this.showRelatedProblems = showRelatedProblems;
}
public JavaLensSettings() {
@@ -31,12 +31,12 @@ public class JavaLensSettings {
this.showImplementations = showImplementations;
}
public boolean isShowBrokenUsages() {
return showBrokenUsages;
public boolean isShowRelatedProblems() {
return showRelatedProblems;
}
public void setShowBrokenUsages(boolean showBrokenUsages) {
this.showBrokenUsages = showBrokenUsages;
public void setShowRelatedProblems(boolean showRelatedProblems) {
this.showRelatedProblems = showRelatedProblems;
}
@Override
@@ -46,7 +46,7 @@ public class JavaLensSettings {
JavaLensSettings settings = (JavaLensSettings)o;
if (showUsages != settings.showUsages || showBrokenUsages != settings.showBrokenUsages) return false;
if (showUsages != settings.showUsages || showRelatedProblems != settings.showRelatedProblems) return false;
return showImplementations == settings.showImplementations;
}
@@ -54,7 +54,7 @@ public class JavaLensSettings {
public int hashCode() {
int result = showUsages ? 1 : 0;
result = 31 * result + (showImplementations ? 1 : 0);
result = 31 * result + (showBrokenUsages ? 1 : 0);
result = 31 * result + (showRelatedProblems ? 1 : 0);
return result;
}
}
@@ -15,7 +15,7 @@ class JavaLensConfigurable(val settings: JavaLensSettings) : ImmediateConfigurab
get() = listOf(
ImmediateConfigurable.Case(JavaBundle.message("settings.inlay.java.usages"), "usages", { settings.isShowUsages}, { settings.isShowUsages = it}),
ImmediateConfigurable.Case(JavaBundle.message("settings.inlay.java.inheritors"), "inheritors", { settings.isShowImplementations}, { settings.isShowImplementations = it}),
ImmediateConfigurable.Case(JavaBundle.message("project.problems.title"), "broken.usages", { settings.isShowBrokenUsages}, { settings.isShowBrokenUsages = it})
ImmediateConfigurable.Case(JavaBundle.message("project.problems.title"), "related.problems", { settings.isShowRelatedProblems }, { settings.isShowRelatedProblems = it})
)
override val mainCheckboxText: String
@@ -63,9 +63,9 @@ public class ProjectProblemPass extends EditorBoundHighlightingPass {
Map<PsiMember, ScopedMember> changes = new SmartHashMap<>();
problems.forEach((curMember, problem) -> {
ScopedMember prevMember = problem.prevMember;
Set<PsiElement> brokenUsages = problem.brokenUsages;
Set<PsiElement> relatedProblems = problem.relatedProblems;
changes.put(curMember, prevMember);
if (brokenUsages != null) addInfo(factory, curMember, brokenUsages, editorInfos);
if (relatedProblems != null) addInfo(factory, curMember, relatedProblems, editorInfos);
});
updateInfos(myEditor, editorInfos);
@@ -80,20 +80,20 @@ public class ProjectProblemPass extends EditorBoundHighlightingPass {
private void addInfo(@NotNull PresentationFactory factory,
@NotNull PsiMember psiMember,
@NotNull Set<PsiElement> brokenUsages,
@NotNull Set<PsiElement> relatedProblems,
@NotNull Map<PsiMember, EditorInfo> editorInfos) {
EditorInfo oldInfo = editorInfos.remove(psiMember);
if (oldInfo != null) Disposer.dispose(oldInfo.myInlay);
if (brokenUsages.isEmpty() || hasOtherElementsOnSameLine(psiMember)) return;
if (relatedProblems.isEmpty() || hasOtherElementsOnSameLine(psiMember)) return;
PsiElement identifier = getIdentifier(psiMember);
if (identifier == null) return;
int offset = getMemberOffset(psiMember);
InlayPresentation presentation = getPresentation(myProject, myEditor, myEditor.getDocument(), factory, offset, psiMember, brokenUsages);
InlayPresentation presentation = getPresentation(myProject, myEditor, myEditor.getDocument(), factory, offset, psiMember, relatedProblems);
BlockInlayRenderer renderer = createBlockRenderer(presentation);
Inlay<?> newInlay = myEditor.getInlayModel().addBlockElement(offset, true, true, BlockInlayPriority.PROBLEMS, renderer);
if (newInlay == null) return;
addListener(renderer, newInlay);
HighlightInfo newHighlightInfo = createHighlightInfo(myEditor, identifier, brokenUsages);
HighlightInfo newHighlightInfo = createHighlightInfo(myEditor, identifier, relatedProblems);
editorInfos.put(psiMember, new EditorInfo(newInlay, newHighlightInfo));
}
@@ -121,11 +121,11 @@ public class ProjectProblemPass extends EditorBoundHighlightingPass {
private static class Problem {
private final ScopedMember prevMember;
private final Set<PsiElement> brokenUsages;
private final Set<PsiElement> relatedProblems;
private Problem(ScopedMember prevMember, Set<PsiElement> brokenUsages) {
private Problem(ScopedMember prevMember, Set<PsiElement> relatedProblems) {
this.prevMember = prevMember;
this.brokenUsages = brokenUsages;
this.relatedProblems = relatedProblems;
}
}
}
@@ -29,6 +29,7 @@ import com.intellij.psi.*;
import com.intellij.psi.javadoc.PsiDocComment;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.usageView.UsageInfo;
import com.intellij.usageView.UsageViewUtil;
import com.intellij.usages.*;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.containers.ContainerUtil;
@@ -56,48 +57,48 @@ public class ProjectProblemPassUtils {
@NotNull PresentationFactory factory,
int offset,
@NotNull PsiMember member,
@NotNull Set<PsiElement> brokenUsages) {
@NotNull Set<PsiElement> relatedProblems) {
int column = offset - document.getLineStartOffset(document.getLineNumber(offset));
int columnWidth = EditorUtil.getPlainSpaceWidth(editor);
SpacePresentation usagesOffset = new SpacePresentation(column * columnWidth, 0);
InlayPresentation textPresentation = factory.smallText(JavaBundle.message("project.problems.broken.usages", brokenUsages.size()));
SpacePresentation problemsOffset = new SpacePresentation(column * columnWidth, 0);
InlayPresentation textPresentation = factory.smallText(JavaBundle.message("project.problems.hint.text", relatedProblems.size()));
InlayPresentation errorTextPresentation = new AttributesTransformerPresentation(textPresentation, __ ->
editor.getColorsScheme().getAttributes(CodeInsightColors.WRONG_REFERENCES_ATTRIBUTES));
InlayPresentation usagesPresentation = factory.referenceOnHover(errorTextPresentation, (e, p) -> showUsages(member, brokenUsages));
InlayPresentation problemsPresentation = factory.referenceOnHover(errorTextPresentation, (e, p) -> showProblems(member, relatedProblems));
JPopupMenu popupMenu = new JPopupMenu();
JMenuItem item = new JMenuItem(JavaBundle.message("project.problems.settings"));
item.addActionListener(e -> JavaLensProvider.openSettings(JavaLanguage.INSTANCE, project));
popupMenu.add(item);
InlayPresentation withSettings = factory.onClick(usagesPresentation, MouseButton.Right, (e, __) -> {
InlayPresentation withSettings = factory.onClick(problemsPresentation, MouseButton.Right, (e, __) -> {
popupMenu.show(e.getComponent(), e.getX(), e.getY());
return Unit.INSTANCE;
});
return factory.seq(usagesOffset, withSettings);
return factory.seq(problemsOffset, withSettings);
}
private static void showUsages(@NotNull PsiMember member, @NotNull Set<PsiElement> brokenUsages) {
private static void showProblems(@NotNull PsiMember member, @NotNull Set<PsiElement> relatedProblems) {
Project project = member.getProject();
if (brokenUsages.size() == 1) {
PsiElement usage = brokenUsages.iterator().next();
if (usage instanceof Navigatable) ((Navigatable)usage).navigate(true);
if (relatedProblems.size() == 1) {
PsiElement problem = relatedProblems.iterator().next();
if (problem instanceof Navigatable) ((Navigatable)problem).navigate(true);
}
else {
String memberName = Objects.requireNonNull(member.getName());
String memberName = UsageViewUtil.getLongName(member);
UsageViewPresentation presentation = new UsageViewPresentation();
String title = JavaBundle.message("project.problems.window.title", memberName);
presentation.setCodeUsagesString(title);
presentation.setCodeUsagesString(JavaBundle.message("project.problems.title"));
presentation.setTabName(title);
presentation.setTabText(title);
PsiElement[] primary = new PsiElement[]{member};
Usage[] usages = ContainerUtil.map2Array(brokenUsages, new Usage[brokenUsages.size()],
Usage[] usages = ContainerUtil.map2Array(relatedProblems, new Usage[relatedProblems.size()],
e -> UsageInfoToUsageConverter.convert(primary, new UsageInfo(e)));
UsageTarget[] usageTargets = new UsageTarget[]{new BrokenUsageTargetAdapter(member)};
UsageTarget[] usageTargets = new UsageTarget[]{new RelatedProblemTargetAdapter(member)};
UsageViewManager usageViewManager = UsageViewManager.getInstance(project);
usageViewManager.showUsages(usageTargets, usages, presentation);
}
@@ -125,14 +126,16 @@ public class ProjectProblemPassUtils {
});
}
static @NotNull HighlightInfo createHighlightInfo(@NotNull Editor editor, @NotNull PsiElement identifier, @NotNull Set<PsiElement> brokenUsages) {
ShowBrokenUsagesAction brokenUsagesAction = new ShowBrokenUsagesAction(brokenUsages);
return createHighlightInfo(editor, identifier, brokenUsagesAction);
static @NotNull HighlightInfo createHighlightInfo(@NotNull Editor editor,
@NotNull PsiElement identifier,
@NotNull Set<PsiElement> relatedProblems) {
ShowRelatedProblemsAction relatedProblemsAction = new ShowRelatedProblemsAction(relatedProblems);
return createHighlightInfo(editor, identifier, relatedProblemsAction);
}
private static @NotNull HighlightInfo createHighlightInfo(@NotNull Editor editor,
@NotNull PsiElement identifier,
@NotNull IntentionAction action) {
@NotNull PsiElement identifier,
@NotNull IntentionAction action) {
Color textColor = editor.getColorsScheme().getAttributes(CodeInsightColors.WEAK_WARNING_ATTRIBUTES).getEffectColor();
TextAttributes attributes = new TextAttributes(null, null, textColor, null, Font.PLAIN);
@@ -163,7 +166,7 @@ public class ProjectProblemPassUtils {
}
static boolean hintsEnabled() {
return JavaLensProvider.getSettings().isShowBrokenUsages();
return JavaLensProvider.getSettings().isShowRelatedProblems();
}
public static @NotNull Map<PsiMember, Inlay<?>> getInlays(@NotNull Editor editor) {
@@ -275,12 +278,12 @@ public class ProjectProblemPassUtils {
}
}
private static class ShowBrokenUsagesAction extends BaseElementAtCaretIntentionAction {
private static class ShowRelatedProblemsAction extends BaseElementAtCaretIntentionAction {
private final Set<PsiElement> myBrokenUsages;
private final Set<PsiElement> myRelatedProblems;
private ShowBrokenUsagesAction(Set<PsiElement> usages) {
myBrokenUsages = usages;
private ShowRelatedProblemsAction(Set<PsiElement> relatedProblems) {
myRelatedProblems = relatedProblems;
}
@Override
@@ -292,7 +295,7 @@ public class ProjectProblemPassUtils {
public void invoke(@NotNull Project project, Editor editor, @NotNull PsiElement element) throws IncorrectOperationException {
PsiMember member = PsiTreeUtil.getParentOfType(element, PsiMember.class);
if (member == null) return;
showUsages(member, myBrokenUsages);
showProblems(member, myRelatedProblems);
}
@Override
@@ -16,11 +16,11 @@ import javax.swing.*;
import static com.intellij.util.ObjectUtils.tryCast;
class BrokenUsageTargetAdapter implements PsiElementUsageTarget, ItemPresentation {
class RelatedProblemTargetAdapter implements PsiElementUsageTarget, ItemPresentation {
private final SmartPsiElementPointer<PsiElement> myPointer;
BrokenUsageTargetAdapter(@NotNull PsiElement element) {
RelatedProblemTargetAdapter(@NotNull PsiElement element) {
myPointer = SmartPointerManager.createPointer(element);
}
@@ -41,17 +41,17 @@ internal abstract class ProjectProblemsViewTest : LightJavaCodeInsightFixtureTes
val rootPresentation = presentation.root
val sequencePresentation = rootPresentation.content as SequencePresentation
val settingsOnClickPresentation = sequencePresentation.presentations[1] as OnClickPresentation
val usagesOnHoverPresentation = settingsOnClickPresentation.presentation as OnHoverPresentation
usagesOnHoverPresentation.mouseMoved(clickEvent, point)
val usagesDelegatePresentation = usagesOnHoverPresentation.presentation as DynamicDelegatePresentation
val usagesOnClickPresentation = usagesDelegatePresentation.delegate as OnClickPresentation
usagesOnClickPresentation.mouseClicked(clickEvent, point)
val problemOnHoverPresentation = settingsOnClickPresentation.presentation as OnHoverPresentation
problemOnHoverPresentation.mouseMoved(clickEvent, point)
val problemsDelegatePresentation = problemOnHoverPresentation.presentation as DynamicDelegatePresentation
val problemsOnClickPresentation = problemsDelegatePresentation.delegate as OnClickPresentation
problemsOnClickPresentation.mouseClicked(clickEvent, point)
val editor = editorManager.selectedTextEditor!!
val openedFile = FileDocumentManager.getInstance().getFile(editor.document)!!
if (openedFile != targetFile) {
// one problem is reported in inlay, we navigated to this problem
val usagePsiFile = PsiManager.getInstance(project).findFile(openedFile)!!
val psiElement = usagePsiFile.findElementAt(editor.caretModel.offset)!!
val psiFileWithProblem = PsiManager.getInstance(project).findFile(openedFile)!!
val psiElement = psiFileWithProblem.findElementAt(editor.caretModel.offset)!!
problems.add(psiElement)
// restore file for the next iteration
editorManager.openFile(targetFile, true)
@@ -82,7 +82,7 @@ class ProjectProblemsViewPropertyTest : BaseUnivocityTest() {
changedFiles.add(fileToChange.virtualFile)
val expected = findFilesWithBrokenUsages(relatedFiles, members)
val expected = findFilesWithProblems(relatedFiles, members)
assertContainsElements(actual, expected)
i++
@@ -231,7 +231,7 @@ class ProjectProblemsViewPropertyTest : BaseUnivocityTest() {
return possibleOverride == JavaOverridingMethodsSearcher.findOverridingMethod(overrideClass, target, targetClass)
}
private fun findFilesWithBrokenUsages(relatedFiles: Set<VirtualFile>, members: List<ScopedMember>): Set<VirtualFile> {
private fun findFilesWithProblems(relatedFiles: Set<VirtualFile>, members: List<ScopedMember>): Set<VirtualFile> {
val psiManager = PsiManager.getInstance(myProject)
val filesWithErrors = mutableSetOf<VirtualFile>()
for (file in relatedFiles) {
@@ -324,11 +324,11 @@ class ProjectProblemsViewPropertyTest : BaseUnivocityTest() {
val presentation = constrainedPresentations[0]
val rootPresentation = presentation.root
val settingsOnClickPresentation = (rootPresentation.content as SequencePresentation).presentations[1] as OnClickPresentation
val usagesHoverPresentation = settingsOnClickPresentation.presentation as OnHoverPresentation
usagesHoverPresentation.mouseMoved(click, point)
val delegatePresentation = usagesHoverPresentation.presentation as DynamicDelegatePresentation
val usagesClickPresentation = delegatePresentation.delegate as OnClickPresentation
usagesClickPresentation.mouseClicked(click, point)
val problemsHoverPresentation = settingsOnClickPresentation.presentation as OnHoverPresentation
problemsHoverPresentation.mouseMoved(click, point)
val delegatePresentation = problemsHoverPresentation.presentation as DynamicDelegatePresentation
val problemsClickPresentation = delegatePresentation.delegate as OnClickPresentation
problemsClickPresentation.mouseClicked(click, point)
}
}
@@ -1022,11 +1022,11 @@ postfix.template.language.level.title=Minimum language level:
press.0.to.see.inheritors.of.1=Press {0} to see inheritors of {1}
press.0.to.see.non.imported.classes=Press {0} to see non-imported classes
pressing.0.twice.without.a.class.qualifier=Pressing {0} twice without a class qualifier would show all accessible static methods
project.problems.broken.usages={0} broken {0, choice, 0#usage|2#usages}
project.problems.window.title=Broken usages of {0}
project.problems.fix.text=Show broken usages
project.problems.fix.description=Found broken usages of ''{0}''
project.problems.title=Broken usages
project.problems.hint.text={0} related {0, choice, 0#problem|2#problems}
project.problems.window.title=Problems Related to {0}
project.problems.fix.text=Show related problems
project.problems.fix.description=Found related problems
project.problems.title=Related problems
project.problems.settings=Settings...
progress.creating.class=Creating class {0}
progress.title.check.applicability=Check Applicability...