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

Camelcade / Perl5-IDEA / #525521660

24 Aug 2025 01:28PM UTC coverage: 75.89% (-6.3%) from 82.227%
#525521660

push

github

hurricup
Migrated coverage reporting to https://github.com/nbaztec/coveralls-jacoco-gradle-plugin

See: https://github.com/kt3k/coveralls-gradle-plugin/issues/119

14751 of 22639 branches covered (65.16%)

Branch coverage included in aggregate %.

31091 of 37767 relevant lines covered (82.32%)

0.82 hits per line

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

93.18
/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.psi.*;
28
import com.perl5.lang.perl.psi.impl.PerlPolyNamedElement;
29
import com.perl5.lang.perl.psi.light.PerlDelegatingLightNamedElement;
30
import com.perl5.lang.perl.util.PerlSubUtil;
31
import org.jetbrains.annotations.NotNull;
32
import org.jetbrains.annotations.Nullable;
33

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

38

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

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

67
    List<PerlNamespaceDefinitionElement> parentNamespaces =
1✔
68
      PerlNamespaceDefinitionHandler.instance(element).getParentNamespaceDefinitions(element);
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 =
1✔
79
      PerlNamespaceDefinitionHandler.instance(element).getChildNamespaceDefinitions(element);
1✔
80
    if (!childNamespaces.isEmpty()) {
1✔
81
      NavigationGutterIconBuilder<PsiElement> builder = NavigationGutterIconBuilder
1✔
82
        .create(AllIcons.Gutter.ImplementedMethod)
1✔
83
        .setTargets(childNamespaces)
1✔
84
        .setTooltipText(PerlBundle.message("tooltip.subclasses"));
1✔
85

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

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

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

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

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

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

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

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