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

Camelcade / Perl5-IDEA / #525521581

06 Jun 2025 08:26AM UTC coverage: 82.33% (-0.02%) from 82.354%
#525521581

push

github

hurricup
Moved debugger properties to the respective bundle

18 of 26 new or added lines in 8 files covered. (69.23%)

158 existing lines in 31 files now uncovered.

30858 of 37481 relevant lines covered (82.33%)

0.82 hits per line

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

96.43
/plugin/core/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.perl5.PerlBundle;
26
import com.perl5.lang.perl.lexer.PerlElementTypes;
27
import com.perl5.lang.perl.psi.PerlNamespaceDefinitionElement;
28
import com.perl5.lang.perl.psi.PerlNamespaceDefinitionWithIdentifier;
29
import com.perl5.lang.perl.psi.PerlSubDefinitionElement;
30
import com.perl5.lang.perl.psi.PerlSubElement;
31
import com.perl5.lang.perl.psi.impl.PerlPolyNamedElement;
32
import com.perl5.lang.perl.psi.light.PerlDelegatingLightNamedElement;
33
import org.jetbrains.annotations.NotNull;
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✔
UNCOV
65
      nameIdentifier = element;
×
66
    }
67

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

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

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

85
      result.add(getMarkerInfo(builder, nameIdentifier));
1✔
86
    }
87
  }
1✔
88

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

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

106
      PerlSubElement parentSub = subElement.getDirectSuperMethod();
1✔
107

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

114
        result.add(getMarkerInfo(builder, nameIdentifier));
1✔
115
      }
116

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

125
        result.add(getMarkerInfo(builder, nameIdentifier));
1✔
126
      }
127
    }
128
  }
1✔
129
}
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