• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Camelcade / Perl5-IDEA / #525521635

20 Jul 2025 03:45PM UTC coverage: 82.266% (-0.09%) from 82.355%
#525521635

push

github

hurricup
Build 252.23892.248

30936 of 37605 relevant lines covered (82.27%)

0.82 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

96.55
/plugin/backend/src/main/java/com/perl5/lang/perl/idea/navigation/PerlLineMarkerProvider.java
1
/*
2
 * Copyright 2015-2025 Alexandr Evstigneev
3
 *
4
 * Licensed under the Apache License, Version 2.0 (the "License");
5
 * you may not use this file except in compliance with the License.
6
 * You may obtain a copy of the License at
7
 *
8
 * http://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 * Unless required by applicable law or agreed to in writing, software
11
 * distributed under the License is distributed on an "AS IS" BASIS,
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 * See the License for the specific language governing permissions and
14
 * limitations under the License.
15
 */
16

17
package com.perl5.lang.perl.idea.navigation;
18

19
import com.intellij.codeInsight.daemon.RelatedItemLineMarkerInfo;
20
import com.intellij.codeInsight.daemon.RelatedItemLineMarkerProvider;
21
import com.intellij.codeInsight.navigation.NavigationGutterIconBuilder;
22
import com.intellij.icons.AllIcons;
23
import com.intellij.psi.PsiElement;
24
import com.intellij.psi.util.PsiTreeUtil;
25
import com.intellij.util.Processor;
26
import com.perl5.PerlBundle;
27
import com.perl5.lang.perl.lexer.PerlElementTypes;
28
import com.perl5.lang.perl.psi.*;
29
import com.perl5.lang.perl.psi.impl.PerlPolyNamedElement;
30
import com.perl5.lang.perl.psi.light.PerlDelegatingLightNamedElement;
31
import com.perl5.lang.perl.util.PerlSubUtil;
32
import org.jetbrains.annotations.NotNull;
33
import org.jetbrains.annotations.Nullable;
34

35
import java.util.ArrayList;
36
import java.util.Collection;
37
import java.util.List;
38

39

40
public class PerlLineMarkerProvider extends RelatedItemLineMarkerProvider implements PerlElementTypes {
1✔
41
  @Override
42
  protected void collectNavigationMarkers(@NotNull PsiElement element, @NotNull Collection<? super RelatedItemLineMarkerInfo<?>> result) {
43
    switch (element) {
1✔
44
      case PerlNamespaceDefinitionWithIdentifier namespaceDefinition -> addNamespaceMarkers(namespaceDefinition, result);
1✔
45
      case PerlSubDefinitionElement subDefinition when subDefinition.isMethod() -> addSubDefinitionsMarkers(subDefinition, result);
1✔
46
      case PerlPolyNamedElement<?> polyNamedElement -> {
1✔
47
        for (PerlDelegatingLightNamedElement<?> lightNamedElement : polyNamedElement.getLightElements()) {
1✔
48
          if (lightNamedElement instanceof PerlNamespaceDefinitionWithIdentifier namespaceDefinition) {
1✔
49
            addNamespaceMarkers(namespaceDefinition, result);
1✔
50
          }
51
          else if (lightNamedElement instanceof PerlSubDefinitionElement subDefinition && subDefinition.isMethod()) {
1✔
52
            addSubDefinitionsMarkers(subDefinition, result);
1✔
53
          }
54
        }
1✔
55
      }
1✔
56
      default -> {
57
      }
1✔
58
    }
59
  }
1✔
60

61
  private void addNamespaceMarkers(@NotNull PerlNamespaceDefinitionWithIdentifier element,
62
                                   Collection<? super RelatedItemLineMarkerInfo<?>> result) {
63
    PsiElement nameIdentifier = element.getNameIdentifier();
1✔
64
    if (nameIdentifier == null) {
1✔
65
      nameIdentifier = element;
×
66
    }
67

68
    List<PerlNamespaceDefinitionElement> parentNamespaces =
1✔
69
      PerlNamespaceDefinitionHandler.instance(element).getParentNamespaceDefinitions(element);
1✔
70
    if (!parentNamespaces.isEmpty()) {
1✔
71
      NavigationGutterIconBuilder<PsiElement> builder = NavigationGutterIconBuilder
1✔
72
        .create(AllIcons.Gutter.ImplementingMethod)
1✔
73
        .setTargets(parentNamespaces)
1✔
74
        .setTooltipText(PerlBundle.message("tooltip.parent.classes"));
1✔
75

76
      result.add(getMarkerInfo(builder, nameIdentifier));
1✔
77
    }
78

79
    Collection<PerlNamespaceDefinitionElement> childNamespaces =
1✔
80
      PerlNamespaceDefinitionHandler.instance(element).getChildNamespaceDefinitions(element);
1✔
81
    if (!childNamespaces.isEmpty()) {
1✔
82
      NavigationGutterIconBuilder<PsiElement> builder = NavigationGutterIconBuilder
1✔
83
        .create(AllIcons.Gutter.ImplementedMethod)
1✔
84
        .setTargets(childNamespaces)
1✔
85
        .setTooltipText(PerlBundle.message("tooltip.subclasses"));
1✔
86

87
      result.add(getMarkerInfo(builder, nameIdentifier));
1✔
88
    }
89
  }
1✔
90

91
  private RelatedItemLineMarkerInfo<?> getMarkerInfo(@NotNull NavigationGutterIconBuilder<PsiElement> builder,
92
                                                     @NotNull PsiElement element) {
93
    while (element.getFirstChild() != null) {
1✔
94
      element = element.getFirstChild();
1✔
95
    }
96
    return builder.createLineMarkerInfo(element);
1✔
97
  }
98

99
  private void addSubDefinitionsMarkers(@NotNull PerlSubDefinitionElement subElement,
100
                                        Collection<? super RelatedItemLineMarkerInfo<?>> result) {
101
    PerlNamespaceDefinitionElement containingNamespace = PsiTreeUtil.getParentOfType(subElement, PerlNamespaceDefinitionElement.class);
1✔
102
    if (containingNamespace != null) {
1✔
103
      PsiElement nameIdentifier = subElement.getNameIdentifier();
1✔
104
      if (nameIdentifier == null) {
1✔
105
        nameIdentifier = subElement;
×
106
      }
107

108
      @Nullable PerlSubElement parentSub = PerlSubUtil.getDirectSuperMethod(subElement);
1✔
109

110
      if (parentSub != null) {
1✔
111
        NavigationGutterIconBuilder<PsiElement> builder = NavigationGutterIconBuilder
1✔
112
          .create(AllIcons.Gutter.OverridingMethod)
1✔
113
          .setTarget(parentSub)
1✔
114
          .setTooltipText(PerlBundle.message("tooltip.overriding.method"));
1✔
115

116
        result.add(getMarkerInfo(builder, nameIdentifier));
1✔
117
      }
118

119
      List<PerlSubElement> overridingSubs = new ArrayList<>();
1✔
120
      PerlSubUtil.processDirectOverridingSubs(subElement, (Processor<? super PerlSubDefinitionElement>)overridingSubs::add);
1✔
121
      if (!overridingSubs.isEmpty()) {
1✔
122
        NavigationGutterIconBuilder<PsiElement> builder = NavigationGutterIconBuilder
1✔
123
          .create(AllIcons.Gutter.OverridenMethod)
1✔
124
          .setTargets(overridingSubs)
1✔
125
          .setTooltipText(PerlBundle.message("tooltip.overridden.methods"));
1✔
126

127
        result.add(getMarkerInfo(builder, nameIdentifier));
1✔
128
      }
129
    }
130
  }
1✔
131
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc