diff --git a/third_party/src/main/java/com/jetbrains/lang/dart/ide/marker/DartMethodLineMarkerProvider.java b/third_party/src/main/java/com/jetbrains/lang/dart/ide/marker/DartMethodLineMarkerProvider.java index 702b5a5d1..fc9873a93 100644 --- a/third_party/src/main/java/com/jetbrains/lang/dart/ide/marker/DartMethodLineMarkerProvider.java +++ b/third_party/src/main/java/com/jetbrains/lang/dart/ide/marker/DartMethodLineMarkerProvider.java @@ -14,6 +14,7 @@ import com.intellij.psi.PsiWhiteSpace; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.FunctionUtil; +import com.intellij.util.IconUtil; import com.jetbrains.lang.dart.psi.*; import com.jetbrains.lang.dart.psi.impl.AbstractDartMethodDeclarationImpl; import org.jetbrains.annotations.NotNull; @@ -54,9 +55,14 @@ public LineMarkerInfo getLineMarkerInfo(final @NotNull PsiElement element) { PsiElement anchor = PsiTreeUtil.getDeepestFirst(markerLocation); // finally, create the marker - LineMarkerInfo info = new LineMarkerInfo<>(anchor, anchor.getTextRange(), null, FunctionUtil.nullConstant(), null, - GutterIconRenderer.Alignment.RIGHT); - EditorColorsScheme scheme = EditorColorsManager.getInstance().getGlobalScheme(); + LineMarkerInfo info = new LineMarkerInfo<>(anchor, + anchor.getTextRange(), + IconUtil.getEmptyIcon(true), + FunctionUtil.nullConstant(), + null, + GutterIconRenderer.Alignment.RIGHT, + () -> "Method separator"); + EditorColorsScheme scheme = EditorColorsManager.getInstance().getGlobalScheme(); info.separatorColor = scheme.getColor(CodeInsightColors.METHOD_SEPARATORS_COLOR); info.separatorPlacement = SeparatorPlacement.TOP; return info; diff --git a/third_party/src/main/java/com/jetbrains/lang/dart/ide/marker/DartServerImplementationsMarkerProvider.java b/third_party/src/main/java/com/jetbrains/lang/dart/ide/marker/DartServerImplementationsMarkerProvider.java index e55211051..7d8ec64c5 100644 --- a/third_party/src/main/java/com/jetbrains/lang/dart/ide/marker/DartServerImplementationsMarkerProvider.java +++ b/third_party/src/main/java/com/jetbrains/lang/dart/ide/marker/DartServerImplementationsMarkerProvider.java @@ -63,43 +63,63 @@ public LineMarkerInfo getLineMarkerInfo(final @NotNull PsiElement element) { return null; } - private static @NotNull LineMarkerInfo createMarkerClass(final @NotNull DartComponentName name) { - final VirtualFile file = name.getContainingFile().getVirtualFile(); - PsiElement anchor = PsiTreeUtil.getDeepestFirst(name); - return new LineMarkerInfo<>(anchor, anchor.getTextRange(), AllIcons.Gutter.OverridenMethod, - element -> DaemonBundle.message("class.is.subclassed.too.many"), (e, __) -> { - DartAnalysisServerService das = DartAnalysisServerService.getInstance(name.getProject()); - final List items = das.search_getTypeHierarchy(file, anchor.getTextRange().getStartOffset(), false); - if (items.isEmpty()) { - return; - } - // TODO(scheglov) Consider using just Element(s), not PsiElement(s) for better performance - final Set components = - DartInheritorsSearcher.getSubClasses(name.getProject(), GlobalSearchScope.allScope(name.getProject()), items); - String popupTitle = DaemonBundle.message("navigation.title.subclass", name.getName(), components.size(), ""); - String findUsagesTitle = DartBundle.message("tab.title.subclasses.of.0", name.getName()); - PsiElementListNavigator.openTargets(e, DartResolveUtil.getComponentNameArray(components), popupTitle, findUsagesTitle, - new DefaultPsiElementCellRenderer()); - }, GutterIconRenderer.Alignment.RIGHT); - } + private static @NotNull LineMarkerInfo createMarkerClass(final @NotNull DartComponentName name) { + final VirtualFile file = name.getContainingFile().getVirtualFile(); + PsiElement anchor = PsiTreeUtil.getDeepestFirst(name); + String accessibleName = DaemonBundle.message("class.is.subclassed.too.many"); + + return new LineMarkerInfo<>( + anchor, + anchor.getTextRange(), + AllIcons.Gutter.OverridenMethod, + element -> accessibleName, + (e, __) -> { + DartAnalysisServerService das = DartAnalysisServerService.getInstance(name.getProject()); + final List items = das.search_getTypeHierarchy(file, anchor.getTextRange().getStartOffset(), false); + if (items.isEmpty()) { + return; + } + // TODO(scheglov) Consider using just Element(s), not PsiElement(s) for better performance + final Set components = + DartInheritorsSearcher.getSubClasses(name.getProject(), GlobalSearchScope.allScope(name.getProject()), items); + String popupTitle = DaemonBundle.message("navigation.title.subclass", name.getName(), components.size(), ""); + String findUsagesTitle = DartBundle.message("tab.title.subclasses.of.0", name.getName()); + PsiElementListNavigator.openTargets(e, DartResolveUtil.getComponentNameArray(components), popupTitle, findUsagesTitle, + new DefaultPsiElementCellRenderer()); + }, + GutterIconRenderer.Alignment.RIGHT, + () -> accessibleName + ); + } + + + private static @NotNull LineMarkerInfo createMarkerMember(final @NotNull DartComponentName name) { + final VirtualFile file = name.getContainingFile().getVirtualFile(); + PsiElement anchor = PsiTreeUtil.getDeepestFirst(name); + String accessibleName = DaemonBundle.message("method.is.overridden.too.many"); + + return new LineMarkerInfo<>( + anchor, + anchor.getTextRange(), + AllIcons.Gutter.OverridenMethod, + element -> accessibleName, + (e, __) -> { + DartAnalysisServerService das = DartAnalysisServerService.getInstance(name.getProject()); + final List items = das.search_getTypeHierarchy(file, anchor.getTextRange().getStartOffset(), false); + if (items.isEmpty()) { + return; + } + // TODO(scheglov) Consider using just Element(s), not PsiElement(s) for better performance + final Set components = + DartInheritorsSearcher.getSubMembers(name.getProject(), GlobalSearchScope.allScope(name.getProject()), items); + String popupTitle = DaemonBundle.message("navigation.title.overrider.method", name.getName(), components.size()); + String findUsagesTitle = DartBundle.message("tab.title.overriding.methods.of.0", name.getName()); + PsiElementListNavigator.openTargets(e, DartResolveUtil.getComponentNameArray(components), popupTitle, findUsagesTitle, + new DefaultPsiElementCellRenderer()); + }, + GutterIconRenderer.Alignment.RIGHT, + () -> accessibleName + ); + } - private static @NotNull LineMarkerInfo createMarkerMember(final @NotNull DartComponentName name) { - final VirtualFile file = name.getContainingFile().getVirtualFile(); - PsiElement anchor = PsiTreeUtil.getDeepestFirst(name); - return new LineMarkerInfo<>(anchor, anchor.getTextRange(), AllIcons.Gutter.OverridenMethod, - element -> DaemonBundle.message("method.is.overridden.too.many"), (e, __) -> { - DartAnalysisServerService das = DartAnalysisServerService.getInstance(name.getProject()); - final List items = das.search_getTypeHierarchy(file, anchor.getTextRange().getStartOffset(), false); - if (items.isEmpty()) { - return; - } - // TODO(scheglov) Consider using just Element(s), not PsiElement(s) for better performance - final Set components = - DartInheritorsSearcher.getSubMembers(name.getProject(), GlobalSearchScope.allScope(name.getProject()), items); - String popupTitle = DaemonBundle.message("navigation.title.overrider.method", name.getName(), components.size()); - String findUsagesTitle = DartBundle.message("tab.title.overriding.methods.of.0", name.getName()); - PsiElementListNavigator.openTargets(e, DartResolveUtil.getComponentNameArray(components), popupTitle, findUsagesTitle, - new DefaultPsiElementCellRenderer()); - }, GutterIconRenderer.Alignment.RIGHT); - } } diff --git a/third_party/src/main/java/com/jetbrains/lang/dart/ide/marker/DartServerOverrideMarkerProvider.java b/third_party/src/main/java/com/jetbrains/lang/dart/ide/marker/DartServerOverrideMarkerProvider.java index 54383d184..f57dbb596 100644 --- a/third_party/src/main/java/com/jetbrains/lang/dart/ide/marker/DartServerOverrideMarkerProvider.java +++ b/third_party/src/main/java/com/jetbrains/lang/dart/ide/marker/DartServerOverrideMarkerProvider.java @@ -49,7 +49,7 @@ private static void addDartComponent(List components, Project pro } } - private static @Nullable LineMarkerInfo createOverrideMarker(DartComponentName componentName) { + private static @Nullable LineMarkerInfo createOverrideMarker(final DartComponentName componentName) { final VirtualFile virtualFile = componentName.getContainingFile().getVirtualFile(); if (virtualFile == null || !virtualFile.isInLocalFileSystem()) { return null; @@ -75,46 +75,49 @@ private static void addDartComponent(List components, Project pro return tryCreateOverrideMarker(componentName, superclassComponent, interfaceComponents); } - private static @Nullable LineMarkerInfo tryCreateOverrideMarker(final @NotNull DartComponentName componentName, - final @Nullable DartComponent superclassComponent, - final @NotNull List interfaceComponents) { - if (superclassComponent == null && interfaceComponents.isEmpty()) { - return null; - } - final String name = componentName.getName(); - final boolean overrides; - final DartComponent superComponent; - if (superclassComponent != null) { - overrides = true; - superComponent = superclassComponent; - } - else { - overrides = false; - superComponent = interfaceComponents.getFirst(); + private static @Nullable LineMarkerInfo tryCreateOverrideMarker(final @NotNull DartComponentName componentName, + final @Nullable DartComponent superclassComponent, + final @NotNull List interfaceComponents) { + if (superclassComponent == null && interfaceComponents.isEmpty()) { + return null; + } + final String name = componentName.getName(); + final boolean overrides; + final DartComponent superComponent; + if (superclassComponent != null) { + overrides = true; + superComponent = superclassComponent; + } + else { + overrides = false; + superComponent = interfaceComponents.getFirst(); + } + + // Generate the tooltip/accessible name string once + final String accessibleName; + final DartClass superClass = PsiTreeUtil.getParentOfType(superComponent, DartClass.class); + if (superClass == null) { + accessibleName = "null"; + } else if (overrides) { + accessibleName = DartBundle.message(superclassComponent.isOperator() ? "overrides.operator.in" : "overrides.method.in", name, superClass.getName()); + } else { + accessibleName = DartBundle.message("implements.method.in", name, superClass.getName()); + } + + final Icon icon = overrides ? AllIcons.Gutter.OverridingMethod : AllIcons.Gutter.ImplementingMethod; + PsiElement anchor = PsiTreeUtil.getDeepestFirst(componentName); + + return new LineMarkerInfo<>(anchor, anchor.getTextRange(), icon, __ -> accessibleName, (e, __) -> { + List superComponents = new ArrayList<>(); + if (superclassComponent != null) { + superComponents.add(superclassComponent); + } + superComponents.addAll(interfaceComponents); + PsiElementListNavigator.openTargets(e, DartResolveUtil.getComponentNameArray(superComponents), + DaemonBundle.message("navigation.title.super.method", name), + DaemonBundle.message("navigation.findUsages.title.super.method", name), + new DefaultPsiElementCellRenderer()); + }, GutterIconRenderer.Alignment.LEFT, () -> accessibleName); } - final Icon icon = overrides ? AllIcons.Gutter.OverridingMethod : AllIcons.Gutter.ImplementingMethod; - PsiElement anchor = PsiTreeUtil.getDeepestFirst(componentName); - return new LineMarkerInfo<>(anchor, anchor.getTextRange(), icon, __ -> { - final DartClass superClass = PsiTreeUtil.getParentOfType(superComponent, DartClass.class); - if (superClass == null) return "null"; - if (overrides) { - return DartBundle.message(superclassComponent.isOperator() ? "overrides.operator.in" - : "overrides.method.in", - name, - superClass.getName()); - } - return DartBundle.message("implements.method.in", name, superClass.getName()); - }, (e, __) -> { - List superComponents = new ArrayList<>(); - if (superclassComponent != null) { - superComponents.add(superclassComponent); - } - superComponents.addAll(interfaceComponents); - PsiElementListNavigator.openTargets(e, DartResolveUtil.getComponentNameArray(superComponents), - DaemonBundle.message("navigation.title.super.method", name), - DaemonBundle.message("navigation.findUsages.title.super.method", name), - new DefaultPsiElementCellRenderer()); - }, GutterIconRenderer.Alignment.LEFT); - } }