| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | // Copyright (c) 2021-2025 ChilliBits. All rights reserved. | ||
| 2 | |||
| 3 | #include "CSTVisualizer.h" | ||
| 4 | |||
| 5 | #include <util/CommonUtil.h> | ||
| 6 | |||
| 7 | namespace spice::compiler { | ||
| 8 | |||
| 9 | 1589810 | std::string CSTVisualizer::buildRule(antlr4::ParserRuleContext *ctx) { | |
| 10 |
1/2✓ Branch 2 → 3 taken 1589810 times.
✗ Branch 2 → 176 not taken.
|
1589810 | std::stringstream result; |
| 11 | |||
| 12 | // Prepare strings | ||
| 13 |
1/2✓ Branch 3 → 4 taken 1589810 times.
✗ Branch 3 → 174 not taken.
|
1589810 | const std::string codeLoc = tokenToCodeLoc(*ctx->start); |
| 14 |
2/4✓ Branch 4 → 5 taken 1589810 times.
✗ Branch 4 → 172 not taken.
✓ Branch 6 → 7 taken 1589810 times.
✗ Branch 6 → 172 not taken.
|
1589810 | const std::string ruleName = ruleNames[ctx->getRuleIndex()]; |
| 15 |
2/4✓ Branch 7 → 8 taken 1589810 times.
✗ Branch 7 → 108 not taken.
✓ Branch 8 → 9 taken 1589810 times.
✗ Branch 8 → 106 not taken.
|
1589810 | const std::string nodeId = codeLoc + "_" + ruleName; |
| 16 | |||
| 17 | // Build result | ||
| 18 |
4/8✓ Branch 10 → 11 taken 1589810 times.
✗ Branch 10 → 168 not taken.
✓ Branch 11 → 12 taken 1589810 times.
✗ Branch 11 → 168 not taken.
✓ Branch 12 → 13 taken 1589810 times.
✗ Branch 12 → 168 not taken.
✓ Branch 13 → 14 taken 1589810 times.
✗ Branch 13 → 168 not taken.
|
1589810 | result << nodeId << R"( [color="lightgreen",label=")" << ruleName << "\"];\n"; |
| 19 | |||
| 20 | // Link parent node with the current one | ||
| 21 |
1/2✓ Branch 14 → 15 taken 1589810 times.
✗ Branch 14 → 168 not taken.
|
1589810 | const std::string parentNodeIdBackup = parentNodeId; |
| 22 |
2/2✓ Branch 16 → 17 taken 1589035 times.
✓ Branch 16 → 25 taken 775 times.
|
1589810 | if (!parentNodeId.empty()) |
| 23 |
6/12✓ Branch 17 → 18 taken 1589035 times.
✗ Branch 17 → 111 not taken.
✓ Branch 18 → 19 taken 1589035 times.
✗ Branch 18 → 109 not taken.
✓ Branch 19 → 20 taken 1589035 times.
✗ Branch 19 → 109 not taken.
✓ Branch 20 → 21 taken 1589035 times.
✗ Branch 20 → 109 not taken.
✓ Branch 21 → 22 taken 1589035 times.
✗ Branch 21 → 109 not taken.
✓ Branch 22 → 23 taken 1589035 times.
✗ Branch 22 → 109 not taken.
|
1589035 | result << getSpaces() << parentNodeId << " -> " << nodeId << ";\n"; |
| 24 |
1/2✓ Branch 25 → 26 taken 1589810 times.
✗ Branch 25 → 166 not taken.
|
1589810 | parentNodeId = nodeId; // Set parentNodeId for children |
| 25 | |||
| 26 | // Visit all the children | ||
| 27 |
2/2✓ Branch 95 → 28 taken 2163605 times.
✓ Branch 95 → 96 taken 1589810 times.
|
3753415 | for (const auto &child : ctx->children) { |
| 28 |
2/4✓ Branch 29 → 30 taken 2163605 times.
✗ Branch 29 → 114 not taken.
✓ Branch 30 → 31 taken 2163605 times.
✗ Branch 30 → 112 not taken.
|
2163605 | result << getSpaces(); |
| 29 | |||
| 30 |
3/4✓ Branch 32 → 33 taken 2163605 times.
✗ Branch 32 → 34 not taken.
✓ Branch 35 → 36 taken 574570 times.
✓ Branch 35 → 87 taken 1589035 times.
|
2163605 | if (const auto token = dynamic_cast<antlr4::tree::TerminalNode *>(child)) { // Terminal node |
| 31 |
2/4✓ Branch 36 → 37 taken 574570 times.
✗ Branch 36 → 158 not taken.
✓ Branch 37 → 38 taken 574570 times.
✗ Branch 37 → 158 not taken.
|
574570 | std::string terminalCodeLoc = tokenToCodeLoc(*token->getSymbol()); |
| 32 |
1/2✓ Branch 38 → 39 taken 574570 times.
✗ Branch 38 → 156 not taken.
|
574570 | std::string terminalText = token->getText(); |
| 33 |
3/6✓ Branch 41 → 42 taken 574570 times.
✗ Branch 41 → 123 not taken.
✓ Branch 44 → 45 taken 574570 times.
✗ Branch 44 → 117 not taken.
✓ Branch 45 → 46 taken 574570 times.
✗ Branch 45 → 115 not taken.
|
2298280 | CommonUtil::replaceAll(terminalText, "\\", "\\\\"); |
| 34 |
3/6✓ Branch 52 → 53 taken 574570 times.
✗ Branch 52 → 135 not taken.
✓ Branch 55 → 56 taken 574570 times.
✗ Branch 55 → 129 not taken.
✓ Branch 56 → 57 taken 574570 times.
✗ Branch 56 → 127 not taken.
|
2298280 | CommonUtil::replaceAll(terminalText, "\"", "\\\""); |
| 35 |
6/12✓ Branch 63 → 64 taken 574570 times.
✗ Branch 63 → 143 not taken.
✓ Branch 64 → 65 taken 574570 times.
✗ Branch 64 → 143 not taken.
✓ Branch 65 → 66 taken 574570 times.
✗ Branch 65 → 143 not taken.
✓ Branch 66 → 67 taken 574570 times.
✗ Branch 66 → 143 not taken.
✓ Branch 67 → 68 taken 574570 times.
✗ Branch 67 → 141 not taken.
✓ Branch 68 → 69 taken 574570 times.
✗ Branch 68 → 139 not taken.
|
574570 | std::string terminalName = std::string(vocabulary.getSymbolicName(token->getSymbol()->getType())) + ": " + terminalText; |
| 36 | |||
| 37 |
4/8✓ Branch 72 → 73 taken 574570 times.
✗ Branch 72 → 152 not taken.
✓ Branch 73 → 74 taken 574570 times.
✗ Branch 73 → 152 not taken.
✓ Branch 74 → 75 taken 574570 times.
✗ Branch 74 → 152 not taken.
✓ Branch 75 → 76 taken 574570 times.
✗ Branch 75 → 152 not taken.
|
574570 | result << terminalCodeLoc << R"( [color="lightblue",label=")" << terminalName << "\"];\n"; |
| 38 |
6/12✓ Branch 76 → 77 taken 574570 times.
✗ Branch 76 → 151 not taken.
✓ Branch 77 → 78 taken 574570 times.
✗ Branch 77 → 149 not taken.
✓ Branch 78 → 79 taken 574570 times.
✗ Branch 78 → 149 not taken.
✓ Branch 79 → 80 taken 574570 times.
✗ Branch 79 → 149 not taken.
✓ Branch 80 → 81 taken 574570 times.
✗ Branch 80 → 149 not taken.
✓ Branch 81 → 82 taken 574570 times.
✗ Branch 81 → 149 not taken.
|
574570 | result << getSpaces() << nodeId << " -> " << terminalCodeLoc << "\n"; |
| 39 | 574570 | } else { // Non-terminal node | |
| 40 |
3/6✓ Branch 87 → 88 taken 1589035 times.
✗ Branch 87 → 163 not taken.
✓ Branch 88 → 89 taken 1589035 times.
✗ Branch 88 → 161 not taken.
✓ Branch 89 → 90 taken 1589035 times.
✗ Branch 89 → 159 not taken.
|
1589035 | result << std::any_cast<std::string>(visit(child)); |
| 41 | } | ||
| 42 | } | ||
| 43 | |||
| 44 | // Restore parent node id | ||
| 45 |
1/2✓ Branch 96 → 97 taken 1589810 times.
✗ Branch 96 → 166 not taken.
|
1589810 | parentNodeId = parentNodeIdBackup; |
| 46 | |||
| 47 |
1/2✓ Branch 97 → 98 taken 1589810 times.
✗ Branch 97 → 166 not taken.
|
3179620 | return result.str(); |
| 48 | 1589810 | } | |
| 49 | |||
| 50 | 4327210 | std::string CSTVisualizer::getSpaces() const { | |
| 51 | 4327210 | std::string spaces; | |
| 52 |
2/2✓ Branch 6 → 4 taken 4327210 times.
✓ Branch 6 → 7 taken 4327210 times.
|
8654420 | for (int i = 0; i < currentTabs; i++) |
| 53 |
1/2✓ Branch 4 → 5 taken 4327210 times.
✗ Branch 4 → 9 not taken.
|
4327210 | spaces += " "; |
| 54 | 4327210 | return spaces; | |
| 55 | ✗ | } | |
| 56 | |||
| 57 | 2164380 | std::string CSTVisualizer::tokenToCodeLoc(const antlr4::Token &token) { | |
| 58 |
7/14✓ Branch 2 → 3 taken 2164380 times.
✗ Branch 2 → 27 not taken.
✓ Branch 3 → 4 taken 2164380 times.
✗ Branch 3 → 27 not taken.
✓ Branch 4 → 5 taken 2164380 times.
✗ Branch 4 → 22 not taken.
✓ Branch 5 → 6 taken 2164380 times.
✗ Branch 5 → 22 not taken.
✓ Branch 6 → 7 taken 2164380 times.
✗ Branch 6 → 20 not taken.
✓ Branch 7 → 8 taken 2164380 times.
✗ Branch 7 → 18 not taken.
✓ Branch 8 → 9 taken 2164380 times.
✗ Branch 8 → 16 not taken.
|
2164380 | return "L" + std::to_string(token.getLine()) + "C" + std::to_string(token.getCharPositionInLine()); |
| 59 | } | ||
| 60 | |||
| 61 | } // namespace spice::compiler | ||
| 62 |