2023-04-07 12:13:31 +03:00
|
|
|
// for clangd
|
|
|
|
|
#include "../include/find_symbols_visitor.hpp"
|
|
|
|
|
|
2023-04-27 14:02:37 +03:00
|
|
|
// TODO
|
|
|
|
|
|
2023-04-07 12:13:31 +03:00
|
|
|
namespace interpreter {
|
|
|
|
|
|
|
|
|
|
// Sources -----------------
|
|
|
|
|
void FindSymbolsVisitor::Visit(SourceFile* node) {
|
|
|
|
|
for (auto& statement : node->statements) {
|
|
|
|
|
if (std::holds_alternative<Partition>(statement)) {
|
|
|
|
|
Visit(&std::get<Partition>(statement));
|
|
|
|
|
} else if (std::holds_alternative<SourceStatement>(statement)) {
|
|
|
|
|
Visitor::Visit(std::get<SourceStatement>(statement));
|
|
|
|
|
} else {
|
|
|
|
|
// error
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FindSymbolsVisitor::Visit(Sources* node) {
|
|
|
|
|
for (auto& statement : node->statements) {
|
|
|
|
|
Visitor::Visit(statement);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Namespaces, partitions -----------------
|
|
|
|
|
|
|
|
|
|
void FindSymbolsVisitor::Visit(Partition* node) {
|
|
|
|
|
// TODO
|
|
|
|
|
Visit(node->scope.get());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FindSymbolsVisitor::Visit(Namespace* node) {
|
2023-04-12 13:31:39 +03:00
|
|
|
std::optional<info::NamespaceInfo::Modifier> modifier;
|
|
|
|
|
if (node->modifier.has_value()) {
|
|
|
|
|
switch (node->modifier.value()) {
|
|
|
|
|
case interpreter::Namespace::Var:
|
|
|
|
|
modifier = info::NamespaceInfo::Var;
|
|
|
|
|
break;
|
|
|
|
|
case interpreter::Namespace::Const:
|
|
|
|
|
modifier = info::NamespaceInfo::Const;
|
|
|
|
|
break;
|
|
|
|
|
}
|
2023-04-07 12:13:31 +03:00
|
|
|
}
|
2023-04-12 13:31:39 +03:00
|
|
|
|
|
|
|
|
std::optional<std::string> name;
|
|
|
|
|
if (node->name.has_value()) {
|
|
|
|
|
name = node->name.value().name;
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-17 12:09:02 +03:00
|
|
|
namespace_visitor_.AddEnterNamespace(node->type, modifier, name);
|
2023-04-07 12:13:31 +03:00
|
|
|
Visit(node->scope.get());
|
2023-04-17 12:09:02 +03:00
|
|
|
namespace_visitor_.ExitNamespace();
|
2023-04-07 12:13:31 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Definitions -----------------
|
|
|
|
|
|
2023-04-17 18:56:58 +03:00
|
|
|
// TODO: add imported symbols to symbol table (global info)
|
2023-04-07 12:13:31 +03:00
|
|
|
void FindSymbolsVisitor::Visit(ImportStatement* node) {
|
2023-04-12 13:31:39 +03:00
|
|
|
is_in_statement = true;
|
|
|
|
|
|
2023-04-07 12:13:31 +03:00
|
|
|
info::ImportInfo info;
|
|
|
|
|
info.module_name = node->module_name;
|
2023-04-12 13:31:39 +03:00
|
|
|
info.symbols = node->symbols;
|
2023-04-17 12:09:02 +03:00
|
|
|
namespace_visitor_.AddImport(std::move(info), node->name);
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
is_in_statement = false;
|
2023-04-07 12:13:31 +03:00
|
|
|
}
|
|
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
void FindSymbolsVisitor::Visit(AliasDefinitionStatement* node) {
|
|
|
|
|
is_in_statement = true;
|
|
|
|
|
|
2023-04-07 12:13:31 +03:00
|
|
|
info::TypeInfo info;
|
|
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
info::AliasTypeInfo alias_info;
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
switch (node->modifier) {
|
|
|
|
|
case interpreter::AliasDefinitionStatement::Alias:
|
|
|
|
|
alias_info.modifier = info::AliasTypeInfo::Alias;
|
|
|
|
|
break;
|
|
|
|
|
case interpreter::AliasDefinitionStatement::Type:
|
|
|
|
|
alias_info.modifier = info::AliasTypeInfo::Type;
|
|
|
|
|
break;
|
|
|
|
|
case interpreter::AliasDefinitionStatement::Let:
|
|
|
|
|
alias_info.modifier = info::AliasTypeInfo::Let;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
alias_info.parameters = node->parameters;
|
2023-04-17 18:56:58 +03:00
|
|
|
node->parameter_graph_ids_.resize(node->parameters.size());
|
|
|
|
|
for (size_t i = 0; i < node->parameters.size(); ++i) {
|
|
|
|
|
node->parameter_graph_ids_[i] = namespace_visitor_.GetAbstractTypeGraph()->AddVertex();
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
alias_info.value.node = node->value.get();
|
2023-04-07 12:13:31 +03:00
|
|
|
|
|
|
|
|
info.type = std::move(alias_info);
|
|
|
|
|
|
2023-04-17 12:09:02 +03:00
|
|
|
node->type_id_ = namespace_visitor_.AddType(node->type, std::move(info));
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
is_in_statement = false;
|
|
|
|
|
}
|
2023-04-07 12:13:31 +03:00
|
|
|
|
|
|
|
|
void FindSymbolsVisitor::Visit(FunctionDeclaration* node) {
|
2023-04-12 13:31:39 +03:00
|
|
|
bool was_in_statement = is_in_statement;
|
|
|
|
|
is_in_statement = true;
|
|
|
|
|
|
2023-04-07 12:13:31 +03:00
|
|
|
info::FunctionDeclarationInfo info;
|
2023-04-12 13:31:39 +03:00
|
|
|
|
|
|
|
|
info.parameters.resize(node->parameters.size());
|
|
|
|
|
for (size_t i = 0; i < node->parameters.size(); ++i) {
|
|
|
|
|
Visit(node->parameters[i].get());
|
|
|
|
|
info.parameters[i] = std::move(std::any_cast<info::ParameterInfo>(current_info_));
|
2023-04-07 12:13:31 +03:00
|
|
|
current_info_.reset();
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
info.argument_types.resize(node->type->types.size());
|
|
|
|
|
for (size_t i = 0; i < node->type->types.size(); ++i) {
|
|
|
|
|
info.argument_type_nodes[i] = &node->type->types[i];
|
|
|
|
|
}
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-22 19:30:16 +03:00
|
|
|
info.node = node;
|
|
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
if (was_in_statement) {
|
|
|
|
|
current_info_ = std::move(info);
|
|
|
|
|
} else {
|
2023-04-27 14:02:37 +03:00
|
|
|
node->function_id_ = namespace_visitor_.AddFunctionDeclaration(node->name.name, std::move(info));
|
2023-04-12 13:31:39 +03:00
|
|
|
is_in_statement = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
void FindSymbolsVisitor::Visit(FunctionDefinitionStatement* node) {
|
|
|
|
|
is_in_statement = true;
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
info::FunctionDefinitionInfo info;
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
auto definition = node->definition.get();
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
info.parameters.resize(definition->parameters.size());
|
|
|
|
|
for (size_t i = 0; i < definition->parameters.size(); ++i) {
|
|
|
|
|
Visit(definition->parameters[i].get());
|
|
|
|
|
info.parameters[i] = std::move(std::any_cast<info::ParameterInfo>(current_info_));
|
|
|
|
|
current_info_.reset();
|
|
|
|
|
}
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
info.argument_names.resize(definition->arguments.size());
|
2023-04-17 18:56:58 +03:00
|
|
|
node->argument_graph_ids_.resize(definition->arguments.size());
|
2023-04-12 13:31:39 +03:00
|
|
|
for (size_t i = 0; i < definition->arguments.size(); ++i) {
|
|
|
|
|
info.argument_names[i] = definition->arguments[i].name;
|
2023-04-17 18:56:58 +03:00
|
|
|
node->argument_graph_ids_[i] = namespace_visitor_.GetAbstractTypeGraph()->AddVertex();
|
2023-04-12 13:31:39 +03:00
|
|
|
}
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-21 14:27:55 +03:00
|
|
|
node->return_type_graph_id_ = namespace_visitor_.GetAbstractTypeGraph()->AddVertex();
|
|
|
|
|
|
2023-04-22 19:30:16 +03:00
|
|
|
info.node = node;
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-27 14:02:37 +03:00
|
|
|
node->function_id_ = namespace_visitor_.AddFunctionDefinition(definition->name.name, std::move(info));
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
is_in_statement = false;
|
2023-04-07 12:13:31 +03:00
|
|
|
}
|
|
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
void FindSymbolsVisitor::Visit(TypeDefinitionStatement* node) {
|
|
|
|
|
is_in_statement = true;
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
info::TypeInfo info;
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
auto definition = node->definition.get();
|
2023-04-07 12:13:31 +03:00
|
|
|
|
|
|
|
|
info::AnyTypeInfo any_type_info;
|
|
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
Visit(definition->type.get());
|
|
|
|
|
any_type_info.type = std::move(std::any_cast<info::ParameterInfo>(current_info_));
|
2023-04-07 12:13:31 +03:00
|
|
|
current_info_.reset();
|
|
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
any_type_info.parameters.resize(definition->parameters.size());
|
|
|
|
|
for (size_t i = 0; i < definition->parameters.size(); ++i) {
|
|
|
|
|
Visit(definition->parameters[i].get());
|
|
|
|
|
any_type_info.parameters[i] = std::move(std::any_cast<info::ParameterInfo>(current_info_));
|
2023-04-07 12:13:31 +03:00
|
|
|
current_info_.reset();
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
any_type_info.value = &node->value;
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
std::string type = any_type_info.type.type;
|
2023-04-08 15:06:51 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
info.type = std::move(any_type_info);
|
2023-04-08 15:06:51 +03:00
|
|
|
|
2023-04-17 12:09:02 +03:00
|
|
|
node->type_id_ = namespace_visitor_.AddType(type, std::move(info));
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
is_in_statement = false;
|
2023-04-07 12:13:31 +03:00
|
|
|
}
|
|
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
void FindSymbolsVisitor::Visit(AbstractTypeDefinitionStatement* node) {
|
|
|
|
|
is_in_statement = true;
|
2023-04-08 15:06:51 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
info::TypeInfo info;
|
2023-04-08 15:06:51 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
info::AbstractTypeInfo abstract_type_info;
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
Visit(node->type.get());
|
|
|
|
|
abstract_type_info.type = std::move(std::any_cast<info::ParameterInfo>(current_info_));
|
|
|
|
|
current_info_.reset();
|
2023-04-08 15:06:51 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
switch (node->modifier) {
|
|
|
|
|
case interpreter::AbstractTypeDefinitionStatement::Basic:
|
|
|
|
|
abstract_type_info.modifier = info::AbstractTypeInfo::Basic;
|
|
|
|
|
break;
|
|
|
|
|
case interpreter::AbstractTypeDefinitionStatement::Abstract:
|
|
|
|
|
abstract_type_info.modifier = info::AbstractTypeInfo::Abstract;
|
|
|
|
|
break;
|
2023-04-07 12:13:31 +03:00
|
|
|
}
|
2023-04-08 15:06:51 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
std::string type = abstract_type_info.type.type;
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
info.type = std::move(abstract_type_info);
|
2023-04-08 15:06:51 +03:00
|
|
|
|
2023-04-17 18:56:58 +03:00
|
|
|
node->type_graph_id_ = namespace_visitor_.GetAbstractTypeGraph()->AddVertex(); // ??
|
2023-04-17 12:09:02 +03:00
|
|
|
node->type_id_ = namespace_visitor_.AddType(type, std::move(info));
|
2023-04-08 15:06:51 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
is_in_statement = false;
|
2023-04-07 12:13:31 +03:00
|
|
|
}
|
|
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
void FindSymbolsVisitor::Visit(TypeclassDefinitionStatement* node) {
|
|
|
|
|
is_in_statement = true;
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
info::TypeclassInfo info;
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
auto definition = node->definition.get();
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
info.parameters.resize(definition->parameters.size());
|
|
|
|
|
for (size_t i = 0; i < definition->parameters.size(); ++i) {
|
|
|
|
|
Visit(definition->parameters[i].get());
|
|
|
|
|
info.parameters[i] = std::move(std::any_cast<info::ParameterInfo>(current_info_));
|
2023-04-08 15:06:51 +03:00
|
|
|
current_info_.reset();
|
2023-04-07 12:13:31 +03:00
|
|
|
}
|
2023-04-08 15:06:51 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
info.requirements.reserve(node->requirements.size());
|
|
|
|
|
for (size_t i = 0; i < node->requirements.size(); ++i) {
|
|
|
|
|
Visit(node->requirements[i].get());
|
|
|
|
|
info.requirements[i] = std::move(std::any_cast<info::FunctionDeclarationInfo>(current_info_));
|
|
|
|
|
current_info_.reset();
|
2023-04-07 12:13:31 +03:00
|
|
|
}
|
2023-04-08 15:06:51 +03:00
|
|
|
|
2023-04-17 12:09:02 +03:00
|
|
|
node->typeclass_id_ = namespace_visitor_.AddTypeclass(definition->type.get()->type, std::move(info));
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
is_in_statement = false;
|
2023-04-07 12:13:31 +03:00
|
|
|
}
|
|
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
// Definition parts
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
void FindSymbolsVisitor::Visit(AnyAnnotatedType* node) {
|
|
|
|
|
info::ParameterInfo info;
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
info.type = node->type;
|
2023-04-07 12:13:31 +03:00
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
info.typeclass_nodes.resize(node->typeclasses.size());
|
|
|
|
|
for (size_t i = 0; i < node->typeclasses.size(); ++i) {
|
2023-04-27 14:02:37 +03:00
|
|
|
info.typeclass_nodes[i] = node->typeclasses[i].get();
|
2023-04-07 12:13:31 +03:00
|
|
|
}
|
|
|
|
|
|
2023-04-17 18:56:58 +03:00
|
|
|
node->type_graph_id_ = namespace_visitor_.GetAbstractTypeGraph()->AddVertex();
|
|
|
|
|
|
2023-04-12 13:31:39 +03:00
|
|
|
current_info_ = std::move(info);
|
2023-04-07 12:13:31 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace interpreter
|