diff --git a/src/language/ast/ASTNodeAffectationExpressionBuilder.cpp b/src/language/ast/ASTNodeAffectationExpressionBuilder.cpp index a97c13443bd628a2226de54623c673d464916a0c..32117039587e2c53907ea030ac73a7e10e544255 100644 --- a/src/language/ast/ASTNodeAffectationExpressionBuilder.cpp +++ b/src/language/ast/ASTNodeAffectationExpressionBuilder.cpp @@ -43,6 +43,6 @@ ASTNodeAffectationExpressionBuilder::ASTNodeAffectationExpressionBuilder(ASTNode error_message << "undefined affectation type: "; error_message << rang::fgB::red << affectation_name << rang::fg::reset; - throw ParseError(error_message.str(), std::vector{node.begin()}); + throw ParseError(error_message.str(), std::vector{node.children[0]->begin()}); } } diff --git a/src/language/ast/ASTNodeBuiltinFunctionExpressionBuilder.cpp b/src/language/ast/ASTNodeBuiltinFunctionExpressionBuilder.cpp index 248511e6c91c2eec08a94e87faa8179c06a0bf80..487259530b7c3e4872371e9623517c0546d31e4f 100644 --- a/src/language/ast/ASTNodeBuiltinFunctionExpressionBuilder.cpp +++ b/src/language/ast/ASTNodeBuiltinFunctionExpressionBuilder.cpp @@ -4,6 +4,7 @@ #include <language/ast/ASTNodeDataTypeFlattener.hpp> #include <language/node_processor/BuiltinFunctionProcessor.hpp> #include <language/utils/ASTNodeNaturalConversionChecker.hpp> +#include <language/utils/BuiltinFunctionEmbedderUtils.hpp> #include <language/utils/ParseError.hpp> #include <language/utils/SymbolTable.hpp> @@ -494,7 +495,8 @@ ASTNodeBuiltinFunctionExpressionBuilder::_buildArgumentProcessors( if (arguments_number != parameters_number) { std::ostringstream error_message; error_message << "bad number of arguments: expecting " << rang::fgB::yellow << parameters_number - << rang::style::reset << ", provided " << rang::fgB::yellow << arguments_number << rang::style::reset; + << rang::style::reset << rang::style::bold << ", provided " << rang::fgB::yellow << arguments_number + << rang::style::reset; throw ParseError(error_message.str(), argument_nodes.begin()); } @@ -505,14 +507,9 @@ ASTNodeBuiltinFunctionExpressionBuilder::_buildArgumentProcessors( ASTNodeBuiltinFunctionExpressionBuilder::ASTNodeBuiltinFunctionExpressionBuilder(ASTNode& node) { - auto [i_function_symbol, found] = node.m_symbol_table->find(node.children[0]->string(), node.begin()); - Assert(found); - Assert(i_function_symbol->attributes().dataType() == ASTNodeDataType::builtin_function_t); + Assert(node.children[0]->m_data_type == ASTNodeDataType::builtin_function_t); - uint64_t builtin_function_id = std::get<uint64_t>(i_function_symbol->attributes().value()); - - auto& builtin_function_embedder_table = node.m_symbol_table->builtinFunctionEmbedderTable(); - std::shared_ptr builtin_function_embedder = builtin_function_embedder_table[builtin_function_id]; + std::shared_ptr builtin_function_embedder = getBuiltinFunctionEmbedder(node); std::vector<ASTNodeDataType> builtin_function_parameter_type_list = builtin_function_embedder->getParameterDataTypes(); diff --git a/src/language/ast/ASTNodeDataTypeBuilder.cpp b/src/language/ast/ASTNodeDataTypeBuilder.cpp index b5f65437ce1b45b4a403aaf079317de8f04c0de5..24841d797529750ba2adc6664c278a56c615fdd2 100644 --- a/src/language/ast/ASTNodeDataTypeBuilder.cpp +++ b/src/language/ast/ASTNodeDataTypeBuilder.cpp @@ -3,6 +3,7 @@ #include <language/PEGGrammar.hpp> #include <language/utils/ASTNodeNaturalConversionChecker.hpp> #include <language/utils/BuiltinFunctionEmbedder.hpp> +#include <language/utils/BuiltinFunctionEmbedderUtils.hpp> #include <language/utils/OperatorRepository.hpp> #include <language/utils/ParseError.hpp> #include <language/utils/SymbolTable.hpp> @@ -284,8 +285,13 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n) const std::shared_ptr<SymbolTable>& symbol_table = n.m_symbol_table; auto [i_symbol, found] = symbol_table->find(n.string(), n.begin()); - Assert(found); - n.m_data_type = i_symbol->attributes().dataType(); + if (found) { + n.m_data_type = i_symbol->attributes().dataType(); + } else if (symbol_table->has(n.string(), n.begin())) { + n.m_data_type = ASTNodeDataType::build<ASTNodeDataType::builtin_function_t>(); + } else { + throw UnexpectedError("could not find symbol " + n.string()); + } } } for (auto& child : n.children) { @@ -522,15 +528,7 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n) const n.m_data_type = image_domain_node.m_data_type.contentType(); } else if (n.children[0]->m_data_type == ASTNodeDataType::builtin_function_t) { - const std::string builtin_function_name = n.children[0]->string(); - auto& symbol_table = *n.m_symbol_table; - - auto [i_symbol, success] = symbol_table.find(builtin_function_name, n.begin()); - Assert(success); - - uint64_t builtin_function_id = std::get<uint64_t>(i_symbol->attributes().value()); - auto builtin_function_embedder = symbol_table.builtinFunctionEmbedderTable()[builtin_function_id]; - Assert(builtin_function_embedder); + auto builtin_function_embedder = getBuiltinFunctionEmbedder(n); n.m_data_type = builtin_function_embedder->getReturnDataType(); } else { diff --git a/src/language/ast/ASTNodeDataTypeFlattener.cpp b/src/language/ast/ASTNodeDataTypeFlattener.cpp index 6a06c72bb66926af546ff0a130315eacc8b54c9a..a2f83e5923392163f54ccc1b8bdecd5b8ed96e86 100644 --- a/src/language/ast/ASTNodeDataTypeFlattener.cpp +++ b/src/language/ast/ASTNodeDataTypeFlattener.cpp @@ -2,6 +2,7 @@ #include <language/PEGGrammar.hpp> #include <language/utils/BuiltinFunctionEmbedder.hpp> +#include <language/utils/BuiltinFunctionEmbedderUtils.hpp> #include <language/utils/FunctionTable.hpp> #include <language/utils/SymbolTable.hpp> @@ -16,12 +17,12 @@ ASTNodeDataTypeFlattener::ASTNodeDataTypeFlattener(ASTNode& node, FlattenedDataT flattened_datatype_list.push_back({node.m_data_type, node}); } else { ASTNode& function_name_node = *node.children[0]; + Assert(node.m_symbol_table->has(function_name_node.string(), node.begin())); - auto [i_function_symbol, found] = node.m_symbol_table->find(function_name_node.string(), node.begin()); - Assert(found); - - switch (i_function_symbol->attributes().dataType()) { + switch (function_name_node.m_data_type) { case ASTNodeDataType::function_t: { + auto [i_function_symbol, found] = node.m_symbol_table->find(function_name_node.string(), node.begin()); + uint64_t function_id = std::get<uint64_t>(i_function_symbol->attributes().value()); FunctionDescriptor& function_descriptor = node.m_symbol_table->functionTable()[function_id]; @@ -35,10 +36,8 @@ ASTNodeDataTypeFlattener::ASTNodeDataTypeFlattener(ASTNode& node, FlattenedDataT break; } case ASTNodeDataType::builtin_function_t: { - uint64_t builtin_function_id = std::get<uint64_t>(i_function_symbol->attributes().value()); - auto builtin_function_embedder = node.m_symbol_table->builtinFunctionEmbedderTable()[builtin_function_id]; + const auto& compound_data_type = getBuiltinFunctionEmbedder(node)->getReturnDataType(); - const auto& compound_data_type = builtin_function_embedder->getReturnDataType(); for (auto data_type : compound_data_type.contentTypeList()) { flattened_datatype_list.push_back({*data_type, node}); } diff --git a/src/language/ast/ASTNodeExpressionBuilder.cpp b/src/language/ast/ASTNodeExpressionBuilder.cpp index fcdc4e1b93ab9135a6942e0e338144dff9474116..f8d26d197e94ae33fef09eed675bfdd688c6cc44 100644 --- a/src/language/ast/ASTNodeExpressionBuilder.cpp +++ b/src/language/ast/ASTNodeExpressionBuilder.cpp @@ -68,12 +68,17 @@ ASTNodeExpressionBuilder::_buildExpression(ASTNode& n) n.m_node_processor = std::make_unique<FakeProcessor>(); } else if (n.is_type<language::name>()) { - // Dealing with contexts - auto [i_symbol, success] = n.m_symbol_table->find(n.string(), n.begin()); - if (i_symbol->attributes().hasLocalContext()) { - n.m_node_processor = std::make_unique<LocalNameProcessor>(n); + if (n.m_data_type == ASTNodeDataType::builtin_function_t) { + n.m_node_processor = std::make_unique<FakeProcessor>(); } else { - n.m_node_processor = std::make_unique<NameProcessor>(n); + // Dealing with contexts + auto [i_symbol, success] = n.m_symbol_table->find(n.string(), n.begin()); + Assert(success, "could not find symbol"); + if (i_symbol->attributes().hasLocalContext()) { + n.m_node_processor = std::make_unique<LocalNameProcessor>(n); + } else { + n.m_node_processor = std::make_unique<NameProcessor>(n); + } } } else if (n.is_type<language::unary_minus>() or n.is_type<language::unary_not>()) { ASTNodeUnaryOperatorExpressionBuilder{n}; diff --git a/src/language/ast/ASTNodeFunctionEvaluationExpressionBuilder.cpp b/src/language/ast/ASTNodeFunctionEvaluationExpressionBuilder.cpp index 13af5a812bd46ae0a6309eb65c1eecdda2cb027e..126ef86fc5dff7a1cb11f2f0f94f8a860b30138a 100644 --- a/src/language/ast/ASTNodeFunctionEvaluationExpressionBuilder.cpp +++ b/src/language/ast/ASTNodeFunctionEvaluationExpressionBuilder.cpp @@ -7,10 +7,7 @@ ASTNodeFunctionEvaluationExpressionBuilder::ASTNodeFunctionEvaluationExpressionBuilder(ASTNode& node) { - auto [i_function_symbol, found] = node.m_symbol_table->find(node.children[0]->string(), node.begin()); - Assert(found); - - switch (i_function_symbol->attributes().dataType()) { + switch (node.children[0]->m_data_type) { case ASTNodeDataType::function_t: { ASTNodeFunctionExpressionBuilder{node}; break; diff --git a/src/language/ast/ASTNodeFunctionExpressionBuilder.cpp b/src/language/ast/ASTNodeFunctionExpressionBuilder.cpp index 6484b85b0fed5626df7f46ade79c479cfe5f23ae..1fb23a5de3287b8b685ce9ef2ea4789697cbe198 100644 --- a/src/language/ast/ASTNodeFunctionExpressionBuilder.cpp +++ b/src/language/ast/ASTNodeFunctionExpressionBuilder.cpp @@ -233,7 +233,8 @@ ASTNodeFunctionExpressionBuilder::_buildArgumentConverter(FunctionDescriptor& fu if (arguments_number != parameters_number) { std::ostringstream error_message; error_message << "bad number of arguments: expecting " << rang::fgB::yellow << parameters_number - << rang::style::reset << ", provided " << rang::fgB::yellow << arguments_number << rang::style::reset; + << rang::style::reset << rang::style::bold << ", provided " << rang::fgB::yellow << arguments_number + << rang::style::reset; throw ParseError(error_message.str(), argument_nodes.begin()); } diff --git a/src/language/ast/ASTSymbolInitializationChecker.cpp b/src/language/ast/ASTSymbolInitializationChecker.cpp index c37d4ba6bbe45563a71c876c5d1b70e992762729..8fe9ac4f774a949600b1dadbb0018568722c37a7 100644 --- a/src/language/ast/ASTSymbolInitializationChecker.cpp +++ b/src/language/ast/ASTSymbolInitializationChecker.cpp @@ -107,8 +107,9 @@ ASTSymbolInitializationChecker::_checkSymbolInitialization(ASTNode& node) } } else if (node.is_type<language::name>()) { auto [i_symbol, found] = node.m_symbol_table->find(node.string(), node.begin()); - Assert(found, "unexpected error, should have been detected through declaration checking"); - if (not i_symbol->attributes().isInitialized()) { + Assert(node.m_symbol_table->has(node.string(), node.begin()), + "unexpected error, should have been detected through declaration checking"); + if (found and not i_symbol->attributes().isInitialized()) { std::ostringstream error_message; error_message << "uninitialized symbol '" << rang::fg::red << node.string() << rang::fg::reset << '\''; throw ParseError(error_message.str(), std::vector{node.begin()}); diff --git a/src/language/ast/ASTSymbolTableBuilder.cpp b/src/language/ast/ASTSymbolTableBuilder.cpp index feb0b0130dd316df1cf768ad3506fa31f42b68b8..44058de6f3739580dbcf3d34e22970647c6bb2ad 100644 --- a/src/language/ast/ASTSymbolTableBuilder.cpp +++ b/src/language/ast/ASTSymbolTableBuilder.cpp @@ -22,11 +22,19 @@ ASTSymbolTableBuilder::buildSymbolTable(ASTNode& n, std::shared_ptr<SymbolTable> n.m_symbol_table = local_symbol_table; const std::string& symbol = n.children[0]->string(); - auto [i_symbol, success] = symbol_table->add(symbol, n.children[0]->begin()); + + if (symbol_table->getBuiltinFunctionSymbolList(symbol, n.children[0]->begin()).size() > 0) { + std::ostringstream error_message; + error_message << "symbol '" << rang::fg::red << symbol << rang::fg::reset + << "' already denotes a builtin function!"; + throw ParseError(error_message.str(), std::vector{n.children[0]->begin()}); + } + + auto [i_symbol, success] = symbol_table->add(symbol, n.children[0]->begin()); if (not success) { std::ostringstream error_message; error_message << "symbol '" << rang::fg::red << symbol << rang::fg::reset << "' was already defined!"; - throw ParseError(error_message.str(), std::vector{n.begin()}); + throw ParseError(error_message.str(), std::vector{n.children[0]->begin()}); } for (auto& child : n.children) { @@ -42,6 +50,13 @@ ASTSymbolTableBuilder::buildSymbolTable(ASTNode& n, std::shared_ptr<SymbolTable> if (n.has_content()) { if (n.is_type<language::var_declaration>()) { auto register_symbol = [&](const ASTNode& argument_node) { + if (symbol_table->getBuiltinFunctionSymbolList(argument_node.string(), argument_node.begin()).size() > 0) { + std::ostringstream error_message; + error_message << "symbol '" << rang::fg::red << argument_node.string() << rang::fg::reset + << "' already denotes a builtin function!"; + throw ParseError(error_message.str(), std::vector{argument_node.begin()}); + } + auto [i_symbol, success] = symbol_table->add(argument_node.string(), argument_node.begin()); if (not success) { std::ostringstream error_message; @@ -61,6 +76,13 @@ ASTSymbolTableBuilder::buildSymbolTable(ASTNode& n, std::shared_ptr<SymbolTable> } } else if (n.is_type<language::function_definition>()) { auto register_and_initialize_symbol = [&](const ASTNode& argument_node) { + if (symbol_table->getBuiltinFunctionSymbolList(argument_node.string(), argument_node.begin()).size() > 0) { + std::ostringstream error_message; + error_message << "symbol '" << rang::fg::red << argument_node.string() << rang::fg::reset + << "' already denotes a builtin function!"; + throw ParseError(error_message.str(), std::vector{argument_node.begin()}); + } + auto [i_symbol, success] = symbol_table->add(argument_node.string(), argument_node.begin()); if (not success) { std::ostringstream error_message; @@ -81,8 +103,7 @@ ASTSymbolTableBuilder::buildSymbolTable(ASTNode& n, std::shared_ptr<SymbolTable> } } } else if (n.is_type<language::name>()) { - auto [i_symbol, found] = symbol_table->find(n.string(), n.begin()); - if (not found) { + if (not symbol_table->has(n.string(), n.begin())) { std::ostringstream error_message; error_message << "undefined symbol '" << rang::fg::red << n.string() << rang::fg::reset << '\''; throw ParseError(error_message.str(), std::vector{n.begin()}); diff --git a/src/language/modules/BuiltinModule.cpp b/src/language/modules/BuiltinModule.cpp index 22d23f8033604698f44ea18e42c63e9ba48ba345..98d8f71c6c91bd83ac53ff8d45b98f419c283fe9 100644 --- a/src/language/modules/BuiltinModule.cpp +++ b/src/language/modules/BuiltinModule.cpp @@ -12,8 +12,33 @@ void BuiltinModule::_addBuiltinFunction(const std::string& name, std::shared_ptr<IBuiltinFunctionEmbedder> builtin_function_embedder) { - auto [i_builtin_function, success] = - m_name_builtin_function_map.insert(std::make_pair(name, builtin_function_embedder)); + auto is_keyword = [](const std::string& s) -> bool { + if (s.size() == 0) { + return false; + } else { + if (not(std::isalpha(s[0]) or s[0] == '_')) { + return false; + } + for (size_t i = 1; i < s.size(); ++i) { + if (not(std::isalnum(s[0]) or s[0] == '_')) { + return false; + } + } + } + + return true; + }; + + if (not is_keyword(name)) { + std::ostringstream os; + os << "while defining module " << this->name() << " invalid builtin function name: '" << name << "'\n"; + throw UnexpectedError(os.str()); + } + + auto parameter_data_type_list = builtin_function_embedder->getParameterDataTypes(); + + auto [i_builtin_function, success] = m_name_builtin_function_map.insert( + std::make_pair(name + ':' + dataTypeName(parameter_data_type_list), builtin_function_embedder)); if (not success) { throw NormalError("builtin-function '" + name + "' cannot be added!\n"); } diff --git a/src/language/modules/ModuleRepository.cpp b/src/language/modules/ModuleRepository.cpp index d0cd8260ba6d6a3de9d335833d42002519568592..e516ab800833f5503de27bcfdd73e8b8381e06e6 100644 --- a/src/language/modules/ModuleRepository.cpp +++ b/src/language/modules/ModuleRepository.cpp @@ -20,6 +20,29 @@ void ModuleRepository::_subscribe(std::unique_ptr<IModule> m) { + auto is_keyword = [](const std::string& s) -> bool { + if (s.size() == 0) { + return false; + } else { + if (not(std::isalpha(s[0]) or s[0] == '_')) { + return false; + } + for (size_t i = 1; i < s.size(); ++i) { + if (not(std::isalnum(s[0]) or s[0] == '_')) { + return false; + } + } + } + + return true; + }; + + if (not is_keyword(std::string{m->name()})) { + std::ostringstream os; + os << "cannot subscribe module with invalid name: '" << m->name() << "'\n"; + throw UnexpectedError(os.str()); + } + auto [i_module, success] = m_module_set.emplace(m->name(), std::move(m)); Assert(success, "module has already been subscribed"); } @@ -147,6 +170,15 @@ ModuleRepository::registerOperators(const std::string& module_name) std::string ModuleRepository::getModuleInfo(const std::string& module_name) const { + auto demangleBuiltinFunction = [](const std::string& mangled_name) -> std::string { + size_t i = 0; + for (; i < mangled_name.size(); ++i) { + if (mangled_name[i] == '(') + break; + } + return mangled_name.substr(0, i); + }; + std::stringstream os; auto i_module = m_module_set.find(module_name); if (i_module != m_module_set.end()) { @@ -155,8 +187,8 @@ ModuleRepository::getModuleInfo(const std::string& module_name) const const auto& builtin_function_map = i_module->second->getNameBuiltinFunctionMap(); if (builtin_function_map.size() > 0) { os << " functions\n"; - for (auto& [name, function] : builtin_function_map) { - os << " " << rang::fgB::green << name << rang::style::reset << ": "; + for (auto& [mangled_name, function] : builtin_function_map) { + os << " " << rang::fgB::green << demangleBuiltinFunction(mangled_name) << rang::style::reset << ": "; os << dataTypeName(function->getParameterDataTypes()); os << rang::fgB::yellow << " -> " << rang::style::reset; os << dataTypeName(function->getReturnDataType()) << '\n'; diff --git a/src/language/utils/ASTNodeDataType.cpp b/src/language/utils/ASTNodeDataType.cpp index 81f3fc81caba045ca4ae719ddfa21c09c1c8fc98..3550025dd36e05c46e8ca20ce49a45d6b0fff30b 100644 --- a/src/language/utils/ASTNodeDataType.cpp +++ b/src/language/utils/ASTNodeDataType.cpp @@ -79,19 +79,27 @@ dataTypeName(const ASTNodeDataType& data_type) name = "R^" + std::to_string(data_type.nbRows()) + "x" + std::to_string(data_type.nbColumns()); break; case ASTNodeDataType::tuple_t: - name = "tuple(" + dataTypeName(data_type.contentType()) + ')'; + name = "(" + dataTypeName(data_type.contentType()) + "...)"; break; case ASTNodeDataType::list_t: { std::ostringstream data_type_name_list; const auto& data_type_list = data_type.contentTypeList(); if (data_type_list.size() > 0) { - data_type_name_list << dataTypeName(*data_type_list[0]); + if (*data_type_list[0] == ASTNodeDataType::list_t) { + data_type_name_list << '(' << dataTypeName(*data_type_list[0]) << ')'; + } else { + data_type_name_list << dataTypeName(*data_type_list[0]); + } for (size_t i = 1; i < data_type_list.size(); ++i) { - data_type_name_list << '*' << dataTypeName(*data_type_list[i]); + if (*data_type_list[i] == ASTNodeDataType::list_t) { + data_type_name_list << "*(" << dataTypeName(*data_type_list[i]) << ')'; + } else { + data_type_name_list << '*' << dataTypeName(*data_type_list[i]); + } } - name = "list(" + data_type_name_list.str() + ")"; + name = data_type_name_list.str(); } else { - name = "list(void)"; + name = "void"; } break; } @@ -99,7 +107,7 @@ dataTypeName(const ASTNodeDataType& data_type) name = "string"; break; case ASTNodeDataType::typename_t: - name = std::string("typename(") + dataTypeName(data_type.contentType()) + ")"; + name = dataTypeName(data_type.contentType()); break; case ASTNodeDataType::type_name_id_t: name = "type_name_id"; @@ -129,11 +137,10 @@ dataTypeName(const std::vector<ASTNodeDataType>& data_type_vector) return dataTypeName(data_type_vector[0]); } else { std::ostringstream os; - os << '(' << dataTypeName(data_type_vector[0]); + os << dataTypeName(data_type_vector[0]); for (size_t i = 1; i < data_type_vector.size(); ++i) { - os << ',' << dataTypeName(data_type_vector[i]); + os << '*' << dataTypeName(data_type_vector[i]); } - os << ')'; return os.str(); } } diff --git a/src/language/utils/BuiltinFunctionEmbedderUtils.cpp b/src/language/utils/BuiltinFunctionEmbedderUtils.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9899fee3e1855a2ded4e306dd5dcf041d84e051b --- /dev/null +++ b/src/language/utils/BuiltinFunctionEmbedderUtils.cpp @@ -0,0 +1,255 @@ +#include <language/utils/BuiltinFunctionEmbedderUtils.hpp> + +#include <language/PEGGrammar.hpp> +#include <language/ast/ASTNode.hpp> +#include <language/utils/BuiltinFunctionEmbedder.hpp> +#include <language/utils/ParseError.hpp> +#include <language/utils/SymbolTable.hpp> + +std::shared_ptr<IBuiltinFunctionEmbedder> +getBuiltinFunctionEmbedder(ASTNode& n) +{ + const std::string builtin_function_name = n.children[0]->string(); + auto& symbol_table = *n.m_symbol_table; + + auto& args_node = *n.children[1]; + + auto get_argument_value_type = [](ASTNode& argument_node, std::vector<ASTNodeDataType>& arg_type_list) -> void { + if (argument_node.is_type<language::function_evaluation>()) { + ASTNode& function_node = *argument_node.children[0]; + switch (function_node.m_data_type) { + case ASTNodeDataType::function_t: { + auto [i_function_symbol, found] = + argument_node.m_symbol_table->find(function_node.string(), argument_node.begin()); + Assert(found); + Assert(i_function_symbol->attributes().dataType() == ASTNodeDataType::function_t); + + uint64_t function_id = std::get<uint64_t>(i_function_symbol->attributes().value()); + + FunctionDescriptor& function_descriptor = argument_node.m_symbol_table->functionTable()[function_id]; + ASTNode& function_image_domain = *function_descriptor.domainMappingNode().children[1]; + + if (function_image_domain.children.size() > 0) { + for (size_t i = 0; i < function_image_domain.children.size(); ++i) { + arg_type_list.push_back(function_image_domain.children[i]->m_data_type); + } + } else { + arg_type_list.push_back(function_image_domain.m_data_type); + } + break; + } + case ASTNodeDataType::builtin_function_t: { + std::shared_ptr builtin_function = getBuiltinFunctionEmbedder(argument_node); + arg_type_list.push_back(builtin_function->getReturnDataType()); + break; + } + default: { + throw UnexpectedError("unexpected function type"); + } + } + } else { + arg_type_list.push_back(argument_node.m_data_type); + } + }; + + std::vector<ASTNodeDataType> arg_type_list; + if (args_node.is_type<language::function_argument_list>()) { + for (auto& arg : args_node.children) { + get_argument_value_type(*arg, arg_type_list); + } + } else { + get_argument_value_type(args_node, arg_type_list); + } + + // replace typenames by their values + for (size_t i = 0; i < arg_type_list.size(); ++i) { + if (arg_type_list[i] == ASTNodeDataType::typename_t) { + arg_type_list[i] = arg_type_list[i].contentType(); + } + } + + std::string mangled_name = builtin_function_name + ':' + dataTypeName(args_node.m_data_type); + + std::vector builtin_function_candidate_list = + symbol_table.getBuiltinFunctionSymbolList(builtin_function_name, n.begin()); + + auto is_castable_to_vector = [](const ASTNodeDataType& arg_type, const ASTNodeDataType& target_type) { + if (isNaturalConversion(arg_type, target_type)) { + return true; + } + bool is_castable = true; + if (target_type.dimension() > 1) { + switch (arg_type) { + case ASTNodeDataType::int_t: { + break; + } + case ASTNodeDataType::list_t: { + if (arg_type.contentTypeList().size() != target_type.dimension()) { + is_castable = false; + break; + } + for (auto list_arg : arg_type.contentTypeList()) { + is_castable &= isNaturalConversion(*list_arg, ASTNodeDataType::build<ASTNodeDataType::double_t>()); + } + break; + } + default: { + is_castable &= false; + } + } + } else { + is_castable &= isNaturalConversion(arg_type, ASTNodeDataType::build<ASTNodeDataType::double_t>()); + } + return is_castable; + }; + + auto is_castable_to_matrix = [](const ASTNodeDataType& arg_type, const ASTNodeDataType& target_type) { + if (isNaturalConversion(arg_type, target_type)) { + return true; + } + + bool is_castable = true; + if (target_type.nbRows() > 1) { + switch (arg_type) { + case ASTNodeDataType::int_t: { + break; + } + case ASTNodeDataType::list_t: { + if (arg_type.contentTypeList().size() != target_type.nbRows() * target_type.nbColumns()) { + is_castable = false; + break; + } + for (auto list_arg : arg_type.contentTypeList()) { + is_castable &= isNaturalConversion(*list_arg, ASTNodeDataType::build<ASTNodeDataType::double_t>()); + } + break; + } + default: { + is_castable &= false; + } + } + } else { + is_castable &= isNaturalConversion(arg_type, ASTNodeDataType::build<ASTNodeDataType::double_t>()); + } + return is_castable; + }; + + std::vector<uint64_t> callable_id_list; + for (auto candidate : builtin_function_candidate_list) { + uint64_t builtin_function_id = std::get<uint64_t>(candidate.attributes().value()); + + auto& builtin_function_embedder_table = n.m_symbol_table->builtinFunctionEmbedderTable(); + std::shared_ptr builtin_function_embedder = builtin_function_embedder_table[builtin_function_id]; + + bool is_castable = true; + + if (builtin_function_embedder->numberOfParameters() == arg_type_list.size()) { + std::vector<ASTNodeDataType> builtin_function_parameter_type_list = + builtin_function_embedder->getParameterDataTypes(); + for (size_t i_arg = 0; i_arg < arg_type_list.size(); ++i_arg) { + const ASTNodeDataType& target_type = builtin_function_parameter_type_list[i_arg]; + const ASTNodeDataType& arg_type = arg_type_list[i_arg]; + + if (not isNaturalConversion(arg_type, target_type)) { + switch (target_type) { + case ASTNodeDataType::vector_t: { + is_castable &= is_castable_to_vector(arg_type, target_type); + break; + } + case ASTNodeDataType::matrix_t: { + is_castable &= is_castable_to_matrix(arg_type, target_type); + break; + } + case ASTNodeDataType::tuple_t: { + ASTNodeDataType tuple_content_type = target_type.contentType(); + if (not isNaturalConversion(arg_type, tuple_content_type)) { + switch (tuple_content_type) { + case ASTNodeDataType::vector_t: { + if (arg_type == ASTNodeDataType::list_t) { + for (auto element_type : arg_type.contentTypeList()) { + is_castable &= is_castable_to_vector(*element_type, tuple_content_type); + } + } else { + is_castable &= is_castable_to_vector(arg_type, tuple_content_type); + } + break; + } + case ASTNodeDataType::matrix_t: { + if (arg_type == ASTNodeDataType::list_t) { + for (auto element_type : arg_type.contentTypeList()) { + is_castable &= is_castable_to_matrix(*element_type, tuple_content_type); + } + } else { + is_castable &= is_castable_to_matrix(arg_type, tuple_content_type); + } + break; + } + default: + if (arg_type == ASTNodeDataType::list_t) { + for (auto element_type : arg_type.contentTypeList()) { + is_castable &= isNaturalConversion(*element_type, tuple_content_type); + } + } else { + is_castable &= false; + } + } + } + break; + } + default: + is_castable &= false; + } + } + } + + if (is_castable) { + callable_id_list.push_back(builtin_function_id); + } + } + } + + uint64_t builtin_function_id = [&] { + switch (size(callable_id_list)) { + case 0: { + std::ostringstream error_msg; + error_msg << "no matching function to call " << rang::fgB::red << builtin_function_name << rang::style::reset + << rang::style::bold << ": " << rang::fgB::yellow << dataTypeName(args_node.m_data_type) + << rang::style::reset << rang::style::bold << "\nnote: candidates are"; + + for (auto candidate : builtin_function_candidate_list) { + uint64_t builtin_function_id = std::get<uint64_t>(candidate.attributes().value()); + + auto& builtin_function_embedder_table = n.m_symbol_table->builtinFunctionEmbedderTable(); + std::shared_ptr builtin_function_embedder = builtin_function_embedder_table[builtin_function_id]; + + error_msg << "\n " << builtin_function_name << ": " + << dataTypeName(builtin_function_embedder->getParameterDataTypes()) << " -> " + << dataTypeName(builtin_function_embedder->getReturnDataType()); + } + + throw ParseError(error_msg.str(), n.begin()); + } + case 1: { + return callable_id_list[0]; + } + default: { + std::ostringstream error_msg; + error_msg << "ambiguous function call " << rang::fgB::red << builtin_function_name << rang::style::reset + << rang::style::bold << ": " << rang::fgB::yellow << dataTypeName(args_node.m_data_type) + << rang::style::reset << rang::style::bold << "\nnote: candidates are"; + + auto& builtin_function_embedder_table = n.m_symbol_table->builtinFunctionEmbedderTable(); + for (auto callable_id : callable_id_list) { + std::shared_ptr builtin_function_embedder = builtin_function_embedder_table[callable_id]; + + error_msg << "\n " << builtin_function_name << ": " + << dataTypeName(builtin_function_embedder->getParameterDataTypes()) << " -> " + << dataTypeName(builtin_function_embedder->getReturnDataType()); + } + throw ParseError(error_msg.str(), n.begin()); + } + } + }(); + + return n.m_symbol_table->builtinFunctionEmbedderTable()[builtin_function_id]; +} diff --git a/src/language/utils/BuiltinFunctionEmbedderUtils.hpp b/src/language/utils/BuiltinFunctionEmbedderUtils.hpp new file mode 100644 index 0000000000000000000000000000000000000000..1f24acff477dcc4e782feba24cd2c1b4060e3f32 --- /dev/null +++ b/src/language/utils/BuiltinFunctionEmbedderUtils.hpp @@ -0,0 +1,11 @@ +#ifndef BUILTIN_FUNCTION_EMBEDDER_UTILS_HPP +#define BUILTIN_FUNCTION_EMBEDDER_UTILS_HPP + +class IBuiltinFunctionEmbedder; +class ASTNode; + +#include <memory> + +std::shared_ptr<IBuiltinFunctionEmbedder> getBuiltinFunctionEmbedder(ASTNode& n); + +#endif // BUILTIN_FUNCTION_EMBEDDER_UTILS_HPP diff --git a/src/language/utils/CMakeLists.txt b/src/language/utils/CMakeLists.txt index 80640af6e39ee7febd53562c4c89bc1d2bd9b8c3..bed3da329d5534e8aa4f48ef48cc0751dfa00f3b 100644 --- a/src/language/utils/CMakeLists.txt +++ b/src/language/utils/CMakeLists.txt @@ -20,6 +20,7 @@ add_library(PugsLanguageUtils BinaryOperatorRegisterForRnxn.cpp BinaryOperatorRegisterForString.cpp BinaryOperatorRegisterForZ.cpp + BuiltinFunctionEmbedderUtils.cpp DataVariant.cpp EmbeddedData.cpp EmbeddedIDiscreteFunctionOperators.cpp diff --git a/src/language/utils/SymbolTable.hpp b/src/language/utils/SymbolTable.hpp index 772ac6564859dd402ba2086d4fed7dc0b4c64059..7321994564a8810b10e81d60503a55226abf0c56 100644 --- a/src/language/utils/SymbolTable.hpp +++ b/src/language/utils/SymbolTable.hpp @@ -279,6 +279,55 @@ class SymbolTable } } + std::vector<Symbol> + getBuiltinFunctionSymbolList(const std::string& symbol, const TAO_PEGTL_NAMESPACE::position& use_position) + { + std::vector<Symbol> builtin_function_symbol_list; + + for (auto i_stored_symbol : m_symbol_list) { + if (use_position.byte < i_stored_symbol.attributes().position().byte) + continue; + + // Symbol must be defined before the call + std::string_view stored_symbol_name = i_stored_symbol.name(); + if ((stored_symbol_name.size() > symbol.size()) and (stored_symbol_name[symbol.size()] == ':')) { + if (stored_symbol_name.substr(0, symbol.size()) == symbol) { + builtin_function_symbol_list.push_back(i_stored_symbol); + } + } + } + + if (m_parent_table) { + return m_parent_table->getBuiltinFunctionSymbolList(symbol, use_position); + } else { + return builtin_function_symbol_list; + } + } + + bool + has(const std::string& symbol, const TAO_PEGTL_NAMESPACE::position& use_position) + { + for (auto i_stored_symbol : m_symbol_list) { + if (use_position.byte < i_stored_symbol.attributes().position().byte) + continue; + + // Symbol must be defined before the call + std::string_view stored_symbol_name = i_stored_symbol.name(); + if ((stored_symbol_name.size() == symbol.size()) or + (stored_symbol_name.size() > symbol.size() and (stored_symbol_name[symbol.size()] == ':'))) { + if (stored_symbol_name.substr(0, symbol.size()) == symbol) { + return true; + } + } + } + + if (m_parent_table) { + return m_parent_table->has(symbol, use_position); + } else { + return false; + } + } + auto find(const std::string& symbol, const TAO_PEGTL_NAMESPACE::position& use_position) { @@ -306,8 +355,15 @@ class SymbolTable add(const std::string& symbol_name, const TAO_PEGTL_NAMESPACE::position& symbol_position) { for (auto i_stored_symbol = m_symbol_list.begin(); i_stored_symbol != m_symbol_list.end(); ++i_stored_symbol) { - if (i_stored_symbol->name() == symbol_name) { - return std::make_pair(i_stored_symbol, false); + std::string_view stored_symbol_name = i_stored_symbol->name(); + if (stored_symbol_name.size() == symbol_name.size()) { + if (stored_symbol_name == symbol_name) { + return std::make_pair(i_stored_symbol, false); + } else if (stored_symbol_name.size() > symbol_name.size() and (stored_symbol_name[symbol_name.size()] == ':')) { + if (stored_symbol_name.substr(0, symbol_name.size()) == symbol_name) { + return std::make_pair(i_stored_symbol, false); + } + } } } diff --git a/tests/test_ASTModulesImporter.cpp b/tests/test_ASTModulesImporter.cpp index 6d98d31fb33628873fb73369213351128dd6e71a..4be8e087dd89490caf6be0a8ba3132588fd919df 100644 --- a/tests/test_ASTModulesImporter.cpp +++ b/tests/test_ASTModulesImporter.cpp @@ -102,7 +102,7 @@ import unknown_module; REQUIRE_THROWS_AS(ASTModulesImporter{*ast}, ParseError); } - SECTION("symbol already defined") + SECTION("symbol already defined (same builtin function)") { std::string_view data = R"( import math; @@ -111,7 +111,7 @@ import math; TAO_PEGTL_NAMESPACE::string_input input{data, "test.pgs"}; auto ast = ASTBuilder::build(input); - ast->m_symbol_table->add("sin", ast->begin()); + ast->m_symbol_table->add("sin:R", ast->begin()); REQUIRE_THROWS_AS(ASTModulesImporter{*ast}, ParseError); } diff --git a/tests/test_ASTNodeAffectationExpressionBuilder.cpp b/tests/test_ASTNodeAffectationExpressionBuilder.cpp index 85c443ebcc807d87ba197bc8f534763fcf46beba..81ff4f95cffb91fe3352ff5560043d75a309e700 100644 --- a/tests/test_ASTNodeAffectationExpressionBuilder.cpp +++ b/tests/test_ASTNodeAffectationExpressionBuilder.cpp @@ -1609,7 +1609,7 @@ let s : string, s="foo"; s*=2; let s :(R), s=(1,2,3); s *= 4; )"; - std::string error_message = "undefined affectation type: tuple(R) *= Z"; + std::string error_message = "undefined affectation type: (R...) *= Z"; CHECK_AST_THROWS_WITH(data, error_message); } @@ -1620,7 +1620,7 @@ let s : string, s="foo"; s*=2; let s : (builtin_t), s =(a,b); s *= b; )"; - std::string error_message = "undefined affectation type: tuple(builtin_t) *= builtin_t"; + std::string error_message = "undefined affectation type: (builtin_t...) *= builtin_t"; CHECK_AST_WITH_BUILTIN_THROWS_WITH(data, error_message); } diff --git a/tests/test_ASTNodeBuiltinFunctionExpressionBuilder.cpp b/tests/test_ASTNodeBuiltinFunctionExpressionBuilder.cpp index a313d7c92577b33892c4128b4d5d88ec8c6daebc..d7cd62afe7e4260d14640287ad440355dab59898 100644 --- a/tests/test_ASTNodeBuiltinFunctionExpressionBuilder.cpp +++ b/tests/test_ASTNodeBuiltinFunctionExpressionBuilder.cpp @@ -63,6 +63,21 @@ REQUIRE_THROWS_WITH(ASTNodeExpressionBuilder{*ast}, expected_error); \ } +#define CHECK_AST_THROWS_AT_BUILD_WITH(data, expected_error) \ + { \ + static_assert(std::is_same_v<std::decay_t<decltype(data)>, std::string_view>); \ + static_assert((std::is_same_v<std::decay_t<decltype(expected_error)>, std::string_view>) or \ + (std::is_same_v<std::decay_t<decltype(expected_error)>, std::string>)); \ + \ + TAO_PEGTL_NAMESPACE::string_input input{data, "test.pgs"}; \ + auto ast = ASTBuilder::build(input); \ + \ + test_only::test_BuiltinFunctionRegister{*ast}; \ + \ + ASTSymbolTableBuilder{*ast}; \ + REQUIRE_THROWS_WITH(ASTNodeDataTypeBuilder{*ast}, expected_error); \ + } + // clazy:excludeall=non-pod-global-static TEST_CASE("ASTNodeBuiltinFunctionExpressionBuilder", "[language]") @@ -78,7 +93,7 @@ RtoR(1.); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:RtoR:NameProcessor) + +-(language::name:RtoR:FakeProcessor) `-(language::real:1.:ValueProcessor) )"; @@ -94,7 +109,7 @@ RtoR(1); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:RtoR:NameProcessor) + +-(language::name:RtoR:FakeProcessor) `-(language::integer:1:ValueProcessor) )"; @@ -111,7 +126,7 @@ RtoR(n); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:RtoR:NameProcessor) + +-(language::name:RtoR:FakeProcessor) `-(language::name:n:NameProcessor) )"; @@ -127,7 +142,7 @@ RtoR(true); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:RtoR:NameProcessor) + +-(language::name:RtoR:FakeProcessor) `-(language::true_kw:ValueProcessor) )"; @@ -146,7 +161,7 @@ RtoR1(1.); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:RtoR1:NameProcessor) + +-(language::name:RtoR1:FakeProcessor) `-(language::real:1.:ValueProcessor) )"; @@ -162,7 +177,7 @@ RtoR1(1); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:RtoR1:NameProcessor) + +-(language::name:RtoR1:FakeProcessor) `-(language::integer:1:ValueProcessor) )"; @@ -179,7 +194,7 @@ RtoR1(n); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:RtoR1:NameProcessor) + +-(language::name:RtoR1:FakeProcessor) `-(language::name:n:NameProcessor) )"; @@ -195,7 +210,7 @@ RtoR1(true); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:RtoR1:NameProcessor) + +-(language::name:RtoR1:FakeProcessor) `-(language::true_kw:ValueProcessor) )"; @@ -214,7 +229,7 @@ RtoR11(1.); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:RtoR11:NameProcessor) + +-(language::name:RtoR11:FakeProcessor) `-(language::real:1.:ValueProcessor) )"; @@ -230,7 +245,7 @@ RtoR11(1); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:RtoR11:NameProcessor) + +-(language::name:RtoR11:FakeProcessor) `-(language::integer:1:ValueProcessor) )"; @@ -247,7 +262,7 @@ RtoR11(n); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:RtoR11:NameProcessor) + +-(language::name:RtoR11:FakeProcessor) `-(language::name:n:NameProcessor) )"; @@ -263,7 +278,7 @@ RtoR11(true); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:RtoR11:NameProcessor) + +-(language::name:RtoR11:FakeProcessor) `-(language::true_kw:ValueProcessor) )"; @@ -283,7 +298,7 @@ R1toR(x); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R1toR:NameProcessor) + +-(language::name:R1toR:FakeProcessor) `-(language::name:x:NameProcessor) )"; @@ -299,7 +314,7 @@ R1toR(1.); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R1toR:NameProcessor) + +-(language::name:R1toR:FakeProcessor) `-(language::real:1.:ValueProcessor) )"; @@ -315,7 +330,7 @@ R1toR(1); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R1toR:NameProcessor) + +-(language::name:R1toR:FakeProcessor) `-(language::integer:1:ValueProcessor) )"; @@ -332,7 +347,7 @@ R1toR(n); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R1toR:NameProcessor) + +-(language::name:R1toR:FakeProcessor) `-(language::name:n:NameProcessor) )"; @@ -348,7 +363,7 @@ R1toR(true); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R1toR:NameProcessor) + +-(language::name:R1toR:FakeProcessor) `-(language::true_kw:ValueProcessor) )"; @@ -368,7 +383,7 @@ R11toR(x); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R11toR:NameProcessor) + +-(language::name:R11toR:FakeProcessor) `-(language::name:x:NameProcessor) )"; @@ -384,7 +399,7 @@ R11toR(1.); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R11toR:NameProcessor) + +-(language::name:R11toR:FakeProcessor) `-(language::real:1.:ValueProcessor) )"; @@ -400,7 +415,7 @@ R11toR(1); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R11toR:NameProcessor) + +-(language::name:R11toR:FakeProcessor) `-(language::integer:1:ValueProcessor) )"; @@ -417,7 +432,7 @@ R11toR(n); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R11toR:NameProcessor) + +-(language::name:R11toR:FakeProcessor) `-(language::name:n:NameProcessor) )"; @@ -433,7 +448,7 @@ R11toR(true); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R11toR:NameProcessor) + +-(language::name:R11toR:FakeProcessor) `-(language::true_kw:ValueProcessor) )"; @@ -452,7 +467,7 @@ R2toR(0); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R2toR:NameProcessor) + +-(language::name:R2toR:FakeProcessor) `-(language::integer:0:ValueProcessor) )"; @@ -469,7 +484,7 @@ R2toR(x); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R2toR:NameProcessor) + +-(language::name:R2toR:FakeProcessor) `-(language::name:x:NameProcessor) )"; @@ -485,7 +500,7 @@ R2toR((1,2)); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R2toR:NameProcessor) + +-(language::name:R2toR:FakeProcessor) `-(language::tuple_expression:TupleToVectorProcessor<ASTNodeExpressionListProcessor>) +-(language::integer:1:ValueProcessor) `-(language::integer:2:ValueProcessor) @@ -506,7 +521,7 @@ R22toR(0); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R22toR:NameProcessor) + +-(language::name:R22toR:FakeProcessor) `-(language::integer:0:ValueProcessor) )"; @@ -523,7 +538,7 @@ R22toR(x); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R22toR:NameProcessor) + +-(language::name:R22toR:FakeProcessor) `-(language::name:x:NameProcessor) )"; @@ -539,7 +554,7 @@ R22toR((1,2,3,4)); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R22toR:NameProcessor) + +-(language::name:R22toR:FakeProcessor) `-(language::tuple_expression:TupleToVectorProcessor<ASTNodeExpressionListProcessor>) +-(language::integer:1:ValueProcessor) +-(language::integer:2:ValueProcessor) @@ -562,7 +577,7 @@ R3toR(0); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R3toR:NameProcessor) + +-(language::name:R3toR:FakeProcessor) `-(language::integer:0:ValueProcessor) )"; @@ -579,7 +594,7 @@ R3toR(x); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R3toR:NameProcessor) + +-(language::name:R3toR:FakeProcessor) `-(language::name:x:NameProcessor) )"; @@ -595,7 +610,7 @@ R3toR((1,2,3)); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R3toR:NameProcessor) + +-(language::name:R3toR:FakeProcessor) `-(language::tuple_expression:TupleToVectorProcessor<ASTNodeExpressionListProcessor>) +-(language::integer:1:ValueProcessor) +-(language::integer:2:ValueProcessor) @@ -617,7 +632,7 @@ R33toR(0); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R33toR:NameProcessor) + +-(language::name:R33toR:FakeProcessor) `-(language::integer:0:ValueProcessor) )"; @@ -634,7 +649,7 @@ R33toR(x); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R33toR:NameProcessor) + +-(language::name:R33toR:FakeProcessor) `-(language::name:x:NameProcessor) )"; @@ -650,7 +665,7 @@ R33toR((1,2,3,4,5,6,7,8,9)); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R33toR:NameProcessor) + +-(language::name:R33toR:FakeProcessor) `-(language::tuple_expression:TupleToVectorProcessor<ASTNodeExpressionListProcessor>) +-(language::integer:1:ValueProcessor) +-(language::integer:2:ValueProcessor) @@ -678,7 +693,7 @@ ZtoR(1); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:ZtoR:NameProcessor) + +-(language::name:ZtoR:FakeProcessor) `-(language::integer:1:ValueProcessor) )"; @@ -695,7 +710,7 @@ ZtoR(n); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:ZtoR:NameProcessor) + +-(language::name:ZtoR:FakeProcessor) `-(language::name:n:NameProcessor) )"; @@ -711,7 +726,7 @@ ZtoR(true); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:ZtoR:NameProcessor) + +-(language::name:ZtoR:FakeProcessor) `-(language::true_kw:ValueProcessor) )"; @@ -730,7 +745,7 @@ NtoR(1); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:NtoR:NameProcessor) + +-(language::name:NtoR:FakeProcessor) `-(language::integer:1:ValueProcessor) )"; @@ -747,7 +762,7 @@ NtoR(n); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:NtoR:NameProcessor) + +-(language::name:NtoR:FakeProcessor) `-(language::name:n:NameProcessor) )"; @@ -763,7 +778,7 @@ NtoR(true); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:NtoR:NameProcessor) + +-(language::name:NtoR:FakeProcessor) `-(language::true_kw:ValueProcessor) )"; @@ -782,7 +797,7 @@ BtoR(true); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:BtoR:NameProcessor) + +-(language::name:BtoR:FakeProcessor) `-(language::true_kw:ValueProcessor) )"; @@ -799,7 +814,7 @@ RRtoB(1., 0.); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:RRtoB:NameProcessor) + +-(language::name:RRtoB:FakeProcessor) `-(language::function_argument_list:ASTNodeExpressionListProcessor) +-(language::real:1.:ValueProcessor) `-(language::real:0.:ValueProcessor) @@ -821,7 +836,7 @@ R3R2toR(x,y); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R3R2toR:NameProcessor) + +-(language::name:R3R2toR:FakeProcessor) `-(language::function_argument_list:ASTNodeExpressionListProcessor) +-(language::name:x:NameProcessor) `-(language::name:y:NameProcessor) @@ -839,7 +854,7 @@ R3R2toR((1,2,3),(3,4)); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R3R2toR:NameProcessor) + +-(language::name:R3R2toR:FakeProcessor) `-(language::function_argument_list:ASTNodeExpressionListProcessor) +-(language::tuple_expression:TupleToVectorProcessor<ASTNodeExpressionListProcessor>) | +-(language::integer:1:ValueProcessor) @@ -862,7 +877,7 @@ R3R2toR((1,2,3),0); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R3R2toR:NameProcessor) + +-(language::name:R3R2toR:FakeProcessor) `-(language::function_argument_list:ASTNodeExpressionListProcessor) +-(language::tuple_expression:TupleToVectorProcessor<ASTNodeExpressionListProcessor>) | +-(language::integer:1:ValueProcessor) @@ -888,7 +903,7 @@ R33R22toR(x,y); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R33R22toR:NameProcessor) + +-(language::name:R33R22toR:FakeProcessor) `-(language::function_argument_list:ASTNodeExpressionListProcessor) +-(language::name:x:NameProcessor) `-(language::name:y:NameProcessor) @@ -906,7 +921,7 @@ R33R22toR((1,2,3,4,5,6,7,8,9),(1,2,3,4)); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R33R22toR:NameProcessor) + +-(language::name:R33R22toR:FakeProcessor) `-(language::function_argument_list:ASTNodeExpressionListProcessor) +-(language::tuple_expression:TupleToVectorProcessor<ASTNodeExpressionListProcessor>) | +-(language::integer:1:ValueProcessor) @@ -937,7 +952,7 @@ R33R22toR((1,2,3,4,5,6,7,8,9),0); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:R33R22toR:NameProcessor) + +-(language::name:R33R22toR:FakeProcessor) `-(language::function_argument_list:ASTNodeExpressionListProcessor) +-(language::tuple_expression:TupleToVectorProcessor<ASTNodeExpressionListProcessor>) | +-(language::integer:1:ValueProcessor) @@ -965,7 +980,7 @@ StoB("foo"); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:StoB:NameProcessor) + +-(language::name:StoB:FakeProcessor) `-(language::literal:"foo":ValueProcessor) )"; @@ -981,7 +996,7 @@ builtinToBuiltin(a); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:builtinToBuiltin:NameProcessor) + +-(language::name:builtinToBuiltin:FakeProcessor) `-(language::name:a:NameProcessor) )"; @@ -999,7 +1014,7 @@ tuple_ZtoR(true); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_ZtoR:NameProcessor) + +-(language::name:tuple_ZtoR:FakeProcessor) `-(language::true_kw:ValueProcessor) )"; @@ -1016,7 +1031,7 @@ tuple_ZtoR(t); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_ZtoR:NameProcessor) + +-(language::name:tuple_ZtoR:FakeProcessor) `-(language::name:t:NameProcessor) )"; @@ -1033,7 +1048,7 @@ tuple_ZtoR(n); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_ZtoR:NameProcessor) + +-(language::name:tuple_ZtoR:FakeProcessor) `-(language::name:n:NameProcessor) )"; @@ -1050,7 +1065,7 @@ tuple_BtoR(t); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_BtoR:NameProcessor) + +-(language::name:tuple_BtoR:FakeProcessor) `-(language::name:t:NameProcessor) )"; @@ -1067,7 +1082,7 @@ tuple_NtoR(t); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_NtoR:NameProcessor) + +-(language::name:tuple_NtoR:FakeProcessor) `-(language::name:t:NameProcessor) )"; @@ -1084,7 +1099,7 @@ tuple_ZtoR(t); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_ZtoR:NameProcessor) + +-(language::name:tuple_ZtoR:FakeProcessor) `-(language::name:t:NameProcessor) )"; @@ -1100,7 +1115,7 @@ tuple_ZtoR(1); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_ZtoR:NameProcessor) + +-(language::name:tuple_ZtoR:FakeProcessor) `-(language::integer:1:ValueProcessor) )"; @@ -1117,7 +1132,7 @@ tuple_ZtoR(t); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_ZtoR:NameProcessor) + +-(language::name:tuple_ZtoR:FakeProcessor) `-(language::name:t:NameProcessor) )"; @@ -1133,7 +1148,7 @@ tuple_RtoB(1); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_RtoB:NameProcessor) + +-(language::name:tuple_RtoB:FakeProcessor) `-(language::integer:1:ValueProcessor) )"; @@ -1150,7 +1165,7 @@ tuple_RtoB(t); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_RtoB:NameProcessor) + +-(language::name:tuple_RtoB:FakeProcessor) `-(language::name:t:NameProcessor) )"; @@ -1166,7 +1181,7 @@ tuple_RtoB(1.2); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_RtoB:NameProcessor) + +-(language::name:tuple_RtoB:FakeProcessor) `-(language::real:1.2:ValueProcessor) )"; @@ -1183,7 +1198,7 @@ tuple_RtoB(t); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_RtoB:NameProcessor) + +-(language::name:tuple_RtoB:FakeProcessor) `-(language::name:t:NameProcessor) )"; @@ -1200,7 +1215,7 @@ tuple_RtoB((1.2, 2, true, n)); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_RtoB:NameProcessor) + +-(language::name:tuple_RtoB:FakeProcessor) `-(language::tuple_expression:TupleToVectorProcessor<ASTNodeExpressionListProcessor>) +-(language::real:1.2:ValueProcessor) +-(language::integer:2:ValueProcessor) @@ -1220,7 +1235,7 @@ tuple_stringtoB(1.2); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_stringtoB:NameProcessor) + +-(language::name:tuple_stringtoB:FakeProcessor) `-(language::real:1.2:ValueProcessor) )"; @@ -1237,7 +1252,7 @@ tuple_stringtoB(s); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_stringtoB:NameProcessor) + +-(language::name:tuple_stringtoB:FakeProcessor) `-(language::name:s:NameProcessor) )"; @@ -1254,7 +1269,7 @@ tuple_stringtoB(t); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_stringtoB:NameProcessor) + +-(language::name:tuple_stringtoB:FakeProcessor) `-(language::name:t:NameProcessor) )"; @@ -1271,7 +1286,7 @@ tuple_stringtoB(t); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_stringtoB:NameProcessor) + +-(language::name:tuple_stringtoB:FakeProcessor) `-(language::name:t:NameProcessor) )"; @@ -1287,7 +1302,7 @@ tuple_stringtoB("foo"); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_stringtoB:NameProcessor) + +-(language::name:tuple_stringtoB:FakeProcessor) `-(language::literal:"foo":ValueProcessor) )"; @@ -1303,7 +1318,7 @@ tuple_stringtoB(("foo",2,"bar")); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_stringtoB:NameProcessor) + +-(language::name:tuple_stringtoB:FakeProcessor) `-(language::tuple_expression:TupleToVectorProcessor<ASTNodeExpressionListProcessor>) +-(language::literal:"foo":ValueProcessor) +-(language::integer:2:ValueProcessor) @@ -1322,7 +1337,7 @@ tuple_builtinToB(a); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_builtinToB:NameProcessor) + +-(language::name:tuple_builtinToB:FakeProcessor) `-(language::name:a:NameProcessor) )"; @@ -1338,7 +1353,7 @@ tuple_builtinToB((a,b,a)); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_builtinToB:NameProcessor) + +-(language::name:tuple_builtinToB:FakeProcessor) `-(language::tuple_expression:TupleToVectorProcessor<ASTNodeExpressionListProcessor>) +-(language::name:a:NameProcessor) +-(language::name:b:NameProcessor) @@ -1358,7 +1373,7 @@ tuple_builtinToB(t); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_builtinToB:NameProcessor) + +-(language::name:tuple_builtinToB:FakeProcessor) `-(language::name:t:NameProcessor) )"; @@ -1374,7 +1389,7 @@ tuple_R1ToR(1); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_R1ToR:NameProcessor) + +-(language::name:tuple_R1ToR:FakeProcessor) `-(language::integer:1:ValueProcessor) )"; @@ -1390,7 +1405,7 @@ tuple_R1ToR(1.2); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_R1ToR:NameProcessor) + +-(language::name:tuple_R1ToR:FakeProcessor) `-(language::real:1.2:ValueProcessor) )"; @@ -1407,7 +1422,7 @@ tuple_R1ToR(r); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_R1ToR:NameProcessor) + +-(language::name:tuple_R1ToR:FakeProcessor) `-(language::name:r:NameProcessor) )"; @@ -1423,7 +1438,7 @@ tuple_R11ToR(1); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_R11ToR:NameProcessor) + +-(language::name:tuple_R11ToR:FakeProcessor) `-(language::integer:1:ValueProcessor) )"; @@ -1439,7 +1454,7 @@ tuple_R11ToR(1.2); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_R11ToR:NameProcessor) + +-(language::name:tuple_R11ToR:FakeProcessor) `-(language::real:1.2:ValueProcessor) )"; @@ -1456,7 +1471,7 @@ tuple_R11ToR(r); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_R11ToR:NameProcessor) + +-(language::name:tuple_R11ToR:FakeProcessor) `-(language::name:r:NameProcessor) )"; @@ -1472,7 +1487,7 @@ tuple_R2ToR(0); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_R2ToR:NameProcessor) + +-(language::name:tuple_R2ToR:FakeProcessor) `-(language::integer:0:ValueProcessor) )"; @@ -1489,7 +1504,7 @@ tuple_R2ToR(r); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_R2ToR:NameProcessor) + +-(language::name:tuple_R2ToR:FakeProcessor) `-(language::name:r:NameProcessor) )"; @@ -1506,7 +1521,7 @@ tuple_R2ToR((r,r)); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_R2ToR:NameProcessor) + +-(language::name:tuple_R2ToR:FakeProcessor) `-(language::tuple_expression:TupleToVectorProcessor<ASTNodeExpressionListProcessor>) +-(language::name:r:NameProcessor) `-(language::name:r:NameProcessor) @@ -1524,7 +1539,7 @@ tuple_R22ToR(0); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_R22ToR:NameProcessor) + +-(language::name:tuple_R22ToR:FakeProcessor) `-(language::integer:0:ValueProcessor) )"; @@ -1541,7 +1556,7 @@ tuple_R22ToR(r); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_R22ToR:NameProcessor) + +-(language::name:tuple_R22ToR:FakeProcessor) `-(language::name:r:NameProcessor) )"; @@ -1558,7 +1573,7 @@ tuple_R22ToR((r,r)); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_R22ToR:NameProcessor) + +-(language::name:tuple_R22ToR:FakeProcessor) `-(language::tuple_expression:TupleToVectorProcessor<ASTNodeExpressionListProcessor>) +-(language::name:r:NameProcessor) `-(language::name:r:NameProcessor) @@ -1576,7 +1591,7 @@ tuple_R3ToR(0); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_R3ToR:NameProcessor) + +-(language::name:tuple_R3ToR:FakeProcessor) `-(language::integer:0:ValueProcessor) )"; @@ -1593,7 +1608,7 @@ tuple_R3ToR(r); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_R3ToR:NameProcessor) + +-(language::name:tuple_R3ToR:FakeProcessor) `-(language::name:r:NameProcessor) )"; @@ -1609,7 +1624,7 @@ tuple_R33ToR(0); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_R33ToR:NameProcessor) + +-(language::name:tuple_R33ToR:FakeProcessor) `-(language::integer:0:ValueProcessor) )"; @@ -1626,7 +1641,7 @@ tuple_R33ToR(r); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:tuple_R33ToR:NameProcessor) + +-(language::name:tuple_R33ToR:FakeProcessor) `-(language::name:r:NameProcessor) )"; @@ -1643,7 +1658,7 @@ fidToR(f); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:fidToR:NameProcessor) + +-(language::name:fidToR:FakeProcessor) `-(language::name:f:NameProcessor) )"; @@ -1658,7 +1673,12 @@ fidToR(f); std::string_view data = R"( BtoR(true, false); )"; - CHECK_AST_THROWS_WITH(data, std::string{"bad number of arguments: expecting 1, provided 2"}); + + const std::string error_msg = "no matching function to call BtoR: B*B\n" + "note: candidates are\n" + " BtoR: B -> R"; + + CHECK_AST_THROWS_AT_BUILD_WITH(data, error_msg); } SECTION("bad number of arguments 2") @@ -1666,7 +1686,12 @@ BtoR(true, false); std::string_view data = R"( RRtoB(3); )"; - CHECK_AST_THROWS_WITH(data, std::string{"bad number of arguments: expecting 2, provided 1"}); + + const std::string error_msg = "no matching function to call RRtoB: Z\n" + "note: candidates are\n" + " RRtoB: R*R -> B"; + + CHECK_AST_THROWS_AT_BUILD_WITH(data, error_msg); } SECTION("invalid argument type") @@ -1674,7 +1699,11 @@ RRtoB(3); std::string_view data = R"( RtoR("foo"); )"; - CHECK_AST_THROWS_WITH(data, std::string{"invalid implicit conversion: string -> R"}); + + const std::string error_msg = "no matching function to call RtoR: string\n" + "note: candidates are\n" + " RtoR: R -> R"; + CHECK_AST_THROWS_AT_BUILD_WITH(data, error_msg); } } } diff --git a/tests/test_ASTNodeDataType.cpp b/tests/test_ASTNodeDataType.cpp index 1f2b2a2bffe4113ac8a01feb7ee9839f29b3bc6e..9316c27dbcf09f0f114500a6c04ca3dad1c8806b 100644 --- a/tests/test_ASTNodeDataType.cpp +++ b/tests/test_ASTNodeDataType.cpp @@ -44,17 +44,17 @@ TEST_CASE("ASTNodeDataType", "[language]") REQUIRE(dataTypeName(int_dt) == "Z"); REQUIRE(dataTypeName(double_dt) == "R"); REQUIRE(dataTypeName(string_dt) == "string"); - REQUIRE(dataTypeName(ASTNodeDataType::build<ASTNodeDataType::typename_t>(double_dt)) == "typename(R)"); + REQUIRE(dataTypeName(ASTNodeDataType::build<ASTNodeDataType::typename_t>(double_dt)) == "R"); REQUIRE(dataTypeName(void_dt) == "void"); REQUIRE(dataTypeName(function_dt) == "function"); REQUIRE(dataTypeName(builtin_function_dt) == "builtin_function"); - REQUIRE(dataTypeName(list_dt) == "list(R*Z)"); - REQUIRE(dataTypeName(empty_list_dt) == "list(void)"); - REQUIRE(dataTypeName(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(bool_dt)) == "tuple(B)"); - REQUIRE(dataTypeName(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(unsigned_int_dt)) == "tuple(N)"); - REQUIRE(dataTypeName(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(int_dt)) == "tuple(Z)"); - REQUIRE(dataTypeName(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(double_dt)) == "tuple(R)"); - REQUIRE(dataTypeName(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(int_dt)) == "tuple(Z)"); + REQUIRE(dataTypeName(list_dt) == "R*Z"); + REQUIRE(dataTypeName(empty_list_dt) == "void"); + REQUIRE(dataTypeName(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(bool_dt)) == "(B...)"); + REQUIRE(dataTypeName(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(unsigned_int_dt)) == "(N...)"); + REQUIRE(dataTypeName(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(int_dt)) == "(Z...)"); + REQUIRE(dataTypeName(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(double_dt)) == "(R...)"); + REQUIRE(dataTypeName(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(int_dt)) == "(Z...)"); REQUIRE(dataTypeName(ASTNodeDataType::build<ASTNodeDataType::type_name_id_t>()) == "type_name_id"); @@ -74,7 +74,7 @@ TEST_CASE("ASTNodeDataType", "[language]") REQUIRE(dataTypeName(std::vector<ASTNodeDataType>{}) == "void"); REQUIRE(dataTypeName(std::vector<ASTNodeDataType>{bool_dt}) == "B"); - REQUIRE(dataTypeName(std::vector<ASTNodeDataType>{bool_dt, unsigned_int_dt}) == "(B,N)"); + REQUIRE(dataTypeName(std::vector<ASTNodeDataType>{bool_dt, unsigned_int_dt}) == "B*N"); } SECTION("promotion") diff --git a/tests/test_ASTNodeDataTypeBuilder.cpp b/tests/test_ASTNodeDataTypeBuilder.cpp index b8ce32c92b15e4560251811528b59a69ea48f0e7..79e01aef9a34ab2324c0c731e1a2079d3e985d99 100644 --- a/tests/test_ASTNodeDataTypeBuilder.cpp +++ b/tests/test_ASTNodeDataTypeBuilder.cpp @@ -279,16 +279,16 @@ let (x,b,n,s) : R*B*N*string; std::string_view result = R"( (root:void) `-(language::var_declaration:void) - +-(language::name_list:list(R*B*N*string)) + +-(language::name_list:R*B*N*string) | +-(language::name:x:R) | +-(language::name:b:B) | +-(language::name:n:N) | `-(language::name:s:string) - `-(language::type_expression:typename(list(typename(R)*typename(B)*typename(N)*typename(string)))) - +-(language::R_set:typename(R)) - +-(language::B_set:typename(B)) - +-(language::N_set:typename(N)) - `-(language::string_type:typename(string)) + `-(language::type_expression:R*B*N*string) + +-(language::R_set:R) + +-(language::B_set:B) + +-(language::N_set:N) + `-(language::string_type:string) )"; CHECK_AST(data, result); @@ -418,11 +418,11 @@ let t : (B), t = (true, false); std::string_view result = R"( (root:void) `-(language::var_declaration:void) - +-(language::name:t:tuple(B)) - +-(language::tuple_type_specifier:typename(tuple(B))) - | `-(language::B_set:typename(B)) - +-(language::name:t:tuple(B)) - `-(language::expression_list:list(B*B)) + +-(language::name:t:(B...)) + +-(language::tuple_type_specifier:(B...)) + | `-(language::B_set:B) + +-(language::name:t:(B...)) + `-(language::expression_list:B*B) +-(language::true_kw:B) `-(language::false_kw:B) )"; @@ -439,11 +439,11 @@ let t : (N), t = (1, 2, 3, 5); std::string_view result = R"( (root:void) `-(language::var_declaration:void) - +-(language::name:t:tuple(N)) - +-(language::tuple_type_specifier:typename(tuple(N))) - | `-(language::N_set:typename(N)) - +-(language::name:t:tuple(N)) - `-(language::expression_list:list(Z*Z*Z*Z)) + +-(language::name:t:(N...)) + +-(language::tuple_type_specifier:(N...)) + | `-(language::N_set:N) + +-(language::name:t:(N...)) + `-(language::expression_list:Z*Z*Z*Z) +-(language::integer:1:Z) +-(language::integer:2:Z) +-(language::integer:3:Z) @@ -464,15 +464,15 @@ let t : (Z), t = (2, n, true); (root:void) +-(language::var_declaration:void) | +-(language::name:n:N) - | +-(language::N_set:typename(N)) + | +-(language::N_set:N) | +-(language::name:n:N) | `-(language::integer:3:Z) `-(language::var_declaration:void) - +-(language::name:t:tuple(Z)) - +-(language::tuple_type_specifier:typename(tuple(Z))) - | `-(language::Z_set:typename(Z)) - +-(language::name:t:tuple(Z)) - `-(language::expression_list:list(Z*N*B)) + +-(language::name:t:(Z...)) + +-(language::tuple_type_specifier:(Z...)) + | `-(language::Z_set:Z) + +-(language::name:t:(Z...)) + `-(language::expression_list:Z*N*B) +-(language::integer:2:Z) +-(language::name:n:N) `-(language::true_kw:B) @@ -490,11 +490,11 @@ let t : (R), t = (2, 3.1, 5); std::string_view result = R"( (root:void) `-(language::var_declaration:void) - +-(language::name:t:tuple(R)) - +-(language::tuple_type_specifier:typename(tuple(R))) - | `-(language::R_set:typename(R)) - +-(language::name:t:tuple(R)) - `-(language::expression_list:list(Z*R*Z)) + +-(language::name:t:(R...)) + +-(language::tuple_type_specifier:(R...)) + | `-(language::R_set:R) + +-(language::name:t:(R...)) + `-(language::expression_list:Z*R*Z) +-(language::integer:2:Z) +-(language::real:3.1:R) `-(language::integer:5:Z) @@ -515,34 +515,34 @@ let t2 : (R^3), t2 = (0, 0); (root:void) +-(language::var_declaration:void) | +-(language::name:a:R^2) - | +-(language::vector_type:typename(R^2)) - | | +-(language::R_set:typename(R)) + | +-(language::vector_type:R^2) + | | +-(language::R_set:R) | | `-(language::integer:2:Z) | +-(language::name:a:R^2) - | `-(language::expression_list:list(Z*R)) + | `-(language::expression_list:Z*R) | +-(language::integer:2:Z) | `-(language::real:3.1:R) +-(language::var_declaration:void) - | +-(language::name:t1:tuple(R^2)) - | +-(language::tuple_type_specifier:typename(tuple(R^2))) - | | `-(language::vector_type:typename(R^2)) - | | +-(language::R_set:typename(R)) + | +-(language::name:t1:(R^2...)) + | +-(language::tuple_type_specifier:(R^2...)) + | | `-(language::vector_type:R^2) + | | +-(language::R_set:R) | | `-(language::integer:2:Z) - | +-(language::name:t1:tuple(R^2)) - | `-(language::expression_list:list(R^2*list(Z*Z)*Z)) + | +-(language::name:t1:(R^2...)) + | `-(language::expression_list:R^2*(Z*Z)*Z) | +-(language::name:a:R^2) - | +-(language::tuple_expression:list(Z*Z)) + | +-(language::tuple_expression:Z*Z) | | +-(language::integer:1:Z) | | `-(language::integer:2:Z) | `-(language::integer:0:Z) `-(language::var_declaration:void) - +-(language::name:t2:tuple(R^3)) - +-(language::tuple_type_specifier:typename(tuple(R^3))) - | `-(language::vector_type:typename(R^3)) - | +-(language::R_set:typename(R)) + +-(language::name:t2:(R^3...)) + +-(language::tuple_type_specifier:(R^3...)) + | `-(language::vector_type:R^3) + | +-(language::R_set:R) | `-(language::integer:3:Z) - +-(language::name:t2:tuple(R^3)) - `-(language::expression_list:list(Z*Z)) + +-(language::name:t2:(R^3...)) + `-(language::expression_list:Z*Z) +-(language::integer:0:Z) `-(language::integer:0:Z) )"; @@ -562,42 +562,42 @@ let t2 : (R^3x3), t2 = (0, 0); (root:void) +-(language::var_declaration:void) | +-(language::name:a:R^2x2) - | +-(language::matrix_type:typename(R^2x2)) - | | +-(language::R_set:typename(R)) + | +-(language::matrix_type:R^2x2) + | | +-(language::R_set:R) | | +-(language::integer:2:Z) | | `-(language::integer:2:Z) | +-(language::name:a:R^2x2) - | `-(language::expression_list:list(Z*R*R*Z)) + | `-(language::expression_list:Z*R*R*Z) | +-(language::integer:2:Z) | +-(language::real:3.1:R) | +-(language::unary_minus:R) | | `-(language::real:1.2:R) | `-(language::integer:4:Z) +-(language::var_declaration:void) - | +-(language::name:t1:tuple(R^2x2)) - | +-(language::tuple_type_specifier:typename(tuple(R^2x2))) - | | `-(language::matrix_type:typename(R^2x2)) - | | +-(language::R_set:typename(R)) + | +-(language::name:t1:(R^2x2...)) + | +-(language::tuple_type_specifier:(R^2x2...)) + | | `-(language::matrix_type:R^2x2) + | | +-(language::R_set:R) | | +-(language::integer:2:Z) | | `-(language::integer:2:Z) - | +-(language::name:t1:tuple(R^2x2)) - | `-(language::expression_list:list(R^2x2*list(Z*Z*Z*Z)*Z)) + | +-(language::name:t1:(R^2x2...)) + | `-(language::expression_list:R^2x2*(Z*Z*Z*Z)*Z) | +-(language::name:a:R^2x2) - | +-(language::tuple_expression:list(Z*Z*Z*Z)) + | +-(language::tuple_expression:Z*Z*Z*Z) | | +-(language::integer:1:Z) | | +-(language::integer:2:Z) | | +-(language::integer:1:Z) | | `-(language::integer:3:Z) | `-(language::integer:0:Z) `-(language::var_declaration:void) - +-(language::name:t2:tuple(R^3x3)) - +-(language::tuple_type_specifier:typename(tuple(R^3x3))) - | `-(language::matrix_type:typename(R^3x3)) - | +-(language::R_set:typename(R)) + +-(language::name:t2:(R^3x3...)) + +-(language::tuple_type_specifier:(R^3x3...)) + | `-(language::matrix_type:R^3x3) + | +-(language::R_set:R) | +-(language::integer:3:Z) | `-(language::integer:3:Z) - +-(language::name:t2:tuple(R^3x3)) - `-(language::expression_list:list(Z*Z)) + +-(language::name:t2:(R^3x3...)) + `-(language::expression_list:Z*Z) +-(language::integer:0:Z) `-(language::integer:0:Z) )"; @@ -614,11 +614,11 @@ let t : (string), t = ("foo", "bar"); std::string_view result = R"( (root:void) `-(language::var_declaration:void) - +-(language::name:t:tuple(string)) - +-(language::tuple_type_specifier:typename(tuple(string))) - | `-(language::string_type:typename(string)) - +-(language::name:t:tuple(string)) - `-(language::expression_list:list(string*string)) + +-(language::name:t:(string...)) + +-(language::tuple_type_specifier:(string...)) + | `-(language::string_type:string) + +-(language::name:t:(string...)) + `-(language::expression_list:string*string) +-(language::literal:"foo":string) `-(language::literal:"bar":string) )"; @@ -636,11 +636,11 @@ let t : (builtin_t), t= (1,2,3); std::string_view result = R"( (root:void) `-(language::var_declaration:void) - +-(language::name:t:tuple(builtin_t)) - +-(language::tuple_type_specifier:typename(tuple(builtin_t))) + +-(language::name:t:(builtin_t...)) + +-(language::tuple_type_specifier:(builtin_t...)) | `-(language::type_name_id:builtin_t) - +-(language::name:t:tuple(builtin_t)) - `-(language::expression_list:list(Z*Z*Z)) + +-(language::name:t:(builtin_t...)) + `-(language::expression_list:Z*Z*Z) +-(language::integer:1:Z) +-(language::integer:2:Z) `-(language::integer:3:Z) @@ -1073,11 +1073,11 @@ x = f(x); | `-(language::name:f:function) +-(language::var_declaration:void) | +-(language::name:x:R^2) - | +-(language::vector_type:typename(R^2)) - | | +-(language::R_set:typename(R)) + | +-(language::vector_type:R^2) + | | +-(language::R_set:R) | | `-(language::integer:2:Z) | +-(language::name:x:R^2) - | `-(language::expression_list:list(Z*Z)) + | `-(language::expression_list:Z*Z) | +-(language::integer:1:Z) | `-(language::integer:2:Z) `-(language::eq_op:void) @@ -1106,7 +1106,7 @@ let x : R, x = incr(3); | `-(language::name:incr:function) `-(language::var_declaration:void) +-(language::name:x:R) - +-(language::R_set:typename(R)) + +-(language::R_set:R) +-(language::name:x:R) `-(language::function_evaluation:R) +-(language::name:incr:function) @@ -1129,11 +1129,11 @@ let diff : R, diff = substract(3,2); | `-(language::name:substract:function) `-(language::var_declaration:void) +-(language::name:diff:R) - +-(language::R_set:typename(R)) + +-(language::R_set:R) +-(language::name:diff:R) `-(language::function_evaluation:R) +-(language::name:substract:function) - `-(language::function_argument_list:list(Z*Z)) + `-(language::function_argument_list:Z*Z) +-(language::integer:3:Z) `-(language::integer:2:Z) )"; @@ -1155,7 +1155,7 @@ let z : Z, z = incr(3); | `-(language::name:incr:function) `-(language::var_declaration:void) +-(language::name:z:Z) - +-(language::Z_set:typename(Z)) + +-(language::Z_set:Z) +-(language::name:z:Z) `-(language::function_evaluation:Z) +-(language::name:incr:function) @@ -1178,7 +1178,7 @@ let n : N, n = double(3); | `-(language::name:double:function) `-(language::var_declaration:void) +-(language::name:n:N) - +-(language::N_set:typename(N)) + +-(language::N_set:N) +-(language::name:n:N) `-(language::function_evaluation:N) +-(language::name:double:function) @@ -1201,7 +1201,7 @@ let b : B, b = greater_than_2(3); | `-(language::name:greater_than_2:function) `-(language::var_declaration:void) +-(language::name:b:B) - +-(language::B_set:typename(B)) + +-(language::B_set:B) +-(language::name:b:B) `-(language::function_evaluation:B) +-(language::name:greater_than_2:function) @@ -1224,11 +1224,11 @@ let s : string, s = cat("foo", "bar"); | `-(language::name:cat:function) `-(language::var_declaration:void) +-(language::name:s:string) - +-(language::string_type:typename(string)) + +-(language::string_type:string) +-(language::name:s:string) `-(language::function_evaluation:string) +-(language::name:cat:function) - `-(language::function_argument_list:list(string*string)) + `-(language::function_argument_list:string*string) +-(language::literal:"foo":string) `-(language::literal:"bar":string) )"; @@ -1248,16 +1248,16 @@ let (x,x2) : R*R, (x,x2) = x_x2(3); +-(language::fct_declaration:void) | `-(language::name:x_x2:function) `-(language::var_declaration:void) - +-(language::name_list:list(R*R)) + +-(language::name_list:R*R) | +-(language::name:x:R) | `-(language::name:x2:R) - +-(language::type_expression:typename(list(typename(R)*typename(R)))) - | +-(language::R_set:typename(R)) - | `-(language::R_set:typename(R)) - +-(language::name_list:list(R*R)) + +-(language::type_expression:R*R) + | +-(language::R_set:R) + | `-(language::R_set:R) + +-(language::name_list:R*R) | +-(language::name:x:R) | `-(language::name:x2:R) - `-(language::function_evaluation:list(typename(R)*typename(R))) + `-(language::function_evaluation:R*R) +-(language::name:x_x2:function) `-(language::integer:3:Z) )"; @@ -1316,7 +1316,7 @@ for (let i : N, i=0; i<3; ++i){ `-(language::for_statement:void) +-(language::var_declaration:void) | +-(language::name:i:N) - | +-(language::N_set:typename(N)) + | +-(language::N_set:N) | +-(language::name:i:N) | `-(language::integer:0:Z) +-(language::lesser_op:B) @@ -1342,7 +1342,7 @@ let b:B; (root:void) `-(language::var_declaration:void) +-(language::name:b:B) - `-(language::B_set:typename(B)) + `-(language::B_set:B) )"; CHECK_AST(data, result); @@ -1358,7 +1358,7 @@ let n :N; (root:void) `-(language::var_declaration:void) +-(language::name:n:N) - `-(language::N_set:typename(N)) + `-(language::N_set:N) )"; CHECK_AST(data, result); @@ -1374,7 +1374,7 @@ let z:Z; (root:void) `-(language::var_declaration:void) +-(language::name:z:Z) - `-(language::Z_set:typename(Z)) + `-(language::Z_set:Z) )"; CHECK_AST(data, result); @@ -1390,7 +1390,7 @@ let r:R; (root:void) `-(language::var_declaration:void) +-(language::name:r:R) - `-(language::R_set:typename(R)) + `-(language::R_set:R) )"; CHECK_AST(data, result); @@ -1406,7 +1406,7 @@ let s: string; (root:void) `-(language::var_declaration:void) +-(language::name:s:string) - `-(language::string_type:typename(string)) + `-(language::string_type:string) )"; CHECK_AST(data, result); @@ -1423,7 +1423,7 @@ let t : builtin_t, t= 1; (root:void) `-(language::var_declaration:void) +-(language::name:t:builtin_t) - +-(language::type_name_id:typename(builtin_t)) + +-(language::type_name_id:builtin_t) +-(language::name:t:builtin_t) `-(language::integer:1:Z) )"; @@ -1470,7 +1470,7 @@ a = 1; (root:void) +-(language::var_declaration:void) | +-(language::name:a:N) - | `-(language::N_set:typename(N)) + | `-(language::N_set:N) `-(language::eq_op:void) +-(language::name:a:N) `-(language::integer:1:Z) @@ -1490,7 +1490,7 @@ a *= 1.2; (root:void) +-(language::var_declaration:void) | +-(language::name:a:N) - | +-(language::N_set:typename(N)) + | +-(language::N_set:N) | +-(language::name:a:N) | `-(language::integer:1:Z) `-(language::multiplyeq_op:void) @@ -1512,7 +1512,7 @@ a /= 2; (root:void) +-(language::var_declaration:void) | +-(language::name:a:R) - | +-(language::R_set:typename(R)) + | +-(language::R_set:R) | +-(language::name:a:R) | `-(language::integer:3:Z) `-(language::divideeq_op:void) @@ -1534,7 +1534,7 @@ a += 2; (root:void) +-(language::var_declaration:void) | +-(language::name:a:Z) - | +-(language::Z_set:typename(Z)) + | +-(language::Z_set:Z) | +-(language::name:a:Z) | `-(language::integer:3:Z) `-(language::pluseq_op:void) @@ -1556,7 +1556,7 @@ a -= 2; (root:void) +-(language::var_declaration:void) | +-(language::name:a:Z) - | +-(language::Z_set:typename(Z)) + | +-(language::Z_set:Z) | +-(language::name:a:Z) | `-(language::integer:1:Z) `-(language::minuseq_op:void) @@ -1596,7 +1596,7 @@ for (let i:Z, i=0; i<3; i += 1) { i += 2; } `-(language::for_statement:void) +-(language::var_declaration:void) | +-(language::name:i:Z) - | +-(language::Z_set:typename(Z)) + | +-(language::Z_set:Z) | +-(language::name:i:Z) | `-(language::integer:0:Z) +-(language::lesser_op:B) diff --git a/tests/test_ASTNodeFunctionEvaluationExpressionBuilder.cpp b/tests/test_ASTNodeFunctionEvaluationExpressionBuilder.cpp index 6fbb82cf81db5c9ae7b78d30d17a01864a3e5d57..289eb44be78bc57ed86a03ea308c649b2d17cc87 100644 --- a/tests/test_ASTNodeFunctionEvaluationExpressionBuilder.cpp +++ b/tests/test_ASTNodeFunctionEvaluationExpressionBuilder.cpp @@ -51,7 +51,7 @@ sin(3); std::string_view result = R"( (root:ASTNodeListProcessor) `-(language::function_evaluation:BuiltinFunctionProcessor) - +-(language::name:sin:NameProcessor) + +-(language::name:sin:FakeProcessor) `-(language::integer:3:ValueProcessor) )"; diff --git a/tests/test_ASTNodeNaturalConversionChecker.cpp b/tests/test_ASTNodeNaturalConversionChecker.cpp index d03541e6c96c63b70a220ee94f50a858614eab5b..6852222ae307f2cdac86463ecc2b59fde4536618 100644 --- a/tests/test_ASTNodeNaturalConversionChecker.cpp +++ b/tests/test_ASTNodeNaturalConversionChecker.cpp @@ -1009,7 +1009,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1)}), - "invalid implicit conversion: tuple(N) -> R^1x1"); + "invalid implicit conversion: (N...) -> R^1x1"); } SECTION("tuple(R) -> R^1x1") @@ -1018,7 +1018,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1)}), - "invalid implicit conversion: tuple(R) -> R^1x1"); + "invalid implicit conversion: (R...) -> R^1x1"); } SECTION("tuple(R) -> R^2x2") @@ -1027,7 +1027,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2, 2)}), - "invalid implicit conversion: tuple(R) -> R^2x2"); + "invalid implicit conversion: (R...) -> R^2x2"); } SECTION("tuple(B) -> R^2x2") @@ -1036,7 +1036,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2, 2)}), - "invalid implicit conversion: tuple(B) -> R^2x2"); + "invalid implicit conversion: (B...) -> R^2x2"); } SECTION("tuple(Z) -> R^3x2") @@ -1045,7 +1045,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, 3)}), - "invalid implicit conversion: tuple(Z) -> R^3x3"); + "invalid implicit conversion: (Z...) -> R^3x3"); } SECTION("tuple(R) -> R^3x3") @@ -1054,7 +1054,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, 3)}), - "invalid implicit conversion: tuple(R) -> R^3x3"); + "invalid implicit conversion: (R...) -> R^3x3"); } SECTION("tuple(R^1) -> tuple(R^3x3)") @@ -1419,7 +1419,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") data_node->m_data_type = ASTNodeDataType::build<ASTNodeDataType::tuple_t>(unsigned_int_dt); REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::build<ASTNodeDataType::vector_t>(1)}), - "invalid implicit conversion: tuple(N) -> R^1"); + "invalid implicit conversion: (N...) -> R^1"); } SECTION("tuple(R) -> R^1") @@ -1427,7 +1427,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") data_node->m_data_type = ASTNodeDataType::build<ASTNodeDataType::tuple_t>(double_dt); REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::build<ASTNodeDataType::vector_t>(1)}), - "invalid implicit conversion: tuple(R) -> R^1"); + "invalid implicit conversion: (R...) -> R^1"); } SECTION("tuple(R) -> R^2") @@ -1435,7 +1435,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") data_node->m_data_type = ASTNodeDataType::build<ASTNodeDataType::tuple_t>(double_dt); REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::build<ASTNodeDataType::vector_t>(2)}), - "invalid implicit conversion: tuple(R) -> R^2"); + "invalid implicit conversion: (R...) -> R^2"); } SECTION("tuple(B) -> R^2") @@ -1443,7 +1443,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") data_node->m_data_type = ASTNodeDataType::build<ASTNodeDataType::tuple_t>(bool_dt); REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::build<ASTNodeDataType::vector_t>(2)}), - "invalid implicit conversion: tuple(B) -> R^2"); + "invalid implicit conversion: (B...) -> R^2"); } SECTION("tuple(Z) -> R^3") @@ -1451,7 +1451,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") data_node->m_data_type = ASTNodeDataType::build<ASTNodeDataType::tuple_t>(int_dt); REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::build<ASTNodeDataType::vector_t>(3)}), - "invalid implicit conversion: tuple(Z) -> R^3"); + "invalid implicit conversion: (Z...) -> R^3"); } SECTION("tuple(R) -> R^3") @@ -1459,7 +1459,7 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") data_node->m_data_type = ASTNodeDataType::build<ASTNodeDataType::tuple_t>(double_dt); REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::build<ASTNodeDataType::vector_t>(3)}), - "invalid implicit conversion: tuple(R) -> R^3"); + "invalid implicit conversion: (R...) -> R^3"); } SECTION("tuple(R^1x1) -> tuple(R^3)") @@ -1750,14 +1750,14 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") { data_node->m_data_type = ASTNodeDataType::build<ASTNodeDataType::tuple_t>(unsigned_int_dt); REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, double_dt}), - "invalid implicit conversion: tuple(N) -> R"); + "invalid implicit conversion: (N...) -> R"); } SECTION("tuple(R) -> R") { data_node->m_data_type = ASTNodeDataType::build<ASTNodeDataType::tuple_t>(double_dt); REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, double_dt}), - "invalid implicit conversion: tuple(R) -> R"); + "invalid implicit conversion: (R...) -> R"); } } @@ -1802,14 +1802,14 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") { data_node->m_data_type = ASTNodeDataType::build<ASTNodeDataType::tuple_t>(unsigned_int_dt); REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, int_dt}), - "invalid implicit conversion: tuple(N) -> Z"); + "invalid implicit conversion: (N...) -> Z"); } SECTION("tuple(Z) -> Z") { data_node->m_data_type = ASTNodeDataType::build<ASTNodeDataType::tuple_t>(int_dt); REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, int_dt}), - "invalid implicit conversion: tuple(Z) -> Z"); + "invalid implicit conversion: (Z...) -> Z"); } } @@ -1854,14 +1854,14 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") { data_node->m_data_type = ASTNodeDataType::build<ASTNodeDataType::tuple_t>(int_dt); REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, unsigned_int_dt}), - "invalid implicit conversion: tuple(Z) -> N"); + "invalid implicit conversion: (Z...) -> N"); } SECTION("tuple(N) -> N") { data_node->m_data_type = ASTNodeDataType::build<ASTNodeDataType::tuple_t>(unsigned_int_dt); REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, unsigned_int_dt}), - "invalid implicit conversion: tuple(N) -> N"); + "invalid implicit conversion: (N...) -> N"); } } @@ -1920,14 +1920,14 @@ TEST_CASE("ASTNodeNaturalConversionChecker", "[language]") { data_node->m_data_type = ASTNodeDataType::build<ASTNodeDataType::tuple_t>(int_dt); REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, bool_dt}), - "invalid implicit conversion: tuple(Z) -> B"); + "invalid implicit conversion: (Z...) -> B"); } SECTION("tuple(B) -> B") { data_node->m_data_type = ASTNodeDataType::build<ASTNodeDataType::tuple_t>(bool_dt); REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, bool_dt}), - "invalid implicit conversion: tuple(B) -> B"); + "invalid implicit conversion: (B...) -> B"); } } diff --git a/tests/test_BuiltinFunctionProcessor.cpp b/tests/test_BuiltinFunctionProcessor.cpp index e1b9bb4ed39c39aea07d9d289d8808e8c5a54851..dda3becc1897f2e659ed105256bc0ec09271e46d 100644 --- a/tests/test_BuiltinFunctionProcessor.cpp +++ b/tests/test_BuiltinFunctionProcessor.cpp @@ -81,7 +81,7 @@ TEST_CASE("BuiltinFunctionProcessor", "[language]") std::set<std::string> tested_function_set; { // sqrt - tested_function_set.insert("sqrt"); + tested_function_set.insert("sqrt:R"); std::string_view data = R"( import math; let x:R, x = sqrt(4); @@ -90,7 +90,7 @@ let x:R, x = sqrt(4); } { // abs - tested_function_set.insert("abs"); + tested_function_set.insert("abs:R"); std::string_view data = R"( import math; let x:R, x = abs(-3.4); @@ -99,7 +99,7 @@ let x:R, x = abs(-3.4); } { // sin - tested_function_set.insert("sin"); + tested_function_set.insert("sin:R"); std::string_view data = R"( import math; let x:R, x = sin(1.3); @@ -108,7 +108,7 @@ let x:R, x = sin(1.3); } { // cos - tested_function_set.insert("cos"); + tested_function_set.insert("cos:R"); std::string_view data = R"( import math; let x:R, x = cos(1.3); @@ -117,7 +117,7 @@ let x:R, x = cos(1.3); } { // tan - tested_function_set.insert("tan"); + tested_function_set.insert("tan:R"); std::string_view data = R"( import math; let x:R, x = tan(1.3); @@ -126,7 +126,7 @@ let x:R, x = tan(1.3); } { // asin - tested_function_set.insert("asin"); + tested_function_set.insert("asin:R"); std::string_view data = R"( import math; let x:R, x = asin(0.7); @@ -135,7 +135,7 @@ let x:R, x = asin(0.7); } { // acos - tested_function_set.insert("acos"); + tested_function_set.insert("acos:R"); std::string_view data = R"( import math; let x:R, x = acos(0.7); @@ -144,7 +144,7 @@ let x:R, x = acos(0.7); } { // atan - tested_function_set.insert("atan"); + tested_function_set.insert("atan:R"); std::string_view data = R"( import math; let x:R, x = atan(0.7); @@ -153,7 +153,7 @@ let x:R, x = atan(0.7); } { // atan2 - tested_function_set.insert("atan2"); + tested_function_set.insert("atan2:R*R"); std::string_view data = R"( import math; let x:R, x = atan2(0.7, 0.4); @@ -162,7 +162,7 @@ let x:R, x = atan2(0.7, 0.4); } { // sinh - tested_function_set.insert("sinh"); + tested_function_set.insert("sinh:R"); std::string_view data = R"( import math; let x:R, x = sinh(0.6); @@ -171,7 +171,7 @@ let x:R, x = sinh(0.6); } { // cosh - tested_function_set.insert("cosh"); + tested_function_set.insert("cosh:R"); std::string_view data = R"( import math; let x:R, x = cosh(1.7); @@ -180,7 +180,7 @@ let x:R, x = cosh(1.7); } { // tanh - tested_function_set.insert("tanh"); + tested_function_set.insert("tanh:R"); std::string_view data = R"( import math; let x:R, x = tanh(0.6); @@ -189,7 +189,7 @@ let x:R, x = tanh(0.6); } { // asinh - tested_function_set.insert("asinh"); + tested_function_set.insert("asinh:R"); std::string_view data = R"( import math; let x:R, x = asinh(0.6); @@ -198,7 +198,7 @@ let x:R, x = asinh(0.6); } { // acosh - tested_function_set.insert("acosh"); + tested_function_set.insert("acosh:R"); std::string_view data = R"( import math; let x:R, x = acosh(1.7); @@ -207,7 +207,7 @@ let x:R, x = acosh(1.7); } { // tanh - tested_function_set.insert("atanh"); + tested_function_set.insert("atanh:R"); std::string_view data = R"( import math; let x:R, x = atanh(0.6); @@ -216,7 +216,7 @@ let x:R, x = atanh(0.6); } { // exp - tested_function_set.insert("exp"); + tested_function_set.insert("exp:R"); std::string_view data = R"( import math; let x:R, x = exp(1.7); @@ -225,7 +225,7 @@ let x:R, x = exp(1.7); } { // log - tested_function_set.insert("log"); + tested_function_set.insert("log:R"); std::string_view data = R"( import math; let x:R, x = log(1.6); @@ -234,7 +234,7 @@ let x:R, x = log(1.6); } { // pow - tested_function_set.insert("pow"); + tested_function_set.insert("pow:R*R"); std::string_view data = R"( import math; let x:R, x = pow(1.6, 2.3); @@ -243,7 +243,7 @@ let x:R, x = pow(1.6, 2.3); } { // ceil - tested_function_set.insert("ceil"); + tested_function_set.insert("ceil:R"); std::string_view data = R"( import math; let z:Z, z = ceil(-1.2); @@ -252,7 +252,7 @@ let z:Z, z = ceil(-1.2); } { // floor - tested_function_set.insert("floor"); + tested_function_set.insert("floor:R"); std::string_view data = R"( import math; let z:Z, z = floor(-1.2); @@ -261,7 +261,7 @@ let z:Z, z = floor(-1.2); } { // trunc - tested_function_set.insert("trunc"); + tested_function_set.insert("trunc:R"); std::string_view data = R"( import math; let z:Z, z = trunc(-0.2) + trunc(0.7); @@ -270,7 +270,7 @@ let z:Z, z = trunc(-0.2) + trunc(0.7); } { // round - tested_function_set.insert("round"); + tested_function_set.insert("round:R"); std::string_view data = R"( import math; let z:Z, z = round(-1.2); diff --git a/tests/test_BuiltinFunctionRegister.hpp b/tests/test_BuiltinFunctionRegister.hpp index bc36e2ea29d37cbcd2464ddc1e080bff9e0dd591..e062fcd92222796da9071243bda7c3e5dd253e32 100644 --- a/tests/test_BuiltinFunctionRegister.hpp +++ b/tests/test_BuiltinFunctionRegister.hpp @@ -3,6 +3,7 @@ #include <language/utils/ASTNodeDataTypeTraits.hpp> #include <language/utils/BuiltinFunctionEmbedder.hpp> +#include <language/utils/ParseError.hpp> #include <language/utils/TypeDescriptor.hpp> #include <utils/Exceptions.hpp> @@ -22,135 +23,140 @@ class test_BuiltinFunctionRegister _populateNameBuiltinFunctionMap() { m_name_builtin_function_map.insert( - std::make_pair("runtimeError", std::make_shared<BuiltinFunctionEmbedder<void(void)>>( - [](void) -> void { throw NormalError("runtime error"); }))); + std::make_pair("runtimeError:void", std::make_shared<BuiltinFunctionEmbedder<void(void)>>( + [](void) -> void { throw NormalError("runtime error"); }))); - m_name_builtin_function_map.insert(std::make_pair("RtoR", std::make_shared<BuiltinFunctionEmbedder<double(double)>>( - [](double x) -> double { return x + 1; }))); + m_name_builtin_function_map.insert( + std::make_pair("RtoR:R", std::make_shared<BuiltinFunctionEmbedder<double(double)>>( + [](double x) -> double { return x + 1; }))); m_name_builtin_function_map.insert( - std::make_pair("ZtoR", std::make_shared<BuiltinFunctionEmbedder<double(int64_t)>>( - [](int64_t z) -> double { return 0.5 * z; }))); + std::make_pair("ZtoR:Z", std::make_shared<BuiltinFunctionEmbedder<double(int64_t)>>( + [](int64_t z) -> double { return 0.5 * z; }))); m_name_builtin_function_map.insert( - std::make_pair("NtoR", std::make_shared<BuiltinFunctionEmbedder<double(uint64_t)>>( - [](uint64_t n) -> double { return 0.5 * n; }))); + std::make_pair("NtoR:N", std::make_shared<BuiltinFunctionEmbedder<double(uint64_t)>>( + [](uint64_t n) -> double { return 0.5 * n; }))); - m_name_builtin_function_map.insert(std::make_pair("BtoR", std::make_shared<BuiltinFunctionEmbedder<double(bool)>>( - [](bool b) -> double { return b; }))); + m_name_builtin_function_map.insert(std::make_pair("BtoR:B", std::make_shared<BuiltinFunctionEmbedder<double(bool)>>( + [](bool b) -> double { return b; }))); m_name_builtin_function_map.insert( - std::make_pair("RRtoB", std::make_shared<BuiltinFunctionEmbedder<bool(double, double)>>( - [](double x, double y) -> bool { return x > y; }))); + std::make_pair("RRtoB:R*R", std::make_shared<BuiltinFunctionEmbedder<bool(double, double)>>( + [](double x, double y) -> bool { return x > y; }))); m_name_builtin_function_map.insert( - std::make_pair("StoB", std::make_shared<BuiltinFunctionEmbedder<bool(std::string)>>( - [](const std::string& s) -> bool { return s.size() > 0; }))); + std::make_pair("StoB:string", std::make_shared<BuiltinFunctionEmbedder<bool(std::string)>>( + [](const std::string& s) -> bool { return s.size() > 0; }))); m_name_builtin_function_map.insert( - std::make_pair("RtoR1", std::make_shared<BuiltinFunctionEmbedder<TinyVector<1>(double)>>( - [](double r) -> TinyVector<1> { return {r}; }))); + std::make_pair("RtoR1:R", std::make_shared<BuiltinFunctionEmbedder<TinyVector<1>(double)>>( + [](double r) -> TinyVector<1> { return {r}; }))); m_name_builtin_function_map.insert( - std::make_pair("R1toR", std::make_shared<BuiltinFunctionEmbedder<double(TinyVector<1>)>>( - [](TinyVector<1> x) -> double { return x[0]; }))); + std::make_pair("R1toR:R^1", std::make_shared<BuiltinFunctionEmbedder<double(TinyVector<1>)>>( + [](TinyVector<1> x) -> double { return x[0]; }))); m_name_builtin_function_map.insert( - std::make_pair("R2toR", std::make_shared<BuiltinFunctionEmbedder<double(TinyVector<2>)>>( - [](TinyVector<2> x) -> double { return x[0] + x[1]; }))); + std::make_pair("R2toR:R^2", std::make_shared<BuiltinFunctionEmbedder<double(TinyVector<2>)>>( + [](TinyVector<2> x) -> double { return x[0] + x[1]; }))); m_name_builtin_function_map.insert( - std::make_pair("R3toR", std::make_shared<BuiltinFunctionEmbedder<double(const TinyVector<3>&)>>( - [](const TinyVector<3>& x) -> double { return x[0] + x[1] + x[2]; }))); + std::make_pair("R3toR:R^3", std::make_shared<BuiltinFunctionEmbedder<double(const TinyVector<3>&)>>( + [](const TinyVector<3>& x) -> double { return x[0] + x[1] + x[2]; }))); m_name_builtin_function_map.insert( - std::make_pair("R3R2toR", + std::make_pair("R3R2toR:R^3,R^2", std::make_shared<BuiltinFunctionEmbedder<double(TinyVector<3>, TinyVector<2>)>>( [](TinyVector<3> x, TinyVector<2> y) -> double { return x[0] * y[1] + (y[0] - x[2]) * x[1]; }))); m_name_builtin_function_map.insert( - std::make_pair("RtoR11", std::make_shared<BuiltinFunctionEmbedder<TinyMatrix<1>(double)>>( - [](double r) -> TinyMatrix<1> { return {r}; }))); + std::make_pair("RtoR11:R", std::make_shared<BuiltinFunctionEmbedder<TinyMatrix<1>(double)>>( + [](double r) -> TinyMatrix<1> { return {r}; }))); m_name_builtin_function_map.insert( - std::make_pair("R11toR", std::make_shared<BuiltinFunctionEmbedder<double(TinyMatrix<1>)>>( - [](TinyMatrix<1> x) -> double { return x(0, 0); }))); + std::make_pair("R11toR:R^1x1", std::make_shared<BuiltinFunctionEmbedder<double(TinyMatrix<1>)>>( + [](TinyMatrix<1> x) -> double { return x(0, 0); }))); m_name_builtin_function_map.insert( - std::make_pair("R22toR", std::make_shared<BuiltinFunctionEmbedder<double(TinyMatrix<2>)>>( - [](TinyMatrix<2> x) -> double { return x(0, 0) + x(0, 1) + x(1, 0) + x(1, 1); }))); + std::make_pair("R22toR:R^2x2", + std::make_shared<BuiltinFunctionEmbedder<double(TinyMatrix<2>)>>( + [](TinyMatrix<2> x) -> double { return x(0, 0) + x(0, 1) + x(1, 0) + x(1, 1); }))); m_name_builtin_function_map.insert( - std::make_pair("R33toR", std::make_shared<BuiltinFunctionEmbedder<double(const TinyMatrix<3>&)>>( - [](const TinyMatrix<3>& x) -> double { return x(0, 0) + x(1, 1) + x(2, 2); }))); + std::make_pair("R33toR:R^3x3", std::make_shared<BuiltinFunctionEmbedder<double(const TinyMatrix<3>&)>>( + [](const TinyMatrix<3>& x) -> double { return x(0, 0) + x(1, 1) + x(2, 2); }))); m_name_builtin_function_map.insert( - std::make_pair("R33R22toR", std::make_shared<BuiltinFunctionEmbedder<double(TinyMatrix<3>, TinyMatrix<2>)>>( - [](TinyMatrix<3> x, TinyMatrix<2> y) -> double { - return (x(0, 0) + x(1, 1) + x(2, 2)) * (y(0, 0) + y(0, 1) + y(1, 0) + y(1, 1)); - }))); + std::make_pair("R33R22toR:R^3x3*R^2x2", + std::make_shared<BuiltinFunctionEmbedder<double(TinyMatrix<3>, TinyMatrix<2>)>>( + [](TinyMatrix<3> x, TinyMatrix<2> y) -> double { + return (x(0, 0) + x(1, 1) + x(2, 2)) * (y(0, 0) + y(0, 1) + y(1, 0) + y(1, 1)); + }))); m_name_builtin_function_map.insert( - std::make_pair("fidToR", std::make_shared<BuiltinFunctionEmbedder<double(const FunctionSymbolId&)>>( - [](const FunctionSymbolId&) -> double { return 0; }))); + std::make_pair("fidToR:function", std::make_shared<BuiltinFunctionEmbedder<double(const FunctionSymbolId&)>>( + [](const FunctionSymbolId&) -> double { return 0; }))); m_name_builtin_function_map.insert( - std::make_pair("builtinToBuiltin", + std::make_pair("builtinToBuiltin:builtin_t", std::make_shared< BuiltinFunctionEmbedder<std::shared_ptr<const double>(std::shared_ptr<const double>)>>( [](std::shared_ptr<const double> x) -> std::shared_ptr<const double> { return x; }))); m_name_builtin_function_map.insert( - std::make_pair("tuple_BtoR", std::make_shared<BuiltinFunctionEmbedder<double(std::vector<bool>)>>( - [](const std::vector<bool>&) -> double { return 0.5; }))); + std::make_pair("tuple_BtoR:(B...)", std::make_shared<BuiltinFunctionEmbedder<double(std::vector<bool>)>>( + [](const std::vector<bool>&) -> double { return 0.5; }))); m_name_builtin_function_map.insert( - std::make_pair("tuple_NtoR", std::make_shared<BuiltinFunctionEmbedder<double(std::vector<uint64_t>)>>( - [](const std::vector<uint64_t>&) -> double { return 0.5; }))); + std::make_pair("tuple_NtoR:(N...)", std::make_shared<BuiltinFunctionEmbedder<double(std::vector<uint64_t>)>>( + [](const std::vector<uint64_t>&) -> double { return 0.5; }))); m_name_builtin_function_map.insert( - std::make_pair("tuple_ZtoR", std::make_shared<BuiltinFunctionEmbedder<double(std::vector<int64_t>)>>( - [](const std::vector<int64_t>&) -> double { return 0.5; }))); + std::make_pair("tuple_ZtoR:(Z...)", std::make_shared<BuiltinFunctionEmbedder<double(std::vector<int64_t>)>>( + [](const std::vector<int64_t>&) -> double { return 0.5; }))); m_name_builtin_function_map.insert( - std::make_pair("tuple_RtoB", std::make_shared<BuiltinFunctionEmbedder<bool(std::vector<double>)>>( - [](const std::vector<double>&) -> bool { return false; }))); + std::make_pair("tuple_RtoB:(R...)", std::make_shared<BuiltinFunctionEmbedder<bool(std::vector<double>)>>( + [](const std::vector<double>&) -> bool { return false; }))); m_name_builtin_function_map.insert( - std::make_pair("tuple_stringtoB", std::make_shared<BuiltinFunctionEmbedder<bool(std::vector<std::string>)>>( - [](const std::vector<std::string>&) -> bool { return true; }))); + std::make_pair("tuple_stringtoB:(string...)", + std::make_shared<BuiltinFunctionEmbedder<bool(std::vector<std::string>)>>( + [](const std::vector<std::string>&) -> bool { return true; }))); m_name_builtin_function_map.insert( - std::make_pair("tuple_builtinToB", + std::make_pair("tuple_builtinToB:(builtin_t...)", std::make_shared<BuiltinFunctionEmbedder<bool(std::vector<std::shared_ptr<const double>>)>>( [](const std::vector<std::shared_ptr<const double>>&) -> bool { return true; }))); m_name_builtin_function_map.insert( - std::make_pair("tuple_R1ToR", + std::make_pair("tuple_R1ToR:(R^1...)", std::make_shared<BuiltinFunctionEmbedder<double(const std::vector<TinyVector<1>>&)>>( [](const std::vector<TinyVector<1>>&) -> double { return 1; }))); m_name_builtin_function_map.insert( - std::make_pair("tuple_R2ToR", + std::make_pair("tuple_R2ToR:(R^2...)", std::make_shared<BuiltinFunctionEmbedder<double(const std::vector<TinyVector<2>>&)>>( [](const std::vector<TinyVector<2>>&) -> double { return 1; }))); m_name_builtin_function_map.insert( - std::make_pair("tuple_R3ToR", std::make_shared<BuiltinFunctionEmbedder<double(const std::vector<TinyVector<3>>)>>( - [](const std::vector<TinyVector<3>>&) -> double { return 0; }))); + std::make_pair("tuple_R3ToR:(R^3...)", + std::make_shared<BuiltinFunctionEmbedder<double(const std::vector<TinyVector<3>>)>>( + [](const std::vector<TinyVector<3>>&) -> double { return 0; }))); m_name_builtin_function_map.insert( - std::make_pair("tuple_R11ToR", + std::make_pair("tuple_R11ToR:(R^1x1...)", std::make_shared<BuiltinFunctionEmbedder<double(const std::vector<TinyMatrix<1>>&)>>( [](const std::vector<TinyMatrix<1>>&) -> double { return 1; }))); m_name_builtin_function_map.insert( - std::make_pair("tuple_R22ToR", + std::make_pair("tuple_R22ToR:(R^2x2...)", std::make_shared<BuiltinFunctionEmbedder<double(const std::vector<TinyMatrix<2>>&)>>( [](const std::vector<TinyMatrix<2>>&) -> double { return 1; }))); m_name_builtin_function_map.insert( - std::make_pair("tuple_R33ToR", + std::make_pair("tuple_R33ToR:(R^3x3...)", std::make_shared<BuiltinFunctionEmbedder<double(const std::vector<TinyMatrix<3>>)>>( [](const std::vector<TinyMatrix<3>>&) -> double { return 0; }))); } diff --git a/tests/test_MathModule.cpp b/tests/test_MathModule.cpp index 86696dfab3e574b5649c3670689e4c26cd664dbc..e899190bf486ff605c1bd4f8af2ccc232cc806a8 100644 --- a/tests/test_MathModule.cpp +++ b/tests/test_MathModule.cpp @@ -23,7 +23,7 @@ TEST_CASE("MathModule", "[language]") SECTION("sqrt") { - auto i_function = name_builtin_function.find("sqrt"); + auto i_function = name_builtin_function.find("sqrt:R"); REQUIRE(i_function != name_builtin_function.end()); IBuiltinFunctionEmbedder& function_embedder = *i_function->second; @@ -35,7 +35,7 @@ TEST_CASE("MathModule", "[language]") SECTION("abs") { - auto i_function = name_builtin_function.find("abs"); + auto i_function = name_builtin_function.find("abs:R"); REQUIRE(i_function != name_builtin_function.end()); IBuiltinFunctionEmbedder& function_embedder = *i_function->second; @@ -62,7 +62,7 @@ TEST_CASE("MathModule", "[language]") SECTION("sin") { - auto i_function = name_builtin_function.find("sin"); + auto i_function = name_builtin_function.find("sin:R"); REQUIRE(i_function != name_builtin_function.end()); IBuiltinFunctionEmbedder& function_embedder = *i_function->second; @@ -74,7 +74,7 @@ TEST_CASE("MathModule", "[language]") SECTION("cos") { - auto i_function = name_builtin_function.find("cos"); + auto i_function = name_builtin_function.find("cos:R"); REQUIRE(i_function != name_builtin_function.end()); IBuiltinFunctionEmbedder& function_embedder = *i_function->second; @@ -86,7 +86,7 @@ TEST_CASE("MathModule", "[language]") SECTION("tan") { - auto i_function = name_builtin_function.find("tan"); + auto i_function = name_builtin_function.find("tan:R"); REQUIRE(i_function != name_builtin_function.end()); IBuiltinFunctionEmbedder& function_embedder = *i_function->second; @@ -98,7 +98,7 @@ TEST_CASE("MathModule", "[language]") SECTION("asin") { - auto i_function = name_builtin_function.find("asin"); + auto i_function = name_builtin_function.find("asin:R"); REQUIRE(i_function != name_builtin_function.end()); IBuiltinFunctionEmbedder& function_embedder = *i_function->second; @@ -110,7 +110,7 @@ TEST_CASE("MathModule", "[language]") SECTION("acos") { - auto i_function = name_builtin_function.find("acos"); + auto i_function = name_builtin_function.find("acos:R"); REQUIRE(i_function != name_builtin_function.end()); IBuiltinFunctionEmbedder& function_embedder = *i_function->second; @@ -122,7 +122,7 @@ TEST_CASE("MathModule", "[language]") SECTION("atan") { - auto i_function = name_builtin_function.find("atan"); + auto i_function = name_builtin_function.find("atan:R"); REQUIRE(i_function != name_builtin_function.end()); IBuiltinFunctionEmbedder& function_embedder = *i_function->second; @@ -137,7 +137,7 @@ TEST_CASE("MathModule", "[language]") arg = 1.3; arg_variant = arg; - auto i_function = name_builtin_function.find("sinh"); + auto i_function = name_builtin_function.find("sinh:R"); REQUIRE(i_function != name_builtin_function.end()); IBuiltinFunctionEmbedder& function_embedder = *i_function->second; @@ -149,7 +149,7 @@ TEST_CASE("MathModule", "[language]") SECTION("cosh") { - auto i_function = name_builtin_function.find("cosh"); + auto i_function = name_builtin_function.find("cosh:R"); REQUIRE(i_function != name_builtin_function.end()); IBuiltinFunctionEmbedder& function_embedder = *i_function->second; @@ -161,7 +161,7 @@ TEST_CASE("MathModule", "[language]") SECTION("tanh") { - auto i_function = name_builtin_function.find("tanh"); + auto i_function = name_builtin_function.find("tanh:R"); REQUIRE(i_function != name_builtin_function.end()); IBuiltinFunctionEmbedder& function_embedder = *i_function->second; @@ -173,7 +173,7 @@ TEST_CASE("MathModule", "[language]") SECTION("asinh") { - auto i_function = name_builtin_function.find("asinh"); + auto i_function = name_builtin_function.find("asinh:R"); REQUIRE(i_function != name_builtin_function.end()); IBuiltinFunctionEmbedder& function_embedder = *i_function->second; @@ -188,7 +188,7 @@ TEST_CASE("MathModule", "[language]") arg = 10; arg_variant = arg; - auto i_function = name_builtin_function.find("acosh"); + auto i_function = name_builtin_function.find("acosh:R"); REQUIRE(i_function != name_builtin_function.end()); IBuiltinFunctionEmbedder& function_embedder = *i_function->second; @@ -200,7 +200,7 @@ TEST_CASE("MathModule", "[language]") SECTION("atanh") { - auto i_function = name_builtin_function.find("atanh"); + auto i_function = name_builtin_function.find("atanh:R"); REQUIRE(i_function != name_builtin_function.end()); IBuiltinFunctionEmbedder& function_embedder = *i_function->second; @@ -212,7 +212,7 @@ TEST_CASE("MathModule", "[language]") SECTION("exp") { - auto i_function = name_builtin_function.find("exp"); + auto i_function = name_builtin_function.find("exp:R"); REQUIRE(i_function != name_builtin_function.end()); IBuiltinFunctionEmbedder& function_embedder = *i_function->second; @@ -224,7 +224,7 @@ TEST_CASE("MathModule", "[language]") SECTION("log") { - auto i_function = name_builtin_function.find("log"); + auto i_function = name_builtin_function.find("log:R"); REQUIRE(i_function != name_builtin_function.end()); IBuiltinFunctionEmbedder& function_embedder = *i_function->second; @@ -243,7 +243,7 @@ TEST_CASE("MathModule", "[language]") SECTION("ceil") { - auto i_function = name_builtin_function.find("ceil"); + auto i_function = name_builtin_function.find("ceil:R"); REQUIRE(i_function != name_builtin_function.end()); IBuiltinFunctionEmbedder& function_embedder = *i_function->second; @@ -255,7 +255,7 @@ TEST_CASE("MathModule", "[language]") SECTION("floor") { - auto i_function = name_builtin_function.find("floor"); + auto i_function = name_builtin_function.find("floor:R"); REQUIRE(i_function != name_builtin_function.end()); IBuiltinFunctionEmbedder& function_embedder = *i_function->second; @@ -267,7 +267,7 @@ TEST_CASE("MathModule", "[language]") SECTION("trunc") { - auto i_function = name_builtin_function.find("trunc"); + auto i_function = name_builtin_function.find("trunc:R"); REQUIRE(i_function != name_builtin_function.end()); IBuiltinFunctionEmbedder& function_embedder = *i_function->second; @@ -279,7 +279,7 @@ TEST_CASE("MathModule", "[language]") SECTION("round") { - auto i_function = name_builtin_function.find("round"); + auto i_function = name_builtin_function.find("round:R"); REQUIRE(i_function != name_builtin_function.end()); IBuiltinFunctionEmbedder& function_embedder = *i_function->second; @@ -300,7 +300,7 @@ TEST_CASE("MathModule", "[language]") SECTION("atan2") { - auto i_function = name_builtin_function.find("atan2"); + auto i_function = name_builtin_function.find("atan2:R*R"); REQUIRE(i_function != name_builtin_function.end()); IBuiltinFunctionEmbedder& function_embedder = *i_function->second; @@ -312,7 +312,7 @@ TEST_CASE("MathModule", "[language]") SECTION("pow") { - auto i_function = name_builtin_function.find("pow"); + auto i_function = name_builtin_function.find("pow:R*R"); REQUIRE(i_function != name_builtin_function.end()); IBuiltinFunctionEmbedder& function_embedder = *i_function->second;