User Guide
localrename.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2023 Blue Brain Project, EPFL.
3  * See the top-level LICENSE file for details.
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  */
7 
8 #include <catch2/catch_test_macros.hpp>
9 #include <catch2/matchers/catch_matchers_string.hpp>
10 
11 #include "ast/program.hpp"
12 #include "parser/nmodl_driver.hpp"
19 
20 
21 using namespace nmodl;
22 using namespace visitor;
23 using namespace test;
24 using namespace test_utils;
25 
26 using Catch::Matchers::Equals;
28 
29 //=============================================================================
30 // Procedure/Function inlining tests
31 //=============================================================================
32 
33 std::string run_inline_localvarrename_visitor(const std::string& text) {
35  const auto& ast = driver.parse_string(text);
36 
37  SymtabVisitor().visit_program(*ast);
38  InlineVisitor().visit_program(*ast);
39  SymtabVisitor().visit_program(*ast);
40  LocalVarRenameVisitor().visit_program(*ast);
41  SymtabVisitor().visit_program(*ast);
42  std::stringstream stream;
43  NmodlPrintVisitor(stream).visit_program(*ast);
44 
45 
46  // check that, after visitor rearrangement, parents are still up-to-date
47  CheckParentVisitor().check_ast(*ast);
48 
49  return stream.str();
50 }
51 
52 SCENARIO("LocalVarRenameVisitor works with InlineVisitor", "[visitor][localvarrename]") {
53  GIVEN("A FUNCTION that gets inlined with a LOCAL variable") {
54  std::string nmodl_text = R"(
55  FUNCTION rates_1(Vm (mV)) {
56  LOCAL v
57  v = Vm + 5
58  rates_1 = v
59  }
60 
61  FUNCTION rates_2(Vm (mV)) {
62  rates_2 = rates_1(Vm)
63  }
64  )";
65  std::string output_nmodl = R"(
66  FUNCTION rates_1(Vm(mV)) {
67  LOCAL v_r_0
68  v_r_0 = Vm+5
69  rates_1 = v_r_0
70  }
71 
72  FUNCTION rates_2(Vm(mV)) {
73  LOCAL rates_1_in_0
74  {
75  LOCAL v_r_1, Vm_in_0
76  Vm_in_0 = Vm
77  v_r_1 = Vm_in_0+5
78  rates_1_in_0 = v_r_1
79  }
80  rates_2 = rates_1_in_0
81  }
82  )";
83  THEN("LOCAL variable in inlined function gets renamed") {
84  std::string input = reindent_text(nmodl_text);
85  auto expected_result = reindent_text(output_nmodl);
86  auto result = run_inline_localvarrename_visitor(input);
87  REQUIRE(result == expected_result);
88  }
89  }
90 }
test_utils.hpp
nmodl::parser::NmodlDriver
Class that binds all pieces together for parsing nmodl file.
Definition: nmodl_driver.hpp:67
nmodl::test_utils::reindent_text
std::string reindent_text(const std::string &text, int indent_level)
Reindent nmodl text for text-to-text comparison.
Definition: test_utils.cpp:53
nmodl
encapsulates code generation backend implementations
Definition: ast_common.hpp:26
program.hpp
Auto generated AST classes declaration.
driver
nmodl::parser::UnitDriver driver
Definition: parser.cpp:28
local_var_rename_visitor.hpp
Visitor to rename local variables conflicting with global scope
nmodl::parser::UnitDriver::parse_string
bool parse_string(const std::string &input)
parser Units provided as string (used for testing)
Definition: unit_driver.cpp:40
checkparent_visitor.hpp
Visitor for checking parents of ast nodes
inline_visitor.hpp
Visitor to inline local procedure and function calls
nmodl_driver.hpp
run_inline_localvarrename_visitor
std::string run_inline_localvarrename_visitor(const std::string &text)
Definition: localrename.cpp:33
symtab_visitor.hpp
THIS FILE IS GENERATED AT BUILD TIME AND SHALL NOT BE EDITED.
SCENARIO
SCENARIO("LocalVarRenameVisitor works with InlineVisitor", "[visitor][localvarrename]")
Definition: localrename.cpp:52
nmodl_visitor.hpp
THIS FILE IS GENERATED AT BUILD TIME AND SHALL NOT BE EDITED.