GCC Code Coverage Report


Directory: ./
File: src/cli/commands/internal.cpp
Date: 2023-04-27 00:55:30
Exec Total Coverage
Lines: 63 100 63.0%
Functions: 2 5 40.0%
Branches: 100 193 51.8%

Line Branch Exec Source
1 #include <iostream>
2 #include <sstream>
3
4 #include "cli/commands/internal.h"
5
6 #include "ast/nodes.h"
7 #include "ast/ops.h"
8 #include "lexer/buffer.h"
9 #include "lexer/lexer.h"
10 #include "logging/logging.h"
11 #include "parser/parser.h"
12 #include "sema/sema.h"
13
14 namespace lython {
15
16 bool compare(String const& a, String const& b) {
17 auto size = std::min(a.size(), b.size());
18
19 for (size_t i = 0; i < size; ++i) {
20 if (a[i] != b[i]) {
21 std::cout << i << " `" << a[i] << "` != `" << b[i] << "` | ";
22 return false;
23 }
24 }
25
26 return a.size() == b.size();
27 }
28
29 String strip2(String const& v) {
30 int i = int(v.size()) - 1;
31
32 while (i > 0 && v[size_t(i)] == '\n') {
33 i -= 1;
34 }
35
36 return String(v.begin(), v.begin() + i + 1);
37 }
38
39 int InternalCmd::main(argparse::ArgumentParser const& args) {
40 //
41
42
1/1
✓ Branch 2 taken 1 times.
1 std::string file = "";
43
2/3
✓ Branch 2 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 if (args.is_used("--file")) {
44
2/2
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
1 file = args.get<std::string>("--file");
45 }
46
47
1/1
✓ Branch 2 taken 1 times.
1 bool dump_lexer = args.get<bool>("--debug-lexer");
48
1/1
✓ Branch 2 taken 1 times.
1 bool lexer_format = args.get<bool>("--lexer-format");
49 1 bool show_alloc_layout = true;
50
2/3
✓ Branch 2 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 bool show_parsing = args.get<bool>("--parsing");
51
52 kwinfo("Enter");
53
54 1 std::unique_ptr<AbstractBuffer> reader;
55
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 if (file != "") {
56
2/2
✓ Branch 3 taken 1 times.
✓ Branch 6 taken 1 times.
1 reader = std::make_unique<FileBuffer>(String(file.c_str()));
57 } else {
58 reader = std::make_unique<ConsoleBuffer>();
59 }
60
61
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (dump_lexer) {
62 std::cout << std::string(80, '=') << '\n';
63 std::cout << "Lexer Token Dump\n";
64 {
65 Lexer lex(*reader.get());
66 lex.debug_print(std::cout);
67 reader->reset();
68 }
69 std::cout << std::string(80, '-') << '\n';
70 return 0;
71 }
72
73
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (lexer_format) {
74 std::cout << std::string(80, '=') << '\n';
75 std::cout << "Lexing Round-trip\n";
76 String lexer_string;
77 {
78 Lexer lex(*reader.get());
79 StringStream ss;
80 lex.print(ss);
81 lexer_string = ss.str();
82 reader->reset();
83 }
84
85 std::cout << std::string(80, '-') << '\n';
86 std::cout << strip2(lexer_string) << std::endl;
87 std::cout << std::string(80, '-') << '\n';
88 return 0;
89 }
90
91 1 Module* mod = nullptr;
92
93 try {
94
95
1/1
✓ Branch 2 taken 1 times.
1 Lexer lex(*reader.get());
96
1/1
✓ Branch 1 taken 1 times.
1 Parser parser(lex);
97
1/1
✓ Branch 1 taken 1 times.
1 StringStream parsing;
98
99 // Parsing Logs
100 // ------------
101 {
102
3/3
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 8 taken 1 times.
1 std::cout << std::string(80, '=') << '\n';
103
1/1
✓ Branch 1 taken 1 times.
1 std::cout << "Parsing Trace\n";
104
3/3
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 8 taken 1 times.
1 std::cout << std::string(80, '-') << '\n';
105
1/1
✓ Branch 1 taken 1 times.
1 mod = parser.parse_module();
106 }
107
108 // Parsing diagnostics
109 // -------------------
110 {
111
3/3
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 8 taken 1 times.
1 std::cout << std::string(80, '-') << '\n';
112
1/1
✓ Branch 1 taken 1 times.
1 std::cout << "Parsing Diag\n";
113
3/3
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 8 taken 1 times.
1 std::cout << std::string(80, '-') << '\n';
114
1/1
✓ Branch 1 taken 1 times.
1 parser.show_diagnostics(std::cout);
115
3/3
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 8 taken 1 times.
1 std::cout << std::string(80, '-') << '\n';
116 }
117
118 // Parsing dump
119 // ------------
120 {
121
1/1
✓ Branch 1 taken 1 times.
1 std::stringstream ss;
122
2/2
✓ Branch 5 taken 3 times.
✓ Branch 6 taken 1 times.
4 for (auto stmt: mod->body) {
123
2/2
✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
3 print(str(stmt), ss);
124
1/1
✓ Branch 1 taken 3 times.
3 ss << "\n";
125 }
126
3/3
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 8 taken 1 times.
1 std::cout << std::string(80, '-') << '\n';
127
1/1
✓ Branch 1 taken 1 times.
1 std::cout << "Parsed Module dump\n";
128
3/3
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 8 taken 1 times.
1 std::cout << std::string(80, '-') << '\n';
129
2/2
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
1 std::cout << ss.str();
130
3/3
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 8 taken 1 times.
1 std::cout << std::string(80, '-') << '\n';
131 1 }
132
133 // Memory layout dump
134 {
135 //
136
1/1
✓ Branch 1 taken 1 times.
1 mod->dump(std::cout);
137 }
138
139
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (show_parsing) {
140 return 0;
141 }
142
143 // Sema
144 // ----
145 {
146
1/1
✓ Branch 1 taken 1 times.
1 SemanticAnalyser sema;
147
148
3/3
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 8 taken 1 times.
1 std::cout << std::string(80, '-') << '\n';
149
1/1
✓ Branch 1 taken 1 times.
1 std::cout << "Sema Logs\n";
150
3/3
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 8 taken 1 times.
1 std::cout << std::string(80, '-') << '\n';
151
1/1
✓ Branch 1 taken 1 times.
1 sema.exec(mod, 0);
152
3/3
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 8 taken 1 times.
1 std::cout << std::string(80, '-') << '\n';
153
154 // Sema Diagnostic
155 // ---------------
156 {
157
3/3
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 8 taken 1 times.
1 std::cout << std::string(80, '-') << '\n';
158
1/1
✓ Branch 1 taken 1 times.
1 std::cout << "Sema Diagnostic dump\n";
159
3/3
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 8 taken 1 times.
1 std::cout << std::string(80, '-') << '\n';
160
161
1/1
✓ Branch 1 taken 1 times.
1 sema.show_diagnostic(std::cout, &lex);
162
3/3
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 8 taken 1 times.
1 std::cout << std::string(80, '-') << '\n';
163 }
164
165 // Memory layout dump
166 {
167 //
168
1/1
✓ Branch 1 taken 1 times.
1 mod->dump(std::cout);
169 }
170
171
2/3
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 if (has_circle(mod)) {
172 kwwarn("Circle will cause infinite recursion");
173 }
174
175 // Bindings Dump
176 // -------------
177 {
178
1/1
✓ Branch 1 taken 1 times.
1 std::stringstream ss;
179
1/1
✓ Branch 1 taken 1 times.
1 sema.bindings.dump(ss);
180
181
3/3
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 8 taken 1 times.
1 std::cout << std::string(80, '-') << '\n';
182
1/1
✓ Branch 1 taken 1 times.
1 std::cout << "Sema bindings dump\n";
183
3/3
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 8 taken 1 times.
1 std::cout << std::string(80, '-') << '\n';
184
2/2
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
1 std::cout << ss.str();
185
3/3
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 8 taken 1 times.
1 std::cout << std::string(80, '-') << '\n';
186 1 }
187 1 }
188
189
3/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
1 } catch (lython::Exception e) {
190 std::cout << "Error Occured:" << std::endl;
191 std::cout << "\t" << e.what() << std::endl;
192 }
193
194
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 delete mod;
195
196 1 return 0;
197 1 };
198 } // namespace lython
199