find_symbols_visitor, global_info fixed

This commit is contained in:
ProgramSnail 2023-04-29 18:42:30 +03:00
parent 4d0b527416
commit a512a92f92
9 changed files with 289 additions and 277 deletions

View file

@ -6,51 +6,29 @@
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());
// TODO: separate partitions
Visitor::Visit(&node->scope);
}
void FindSymbolsVisitor::Visit(Namespace* node) {
std::optional<info::NamespaceInfo::Modifier> modifier;
std::optional<info::definition::Namespace::Modifier> modifier;
if (node->modifier.has_value()) {
switch (node->modifier.value()) {
case interpreter::Namespace::Var:
modifier = info::NamespaceInfo::Var;
modifier = info::definition::Namespace::Var;
break;
case interpreter::Namespace::Const:
modifier = info::NamespaceInfo::Const;
modifier = info::definition::Namespace::Const;
break;
}
}
std::optional<std::string> name;
if (node->name.has_value()) {
name = node->name.value().name;
}
namespace_visitor_.AddEnterNamespace(node->type, modifier, name);
Visit(node->scope.get());
namespace_visitor_.AddEnterNamespace(node->type, modifier);
Visitor::Visit(&node->scope);
namespace_visitor_.ExitNamespace();
}
@ -60,7 +38,7 @@ void FindSymbolsVisitor::Visit(Namespace* node) {
void FindSymbolsVisitor::Visit(ImportStatement* node) {
is_in_statement = true;
info::ImportInfo info;
info::definition::Import info;
info.module_name = node->module_name;
info.symbols = node->symbols;
namespace_visitor_.AddImport(std::move(info), node->name);
@ -71,28 +49,27 @@ void FindSymbolsVisitor::Visit(ImportStatement* node) {
void FindSymbolsVisitor::Visit(AliasDefinitionStatement* node) {
is_in_statement = true;
info::TypeInfo info;
info::definition::Type info;
info::AliasTypeInfo alias_info;
info::definition::AliasType alias_info;
switch (node->modifier) {
case interpreter::AliasDefinitionStatement::Alias:
alias_info.modifier = info::AliasTypeInfo::Alias;
alias_info.modifier = info::definition::AliasType::Alias;
break;
case interpreter::AliasDefinitionStatement::Type:
alias_info.modifier = info::AliasTypeInfo::Type;
alias_info.modifier = info::definition::AliasType::Type;
break;
case interpreter::AliasDefinitionStatement::Let:
alias_info.modifier = info::AliasTypeInfo::Let;
alias_info.modifier = info::definition::AliasType::Let;
break;
}
alias_info.parameters = node->parameters;
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();
}
// TODO: deduce parameter requirements
alias_info.parameters = node->parameters;
alias_info.value.node = node->value.get();
alias_info.node = node;
info.type = std::move(alias_info);
@ -105,18 +82,18 @@ void FindSymbolsVisitor::Visit(FunctionDeclaration* node) {
bool was_in_statement = is_in_statement;
is_in_statement = true;
info::FunctionDeclarationInfo info;
info::definition::FunctionDeclaration info;
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_));
info.parameters[i] = std::move(std::any_cast<info::definition::Parameter>(current_info_));
current_info_.reset();
}
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];
info.argument_types[i] = &node->type->types[i];
}
info.node = node;
@ -132,26 +109,15 @@ void FindSymbolsVisitor::Visit(FunctionDeclaration* node) {
void FindSymbolsVisitor::Visit(FunctionDefinitionStatement* node) {
is_in_statement = true;
info::FunctionDefinitionInfo info;
info::definition::FunctionDefinition info;
auto definition = node->definition.get();
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();
}
info.argument_names.resize(definition->arguments.size());
node->argument_graph_ids_.resize(definition->arguments.size());
for (size_t i = 0; i < definition->arguments.size(); ++i) {
info.argument_names[i] = definition->arguments[i].name;
node->argument_graph_ids_[i] = namespace_visitor_.GetAbstractTypeGraph()->AddVertex();
}
node->return_type_graph_id_ = namespace_visitor_.GetAbstractTypeGraph()->AddVertex();
info.node = node;
node->function_id_ = namespace_visitor_.AddFunctionDefinition(definition->name.name, std::move(info));
@ -162,20 +128,20 @@ void FindSymbolsVisitor::Visit(FunctionDefinitionStatement* node) {
void FindSymbolsVisitor::Visit(TypeDefinitionStatement* node) {
is_in_statement = true;
info::TypeInfo info;
info::definition::Type info;
auto definition = node->definition.get();
info::AnyTypeInfo any_type_info;
info::definition::AnyType any_type_info;
Visit(definition->type.get());
any_type_info.type = std::move(std::any_cast<info::ParameterInfo>(current_info_));
any_type_info.type = std::move(std::any_cast<info::definition::Parameter>(current_info_));
current_info_.reset();
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_));
any_type_info.parameters[i] = std::move(std::any_cast<info::definition::Parameter>(current_info_));
current_info_.reset();
}
@ -193,20 +159,20 @@ void FindSymbolsVisitor::Visit(TypeDefinitionStatement* node) {
void FindSymbolsVisitor::Visit(AbstractTypeDefinitionStatement* node) {
is_in_statement = true;
info::TypeInfo info;
info::definition::Type info;
info::AbstractTypeInfo abstract_type_info;
info::definition::AbstractType abstract_type_info;
Visit(node->type.get());
abstract_type_info.type = std::move(std::any_cast<info::ParameterInfo>(current_info_));
abstract_type_info.type = std::move(std::any_cast<info::definition::Parameter>(current_info_));
current_info_.reset();
switch (node->modifier) {
case interpreter::AbstractTypeDefinitionStatement::Basic:
abstract_type_info.modifier = info::AbstractTypeInfo::Basic;
abstract_type_info.modifier = info::definition::AbstractType::Basic;
break;
case interpreter::AbstractTypeDefinitionStatement::Abstract:
abstract_type_info.modifier = info::AbstractTypeInfo::Abstract;
abstract_type_info.modifier = info::definition::AbstractType::Abstract;
break;
}
@ -214,7 +180,6 @@ void FindSymbolsVisitor::Visit(AbstractTypeDefinitionStatement* node) {
info.type = std::move(abstract_type_info);
node->type_graph_id_ = namespace_visitor_.GetAbstractTypeGraph()->AddVertex(); // ??
node->type_id_ = namespace_visitor_.AddType(type, std::move(info));
is_in_statement = false;
@ -223,21 +188,21 @@ void FindSymbolsVisitor::Visit(AbstractTypeDefinitionStatement* node) {
void FindSymbolsVisitor::Visit(TypeclassDefinitionStatement* node) {
is_in_statement = true;
info::TypeclassInfo info;
info::definition::Typeclass info;
auto definition = node->definition.get();
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_));
info.parameters[i] = std::move(std::any_cast<info::definition::Parameter>(current_info_));
current_info_.reset();
}
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_));
info.requirements[i] = std::move(std::any_cast<info::definition::FunctionDeclaration>(current_info_));
current_info_.reset();
}
@ -249,7 +214,7 @@ void FindSymbolsVisitor::Visit(TypeclassDefinitionStatement* node) {
// Definition parts
void FindSymbolsVisitor::Visit(AnyAnnotatedType* node) {
info::ParameterInfo info;
info::definition::Parameter info;
info.type = node->type;
@ -258,8 +223,6 @@ void FindSymbolsVisitor::Visit(AnyAnnotatedType* node) {
info.typeclass_nodes[i] = node->typeclasses[i].get();
}
node->type_graph_id_ = namespace_visitor_.GetAbstractTypeGraph()->AddVertex();
current_info_ = std::move(info);
}