• 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

91.01
/mason/mason2/common/src/main/java/com/perl5/lang/perl/parser/Mason2TemplatingParserImpl.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;
18

19
import com.intellij.lang.PsiBuilder;
20
import com.intellij.lang.WhitespacesBinders;
21
import com.intellij.lang.parser.GeneratedParserUtilBase;
22
import com.intellij.psi.tree.IElementType;
23
import com.perl5.lang.mason2.Mason2Bundle;
24

25
import static com.perl5.lang.mason2.elementType.Mason2ElementTypes.*;
26
import static com.perl5.lang.perl.parser.PerlElementTypesGenerated.*;
27

28

29
public class Mason2TemplatingParserImpl extends Mason2ParserImpl {
1✔
30

31
  @Override
32
  public boolean parseStatement(PsiBuilder b, int l) {
33
    IElementType tokenType = b.getTokenType();
1✔
34

35
    boolean r = false;
1✔
36
    PsiBuilder.Marker m = b.mark();
1✔
37

38
    if (tokenType == MASON_BLOCK_OPENER) {
1✔
39
      PsiBuilder.Marker statementMarker = b.mark();
1✔
40
      b.advanceLexer();
1✔
41
      if (PerlParserProxy.expr(b, l, -1)) {
1✔
42
        // parseStatement filter
43
        if (GeneratedParserUtilBase.consumeToken(b, MASON_EXPR_FILTER_PIPE)) {
1✔
44
          while (b.getTokenType() == IDENTIFIER) {
1!
45
            PsiBuilder.Marker fm = b.mark();
1✔
46
            b.advanceLexer();
1✔
47
            fm.collapse(SUB_NAME);
1✔
48
            fm.precede().done(METHOD);
1✔
49

50
            if (!GeneratedParserUtilBase.consumeToken(b, COMMA)) {
1!
51
              break;
1✔
52
            }
53
          }
×
54
        }
55
      }
56
      if (r = MasonParserUtil.endOrRecover(b, MASON_BLOCK_CLOSER)) {
1!
57
        statementMarker.done(STATEMENT);
1✔
58
      }
59
    }
60
    if (tokenType == MASON_CALL_OPENER) {
1✔
61
      PsiBuilder.Marker statementMarker = b.mark();
1✔
62
      b.advanceLexer();
1✔
63
      PerlParserProxy.expr(b, l, -1);
1✔
64
      if (r = MasonParserUtil.endOrRecover(b, MASON_CALL_CLOSER)) {
1!
65
        statementMarker.done(MASON_CALL_STATEMENT);
1✔
66
      }
67
    }
1✔
68
    else if (tokenType == MASON_CLASS_OPENER) {
1✔
69
      r = parsePerlBlock(b, l, MASON_CLASS_CLOSER);
1✔
70
    }
71
    else if (tokenType == MASON_INIT_OPENER) {
1✔
72
      r = parsePerlBlock(b, l, MASON_INIT_CLOSER);
1✔
73
    }
74
    else if (tokenType == MASON_PERL_OPENER) {
1✔
75
      r = parsePerlBlock(b, l, MASON_PERL_CLOSER);
1✔
76
    }
77
    else if (tokenType == MASON_FLAGS_OPENER) {
1✔
78
      b.advanceLexer();
1✔
79
      PsiBuilder.Marker statementMarker = b.mark();
1✔
80

81
      while (!b.eof() && b.getTokenType() != MASON_FLAGS_CLOSER) {
1✔
82
        if (!PerlParserProxy.expr(b, l, -1)) {
1✔
83
          break;
1✔
84
        }
85
      }
86
      statementMarker.done(MASON_FLAGS_STATEMENT);
1✔
87

88
      r = MasonParserUtil.endOrRecover(b, MASON_FLAGS_CLOSER);
1✔
89
    }
1✔
90
    else if (tokenType == MASON_DOC_OPENER) {
1✔
91
      b.advanceLexer();
1✔
92
      GeneratedParserUtilBase.consumeToken(b, COMMENT_BLOCK);
1✔
93
      r = MasonParserUtil.endOrRecover(b, MASON_DOC_CLOSER);
1✔
94
    }
95
    else if (tokenType == MASON_TEXT_OPENER) {
1✔
96
      b.advanceLexer();
1✔
97
      PsiBuilder.Marker stringMarker = b.mark();
1✔
98
      if (GeneratedParserUtilBase.consumeToken(b, STRING_CONTENT)) {
1✔
99
        stringMarker.done(MASON_TEXT_BLOCK);
1✔
100
      }
101
      else {
102
        stringMarker.drop();
1✔
103
      }
104
      r = MasonParserUtil.endOrRecover(b, MASON_TEXT_CLOSER);
1✔
105
    }
1✔
106
    else if (tokenType == MASON_METHOD_OPENER) {
1✔
107
      r = parseMasonMethod(b, l, MASON_METHOD_CLOSER, MASON_METHOD_DEFINITION);
1✔
108
    }
109
    else if (tokenType == MASON_FILTER_OPENER) {
1✔
110
      r = parseMasonMethod(b, l, MASON_FILTER_CLOSER, MASON_FILTER_DEFINITION);
1✔
111
    }
112
    else if (tokenType == MASON_OVERRIDE_OPENER) {
1✔
113
      r = parseMasonMethod(b, l, MASON_OVERRIDE_CLOSER, MASON_OVERRIDE_DEFINITION);
1✔
114
    }
115
    else if (SIMPLE_MASON_NAMED_BLOCKS.contains(tokenType)) // simple named blocks
1✔
116
    {
117
      PsiBuilder.Marker statementMarker = b.mark();
1✔
118
      b.advanceLexer();
1✔
119
      IElementType closeToken = RESERVED_OPENER_TO_CLOSER_MAP.get(tokenType);
1✔
120

121
      if (GeneratedParserUtilBase.consumeToken(b, SUB_NAME) && GeneratedParserUtilBase.consumeToken(b, MASON_TAG_CLOSER)) {
1!
122
        PsiBuilder.Marker blockMarker = b.mark();
1✔
123
        PerlParserProxy.block_content(b, l);
1✔
124
        blockMarker.done(BLOCK_BRACELESS);
1✔
125
        blockMarker.setCustomEdgeTokenBinders(WhitespacesBinders.GREEDY_LEFT_BINDER, WhitespacesBinders.GREEDY_RIGHT_BINDER);
1✔
126

127
        if (r = GeneratedParserUtilBase.consumeToken(b, closeToken)) {
1!
128
          statementMarker.done(RESERVED_TO_STATEMENT_MAP.get(tokenType));
1✔
129
          statementMarker = null;
1✔
130
        }
131
      }
132

133
      if (statementMarker != null) {
1!
134
        statementMarker.drop();
×
135
      }
136

137
      r = r || MasonParserUtil.recoverToGreedy(b, closeToken, Mason2Bundle.message("parsing.error.error"));
1!
138
    }
139

140
    if (r) {
1✔
141
      m.drop();
1✔
142
    }
143
    else {
144
      m.rollbackTo();
1✔
145
    }
146

147
    return r || super.parseStatement(b, l);
1!
148
  }
149

150
  @Override
151
  public boolean parseStatementModifier(PsiBuilder b, int l) {
152
    if (b.getTokenType() == MASON_FILTERED_BLOCK_OPENER) {
1✔
153
      return MasonParserUtil.parsePerlBlock(b, l, MASON_FILTERED_BLOCK_CLOSER, MASON_FILTERED_BLOCK);
1✔
154
    }
155
    return super.parseStatementModifier(b, l);
1✔
156
  }
157

158
  @Override
159
  public boolean parseTerm(PsiBuilder b, int l) {
160
    if (b.getTokenType() == MASON_SELF_POINTER) {
1✔
161
      PsiBuilder.Marker m = b.mark();
1✔
162
      b.advanceLexer();
1✔
163
      if (regular_nested_call(b, l)) {
1!
164
        m.done(MASON_SIMPLE_DEREF_EXPR);
1✔
165
      }
166
      else {
167
        m.error(Mason2Bundle.message("parsing.error.error.parsing.filter.expression"));
×
168
      }
169
      return true;
1✔
170
    }
171
    return super.parseTerm(b, l);
1✔
172
  }
173

174
  public static boolean parseMasonMethod(PsiBuilder b, int l, IElementType closeToken, IElementType statementTokenType) {
175
    boolean r = false;
1✔
176

177
    PsiBuilder.Marker methodMarker = b.mark();
1✔
178
    b.advanceLexer();
1✔
179
    PsiBuilder.Marker subMarker = b.mark();
1✔
180
    if (GeneratedParserUtilBase.consumeToken(b, SUB_NAME)) {
1✔
181
      subMarker.collapse(SUB_NAME);
1✔
182
      PerlParserProxy.method_signature(b, l);
1✔
183
      if (GeneratedParserUtilBase.consumeToken(b, MASON_TAG_CLOSER)) {
1✔
184
        PsiBuilder.Marker blockMarker = b.mark();
1✔
185
        PerlParserProxy.block_content(b, l);
1✔
186

187
        if (b.getTokenType() == closeToken) {
1✔
188
          blockMarker.done(BLOCK_BRACELESS);
1✔
189
          blockMarker.setCustomEdgeTokenBinders(WhitespacesBinders.GREEDY_LEFT_BINDER, WhitespacesBinders.GREEDY_RIGHT_BINDER);
1✔
190
          b.advanceLexer();
1✔
191
          methodMarker.done(statementTokenType);
1✔
192
          r = true;
1✔
193
        }
194
      }
195
    }
196

197
    if (!r) {
1✔
198
      methodMarker.rollbackTo();
1✔
199
    }
200

201
    return r || MasonParserUtil.recoverToGreedy(b, closeToken, Mason2Bundle.message("parsing.error.error"));
1!
202
  }
203

204
  protected static boolean parsePerlBlock(PsiBuilder b, int l, IElementType closeToken) {
205
    return MasonParserUtil.parsePerlBlock(b, l, closeToken, MASON_ABSTRACT_BLOCK);
1✔
206
  }
207
}
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