@Override protected void collectNavigationMarkers( @NotNull PsiElement element, Collection<? super RelatedItemLineMarkerInfo> result) { if (element instanceof PerlNamespaceDefinition) { PsiElement nameIdentifier = ((PerlNamespaceDefinition) element).getNameIdentifier(); if (nameIdentifier == null) nameIdentifier = element; List<PerlNamespaceDefinition> parentNamespaces = ((PerlNamespaceDefinition) element).getParentNamespaceDefinitions(); if (parentNamespaces.size() > 0) { NavigationGutterIconBuilder<PsiElement> builder = NavigationGutterIconBuilder.create(AllIcons.Gutter.ImplementingMethod) .setTargets(parentNamespaces) .setTooltipText("Parent classes"); result.add(builder.createLineMarkerInfo(nameIdentifier)); } Collection<PerlNamespaceDefinition> childNamespaces = ((PerlNamespaceDefinition) element).getChildNamespaceDefinitions(); if (childNamespaces.size() > 0) { NavigationGutterIconBuilder<PsiElement> builder = NavigationGutterIconBuilder.create(AllIcons.Gutter.ImplementedMethod) .setTargets(childNamespaces) .setTooltipText("Subclasses"); result.add(builder.createLineMarkerInfo(nameIdentifier)); } } else if (element instanceof PerlSubDefinitionBase && ((PerlSubDefinitionBase) element).isMethod()) { PerlNamespaceDefinition containingNamespace = PsiTreeUtil.getParentOfType(element, PerlNamespaceDefinition.class); if (containingNamespace != null) { final String packageName = ((PerlSubDefinitionBase) element).getPackageName(); final String subName = ((PerlSubDefinitionBase) element).getSubName(); PsiElement nameIdentifier = ((PerlSubDefinitionBase) element).getNameIdentifier(); if (nameIdentifier == null) nameIdentifier = element; if (StringUtil.isNotEmpty(packageName) && StringUtil.isNotEmpty(subName)) { Collection<PsiElement> superMethods = PerlMro.resolveSub(element.getProject(), packageName, subName, true); if (superMethods.size() > 0) { NavigationGutterIconBuilder<PsiElement> builder = NavigationGutterIconBuilder.create(AllIcons.Gutter.OverridingMethod) .setTargets(superMethods) .setTooltipText("Overriding method"); result.add(builder.createLineMarkerInfo(nameIdentifier)); } final List<PerlSubBase> overridingSubs = new ArrayList<PerlSubBase>(); PerlPackageUtil.processChildNamespacesSubs( containingNamespace, null, new Processor<PerlSubBase>() { @Override public boolean process(PerlSubBase perlSubBase) { String subBaseName = perlSubBase.getSubName(); if (StringUtil.isNotEmpty(subBaseName) && subName.equals(subBaseName) && perlSubBase.isMethod()) { overridingSubs.add(perlSubBase); return false; } return true; } }); if (overridingSubs.size() > 0) { NavigationGutterIconBuilder<PsiElement> builder = NavigationGutterIconBuilder.create(AllIcons.Gutter.OverridenMethod) .setTargets(overridingSubs) .setTooltipText("Overriden methods"); result.add(builder.createLineMarkerInfo(nameIdentifier)); } } } } }