Skip to content

Commit d2a6959

Browse files
XX
1 parent ce4612d commit d2a6959

File tree

12 files changed

+114
-78
lines changed

12 files changed

+114
-78
lines changed

c.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
from b import j
2+
print(j)

examples/expr2.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
def main0():
22
x: i32
3-
x = (2+3)*5
3+
x = "(2+3)"/"0"
4+
x = 1.23
45
print(x)
56

67
main0()
78

89
# Not implemented yet in LPython:
910
#if __name__ == "__main__":
10-
# main()
11+
# main()/

src/bin/lpython.cpp

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ int emit_tokens(const std::string &infile, bool line_numbers, const CompilerOpti
9090
LFortran::diag::Diagnostics diagnostics;
9191
auto res = LFortran::tokens(al, input, diagnostics, &stypes, &locations);
9292
LFortran::LocationManager lm;
93-
lm.in_filename = infile;
93+
lm.in_filename.push_back(infile);
9494
lm.init_simple(input);
9595
std::cerr << diagnostics.render(input, lm, compiler_options);
9696
if (res.ok) {
@@ -121,7 +121,7 @@ int emit_ast(const std::string &infile,
121121
al, runtime_library_dir, infile, diagnostics, compiler_options.new_parser);
122122
if (diagnostics.diagnostics.size() > 0) {
123123
LFortran::LocationManager lm;
124-
lm.in_filename = infile;
124+
lm.in_filename.push_back(infile);
125125
// TODO: only read this once, and pass it as an argument to parse_python_file()
126126
std::string input = LFortran::read_file(infile);
127127
lm.init_simple(input);
@@ -151,7 +151,7 @@ int emit_asr(const std::string &infile,
151151
Allocator al(4*1024);
152152
LFortran::diag::Diagnostics diagnostics;
153153
LFortran::LocationManager lm;
154-
lm.in_filename = infile;
154+
lm.in_filename.push_back(infile);
155155
std::string input = LFortran::read_file(infile);
156156
lm.init_simple(input);
157157
LFortran::Result<LFortran::LPython::AST::ast_t*> r1 = parse_python_file(
@@ -164,7 +164,8 @@ int emit_asr(const std::string &infile,
164164

165165
diagnostics.diagnostics.clear();
166166
LFortran::Result<LFortran::ASR::TranslationUnit_t*>
167-
r = LFortran::LPython::python_ast_to_asr(al, *ast, diagnostics, compiler_options, true, infile);
167+
r = LFortran::LPython::python_ast_to_asr(al, lm, *ast, diagnostics, compiler_options, true, infile);
168+
for (auto &x: lm.in_filename) std::cout << x << "\n";
168169
std::cerr << diagnostics.render(input, lm, compiler_options);
169170
if (!r.ok) {
170171
LFORTRAN_ASSERT(diagnostics.has_error())
@@ -193,7 +194,7 @@ int emit_cpp(const std::string &infile,
193194
Allocator al(4*1024);
194195
LFortran::diag::Diagnostics diagnostics;
195196
LFortran::LocationManager lm;
196-
lm.in_filename = infile;
197+
lm.in_filename.push_back(infile);
197198
std::string input = LFortran::read_file(infile);
198199
lm.init_simple(input);
199200
LFortran::Result<LFortran::LPython::AST::ast_t*> r = parse_python_file(
@@ -206,7 +207,7 @@ int emit_cpp(const std::string &infile,
206207

207208
diagnostics.diagnostics.clear();
208209
LFortran::Result<LFortran::ASR::TranslationUnit_t*>
209-
r1 = LFortran::LPython::python_ast_to_asr(al, *ast, diagnostics, compiler_options, true, infile);
210+
r1 = LFortran::LPython::python_ast_to_asr(al, lm, *ast, diagnostics, compiler_options, true, infile);
210211
std::cerr << diagnostics.render(input, lm, compiler_options);
211212
if (!r1.ok) {
212213
LFORTRAN_ASSERT(diagnostics.has_error())
@@ -233,7 +234,7 @@ int emit_c(const std::string &infile,
233234
Allocator al(4*1024);
234235
LFortran::diag::Diagnostics diagnostics;
235236
LFortran::LocationManager lm;
236-
lm.in_filename = infile;
237+
lm.in_filename.push_back(infile);
237238
std::string input = LFortran::read_file(infile);
238239
lm.init_simple(input);
239240
LFortran::Result<LFortran::LPython::AST::ast_t*> r = parse_python_file(
@@ -246,7 +247,7 @@ int emit_c(const std::string &infile,
246247

247248
diagnostics.diagnostics.clear();
248249
LFortran::Result<LFortran::ASR::TranslationUnit_t*>
249-
r1 = LFortran::LPython::python_ast_to_asr(al, *ast, diagnostics, compiler_options, true, infile);
250+
r1 = LFortran::LPython::python_ast_to_asr(al, lm, *ast, diagnostics, compiler_options, true, infile);
250251
std::cerr << diagnostics.render(input, lm, compiler_options);
251252
if (!r1.ok) {
252253
LFORTRAN_ASSERT(diagnostics.has_error())
@@ -273,7 +274,7 @@ int emit_wat(const std::string &infile,
273274
Allocator al(4*1024);
274275
LFortran::diag::Diagnostics diagnostics;
275276
LFortran::LocationManager lm;
276-
lm.in_filename = infile;
277+
lm.in_filename.push_back(infile);
277278
std::string input = LFortran::read_file(infile);
278279
lm.init_simple(input);
279280
LFortran::Result<LFortran::LPython::AST::ast_t*> r = parse_python_file(
@@ -286,7 +287,7 @@ int emit_wat(const std::string &infile,
286287

287288
diagnostics.diagnostics.clear();
288289
LFortran::Result<LFortran::ASR::TranslationUnit_t*>
289-
r1 = LFortran::LPython::python_ast_to_asr(al, *ast, diagnostics, compiler_options, true, infile);
290+
r1 = LFortran::LPython::python_ast_to_asr(al, lm, *ast, diagnostics, compiler_options, true, infile);
290291
std::cerr << diagnostics.render(input, lm, compiler_options);
291292
if (!r1.ok) {
292293
LFORTRAN_ASSERT(diagnostics.has_error())
@@ -321,15 +322,15 @@ int get_symbols (const std::string &infile,
321322
Allocator al(4*1024);
322323
LFortran::diag::Diagnostics diagnostics;
323324
LFortran::LocationManager lm;
324-
lm.in_filename = infile;
325+
lm.in_filename.push_back(infile);
325326
std::string input = LFortran::read_file(infile);
326327
lm.init_simple(input);
327328
LFortran::Result<LFortran::LPython::AST::ast_t*> r1 = LFortran::parse_python_file(
328329
al, runtime_library_dir, infile, diagnostics, compiler_options.new_parser);
329330
if (r1.ok) {
330331
LFortran::LPython::AST::ast_t* ast = r1.result;
331332
LFortran::Result<LFortran::ASR::TranslationUnit_t*>
332-
x = LFortran::LPython::python_ast_to_asr(al, *ast, diagnostics, compiler_options, true, infile);
333+
x = LFortran::LPython::python_ast_to_asr(al, lm, *ast, diagnostics, compiler_options, true, infile);
333334
if (!x.ok) {
334335
std::cout << "{}\n";
335336
return 0;
@@ -412,7 +413,7 @@ int get_errors (const std::string &infile,
412413
Allocator al(4*1024);
413414
LFortran::diag::Diagnostics diagnostics;
414415
LFortran::LocationManager lm;
415-
lm.in_filename = infile;
416+
lm.in_filename.push_back(infile);
416417
std::string input = LFortran::read_file(infile);
417418
lm.init_simple(input);
418419
LFortran::Result<LFortran::LPython::AST::ast_t*>
@@ -421,7 +422,7 @@ int get_errors (const std::string &infile,
421422
if (r1.ok) {
422423
LFortran::LPython::AST::ast_t* ast = r1.result;
423424
LFortran::Result<LFortran::ASR::TranslationUnit_t*>
424-
r = LFortran::LPython::python_ast_to_asr(al, *ast, diagnostics, compiler_options, true, infile);
425+
r = LFortran::LPython::python_ast_to_asr(al, lm, *ast, diagnostics, compiler_options, true, infile);
425426
}
426427
std::vector<LFortran::LPython::error_highlight> diag_lists;
427428
LFortran::LPython::error_highlight h;
@@ -518,7 +519,7 @@ int emit_llvm(const std::string &infile,
518519
Allocator al(4*1024);
519520
LFortran::diag::Diagnostics diagnostics;
520521
LFortran::LocationManager lm;
521-
lm.in_filename = infile;
522+
lm.in_filename.push_back(infile);
522523
std::string input = LFortran::read_file(infile);
523524
lm.init_simple(input);
524525
LFortran::Result<LFortran::LPython::AST::ast_t*> r = parse_python_file(
@@ -532,7 +533,7 @@ int emit_llvm(const std::string &infile,
532533
LFortran::LPython::AST::ast_t* ast = r.result;
533534
diagnostics.diagnostics.clear();
534535
LFortran::Result<LFortran::ASR::TranslationUnit_t*>
535-
r1 = LFortran::LPython::python_ast_to_asr(al, *ast, diagnostics, compiler_options, true, infile);
536+
r1 = LFortran::LPython::python_ast_to_asr(al, lm, *ast, diagnostics, compiler_options, true, infile);
536537
std::cerr << diagnostics.render(input, lm, compiler_options);
537538
if (!r1.ok) {
538539
LFORTRAN_ASSERT(diagnostics.has_error())
@@ -565,7 +566,7 @@ int compile_python_to_object_file(
565566
Allocator al(4*1024);
566567
LFortran::diag::Diagnostics diagnostics;
567568
LFortran::LocationManager lm;
568-
lm.in_filename = infile;
569+
lm.in_filename.push_back(infile);
569570
std::vector<std::pair<std::string, double>>times;
570571
auto file_reading_start = std::chrono::high_resolution_clock::now();
571572
std::string input = LFortran::read_file(infile);
@@ -588,7 +589,7 @@ int compile_python_to_object_file(
588589
diagnostics.diagnostics.clear();
589590
auto ast_to_asr_start = std::chrono::high_resolution_clock::now();
590591
LFortran::Result<LFortran::ASR::TranslationUnit_t*>
591-
r1 = LFortran::LPython::python_ast_to_asr(al, *ast, diagnostics, compiler_options,
592+
r1 = LFortran::LPython::python_ast_to_asr(al, lm, *ast, diagnostics, compiler_options,
592593
!(arg_c && compiler_options.disable_main), infile);
593594

594595
auto ast_to_asr_end = std::chrono::high_resolution_clock::now();
@@ -649,7 +650,7 @@ int compile_to_binary_wasm(
649650
Allocator al(4*1024);
650651
LFortran::diag::Diagnostics diagnostics;
651652
LFortran::LocationManager lm;
652-
lm.in_filename = infile;
653+
lm.in_filename.push_back(infile);
653654
std::vector<std::pair<std::string, double>>times;
654655
auto file_reading_start = std::chrono::high_resolution_clock::now();
655656
std::string input = LFortran::read_file(infile);
@@ -672,7 +673,7 @@ int compile_to_binary_wasm(
672673
diagnostics.diagnostics.clear();
673674
auto ast_to_asr_start = std::chrono::high_resolution_clock::now();
674675
LFortran::Result<LFortran::ASR::TranslationUnit_t*>
675-
r1 = LFortran::LPython::python_ast_to_asr(al, *ast, diagnostics, compiler_options, true, infile);
676+
r1 = LFortran::LPython::python_ast_to_asr(al, lm, *ast, diagnostics, compiler_options, true, infile);
676677
auto ast_to_asr_end = std::chrono::high_resolution_clock::now();
677678
times.push_back(std::make_pair("AST to ASR", std::chrono::duration<double, std::milli>(ast_to_asr_end - ast_to_asr_start).count()));
678679
std::cerr << diagnostics.render(input, lm, compiler_options);
@@ -714,7 +715,7 @@ int compile_to_binary_x86(
714715
Allocator al(4*1024);
715716
LFortran::diag::Diagnostics diagnostics;
716717
LFortran::LocationManager lm;
717-
lm.in_filename = infile;
718+
lm.in_filename.push_back(infile);
718719
std::vector<std::pair<std::string, double>>times;
719720
auto file_reading_start = std::chrono::high_resolution_clock::now();
720721
std::string input = LFortran::read_file(infile);
@@ -737,7 +738,7 @@ int compile_to_binary_x86(
737738
diagnostics.diagnostics.clear();
738739
auto ast_to_asr_start = std::chrono::high_resolution_clock::now();
739740
LFortran::Result<LFortran::ASR::TranslationUnit_t*>
740-
r1 = LFortran::LPython::python_ast_to_asr(al, *ast, diagnostics, compiler_options, true, infile);
741+
r1 = LFortran::LPython::python_ast_to_asr(al, lm, *ast, diagnostics, compiler_options, true, infile);
741742
auto ast_to_asr_end = std::chrono::high_resolution_clock::now();
742743
times.push_back(std::make_pair("AST to ASR", std::chrono::duration<double, std::milli>(ast_to_asr_end - ast_to_asr_start).count()));
743744
std::cerr << diagnostics.render(input, lm, compiler_options);
@@ -779,7 +780,7 @@ int compile_to_binary_wasm_to_x86(
779780
Allocator al(4*1024);
780781
LFortran::diag::Diagnostics diagnostics;
781782
LFortran::LocationManager lm;
782-
lm.in_filename = infile;
783+
lm.in_filename.push_back(infile);
783784
std::vector<std::pair<std::string, double>>times;
784785
auto file_reading_start = std::chrono::high_resolution_clock::now();
785786
std::string input = LFortran::read_file(infile);
@@ -802,7 +803,7 @@ int compile_to_binary_wasm_to_x86(
802803
diagnostics.diagnostics.clear();
803804
auto ast_to_asr_start = std::chrono::high_resolution_clock::now();
804805
LFortran::Result<LFortran::ASR::TranslationUnit_t*>
805-
r1 = LFortran::LPython::python_ast_to_asr(al, *ast, diagnostics, compiler_options, true, infile);
806+
r1 = LFortran::LPython::python_ast_to_asr(al, lm, *ast, diagnostics, compiler_options, true, infile);
806807
auto ast_to_asr_end = std::chrono::high_resolution_clock::now();
807808
times.push_back(std::make_pair("AST to ASR", std::chrono::duration<double, std::milli>(ast_to_asr_end - ast_to_asr_start).count()));
808809
std::cerr << diagnostics.render(input, lm, compiler_options);
@@ -1020,7 +1021,7 @@ int link_executable(const std::vector<std::string> &infiles,
10201021
//
10211022
// LFortran::CPreprocessor cpp(compiler_options);
10221023
// LFortran::LocationManager lm;
1023-
// lm.in_filename = infile;
1024+
// lm.in_filename.push_back(infile);
10241025
// std::string s = cpp.run(input, lm, cpp.macro_definitions);
10251026
// std::cout << s;
10261027
// return 0;
@@ -1038,7 +1039,7 @@ namespace wasm {
10381039
Allocator al(4*1024); \
10391040
LFortran::LocationManager lm; \
10401041
LFortran::diag::Diagnostics diagnostics; \
1041-
lm.in_filename = "input";
1042+
lm.in_filename.push_back("input");
10421043

10431044

10441045

@@ -1067,7 +1068,7 @@ EMSCRIPTEN_KEEPALIVE char* emit_asr_from_source(char *input) {
10671068
if (ast.ok) {
10681069
auto casted_ast = (LFortran::LPython::AST::ast_t*)ast.result;
10691070
LFortran::Result<LFortran::ASR::TranslationUnit_t*>
1070-
asr = LFortran::LPython::python_ast_to_asr(al, *casted_ast, diagnostics, compiler_options, true, "input");
1071+
asr = LFortran::LPython::python_ast_to_asr(al, lm, *casted_ast, diagnostics, compiler_options, true, "input");
10711072
out = diagnostics.render(input, lm, compiler_options);
10721073
if (asr.ok) {
10731074
out += LFortran::pickle(*asr.result, compiler_options.use_colors, compiler_options.indent,
@@ -1085,7 +1086,7 @@ EMSCRIPTEN_KEEPALIVE char* emit_wat_from_source(char *input) {
10851086
if (ast.ok) {
10861087
auto casted_ast = (LFortran::LPython::AST::ast_t*)ast.result;
10871088
LFortran::Result<LFortran::ASR::TranslationUnit_t*>
1088-
asr = LFortran::LPython::python_ast_to_asr(al, *casted_ast, diagnostics, compiler_options, true, "input");
1089+
asr = LFortran::LPython::python_ast_to_asr(al, lm, *casted_ast, diagnostics, compiler_options, true, "input");
10891090
out = diagnostics.render(input, lm, compiler_options);
10901091
if (asr.ok) {
10911092
LFortran::Result<LFortran::Vec<uint8_t>>
@@ -1112,7 +1113,7 @@ EMSCRIPTEN_KEEPALIVE char* emit_cpp_from_source(char *input) {
11121113
if (ast.ok) {
11131114
auto casted_ast = (LFortran::LPython::AST::ast_t*)ast.result;
11141115
LFortran::Result<LFortran::ASR::TranslationUnit_t*>
1115-
asr = LFortran::LPython::python_ast_to_asr(al, *casted_ast, diagnostics, compiler_options, true, "input");
1116+
asr = LFortran::LPython::python_ast_to_asr(al, lm, *casted_ast, diagnostics, compiler_options, true, "input");
11161117
out = diagnostics.render(input, lm, compiler_options);
11171118
if (asr.ok) {
11181119
auto res = LFortran::asr_to_cpp(al, *asr.result, diagnostics,
@@ -1150,7 +1151,7 @@ EMSCRIPTEN_KEEPALIVE char* emit_wasm_from_source(char *input) {
11501151
if (ast.ok) {
11511152
auto casted_ast = (LFortran::LPython::AST::ast_t*)ast.result;
11521153
LFortran::Result<LFortran::ASR::TranslationUnit_t*>
1153-
asr = LFortran::LPython::python_ast_to_asr(al, *casted_ast, diagnostics, compiler_options, true, "input");
1154+
asr = LFortran::LPython::python_ast_to_asr(al, lm, *casted_ast, diagnostics, compiler_options, true, "input");
11541155
out = diagnostics.render(input, lm, compiler_options);
11551156
if (asr.ok) {
11561157
LFortran::Result<LFortran::Vec<uint8_t>>

src/libasr/codegen/asr_to_llvm.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
380380
void debug_get_line_column(const uint32_t &loc_first,
381381
uint32_t &line, uint32_t &column) {
382382
LocationManager lm;
383-
lm.in_filename = infile;
383+
lm.in_filename.push_back(infile);
384384
lm.init_simple(LFortran::read_file(infile));
385385
lm.pos_to_linecol(lm.output_to_input_pos(loc_first, false), line, column);
386386
}

src/libasr/diagnostics.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,22 @@ bool Diagnostics::has_error() const {
6262
}
6363

6464
std::string Diagnostics::render(const std::string &input,
65-
const LocationManager &lm, const CompilerOptions &compiler_options) {
65+
LocationManager &lm, const CompilerOptions &compiler_options) {
6666
std::string out;
6767
for (auto &d : this->diagnostics) {
6868
if (compiler_options.no_warnings && d.level != Level::Error) {
6969
continue;
7070
}
7171
if (compiler_options.error_format == "human") {
72-
out += render_diagnostic_human(d, input, lm,
72+
std::string input1;
73+
LFortran::read_file(lm.in_filename.back(), input1);
74+
lm.init_simple(input1);
75+
std::cout << lm.in_filename.back()+"\n"+input1;
76+
out += render_diagnostic_human(d, input1, lm,
7377
compiler_options.use_colors,
7478
compiler_options.show_stacktrace);
7579
if (&d != &this->diagnostics.back()) out += "\n";
80+
lm.in_filename.pop_back();
7681
} else if (compiler_options.error_format == "short") {
7782
out += render_diagnostic_short(d, input, lm);
7883
} else {
@@ -114,7 +119,7 @@ void populate_span(diag::Span &s, const LocationManager &lm,
114119
s.first_line, s.first_column);
115120
lm.pos_to_linecol(lm.output_to_input_pos(s.loc.last, true),
116121
s.last_line, s.last_column);
117-
s.filename = lm.in_filename;
122+
s.filename = lm.in_filename.back();
118123
for (uint32_t i = s.first_line; i <= s.last_line; i++) {
119124
s.source_code.push_back(get_line(input, i));
120125
}
@@ -178,7 +183,7 @@ std::string render_diagnostic_human(const Diagnostic &d, bool use_colors) {
178183
std::string type_color = "";
179184
switch (d.level) {
180185
case (Level::Error):
181-
primary_color = red_bold;
186+
primary_color = red_bold;
182187
type_color = primary_color;
183188
switch (d.stage) {
184189
case (Stage::CPreprocessor):
@@ -205,17 +210,17 @@ std::string render_diagnostic_human(const Diagnostic &d, bool use_colors) {
205210
}
206211
break;
207212
case (Level::Warning):
208-
primary_color = yellow_bold;
213+
primary_color = yellow_bold;
209214
type_color = primary_color;
210215
message_type = "warning";
211216
break;
212217
case (Level::Note):
213-
primary_color = bold;
218+
primary_color = bold;
214219
type_color = primary_color;
215220
message_type = "note";
216221
break;
217222
case (Level::Help):
218-
primary_color = bold;
223+
primary_color = bold;
219224
type_color = primary_color;
220225
message_type = "help";
221226
break;

src/libasr/diagnostics.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ struct Diagnostics {
114114
std::vector<Diagnostic> diagnostics;
115115

116116
std::string render(const std::string &input,
117-
const LocationManager &lm, const CompilerOptions &compiler_options);
117+
LocationManager &lm, const CompilerOptions &compiler_options);
118118

119119
// Returns true iff diagnostics contains at least one error message
120120
bool has_error() const;

src/libasr/location.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ struct LocationManager {
102102
// TODO: design a common structure, that also works with #include, that
103103
// has these mappings for each file
104104
bool preprocessor = false;
105-
std::string in_filename;
105+
std::vector<std::string> in_filename;
106106
uint32_t current_line=0;
107107
std::vector<uint32_t> out_start0; // consecutive intervals in the output code
108108
std::vector<uint32_t> in_start0; // start + size in the original code

0 commit comments

Comments
 (0)