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