| 1 | package pro.verron.officestamper.asciidoc; | |
| 2 | ||
| 3 | import java.util.ArrayList; | |
| 4 | import java.util.List; | |
| 5 | import java.util.Map; | |
| 6 | import java.util.function.Function; | |
| 7 | ||
| 8 | import static pro.verron.officestamper.asciidoc.AsciiDocModel.*; | |
| 9 | ||
| 10 | public final class AsciiDocParser | |
| 11 | implements Function<String, AsciiDocModel> { | |
| 12 | ||
| 13 | public static AsciiDocModel parse(String asciidoc) { | |
| 14 |
1
1. parse : replaced return value with null for pro/verron/officestamper/asciidoc/AsciiDocParser::parse → KILLED |
return new AsciiDocParser().apply(asciidoc); |
| 15 | } | |
| 16 | ||
| 17 | public AsciiDocModel apply(String asciidoc) { | |
| 18 | var blocks = new ArrayList<Block>(); | |
| 19 |
2
1. apply : negated conditional → KILLED 2. apply : negated conditional → KILLED |
if (asciidoc == null || asciidoc.isBlank()) { |
| 20 |
1
1. apply : replaced return value with null for pro/verron/officestamper/asciidoc/AsciiDocParser::apply → KILLED |
return AsciiDocModel.of(blocks); |
| 21 | } | |
| 22 | ||
| 23 | String[] lines = asciidoc.split("\r?\n"); | |
| 24 | StringBuilder currentParagraph = new StringBuilder(); | |
| 25 | boolean inTable = false; | |
| 26 | boolean inBlockquote = false; | |
| 27 | boolean inCodeBlock = false; | |
| 28 | String currentLanguage = ""; | |
| 29 | List<Row> currentTableRows = new ArrayList<>(); | |
| 30 | StringBuilder currentBlockContent = new StringBuilder(); | |
| 31 | ||
| 32 | for (String line : lines) { | |
| 33 | String trimmed = line.trim(); | |
| 34 | ||
| 35 |
1
1. apply : negated conditional → KILLED |
if (trimmed.equals("____")) { |
| 36 |
1
1. apply : negated conditional → KILLED |
if (inBlockquote) { |
| 37 | blocks.add(new Blockquote(parseInlines(currentBlockContent.toString() | |
| 38 | .trim()))); | |
| 39 |
1
1. apply : removed call to java/lang/StringBuilder::setLength → SURVIVED |
currentBlockContent.setLength(0); |
| 40 | inBlockquote = false; | |
| 41 | } | |
| 42 | else { | |
| 43 |
1
1. apply : negated conditional → KILLED |
if (!currentParagraph.isEmpty()) { |
| 44 | blocks.add(new Paragraph(parseInlines(currentParagraph.toString() | |
| 45 | .trim()))); | |
| 46 |
1
1. apply : removed call to java/lang/StringBuilder::setLength → NO_COVERAGE |
currentParagraph.setLength(0); |
| 47 | } | |
| 48 | inBlockquote = true; | |
| 49 | } | |
| 50 | continue; | |
| 51 | } | |
| 52 | ||
| 53 |
1
1. apply : negated conditional → KILLED |
if (inBlockquote) { |
| 54 |
1
1. apply : negated conditional → SURVIVED |
if (!currentBlockContent.isEmpty()) { |
| 55 | currentBlockContent.append(" "); | |
| 56 | } | |
| 57 | currentBlockContent.append(trimmed); | |
| 58 | continue; | |
| 59 | } | |
| 60 | ||
| 61 |
1
1. apply : negated conditional → KILLED |
if (trimmed.startsWith("[source")) { |
| 62 | int commaIndex = trimmed.indexOf(','); | |
| 63 |
1
1. apply : negated conditional → KILLED |
if (commaIndex != -1) { |
| 64 | int bracketIndex = trimmed.indexOf(']'); | |
| 65 |
1
1. apply : Replaced integer addition with subtraction → KILLED |
currentLanguage = trimmed.substring(commaIndex + 1, bracketIndex) |
| 66 | .trim(); | |
| 67 | } | |
| 68 | continue; | |
| 69 | } | |
| 70 | ||
| 71 |
1
1. apply : negated conditional → KILLED |
if (trimmed.equals("----")) { |
| 72 |
1
1. apply : negated conditional → KILLED |
if (inCodeBlock) { |
| 73 | blocks.add(new CodeBlock(currentLanguage, | |
| 74 | currentBlockContent.toString() | |
| 75 | .trim())); | |
| 76 |
1
1. apply : removed call to java/lang/StringBuilder::setLength → SURVIVED |
currentBlockContent.setLength(0); |
| 77 | currentLanguage = ""; | |
| 78 | inCodeBlock = false; | |
| 79 | } | |
| 80 | else { | |
| 81 |
1
1. apply : negated conditional → KILLED |
if (!currentParagraph.isEmpty()) { |
| 82 | blocks.add(new Paragraph(parseInlines(currentParagraph.toString() | |
| 83 | .trim()))); | |
| 84 |
1
1. apply : removed call to java/lang/StringBuilder::setLength → NO_COVERAGE |
currentParagraph.setLength(0); |
| 85 | } | |
| 86 | inCodeBlock = true; | |
| 87 | } | |
| 88 | continue; | |
| 89 | } | |
| 90 | ||
| 91 |
1
1. apply : negated conditional → KILLED |
if (inCodeBlock) { |
| 92 |
1
1. apply : negated conditional → SURVIVED |
if (!currentBlockContent.isEmpty()) { |
| 93 | currentBlockContent.append("\n"); | |
| 94 | } | |
| 95 | currentBlockContent.append(line); // Preserve indentation in code blocks | |
| 96 | continue; | |
| 97 | } | |
| 98 | ||
| 99 |
1
1. apply : negated conditional → KILLED |
if (trimmed.startsWith("image::")) { |
| 100 |
1
1. apply : negated conditional → KILLED |
if (!currentParagraph.isEmpty()) { |
| 101 | blocks.add(new Paragraph(parseInlines(currentParagraph.toString() | |
| 102 | .trim()))); | |
| 103 |
1
1. apply : removed call to java/lang/StringBuilder::setLength → NO_COVERAGE |
currentParagraph.setLength(0); |
| 104 | } | |
| 105 | int endUrl = trimmed.indexOf('[', 7); | |
| 106 |
1
1. apply : negated conditional → KILLED |
if (endUrl != -1) { |
| 107 | int endText = trimmed.indexOf(']', endUrl); | |
| 108 |
1
1. apply : negated conditional → KILLED |
if (endText != -1) { |
| 109 | String url = trimmed.substring(7, endUrl); | |
| 110 |
1
1. apply : Replaced integer addition with subtraction → KILLED |
String altText = trimmed.substring(endUrl + 1, endText); |
| 111 | blocks.add(new ImageBlock(url, altText)); | |
| 112 | continue; | |
| 113 | } | |
| 114 | } | |
| 115 | } | |
| 116 | ||
| 117 |
1
1. apply : negated conditional → KILLED |
if (trimmed.equals("|===")) { |
| 118 |
1
1. apply : negated conditional → KILLED |
if (inTable) { |
| 119 | blocks.add(new Table(currentTableRows)); | |
| 120 | currentTableRows = new ArrayList<>(); | |
| 121 | inTable = false; | |
| 122 | } | |
| 123 | else { | |
| 124 |
1
1. apply : negated conditional → KILLED |
if (!currentParagraph.isEmpty()) { |
| 125 | blocks.add(new Paragraph(parseInlines(currentParagraph.toString() | |
| 126 | .trim()))); | |
| 127 |
1
1. apply : removed call to java/lang/StringBuilder::setLength → NO_COVERAGE |
currentParagraph.setLength(0); |
| 128 | } | |
| 129 | inTable = true; | |
| 130 | } | |
| 131 | continue; | |
| 132 | } | |
| 133 | ||
| 134 |
1
1. apply : negated conditional → KILLED |
if (inTable) { |
| 135 |
1
1. apply : negated conditional → KILLED |
if (trimmed.startsWith("|")) { |
| 136 | String[] cellTexts = trimmed.substring(1) | |
| 137 | .split("\\|"); | |
| 138 | List<Cell> cells = new ArrayList<>(); | |
| 139 | for (String cellText : cellTexts) { | |
| 140 | cells.add(Cell.ofInlines(parseInlines(cellText.trim()))); | |
| 141 | } | |
| 142 | currentTableRows.add(new Row(cells)); | |
| 143 | } | |
| 144 | continue; | |
| 145 | } | |
| 146 | ||
| 147 |
1
1. apply : negated conditional → KILLED |
if (trimmed.isBlank()) { |
| 148 |
1
1. apply : negated conditional → KILLED |
if (!currentParagraph.isEmpty()) { |
| 149 | blocks.add(new Paragraph(parseInlines(currentParagraph.toString() | |
| 150 | .trim()))); | |
| 151 |
1
1. apply : removed call to java/lang/StringBuilder::setLength → NO_COVERAGE |
currentParagraph.setLength(0); |
| 152 | } | |
| 153 | continue; | |
| 154 | } | |
| 155 | ||
| 156 | // Check for Headings | |
| 157 |
1
1. apply : negated conditional → KILLED |
if (trimmed.startsWith("=")) { |
| 158 | int level = 0; | |
| 159 |
3
1. apply : changed conditional boundary → SURVIVED 2. apply : negated conditional → KILLED 3. apply : negated conditional → KILLED |
while (level < trimmed.length() && trimmed.charAt(level) == '=') { |
| 160 | level++; | |
| 161 | } | |
| 162 |
6
1. apply : changed conditional boundary → SURVIVED 2. apply : changed conditional boundary → SURVIVED 3. apply : changed conditional boundary → SURVIVED 4. apply : negated conditional → KILLED 5. apply : negated conditional → KILLED 6. apply : negated conditional → KILLED |
if (level > 0 && level <= 6 && level < trimmed.length() |
| 163 |
1
1. apply : negated conditional → KILLED |
&& Character.isWhitespace(trimmed.charAt(level))) { |
| 164 |
1
1. apply : negated conditional → KILLED |
if (!currentParagraph.isEmpty()) { |
| 165 | blocks.add(new Paragraph(parseInlines(currentParagraph.toString() | |
| 166 | .trim()))); | |
| 167 |
1
1. apply : removed call to java/lang/StringBuilder::setLength → NO_COVERAGE |
currentParagraph.setLength(0); |
| 168 | } | |
| 169 | String title = trimmed.substring(level) | |
| 170 | .trim(); | |
| 171 | blocks.add(new Heading(level, parseInlines(title))); | |
| 172 | continue; | |
| 173 | } | |
| 174 | } | |
| 175 | ||
| 176 | // Check for Unordered List Item | |
| 177 |
1
1. apply : negated conditional → KILLED |
if (trimmed.startsWith("* ")) { |
| 178 |
1
1. apply : negated conditional → KILLED |
if (!currentParagraph.isEmpty()) { |
| 179 | blocks.add(new Paragraph(parseInlines(currentParagraph.toString() | |
| 180 | .trim()))); | |
| 181 |
1
1. apply : removed call to java/lang/StringBuilder::setLength → NO_COVERAGE |
currentParagraph.setLength(0); |
| 182 | } | |
| 183 | String itemText = trimmed.substring(2) | |
| 184 | .trim(); | |
| 185 | var item = new ListItem(parseInlines(itemText)); | |
| 186 |
2
1. apply : negated conditional → KILLED 2. apply : negated conditional → KILLED |
if (!blocks.isEmpty() && blocks.getLast() instanceof UnorderedList(List<ListItem> items1)) { |
| 187 | List<ListItem> items = new ArrayList<>(items1); | |
| 188 | items.add(item); | |
| 189 |
1
1. apply : Replaced integer subtraction with addition → KILLED |
blocks.set(blocks.size() - 1, new UnorderedList(items)); |
| 190 | } | |
| 191 | else { | |
| 192 | blocks.add(new UnorderedList(List.of(item))); | |
| 193 | } | |
| 194 | continue; | |
| 195 | } | |
| 196 | ||
| 197 | // Check for Ordered List Item | |
| 198 |
1
1. apply : negated conditional → KILLED |
if (trimmed.startsWith(". ")) { |
| 199 |
1
1. apply : negated conditional → KILLED |
if (!currentParagraph.isEmpty()) { |
| 200 | blocks.add(new Paragraph(parseInlines(currentParagraph.toString() | |
| 201 | .trim()))); | |
| 202 |
1
1. apply : removed call to java/lang/StringBuilder::setLength → NO_COVERAGE |
currentParagraph.setLength(0); |
| 203 | } | |
| 204 | String itemText = trimmed.substring(2) | |
| 205 | .trim(); | |
| 206 | var item = new ListItem(parseInlines(itemText)); | |
| 207 |
2
1. apply : negated conditional → KILLED 2. apply : negated conditional → KILLED |
if (!blocks.isEmpty() && blocks.getLast() instanceof OrderedList(List<ListItem> items1)) { |
| 208 | List<ListItem> items = new ArrayList<>(items1); | |
| 209 | items.add(item); | |
| 210 |
1
1. apply : Replaced integer subtraction with addition → KILLED |
blocks.set(blocks.size() - 1, new OrderedList(items)); |
| 211 | } | |
| 212 | else { | |
| 213 | blocks.add(new OrderedList(List.of(item))); | |
| 214 | } | |
| 215 | continue; | |
| 216 | } | |
| 217 | ||
| 218 | // Otherwise, it's a paragraph part | |
| 219 |
1
1. apply : negated conditional → SURVIVED |
if (!currentParagraph.isEmpty()) { |
| 220 | currentParagraph.append("\n"); | |
| 221 | } | |
| 222 | currentParagraph.append(trimmed); | |
| 223 | } | |
| 224 | ||
| 225 |
1
1. apply : negated conditional → KILLED |
if (!currentParagraph.isEmpty()) { |
| 226 | blocks.add(new Paragraph(parseInlines(currentParagraph.toString() | |
| 227 | .trim()))); | |
| 228 | } | |
| 229 | ||
| 230 |
1
1. apply : replaced return value with null for pro/verron/officestamper/asciidoc/AsciiDocParser::apply → KILLED |
return AsciiDocModel.of(blocks); |
| 231 | } | |
| 232 | ||
| 233 | private static List<Inline> parseInlines(String text) { | |
| 234 | // Stack-based inline parser with simple tokens for '*', '_', text, and escapes. | |
| 235 | // Non-overlapping nesting is allowed; crossing markers are treated as plain text. | |
| 236 | var root = new Frame(FrameType.ROOT); | |
| 237 | var stack = new ArrayList<Frame>(); | |
| 238 | stack.add(root); | |
| 239 | ||
| 240 |
2
1. parseInlines : negated conditional → KILLED 2. parseInlines : negated conditional → KILLED |
if (text == null || text.isEmpty()) { |
| 241 |
1
1. parseInlines : replaced return value with Collections.emptyList for pro/verron/officestamper/asciidoc/AsciiDocParser::parseInlines → NO_COVERAGE |
return root.children; |
| 242 | } | |
| 243 | ||
| 244 |
2
1. parseInlines : changed conditional boundary → KILLED 2. parseInlines : negated conditional → KILLED |
for (int i = 0; i < text.length(); i++) { |
| 245 | char c = text.charAt(i); | |
| 246 | ||
| 247 | // Escapes for '*', '_', and '\\' | |
| 248 |
1
1. parseInlines : negated conditional → KILLED |
if (c == '\\') { |
| 249 |
3
1. parseInlines : changed conditional boundary → NO_COVERAGE 2. parseInlines : negated conditional → NO_COVERAGE 3. parseInlines : Replaced integer addition with subtraction → NO_COVERAGE |
if (i + 1 < text.length()) { |
| 250 |
1
1. parseInlines : Replaced integer addition with subtraction → NO_COVERAGE |
char next = text.charAt(i + 1); |
| 251 |
3
1. parseInlines : negated conditional → NO_COVERAGE 2. parseInlines : negated conditional → NO_COVERAGE 3. parseInlines : negated conditional → NO_COVERAGE |
if (next == '*' || next == '_' || next == '\\') { |
| 252 | stack.getLast().text.append(next); | |
| 253 |
1
1. parseInlines : Changed increment from 1 to -1 → NO_COVERAGE |
i++; |
| 254 | continue; | |
| 255 | } | |
| 256 | } | |
| 257 | // Lone backslash | |
| 258 | stack.getLast().text.append(c); | |
| 259 | continue; | |
| 260 | } | |
| 261 | ||
| 262 |
2
1. parseInlines : negated conditional → KILLED 2. parseInlines : negated conditional → KILLED |
if (c == '*' || c == '_') { |
| 263 |
1
1. parseInlines : negated conditional → KILLED |
FrameType type = (c == '*') ? FrameType.BOLD : FrameType.ITALIC; |
| 264 | Frame top = stack.getLast(); | |
| 265 |
1
1. parseInlines : negated conditional → KILLED |
if (top.type == type) { |
| 266 | // Close current frame | |
| 267 |
1
1. parseInlines : removed call to pro/verron/officestamper/asciidoc/AsciiDocParser$Frame::flushTextToChildren → KILLED |
top.flushTextToChildren(); |
| 268 |
1
1. parseInlines : negated conditional → KILLED |
Inline node = (type == FrameType.BOLD) ? new Bold(top.children) : new Italic(top.children); |
| 269 | stack.removeLast(); | |
| 270 | Frame parent = stack.getLast(); | |
| 271 | parent.children.add(node); | |
| 272 | } | |
| 273 |
3
1. parseInlines : negated conditional → SURVIVED 2. parseInlines : negated conditional → SURVIVED 3. parseInlines : negated conditional → KILLED |
else if (top.type == FrameType.BOLD || top.type == FrameType.ITALIC || top.type == FrameType.ROOT) { |
| 274 | // Open new frame | |
| 275 |
1
1. parseInlines : removed call to pro/verron/officestamper/asciidoc/AsciiDocParser$Frame::flushTextToChildren → KILLED |
top.flushTextToChildren(); |
| 276 | Frame f = new Frame(type); | |
| 277 | stack.add(f); | |
| 278 | } | |
| 279 | else { | |
| 280 | // Should not happen | |
| 281 | stack.getLast().text.append(c); | |
| 282 | } | |
| 283 | continue; | |
| 284 | } | |
| 285 | ||
| 286 | // Detect literal |TAB| token -> emit a Tab inline | |
| 287 |
9
1. parseInlines : changed conditional boundary → NO_COVERAGE 2. parseInlines : Replaced integer addition with subtraction → NO_COVERAGE 3. parseInlines : negated conditional → NO_COVERAGE 4. parseInlines : negated conditional → NO_COVERAGE 5. parseInlines : Replaced integer addition with subtraction → NO_COVERAGE 6. parseInlines : negated conditional → NO_COVERAGE 7. parseInlines : Replaced integer addition with subtraction → NO_COVERAGE 8. parseInlines : Replaced integer addition with subtraction → NO_COVERAGE 9. parseInlines : negated conditional → SURVIVED |
if (c == '|' && i + 4 < text.length() && text.charAt(i + 1) == 'T' && text.charAt(i + 2) == 'A' |
| 288 |
3
1. parseInlines : negated conditional → NO_COVERAGE 2. parseInlines : negated conditional → NO_COVERAGE 3. parseInlines : Replaced integer addition with subtraction → NO_COVERAGE |
&& text.charAt(i + 3) == 'B' && text.charAt(i + 4) == '|') { |
| 289 | // Flush any pending text | |
| 290 | stack.getLast() | |
| 291 |
1
1. parseInlines : removed call to pro/verron/officestamper/asciidoc/AsciiDocParser$Frame::flushTextToChildren → NO_COVERAGE |
.flushTextToChildren(); |
| 292 | stack.getLast().children.add(new Tab()); | |
| 293 |
1
1. parseInlines : Changed increment from 4 to -4 → NO_COVERAGE |
i += 4; |
| 294 | continue; | |
| 295 | } | |
| 296 | ||
| 297 | // Simple Link detection: https://example.com[Text] | |
| 298 |
2
1. parseInlines : negated conditional → KILLED 2. parseInlines : negated conditional → KILLED |
if (c == 'h' && text.startsWith("http", i)) { |
| 299 | int endUrl = text.indexOf('[', i); | |
| 300 |
1
1. parseInlines : negated conditional → KILLED |
if (endUrl != -1) { |
| 301 | int endText = text.indexOf(']', endUrl); | |
| 302 |
1
1. parseInlines : negated conditional → KILLED |
if (endText != -1) { |
| 303 | stack.getLast() | |
| 304 |
1
1. parseInlines : removed call to pro/verron/officestamper/asciidoc/AsciiDocParser$Frame::flushTextToChildren → KILLED |
.flushTextToChildren(); |
| 305 | String url = text.substring(i, endUrl); | |
| 306 |
1
1. parseInlines : Replaced integer addition with subtraction → KILLED |
String linkText = text.substring(endUrl + 1, endText); |
| 307 | stack.getLast().children.add(new Link(url, linkText)); | |
| 308 | i = endText; | |
| 309 | continue; | |
| 310 | } | |
| 311 | } | |
| 312 | } | |
| 313 | ||
| 314 | // Simple Image detection: image:url[AltText] | |
| 315 |
2
1. parseInlines : negated conditional → SURVIVED 2. parseInlines : negated conditional → KILLED |
if (c == 'i' && text.startsWith("image:", i)) { |
| 316 |
1
1. parseInlines : Replaced integer addition with subtraction → NO_COVERAGE |
int endUrl = text.indexOf('[', i + 6); |
| 317 |
1
1. parseInlines : negated conditional → NO_COVERAGE |
if (endUrl != -1) { |
| 318 | int endText = text.indexOf(']', endUrl); | |
| 319 |
1
1. parseInlines : negated conditional → NO_COVERAGE |
if (endText != -1) { |
| 320 | stack.getLast() | |
| 321 |
1
1. parseInlines : removed call to pro/verron/officestamper/asciidoc/AsciiDocParser$Frame::flushTextToChildren → NO_COVERAGE |
.flushTextToChildren(); |
| 322 |
1
1. parseInlines : Replaced integer addition with subtraction → NO_COVERAGE |
String url = text.substring(i + 6, endUrl); |
| 323 |
1
1. parseInlines : Replaced integer addition with subtraction → NO_COVERAGE |
String title = text.substring(endUrl + 1, endText); |
| 324 | stack.getLast().children.add(new InlineImage(url, Map.of("title", title))); | |
| 325 | i = endText; | |
| 326 | continue; | |
| 327 | } | |
| 328 | } | |
| 329 | } | |
| 330 | ||
| 331 | // Regular char | |
| 332 | stack.getLast().text.append(c); | |
| 333 | } | |
| 334 | ||
| 335 | // Unwind: any unclosed frames become literal markers + content as plain text in parent | |
| 336 |
2
1. parseInlines : negated conditional → KILLED 2. parseInlines : changed conditional boundary → KILLED |
while (stack.size() > 1) { |
| 337 | Frame unfinished = stack.removeLast(); | |
| 338 |
1
1. parseInlines : negated conditional → NO_COVERAGE |
char marker = unfinished.type == FrameType.BOLD ? '*' : '_'; |
| 339 |
1
1. parseInlines : removed call to pro/verron/officestamper/asciidoc/AsciiDocParser$Frame::flushTextToChildren → NO_COVERAGE |
unfinished.flushTextToChildren(); |
| 340 | // Build literal: marker + children as text + (no closing marker since it is missing) | |
| 341 | StringBuilder literal = new StringBuilder(); | |
| 342 | literal.append(marker); | |
| 343 | for (Inline in : unfinished.children) { | |
| 344 | literal.append(in.text()); | |
| 345 | } | |
| 346 | stack.getLast().text.append(literal); | |
| 347 | } | |
| 348 | ||
| 349 | // Flush remainder text on root | |
| 350 |
1
1. parseInlines : removed call to pro/verron/officestamper/asciidoc/AsciiDocParser$Frame::flushTextToChildren → KILLED |
root.flushTextToChildren(); |
| 351 |
1
1. parseInlines : replaced return value with Collections.emptyList for pro/verron/officestamper/asciidoc/AsciiDocParser::parseInlines → KILLED |
return root.children; |
| 352 | } | |
| 353 | ||
| 354 | private enum FrameType { | |
| 355 | ROOT, | |
| 356 | BOLD, | |
| 357 | ITALIC | |
| 358 | } | |
| 359 | ||
| 360 | private static final class Frame { | |
| 361 | final FrameType type; | |
| 362 | final List<Inline> children = new ArrayList<>(); | |
| 363 | final StringBuilder text = new StringBuilder(); | |
| 364 | ||
| 365 | Frame(FrameType type) {this.type = type;} | |
| 366 | ||
| 367 | void flushTextToChildren() { | |
| 368 |
1
1. flushTextToChildren : negated conditional → KILLED |
if (!text.isEmpty()) { |
| 369 | children.add(new Text(text.toString())); | |
| 370 |
1
1. flushTextToChildren : removed call to java/lang/StringBuilder::setLength → KILLED |
text.setLength(0); |
| 371 | } | |
| 372 | } | |
| 373 | } | |
| 374 | } | |
Mutations | ||
| 14 |
1.1 |
|
| 19 |
1.1 2.2 |
|
| 20 |
1.1 |
|
| 35 |
1.1 |
|
| 36 |
1.1 |
|
| 39 |
1.1 |
|
| 43 |
1.1 |
|
| 46 |
1.1 |
|
| 53 |
1.1 |
|
| 54 |
1.1 |
|
| 61 |
1.1 |
|
| 63 |
1.1 |
|
| 65 |
1.1 |
|
| 71 |
1.1 |
|
| 72 |
1.1 |
|
| 76 |
1.1 |
|
| 81 |
1.1 |
|
| 84 |
1.1 |
|
| 91 |
1.1 |
|
| 92 |
1.1 |
|
| 99 |
1.1 |
|
| 100 |
1.1 |
|
| 103 |
1.1 |
|
| 106 |
1.1 |
|
| 108 |
1.1 |
|
| 110 |
1.1 |
|
| 117 |
1.1 |
|
| 118 |
1.1 |
|
| 124 |
1.1 |
|
| 127 |
1.1 |
|
| 134 |
1.1 |
|
| 135 |
1.1 |
|
| 147 |
1.1 |
|
| 148 |
1.1 |
|
| 151 |
1.1 |
|
| 157 |
1.1 |
|
| 159 |
1.1 2.2 3.3 |
|
| 162 |
1.1 2.2 3.3 4.4 5.5 6.6 |
|
| 163 |
1.1 |
|
| 164 |
1.1 |
|
| 167 |
1.1 |
|
| 177 |
1.1 |
|
| 178 |
1.1 |
|
| 181 |
1.1 |
|
| 186 |
1.1 2.2 |
|
| 189 |
1.1 |
|
| 198 |
1.1 |
|
| 199 |
1.1 |
|
| 202 |
1.1 |
|
| 207 |
1.1 2.2 |
|
| 210 |
1.1 |
|
| 219 |
1.1 |
|
| 225 |
1.1 |
|
| 230 |
1.1 |
|
| 240 |
1.1 2.2 |
|
| 241 |
1.1 |
|
| 244 |
1.1 2.2 |
|
| 248 |
1.1 |
|
| 249 |
1.1 2.2 3.3 |
|
| 250 |
1.1 |
|
| 251 |
1.1 2.2 3.3 |
|
| 253 |
1.1 |
|
| 262 |
1.1 2.2 |
|
| 263 |
1.1 |
|
| 265 |
1.1 |
|
| 267 |
1.1 |
|
| 268 |
1.1 |
|
| 273 |
1.1 2.2 3.3 |
|
| 275 |
1.1 |
|
| 287 |
1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8 9.9 |
|
| 288 |
1.1 2.2 3.3 |
|
| 291 |
1.1 |
|
| 293 |
1.1 |
|
| 298 |
1.1 2.2 |
|
| 300 |
1.1 |
|
| 302 |
1.1 |
|
| 304 |
1.1 |
|
| 306 |
1.1 |
|
| 315 |
1.1 2.2 |
|
| 316 |
1.1 |
|
| 317 |
1.1 |
|
| 319 |
1.1 |
|
| 321 |
1.1 |
|
| 322 |
1.1 |
|
| 323 |
1.1 |
|
| 336 |
1.1 2.2 |
|
| 338 |
1.1 |
|
| 339 |
1.1 |
|
| 350 |
1.1 |
|
| 351 |
1.1 |
|
| 368 |
1.1 |
|
| 370 |
1.1 |