From 612ccf9a6948aa97632429abbf20b1ffedbe233c Mon Sep 17 00:00:00 2001 From: Thirumalai Shaktivel Date: Thu, 25 Mar 2021 13:58:37 +0530 Subject: [PATCH 01/10] refactor: fix two cases: * Do not print the empty line at the beginning * Propoer printing of Variable in ASR --- grammar/asdl_cpp.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/grammar/asdl_cpp.py b/grammar/asdl_cpp.py index f8324796c5..b640904ef3 100644 --- a/grammar/asdl_cpp.py +++ b/grammar/asdl_cpp.py @@ -403,7 +403,7 @@ def visitModule(self, mod): self.emit("public:") self.emit( "std::string s, indtd;", 1) self.emit( "bool use_colors;", 1) - self.emit( "bool indent;", 1) + self.emit( "bool indent, start_line = true;", 1) self.emit( "int indent_level = 0, indent_spaces = 3;", 1) self.emit("public:") self.emit( "PickleBaseVisitor() : use_colors(false), indent(false) { s.reserve(100000); }", 1) @@ -439,10 +439,16 @@ def visitConstructor(self, cons, _): def make_visitor(self, name, fields, cons): self.emit("void visit_%s(const %s_t &x) {" % (name, name), 1) - self.emit( 'if(indent) {',2) - self.emit( 's.append("\\n"+indtd);', 3) - self.emit( 'inc_indent();',3) - self.emit( '}', 2) + self.emit( 'if(start_line) {',2) + self.emit( 'if(indent) {',3) + self.emit( 'start_line = false;', 4) + self.emit( 's.append(indtd);', 4) + self.emit( 'inc_indent();',4) + self.emit( '}', 3) + self.emit( '} else {', 2) + self.emit( 's.append("\\n"+indtd);', 4) + self.emit( 'inc_indent();',4) + self.emit( '}', 3) self.emit( 's.append("(");', 2) subs = { "Assignment": "=", @@ -483,10 +489,7 @@ def make_simple_sum_visitor(self, name, types): self.emit( 'switch (x) {', 2) for tp in types: self.emit( 'case (%s::%s) : {' % (name, tp.name), 3) - self.emit( 'if(indent) {',4) - self.emit( 'dec_indent();',5) - self.emit( 's.append("\\n"+indtd);', 5) - self.emit( '}', 4) + self.emit( 'if(indent) s.append("\\n"+indtd);',4) self.emit( 's.append("%s");' % (tp.name), 4) self.emit( ' break; }',3) self.emit( '}', 2) From 323ec2ed88a3363d13e091719defc8ade47d0eaf Mon Sep 17 00:00:00 2001 From: Thirumalai Shaktivel Date: Thu, 25 Mar 2021 16:46:08 +0530 Subject: [PATCH 02/10] refactor: some modification in printing --- grammar/asdl_cpp.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/grammar/asdl_cpp.py b/grammar/asdl_cpp.py index b640904ef3..854f96c6f0 100644 --- a/grammar/asdl_cpp.py +++ b/grammar/asdl_cpp.py @@ -473,6 +473,7 @@ def make_visitor(self, name, fields, cons): self.visitField(field, cons) if n < len(fields) - 1: self.emit( 's.append(" ");', 2) + self.emit( 'dec_indent();', 2) self.emit( 's.append(")");', 2) if not self.used: # Note: a better solution would be to change `&x` to `& /* x */` @@ -591,7 +592,7 @@ def visitField(self, field, cons): self.emit( 's.append("\\n"+indtd);', level+1) self.emit( 'inc_indent();',level+1) self.emit( '}', level) - self.emit( 's.append("{");', level) + self.emit( 's.append(" {");', level) self.emit('{', level) self.emit(' size_t i = 0;', level) self.emit(' for (auto &a : x.m_%s->scope) {' % field.name, level) @@ -609,6 +610,7 @@ def visitField(self, field, cons): self.emit( 'dec_indent();', level+1) self.emit( 's.append("\\n"+indtd);', level+1) self.emit( '}', level) + self.emit( 'dec_indent();', level) self.emit( 's.append("})");', level) elif field.type == "string" and not field.seq: if field.opt: From 787b3b4c086edcb30b2810d6b05a5e37ec2cd99a Mon Sep 17 00:00:00 2001 From: Thirumalai Shaktivel Date: Fri, 26 Mar 2021 08:59:58 +0530 Subject: [PATCH 03/10] refactor: fix ctest --- grammar/asdl_cpp.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/grammar/asdl_cpp.py b/grammar/asdl_cpp.py index 854f96c6f0..5918a0e274 100644 --- a/grammar/asdl_cpp.py +++ b/grammar/asdl_cpp.py @@ -412,8 +412,10 @@ def visitModule(self, mod): self.emit( "indtd = std::string(indent_level*indent_spaces, ' ');",2) self.emit( "}",1) self.emit( "void dec_indent() {", 1) - self.emit( "indent_level--;", 2) - self.emit( "indtd = std::string(indent_level*indent_spaces, ' ');",2) + self.emit( "if(indent_level > 0) {", 2) + self.emit( "indent_level--;", 3) + self.emit( "indtd = std::string(indent_level*indent_spaces, ' ');",3) + self.emit( "}",2) self.emit( "}",1) self.mod = mod super(PickleVisitorVisitor, self).visitModule(mod) @@ -592,7 +594,7 @@ def visitField(self, field, cons): self.emit( 's.append("\\n"+indtd);', level+1) self.emit( 'inc_indent();',level+1) self.emit( '}', level) - self.emit( 's.append(" {");', level) + self.emit( 's.append("{");', level) self.emit('{', level) self.emit(' size_t i = 0;', level) self.emit(' for (auto &a : x.m_%s->scope) {' % field.name, level) From d0eb34679b28e4730840eeb58f0c0a649e26e545 Mon Sep 17 00:00:00 2001 From: Thirumalai Shaktivel Date: Sat, 27 Mar 2021 17:00:03 +0530 Subject: [PATCH 04/10] refactor: place indent function within if(indent) guards --- grammar/asdl_cpp.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/grammar/asdl_cpp.py b/grammar/asdl_cpp.py index 5918a0e274..300f4f40f8 100644 --- a/grammar/asdl_cpp.py +++ b/grammar/asdl_cpp.py @@ -441,16 +441,16 @@ def visitConstructor(self, cons, _): def make_visitor(self, name, fields, cons): self.emit("void visit_%s(const %s_t &x) {" % (name, name), 1) - self.emit( 'if(start_line) {',2) - self.emit( 'if(indent) {',3) + self.emit( 'if(indent) {',2) + self.emit( 'if(start_line) {',3) self.emit( 'start_line = false;', 4) self.emit( 's.append(indtd);', 4) self.emit( 'inc_indent();',4) - self.emit( '}', 3) - self.emit( '} else {', 2) + self.emit( '} else {', 3) self.emit( 's.append("\\n"+indtd);', 4) self.emit( 'inc_indent();',4) self.emit( '}', 3) + self.emit( '}', 2) self.emit( 's.append("(");', 2) subs = { "Assignment": "=", @@ -475,7 +475,7 @@ def make_visitor(self, name, fields, cons): self.visitField(field, cons) if n < len(fields) - 1: self.emit( 's.append(" ");', 2) - self.emit( 'dec_indent();', 2) + self.emit( 'if(indent) dec_indent();', 2) self.emit( 's.append(")");', 2) if not self.used: # Note: a better solution would be to change `&x` to `& /* x */` @@ -610,9 +610,10 @@ def visitField(self, field, cons): self.emit('}', level) self.emit( 'if(indent){',level) self.emit( 'dec_indent();', level+1) + self.emit( 'dec_indent();', level+1) self.emit( 's.append("\\n"+indtd);', level+1) + self.emit( 'dec_indent();', level+1) self.emit( '}', level) - self.emit( 'dec_indent();', level) self.emit( 's.append("})");', level) elif field.type == "string" and not field.seq: if field.opt: From 7d26e2dc59a566ac74632b488e23fa4f7b5006f8 Mon Sep 17 00:00:00 2001 From: Thirumalai Shaktivel Date: Sat, 27 Mar 2021 19:14:07 +0530 Subject: [PATCH 05/10] refactor: increment and decrement equal number of times. --- grammar/asdl_cpp.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/grammar/asdl_cpp.py b/grammar/asdl_cpp.py index 300f4f40f8..1d1ce49087 100644 --- a/grammar/asdl_cpp.py +++ b/grammar/asdl_cpp.py @@ -404,7 +404,8 @@ def visitModule(self, mod): self.emit( "std::string s, indtd;", 1) self.emit( "bool use_colors;", 1) self.emit( "bool indent, start_line = true;", 1) - self.emit( "int indent_level = 0, indent_spaces = 3;", 1) + self.emit( "int indent_level = 0, indent_spaces = 3, tmp = 0, tmp1 = 0, lvl = 0;", 1) + self.emit( "int curly[20], round[20];", 1) self.emit("public:") self.emit( "PickleBaseVisitor() : use_colors(false), indent(false) { s.reserve(100000); }", 1) self.emit( "void inc_indent() {", 1) @@ -414,6 +415,7 @@ def visitModule(self, mod): self.emit( "void dec_indent() {", 1) self.emit( "if(indent_level > 0) {", 2) self.emit( "indent_level--;", 3) + self.emit( "LFORTRAN_ASSERT(indent_level >= 0);", 3) self.emit( "indtd = std::string(indent_level*indent_spaces, ' ');",3) self.emit( "}",2) self.emit( "}",1) @@ -442,6 +444,7 @@ def visitConstructor(self, cons, _): def make_visitor(self, name, fields, cons): self.emit("void visit_%s(const %s_t &x) {" % (name, name), 1) self.emit( 'if(indent) {',2) + self.emit( 'round[++tmp1] = indent_level;',3) self.emit( 'if(start_line) {',3) self.emit( 'start_line = false;', 4) self.emit( 's.append(indtd);', 4) @@ -475,7 +478,11 @@ def make_visitor(self, name, fields, cons): self.visitField(field, cons) if n < len(fields) - 1: self.emit( 's.append(" ");', 2) - self.emit( 'if(indent) dec_indent();', 2) + self.emit( 'if(indent) {', 2) + self.emit( 'lvl = indent_level;', 3) + self.emit( 'for(int times = 0; times < (lvl - round[tmp1] ); times++)', 3) + self.emit( 'dec_indent();', 4) + self.emit( 'round[tmp1] = 0; if(tmp1 > 1) tmp1--;}', 3) self.emit( 's.append(")");', 2) if not self.used: # Note: a better solution would be to change `&x` to `& /* x */` @@ -576,6 +583,7 @@ def visitField(self, field, cons): level = 2 self.emit( 'if(indent) {',level) self.emit( 's.append("\\n"+indtd);', level+1) + self.emit( 'round[++tmp1] = indent_level;',level+1) self.emit( 'inc_indent();',level+1) self.emit( '}', level) self.emit( 's.append("(");', level) @@ -592,6 +600,7 @@ def visitField(self, field, cons): self.emit( 's.append(" ");', level) self.emit( 'if(indent) {',level) self.emit( 's.append("\\n"+indtd);', level+1) + self.emit( 'curly[++tmp] = indent_level;',level+1) self.emit( 'inc_indent();',level+1) self.emit( '}', level) self.emit( 's.append("{");', level) @@ -608,13 +617,15 @@ def visitField(self, field, cons): self.emit(' i++;', level) self.emit(' }', level) self.emit('}', level) - self.emit( 'if(indent){',level) - self.emit( 'dec_indent();', level+1) - self.emit( 'dec_indent();', level+1) + self.emit( 'if(indent) {',level) + self.emit( 'lvl = indent_level;', level+1) + self.emit( 'for(int times = 0; times < (lvl - curly[tmp] ); times++)', level+1) + self.emit( 'dec_indent();', level+2) + self.emit( 'curly[tmp] = 0; if(tmp > 1) tmp--;', level+1) self.emit( 's.append("\\n"+indtd);', level+1) - self.emit( 'dec_indent();', level+1) self.emit( '}', level) self.emit( 's.append("})");', level) + self.emit( 'if(indent) dec_indent();', level) elif field.type == "string" and not field.seq: if field.opt: self.emit("if (x.m_%s) {" % field.name, 2) From b9b721ed494a3b1054f97f1e920889048a082690 Mon Sep 17 00:00:00 2001 From: Thirumalai Shaktivel Date: Sat, 27 Mar 2021 20:24:36 +0530 Subject: [PATCH 06/10] refactor: Remove if statement in dec_indent function --- grammar/asdl_cpp.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/grammar/asdl_cpp.py b/grammar/asdl_cpp.py index 1d1ce49087..5a1c9ee4c5 100644 --- a/grammar/asdl_cpp.py +++ b/grammar/asdl_cpp.py @@ -405,7 +405,7 @@ def visitModule(self, mod): self.emit( "bool use_colors;", 1) self.emit( "bool indent, start_line = true;", 1) self.emit( "int indent_level = 0, indent_spaces = 3, tmp = 0, tmp1 = 0, lvl = 0;", 1) - self.emit( "int curly[20], round[20];", 1) + self.emit( "int curly[20], round[20];", 1) self.emit("public:") self.emit( "PickleBaseVisitor() : use_colors(false), indent(false) { s.reserve(100000); }", 1) self.emit( "void inc_indent() {", 1) @@ -413,11 +413,9 @@ def visitModule(self, mod): self.emit( "indtd = std::string(indent_level*indent_spaces, ' ');",2) self.emit( "}",1) self.emit( "void dec_indent() {", 1) - self.emit( "if(indent_level > 0) {", 2) - self.emit( "indent_level--;", 3) - self.emit( "LFORTRAN_ASSERT(indent_level >= 0);", 3) - self.emit( "indtd = std::string(indent_level*indent_spaces, ' ');",3) - self.emit( "}",2) + self.emit( "indent_level--;", 2) + self.emit( "LFORTRAN_ASSERT(indent_level >= 0);", 2) + self.emit( "indtd = std::string(indent_level*indent_spaces, ' ');",2) self.emit( "}",1) self.mod = mod super(PickleVisitorVisitor, self).visitModule(mod) From 7e058a879fd2aa6534eb01d081316cf0843c37e4 Mon Sep 17 00:00:00 2001 From: Thirumalai Shaktivel Date: Sun, 11 Apr 2021 11:15:56 +0530 Subject: [PATCH 07/10] refactor: test indent at the CI --- run_tests.py | 6 ++ .../asr_indent-subroutine1-5dfc71f.json | 13 +++ .../asr_indent-subroutine1-5dfc71f.stdout | 90 +++++++++++++++++++ .../ast_indent-subroutine1-3a55d20.json | 13 +++ .../ast_indent-subroutine1-3a55d20.stdout | 18 ++++ tests/tests.toml | 1 + 6 files changed, 141 insertions(+) create mode 100644 tests/reference/asr_indent-subroutine1-5dfc71f.json create mode 100644 tests/reference/asr_indent-subroutine1-5dfc71f.stdout create mode 100644 tests/reference/ast_indent-subroutine1-3a55d20.json create mode 100644 tests/reference/ast_indent-subroutine1-3a55d20.stdout diff --git a/run_tests.py b/run_tests.py index 9912257f87..41113c3259 100755 --- a/run_tests.py +++ b/run_tests.py @@ -40,6 +40,7 @@ def main(): continue tokens = test.get("tokens", False) ast = test.get("ast", False) + indent = test.get("indent", False) ast_f90 = test.get("ast_f90", False) ast_cpp = test.get("ast_cpp", False) ast_cpp_hip = test.get("ast_cpp_hip", False) @@ -64,6 +65,11 @@ def main(): if ast: run_test("ast", "lfortran --show-ast --no-color {infile} -o {outfile}", filename, update_reference) + if indent: + run_test("ast_indent", "lfortran --show-ast --indent --no-color {infile} -o {outfile}", + filename, update_reference) + run_test("asr_indent", "lfortran --show-asr --indent --no-color {infile} -o {outfile}", + filename, update_reference) if ast_f90: run_test("ast_f90", "lfortran --show-ast-f90 --no-color {infile}", diff --git a/tests/reference/asr_indent-subroutine1-5dfc71f.json b/tests/reference/asr_indent-subroutine1-5dfc71f.json new file mode 100644 index 0000000000..6024211924 --- /dev/null +++ b/tests/reference/asr_indent-subroutine1-5dfc71f.json @@ -0,0 +1,13 @@ +{ + "basename": "asr_indent-subroutine1-5dfc71f", + "cmd": "lfortran --show-asr --indent --no-color {infile} -o {outfile}", + "infile": "tests/subroutine1.f90", + "infile_hash": "e209c22328b423e75d6801f3c0ef19bc120936196435dff2cb19df31", + "outfile": null, + "outfile_hash": null, + "stdout": "asr_indent-subroutine1-5dfc71f.stdout", + "stdout_hash": "24e2350982c2bc0311d420b6a1a7c942af5a2f0aa26a7aecfcac4a68", + "stderr": null, + "stderr_hash": null, + "returncode": 0 +} \ No newline at end of file diff --git a/tests/reference/asr_indent-subroutine1-5dfc71f.stdout b/tests/reference/asr_indent-subroutine1-5dfc71f.stdout new file mode 100644 index 0000000000..1562080c33 --- /dev/null +++ b/tests/reference/asr_indent-subroutine1-5dfc71f.stdout @@ -0,0 +1,90 @@ +(TranslationUnit + (SymbolTable + 1 + { + g: + (Subroutine + (SymbolTable + 2 + { + i: + (Variable + 2 + i + Local () + Default + (Integer 4 []) + Source + Public), + x: + (Variable + 2 + x + Local () + Default + (Integer 4 []) + Source + Public) + }) + g [] [ + (= + (Var 2 x) (ConstantInteger 1 + (Integer 4 []))) + (DoLoop + ( + (Var 2 i) (ConstantInteger 1 + (Integer 4 [])) (ConstantInteger 10 + (Integer 4 [])) ()) [ + (= + (Var 2 x) + (BinOp + (Var 2 x) + Mul + (Var 2 i) + (Integer 4 [])))])] + Source + Public), + h: + (Subroutine + (SymbolTable + 3 + { + i: + (Variable + 3 + i + Local () + Default + (Integer 4 []) + Source + Public), + x: + (Variable + 3 + x + Local () + Default + (Integer 4 []) + Source + Public) + }) + h [] [ + (= + (Var 3 x) (ConstantInteger 1 + (Integer 4 []))) + (DoLoop + ( + (Var 3 i) (ConstantInteger 1 + (Integer 4 [])) (ConstantInteger 10 + (Integer 4 [])) ()) [ + (= + (Var 3 x) + (BinOp + (Var 3 i) + Mul + (Var 3 x) + (Integer 4 [])))])] + Source + Public) + }) + []) diff --git a/tests/reference/ast_indent-subroutine1-3a55d20.json b/tests/reference/ast_indent-subroutine1-3a55d20.json new file mode 100644 index 0000000000..711a2a6a8a --- /dev/null +++ b/tests/reference/ast_indent-subroutine1-3a55d20.json @@ -0,0 +1,13 @@ +{ + "basename": "ast_indent-subroutine1-3a55d20", + "cmd": "lfortran --show-ast --indent --no-color {infile} -o {outfile}", + "infile": "tests/subroutine1.f90", + "infile_hash": "e209c22328b423e75d6801f3c0ef19bc120936196435dff2cb19df31", + "outfile": null, + "outfile_hash": null, + "stdout": "ast_indent-subroutine1-3a55d20.stdout", + "stdout_hash": "5785ca26e75959e4e7b9753ac07e3e5f9f2a9e554c03ba3f6dede2f1", + "stderr": null, + "stderr_hash": null, + "returncode": 0 +} \ No newline at end of file diff --git a/tests/reference/ast_indent-subroutine1-3a55d20.stdout b/tests/reference/ast_indent-subroutine1-3a55d20.stdout new file mode 100644 index 0000000000..83c4c3f926 --- /dev/null +++ b/tests/reference/ast_indent-subroutine1-3a55d20.stdout @@ -0,0 +1,18 @@ +(TranslationUnit + [ + (Subroutine + g [] [] [ + (Declaration [ + (x "integer" () [] [] [] ()) + (i "integer" () [] [] [] ())])] [ + (= x 1) + (DoLoop i 1 10 () [ + (= x (* x i))])] []) + (Subroutine + h [] [] [ + (Declaration [ + (x "integer" () [] [] [] ()) + (i "integer" () [] [] [] ())])] [ + (= x 1) + (DoLoop i 1 10 () [ + (= x (* i x))])] [])]) diff --git a/tests/tests.toml b/tests/tests.toml index b34fa275e0..bcfbbe3ed4 100644 --- a/tests/tests.toml +++ b/tests/tests.toml @@ -7,6 +7,7 @@ [[test]] filename = "subroutine1.f90" tokens = true +indent = true ast = true [[test]] From f786b839e975b285fee1bd81aadebe9cf00c27be Mon Sep 17 00:00:00 2001 From: Thirumalai Shaktivel Date: Sun, 11 Apr 2021 20:03:40 +0530 Subject: [PATCH 08/10] refactor: split indent into ast_indent and asr_indt, remove extra indent --- grammar/asdl_cpp.py | 5 +- run_tests.py | 11 ++- .../asr_indent-subroutine1-5dfc71f.json | 2 +- .../asr_indent-subroutine1-5dfc71f.stdout | 98 +++++++++---------- tests/tests.toml | 3 +- 5 files changed, 63 insertions(+), 56 deletions(-) diff --git a/grammar/asdl_cpp.py b/grammar/asdl_cpp.py index 5a1c9ee4c5..235e92af9c 100644 --- a/grammar/asdl_cpp.py +++ b/grammar/asdl_cpp.py @@ -611,7 +611,10 @@ def visitField(self, field, cons): self.emit( '}', level) self.emit(' s.append(a.first + ": ");', level) self.emit(' this->visit_symbol(*a.second);', level) - self.emit(' if (i < x.m_%s->scope.size()-1) s.append(", ");' % field.name, level) + self.emit(' if (i < x.m_%s->scope.size()-1) { ' % field.name, level) + self.emit(' s.append(", ");', level) + self.emit(' if(indent) dec_indent();', level) + self.emit(' }', level) self.emit(' i++;', level) self.emit(' }', level) self.emit('}', level) diff --git a/run_tests.py b/run_tests.py index 41113c3259..240c119171 100755 --- a/run_tests.py +++ b/run_tests.py @@ -40,12 +40,13 @@ def main(): continue tokens = test.get("tokens", False) ast = test.get("ast", False) - indent = test.get("indent", False) + ast_indent = test.get("ast_indent", False) ast_f90 = test.get("ast_f90", False) ast_cpp = test.get("ast_cpp", False) ast_cpp_hip = test.get("ast_cpp_hip", False) ast_openmp = test.get("ast_openmp", False) asr = test.get("asr", False) + asr_indent = test.get("asr_indent", False) mod_to_asr = test.get("mod_to_asr", False) llvm = test.get("llvm", False) cpp = test.get("cpp", False) @@ -65,11 +66,9 @@ def main(): if ast: run_test("ast", "lfortran --show-ast --no-color {infile} -o {outfile}", filename, update_reference) - if indent: + if ast_indent: run_test("ast_indent", "lfortran --show-ast --indent --no-color {infile} -o {outfile}", filename, update_reference) - run_test("asr_indent", "lfortran --show-asr --indent --no-color {infile} -o {outfile}", - filename, update_reference) if ast_f90: run_test("ast_f90", "lfortran --show-ast-f90 --no-color {infile}", @@ -91,6 +90,10 @@ def main(): run_test("asr", "lfortran --show-asr --no-color {infile} -o {outfile}", filename, update_reference) + if asr_indent: + run_test("asr_indent", "lfortran --show-asr --indent --no-color {infile} -o {outfile}", + filename, update_reference) + if mod_to_asr: run_test("mod_to_asr", "lfortran mod --show-asr --no-color {infile}", filename, update_reference) diff --git a/tests/reference/asr_indent-subroutine1-5dfc71f.json b/tests/reference/asr_indent-subroutine1-5dfc71f.json index 6024211924..a90713c276 100644 --- a/tests/reference/asr_indent-subroutine1-5dfc71f.json +++ b/tests/reference/asr_indent-subroutine1-5dfc71f.json @@ -6,7 +6,7 @@ "outfile": null, "outfile_hash": null, "stdout": "asr_indent-subroutine1-5dfc71f.stdout", - "stdout_hash": "24e2350982c2bc0311d420b6a1a7c942af5a2f0aa26a7aecfcac4a68", + "stdout_hash": "5f2e15cd782595c0787e9c6ad81c51d97b5d36d1b958761cb2db9520", "stderr": null, "stderr_hash": null, "returncode": 0 diff --git a/tests/reference/asr_indent-subroutine1-5dfc71f.stdout b/tests/reference/asr_indent-subroutine1-5dfc71f.stdout index 1562080c33..c8c9f3f305 100644 --- a/tests/reference/asr_indent-subroutine1-5dfc71f.stdout +++ b/tests/reference/asr_indent-subroutine1-5dfc71f.stdout @@ -16,15 +16,15 @@ (Integer 4 []) Source Public), - x: - (Variable - 2 - x - Local () - Default - (Integer 4 []) - Source - Public) + x: + (Variable + 2 + x + Local () + Default + (Integer 4 []) + Source + Public) }) g [] [ (= @@ -44,47 +44,47 @@ (Integer 4 [])))])] Source Public), - h: - (Subroutine - (SymbolTable - 3 - { - i: - (Variable - 3 - i - Local () - Default - (Integer 4 []) - Source - Public), - x: - (Variable - 3 - x - Local () - Default - (Integer 4 []) - Source - Public) - }) - h [] [ + h: + (Subroutine + (SymbolTable + 3 + { + i: + (Variable + 3 + i + Local () + Default + (Integer 4 []) + Source + Public), + x: + (Variable + 3 + x + Local () + Default + (Integer 4 []) + Source + Public) + }) + h [] [ + (= + (Var 3 x) (ConstantInteger 1 + (Integer 4 []))) + (DoLoop + ( + (Var 3 i) (ConstantInteger 1 + (Integer 4 [])) (ConstantInteger 10 + (Integer 4 [])) ()) [ (= - (Var 3 x) (ConstantInteger 1 - (Integer 4 []))) - (DoLoop - ( - (Var 3 i) (ConstantInteger 1 - (Integer 4 [])) (ConstantInteger 10 - (Integer 4 [])) ()) [ - (= + (Var 3 x) + (BinOp + (Var 3 i) + Mul (Var 3 x) - (BinOp - (Var 3 i) - Mul - (Var 3 x) - (Integer 4 [])))])] - Source - Public) + (Integer 4 [])))])] + Source + Public) }) []) diff --git a/tests/tests.toml b/tests/tests.toml index bcfbbe3ed4..993b6434f5 100644 --- a/tests/tests.toml +++ b/tests/tests.toml @@ -7,7 +7,8 @@ [[test]] filename = "subroutine1.f90" tokens = true -indent = true +ast_indent = true +asr_indent = true ast = true [[test]] From b69a39e77e6b6ae892fefe5fe50ee592b64a85b0 Mon Sep 17 00:00:00 2001 From: Thirumalai Shaktivel Date: Mon, 12 Apr 2021 19:20:27 +0530 Subject: [PATCH 09/10] refactor: match the indent --- grammar/asdl_cpp.py | 10 ++- .../asr_indent-subroutine1-5dfc71f.json | 2 +- .../asr_indent-subroutine1-5dfc71f.stdout | 80 +++++++++---------- 3 files changed, 49 insertions(+), 43 deletions(-) diff --git a/grammar/asdl_cpp.py b/grammar/asdl_cpp.py index 235e92af9c..a721d90611 100644 --- a/grammar/asdl_cpp.py +++ b/grammar/asdl_cpp.py @@ -404,7 +404,8 @@ def visitModule(self, mod): self.emit( "std::string s, indtd;", 1) self.emit( "bool use_colors;", 1) self.emit( "bool indent, start_line = true;", 1) - self.emit( "int indent_level = 0, indent_spaces = 3, tmp = 0, tmp1 = 0, lvl = 0;", 1) + self.emit( "int indent_level = 0, indent_spaces = 3, lvl = 0;", 1) + self.emit( "int tmp = 0, tmp1 = 0, tmp2 = 2;", 1) self.emit( "int curly[20], round[20];", 1) self.emit("public:") self.emit( "PickleBaseVisitor() : use_colors(false), indent(false) { s.reserve(100000); }", 1) @@ -599,6 +600,7 @@ def visitField(self, field, cons): self.emit( 'if(indent) {',level) self.emit( 's.append("\\n"+indtd);', level+1) self.emit( 'curly[++tmp] = indent_level;',level+1) + self.emit( 'tmp2 = 1;',level+1) self.emit( 'inc_indent();',level+1) self.emit( '}', level) self.emit( 's.append("{");', level) @@ -613,7 +615,10 @@ def visitField(self, field, cons): self.emit(' this->visit_symbol(*a.second);', level) self.emit(' if (i < x.m_%s->scope.size()-1) { ' % field.name, level) self.emit(' s.append(", ");', level) - self.emit(' if(indent) dec_indent();', level) + self.emit(' if(indent) {', level) + self.emit(' for(int times = 0; times < tmp2; times++)', level+1) + self.emit(' dec_indent();', level) + self.emit(' }', level) self.emit(' }', level) self.emit(' i++;', level) self.emit(' }', level) @@ -623,6 +628,7 @@ def visitField(self, field, cons): self.emit( 'for(int times = 0; times < (lvl - curly[tmp] ); times++)', level+1) self.emit( 'dec_indent();', level+2) self.emit( 'curly[tmp] = 0; if(tmp > 1) tmp--;', level+1) + self.emit( 'tmp2++;', level+1) self.emit( 's.append("\\n"+indtd);', level+1) self.emit( '}', level) self.emit( 's.append("})");', level) diff --git a/tests/reference/asr_indent-subroutine1-5dfc71f.json b/tests/reference/asr_indent-subroutine1-5dfc71f.json index a90713c276..26950da36f 100644 --- a/tests/reference/asr_indent-subroutine1-5dfc71f.json +++ b/tests/reference/asr_indent-subroutine1-5dfc71f.json @@ -6,7 +6,7 @@ "outfile": null, "outfile_hash": null, "stdout": "asr_indent-subroutine1-5dfc71f.stdout", - "stdout_hash": "5f2e15cd782595c0787e9c6ad81c51d97b5d36d1b958761cb2db9520", + "stdout_hash": "7132f2d438e25d60076581c69bfdd21cf81fe825635e154d83f523e8", "stderr": null, "stderr_hash": null, "returncode": 0 diff --git a/tests/reference/asr_indent-subroutine1-5dfc71f.stdout b/tests/reference/asr_indent-subroutine1-5dfc71f.stdout index c8c9f3f305..8c82edb919 100644 --- a/tests/reference/asr_indent-subroutine1-5dfc71f.stdout +++ b/tests/reference/asr_indent-subroutine1-5dfc71f.stdout @@ -44,47 +44,47 @@ (Integer 4 [])))])] Source Public), - h: - (Subroutine - (SymbolTable - 3 - { - i: - (Variable - 3 - i - Local () - Default - (Integer 4 []) - Source - Public), - x: - (Variable - 3 - x - Local () - Default - (Integer 4 []) - Source - Public) - }) - h [] [ + h: + (Subroutine + (SymbolTable + 3 + { + i: + (Variable + 3 + i + Local () + Default + (Integer 4 []) + Source + Public), + x: + (Variable + 3 + x + Local () + Default + (Integer 4 []) + Source + Public) + }) + h [] [ + (= + (Var 3 x) (ConstantInteger 1 + (Integer 4 []))) + (DoLoop + ( + (Var 3 i) (ConstantInteger 1 + (Integer 4 [])) (ConstantInteger 10 + (Integer 4 [])) ()) [ (= - (Var 3 x) (ConstantInteger 1 - (Integer 4 []))) - (DoLoop - ( - (Var 3 i) (ConstantInteger 1 - (Integer 4 [])) (ConstantInteger 10 - (Integer 4 [])) ()) [ - (= + (Var 3 x) + (BinOp + (Var 3 i) + Mul (Var 3 x) - (BinOp - (Var 3 i) - Mul - (Var 3 x) - (Integer 4 [])))])] - Source - Public) + (Integer 4 [])))])] + Source + Public) }) []) From d5e247dac2664facd5666d3b23f7d42fd4c0965c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20=C4=8Cert=C3=ADk?= Date: Mon, 12 Apr 2021 23:34:35 +0000 Subject: [PATCH 10/10] Split variable increment from an expression --- grammar/asdl_cpp.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/grammar/asdl_cpp.py b/grammar/asdl_cpp.py index a721d90611..cfd793c04b 100644 --- a/grammar/asdl_cpp.py +++ b/grammar/asdl_cpp.py @@ -443,7 +443,8 @@ def visitConstructor(self, cons, _): def make_visitor(self, name, fields, cons): self.emit("void visit_%s(const %s_t &x) {" % (name, name), 1) self.emit( 'if(indent) {',2) - self.emit( 'round[++tmp1] = indent_level;',3) + self.emit( 'tmp1++;',3) + self.emit( 'round[tmp1] = indent_level;',3) self.emit( 'if(start_line) {',3) self.emit( 'start_line = false;', 4) self.emit( 's.append(indtd);', 4)