Skip to content
Snippets Groups Projects
Commit 5317f837 authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Improve checking of declarations and add related tests

parent 3b7412bc
Branches
Tags
1 merge request!37Feature/language
......@@ -16,6 +16,10 @@ ASTSymbolInitializationChecker::_checkSymbolInitialization(ASTNode& node)
};
auto check_correct_name_in_definition = [](ASTNode& decl_name_node, ASTNode& def_name_node) {
if (def_name_node.is_type<language::name_list>()) {
throw parse_error("unexpected variable list, expecting one identifier", std::vector{def_name_node.begin()});
}
Assert(def_name_node.is_type<language::name>());
if (decl_name_node.string() != def_name_node.string()) {
std::ostringstream os;
os << "invalid identifier, expecting '" << decl_name_node.string() << "'" << std::ends;
......
......@@ -10,6 +10,8 @@
#include <ASTNodeAffectationExpressionBuilder.hpp>
#include <ASTSymbolInitializationChecker.hpp>
#include <ASTSymbolTableBuilder.hpp>
#include <ASTPrinter.hpp>
......@@ -1342,5 +1344,75 @@ let x : R^1; let y : R^1; x *= y;
CHECK_AST_THROWS_WITH(data, error_message);
}
}
SECTION("incorrect declarative/definition number of symbols")
{
std::string_view data = R"(
let (x,y,z):R*R*R, (x,y) = (2,3);
)";
string_input input{data, "test.pgs"};
auto ast = ASTBuilder::build(input);
ASTSymbolTableBuilder{*ast};
REQUIRE_THROWS_WITH(ASTSymbolInitializationChecker{*ast},
std::string{"invalid number of definition identifiers, expecting 3 found 2"});
}
SECTION("incorrect identifier/expression number of symbols")
{
std::string_view data = R"(
let (x,y,z):R*R*R, (x,y,z) = (2,3);
)";
string_input input{data, "test.pgs"};
auto ast = ASTBuilder::build(input);
ASTSymbolTableBuilder{*ast};
REQUIRE_THROWS_WITH(ASTSymbolInitializationChecker{*ast},
std::string{"invalid number of definition expressions, expecting 3 found 2"});
}
SECTION("incorrect identifier/expression number of symbols")
{
std::string_view data = R"(
let y:R;
let x:R, (x,y) = (2,3);
)";
string_input input{data, "test.pgs"};
auto ast = ASTBuilder::build(input);
ASTSymbolTableBuilder{*ast};
REQUIRE_THROWS_WITH(ASTSymbolInitializationChecker{*ast},
std::string{"unexpected variable list, expecting one identifier"});
}
SECTION("incorrect definition variable identifier")
{
std::string_view data = R"(
let y:R;
let x:R, y = 3;
)";
string_input input{data, "test.pgs"};
auto ast = ASTBuilder::build(input);
ASTSymbolTableBuilder{*ast};
REQUIRE_THROWS_WITH(ASTSymbolInitializationChecker{*ast}, std::string{"invalid identifier, expecting 'x'"});
}
SECTION("invalid definition variable identifier order")
{
std::string_view data = R"(
let (x,y):R, (y,x) = (3,2);
)";
string_input input{data, "test.pgs"};
auto ast = ASTBuilder::build(input);
ASTSymbolTableBuilder{*ast};
REQUIRE_THROWS_WITH(ASTSymbolInitializationChecker{*ast}, std::string{"invalid identifier, expecting 'x'"});
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment