part of find_symbols_visitor done

This commit is contained in:
ProgramSnail 2023-04-07 12:13:31 +03:00
parent f88a23194f
commit 18e85f794f
6 changed files with 827 additions and 57 deletions

View file

@ -24,7 +24,7 @@ void BuildVisitor::Visit(SourceFile* node) {
Visit(std::get<SourceStatement>(node->statements[i]));
} else if (current_node_type == parser::tokens::Partition) {
node->statements[i].emplace<Partition>();
Visit(&std::get<Partition>(node->statements[i]));
Visit(&std::get<Partition>(node->statements[i]) );
}
}
@ -1174,27 +1174,27 @@ void BuildVisitor::Visit(AnyName& node) {
// Type
void BuildVisitor::Visit(TypeConstructor* node) {
auto parse_node = current_node_;
current_node_ = parse_node.ChildByFieldName("type");
node->type = std::make_unique<ParametrizedType>();
Visit(node->type.get());
size_t parameter_count = (parse_node.NamedChildCount() - 1) / 2;
node->parameters.resize(parameter_count);
for (size_t i = 0; i < parameter_count * 2; ++i) {
current_node_ = parse_node.NthNamedChild(i + 1);
if (i % 2 == 0) {
node->parameters[i / 2].first = current_node_.GetValue();
} else {
Visit(node->parameters[i / 2].second);
}
}
current_node_ = parse_node;
// auto parse_node = current_node_;
//
// current_node_ = parse_node.ChildByFieldName("type");
// node->type = std::make_unique<ParametrizedType>();
// Visit(node->type.get());
//
// size_t parameter_count = (parse_node.NamedChildCount() - 1) / 2;
//
// node->parameters.resize(parameter_count);
//
// for (size_t i = 0; i < parameter_count * 2; ++i) {
// current_node_ = parse_node.NthNamedChild(i + 1);
//
// if (i % 2 == 0) {
// node->parameters[i / 2].first = current_node_.GetValue();
// } else {
// Visit(node->parameters[i / 2].second);
// }
// }
//
// current_node_ = parse_node;
}
void BuildVisitor::Visit(TupleType* node) {
@ -1538,8 +1538,8 @@ void BuildVisitor::Visit(NameSubSuperExpression& node) {
std::string current_node_type = current_node_.GetType();
if (current_node_type == parser::tokens::NameIdentifier) { // optimize ??
// TODO: choose : node = std::make_unique<NameIdentifier>(current_node_.GetValue());
Visit(std::get<std::unique_ptr<NameIdentifier>>(node).get());
node = std::make_unique<NameIdentifier>(current_node_.GetValue());
//Visit(std::get<std::unique_ptr<NameIdentifier>>(node).get());
} else if (current_node_type == parser::tokens::Literal) {
node = std::make_unique<Literal>();
Visit(*std::get<std::unique_ptr<Literal>>(node));