• 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

77.78
/plugin/common/src/main/java/com/perl5/lang/perl/parser/elementTypes/PerlDereferenceElementType.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.parser.elementTypes;
18

19
import com.intellij.lang.ASTNode;
20
import com.intellij.lang.Language;
21
import com.intellij.lang.PsiBuilderUtil;
22
import com.intellij.lexer.Lexer;
23
import com.intellij.openapi.project.Project;
24
import com.intellij.psi.tree.IElementType;
25
import com.perl5.lang.perl.idea.editor.PerlBraceMatcher;
26
import com.perl5.lang.perl.lexer.PerlTemplatingLexer;
27
import org.jetbrains.annotations.NotNull;
28

29
import java.util.Stack;
30

31
import static com.perl5.lang.perl.lexer.PerlLexer.AFTER_VARIABLE;
32
import static com.perl5.lang.perl.parser.PerlElementTypesGenerated.*;
33

34
public abstract class PerlDereferenceElementType extends PerlReparseableElementType {
35
  public PerlDereferenceElementType(@NotNull String debugName) {
36
    super(debugName);
1✔
37
  }
1✔
38

39
  @Override
40
  protected boolean isReparseableOld(@NotNull ASTNode parent,
41
                                     @NotNull CharSequence buffer,
42
                                     @NotNull Language fileLanguage,
43
                                     @NotNull Project project) {
44
    Lexer lexer = createLexer(parent, this);
1✔
45
    boolean result = hasProperTokensStructure(buffer, lexer);
1✔
46
    if (LOG.isDebugEnabled()) {
1!
47
      LOG.debug(this + " reparseable: ", result && isLexerStateOk(lexer.getState()),
1!
48
                "; balanced: ", result,
1✔
49
                "; lexer state: ", lexer.getState());
1✔
50
    }
51
    return result && isLexerStateOk(lexer.getState());
1!
52
  }
53

54
  private boolean isLexerStateOk(int lexerState) {
55
    return PerlTemplatingLexer.getPerlLexerState(lexerState) == AFTER_VARIABLE;
1!
56
  }
57

58
  /**
59
   * Improved copy of {@link PsiBuilderUtil#hasProperBraceBalance(CharSequence, com.intellij.lexer.Lexer, IElementType, IElementType)}
60
   * Checks that all perl braces within range are balanced and properly nested
61
   */
62
  private boolean hasProperTokensStructure(@NotNull CharSequence text,
63
                                           @NotNull Lexer lexer) {
64
    lexer.start(text);
1✔
65

66
    if (lexer.getTokenType() != getSigilTokenType()) {
1!
67
      return false;
×
68
    }
69

70
    lexer.advance();
1✔
71
    skipSpaces(lexer);
1✔
72
    if (lexer.getTokenType() != getOpenBraceTokenType()) {
1✔
73
      return false;
1✔
74
    }
75

76
    lexer.advance();
1✔
77
    skipSpaces(lexer);
1✔
78
    IElementType tokenType = lexer.getTokenType();
1✔
79
    if (tokenType == getVariableNameTokenType() || tokenType == getCloseBraceTokenType()) {
1!
80
      // turned to ${varname}
81
      return false;
1✔
82
    }
83

84
    Stack<IElementType> bracesStack = new Stack<>();
1✔
85
    bracesStack.push(getOpenBraceTokenType());
1✔
86

87
    return checkBracesBalance(lexer, bracesStack);
1✔
88
  }
89

90
  protected abstract @NotNull IElementType getSigilTokenType();
91

92
  protected abstract @NotNull IElementType getOpenBraceTokenType();
93

94
  protected final @NotNull IElementType getCloseBraceTokenType() {
95
    return PerlBraceMatcher.PERL_BRACES_MAP.get(getOpenBraceTokenType());
1!
96
  }
97

98
  protected abstract @NotNull IElementType getVariableNameTokenType();
99

100
  public static class Scalar extends PerlDereferenceElementType {
101
    public Scalar(@NotNull String debugName) {
102
      super(debugName);
1✔
103
    }
1✔
104

105
    @Override
106
    protected @NotNull IElementType getSigilTokenType() {
107
      return SIGIL_SCALAR;
1!
108
    }
109

110
    @Override
111
    protected @NotNull IElementType getOpenBraceTokenType() {
112
      return LEFT_BRACE_SCALAR;
1!
113
    }
114

115
    @Override
116
    protected @NotNull IElementType getVariableNameTokenType() {
117
      return SCALAR_NAME;
1!
118
    }
119
  }
120

121
  public static class ScalarIndex extends Scalar {
122
    public ScalarIndex(@NotNull String debugName) {
123
      super(debugName);
1✔
124
    }
1✔
125

126
    @Override
127
    protected @NotNull IElementType getSigilTokenType() {
128
      return SIGIL_SCALAR_INDEX;
1!
129
    }
130
  }
131

132

133
  public static class Array extends PerlDereferenceElementType {
134
    public Array(@NotNull String debugName) {
135
      super(debugName);
1✔
136
    }
1✔
137

138
    @Override
139
    protected @NotNull IElementType getSigilTokenType() {
140
      return SIGIL_ARRAY;
1!
141
    }
142

143
    @Override
144
    protected @NotNull IElementType getOpenBraceTokenType() {
145
      return LEFT_BRACE_ARRAY;
1!
146
    }
147

148
    @Override
149
    protected @NotNull IElementType getVariableNameTokenType() {
150
      return ARRAY_NAME;
1!
151
    }
152
  }
153

154
  public static class Hash extends PerlDereferenceElementType {
155
    public Hash(@NotNull String debugName) {
156
      super(debugName);
1✔
157
    }
1✔
158

159
    @Override
160
    protected @NotNull IElementType getSigilTokenType() {
161
      return SIGIL_HASH;
1!
162
    }
163

164
    @Override
165
    protected @NotNull IElementType getOpenBraceTokenType() {
166
      return LEFT_BRACE_HASH;
1!
167
    }
168

169
    @Override
170
    protected @NotNull IElementType getVariableNameTokenType() {
171
      return HASH_NAME;
1!
172
    }
173
  }
174

175
  public static class Code extends PerlDereferenceElementType {
176
    public Code(@NotNull String debugName) {
177
      super(debugName);
1✔
178
    }
1✔
179

180
    @Override
181
    protected @NotNull IElementType getSigilTokenType() {
182
      return SIGIL_CODE;
1!
183
    }
184

185
    @Override
186
    protected @NotNull IElementType getOpenBraceTokenType() {
187
      return LEFT_BRACE_CODE;
1!
188
    }
189

190
    @Override
191
    protected @NotNull IElementType getVariableNameTokenType() {
192
      return SUB_NAME;
1!
193
    }
194
  }
195

196
  public static class Glob extends PerlDereferenceElementType {
197
    public Glob(@NotNull String debugName) {
198
      super(debugName);
1✔
199
    }
1✔
200

201
    @Override
202
    protected @NotNull IElementType getSigilTokenType() {
203
      return SIGIL_GLOB;
1!
204
    }
205

206
    @Override
207
    protected @NotNull IElementType getOpenBraceTokenType() {
208
      return LEFT_BRACE_GLOB;
1!
209
    }
210

211
    @Override
212
    protected @NotNull IElementType getVariableNameTokenType() {
213
      return GLOB_NAME;
1!
214
    }
215
  }
216
}
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