in src/org/intellij/grammar/editor/BnfRuleLineMarkerProvider.java [38:84]
public void collectNavigationMarkers(@NotNull List<? extends PsiElement> elements,
@NotNull Collection<? super RelatedItemLineMarkerInfo<?>> result,
boolean forNavigation) {
Set<PsiElement> visited = forNavigation ? new HashSet<>() : null;
for (PsiElement element : elements) {
PsiElement parent = element.getParent();
boolean isRuleId = parent instanceof BnfRule && (forNavigation || element == ((BnfRule)parent).getId());
if (!(isRuleId || forNavigation && element instanceof BnfExpression)) continue;
List<PsiElement> items = new ArrayList<>();
NavigatablePsiElement method = getMethod(element);
if (method != null && (!forNavigation || visited.add(method))) {
items.add(method);
}
boolean hasPSI = false;
if (isRuleId) {
BnfRule rule = RuleGraphHelper.getSynonymTargetOrSelf((BnfRule)parent);
if (RuleGraphHelper.hasPsiClass(rule)) {
hasPSI = true;
JavaHelper javaHelper = JavaHelper.getJavaHelper(rule);
Couple<String> names = ParserGeneratorUtil.getQualifiedRuleClassName(rule);
for (String className : new String[]{names.first, names.second}) {
NavigatablePsiElement aClass = javaHelper.findClass(className);
if (aClass != null && (!forNavigation || visited.add(aClass))) {
items.add(aClass);
}
}
}
}
if (!items.isEmpty()) {
AnAction action = ActionManager.getInstance().getAction("GotoRelated");
String tooltipAd = "";
String popupTitleAd = "";
if (action != null) {
String shortcutText = KeymapUtil.getFirstKeyboardShortcutText(action);
String actionText = StringUtil.isEmpty(shortcutText) ? "'" + action.getTemplatePresentation().getText() + "' action" : shortcutText;
tooltipAd = "\nGo to sub-expression code via " + actionText;
popupTitleAd = " (for sub-expressions use " + actionText + ")";
}
String title = "parser " + (hasPSI ? "and PSI " : "") + "code";
NavigationGutterIconBuilder<PsiElement> builder = NavigationGutterIconBuilder.create(BnfIcons.RELATED_METHOD).
setTargets(items).
setTooltipText("Click to navigate to "+title + tooltipAd).
setPopupTitle(StringUtil.capitalize(title) + popupTitleAd);
result.add(builder.createLineMarkerInfo(element));
}
}
}