Select Git revision
ModuleRepository.cpp
ModuleRepository.cpp 9.28 KiB
#include <language/modules/ModuleRepository.hpp>
#include <language/ast/ASTNode.hpp>
#include <language/modules/CoreModule.hpp>
#include <language/modules/LinearSolverModule.hpp>
#include <language/modules/MathModule.hpp>
#include <language/modules/MeshModule.hpp>
#include <language/modules/SchemeModule.hpp>
#include <language/modules/SocketModule.hpp>
#include <language/modules/UtilsModule.hpp>
#include <language/modules/WriterModule.hpp>
#include <language/utils/BasicAffectationRegistrerFor.hpp>
#include <language/utils/BuiltinFunctionEmbedder.hpp>
#include <language/utils/ParseError.hpp>
#include <language/utils/SymbolTable.hpp>
#include <language/utils/TypeDescriptor.hpp>
#include <language/utils/ValueDescriptor.hpp>
#include <utils/PugsAssert.hpp>
#include <algorithm>
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");
}
ModuleRepository::ModuleRepository()
{
this->_subscribe(std::make_unique<CoreModule>());
this->_subscribe(std::make_unique<LinearSolverModule>());
this->_subscribe(std::make_unique<MathModule>());
this->_subscribe(std::make_unique<MeshModule>());
this->_subscribe(std::make_unique<SchemeModule>());
this->_subscribe(std::make_unique<SocketModule>());
this->_subscribe(std::make_unique<UtilsModule>());
this->_subscribe(std::make_unique<WriterModule>());
}
template <typename NameEmbedderMapT, typename EmbedderTableT>
void
ModuleRepository::_populateEmbedderTableT(const ASTNode& module_node,
const std::string& module_name,
const NameEmbedderMapT& name_embedder_map,
const ASTNodeDataType& data_type,