// for clangd #include "../include/link_symbols_visitor.hpp" #include "../include/error_handling.hpp" namespace interpreter { const std::string& NameFromTypeSubExpression(const TypeSubExpression& type) { if (std::holds_alternative>(type)) { return *std::get>(type); } else if (std::holds_alternative>(type)) { return std::get>(type)->type; } error_handling::HandleInternalError("Empty variant", "NameFromTypeSubExpression"); exit(1); // TODO: better decision ?? } // Namespaces, partitions ----------------- void LinkSymbolsVisitor::Visit(Namespace* node) { // Visitor::Visit(&node->type); // not needed auto maybe_type = namespace_visitor_.FindType(std::nullopt, node->type); // TODO: find only in local namespace auto maybe_typeclass = namespace_visitor_.FindType(std::nullopt, node->type); // TODO: find only if in global namespace if (maybe_type.has_value() && maybe_typeclass.has_value()) { error_handling::HandleTypecheckError("Ambigious namespace name (typeclass or type)"); } if (maybe_type.has_value()) { node->link_type_id_ = maybe_type.value(); } if (maybe_typeclass.has_value()) { node->link_typeclass_id_ = maybe_typeclass.value(); } namespace_visitor_.EnterNamespace(node->type); Visitor::Visit(&node->scope); namespace_visitor_.ExitNamespace(); } // Type, typeclass, etc. ----------------- // Type // TODO: link internal stages void LinkSymbolsVisitor::Visit(TypeExpression* node) { // TODO: check std::vector path; path.reserve(node->path.size()); for (auto& path_type : node->path) { path.push_back(NameFromTypeSubExpression(path_type)); } std::optional maybe_type = namespace_visitor_.FindType(path, NameFromTypeSubExpression(node->type)); if (maybe_type.has_value()) { node->type_id_ = maybe_type.value(); } else { error_handling::HandleTypecheckError("Type not found"); } } // Typeclass void LinkSymbolsVisitor::Visit(TypeclassExpression* node) { // TODO: check std::string typeclass; if (std::holds_alternative>(node->typeclass)) { typeclass = *std::get>(node->typeclass); } else if (std::holds_alternative>(node->typeclass)) { typeclass = std::get>(node->typeclass)->typeclass; } else { // error } std::optional maybe_typeclass = namespace_visitor_.FindTypeclass(typeclass); if (maybe_typeclass.has_value()) { node->typeclass_id_ = maybe_typeclass.value(); } else { error_handling::HandleTypecheckError("Type not found"); } } } // namespace interpreter