fixes, build_visitor TupleType and VariantType fix

This commit is contained in:
ProgramSnail 2023-05-17 17:57:56 +03:00
parent 692f7ea3ec
commit b723fd6a65
12 changed files with 321 additions and 241 deletions

View file

@ -1292,32 +1292,32 @@ void BuildVisitor::Visit(TupleType* node) {
auto parse_node = current_node_;
size_t current_node_n = 0;
size_t current_child = 0;
current_node_ = parse_node.NthNamedChild(current_node_n);
current_node_ = parse_node.NthNamedChild(current_child);
if (current_node_.GetType() == parser::tokens::Constructor) {
if (parse_node.NthChild(0).GetValue() != "&") {
node->type = current_node_.GetValue();
++current_node_n;
current_node_ = parse_node.NthNamedChild(current_node_n);
++current_child;
current_node_ = parse_node.NthNamedChild(current_child);
}
while (current_node_n < parse_node.NamedChildCount()) {
while (current_child < parse_node.NamedChildCount()) {
node->entities.emplace_back();
if (current_node_.GetType() == parser::tokens::NameIdentifier) {
node->entities.back().first = current_node_.GetValue();
++current_node_n;
current_node_ = parse_node.NthNamedChild(current_node_n);
++current_child;
current_node_ = parse_node.NthNamedChild(current_child);
}
node->entities.back().second = std::make_unique<ExtendedScopedAnyType>();
Visit(node->entities.back().second.get());
++current_node_n;
current_node_ = parse_node.NthNamedChild(current_node_n);
++current_child;
current_node_ = parse_node.NthNamedChild(current_child);
}
current_node_ = parse_node;
@ -1328,33 +1328,31 @@ void BuildVisitor::Visit(VariantType* node) {
auto parse_node = current_node_;
size_t current_node_n = 0;
size_t excluded_child_count = 0;
current_node_ = parse_node.NthNamedChild(current_node_n);
size_t child_count = parse_node.NamedChildCount();
if (current_node_.GetType() == parser::tokens::Constructor) {
node->type = current_node_.GetValue();
if (parse_node.NthChild(0).GetValue() != "|") {
node->type = parse_node.NthNamedChild(0).GetValue();
++current_node_n;
current_node_ = parse_node.NthNamedChild(current_node_n);
++excluded_child_count;
}
while (current_node_n < parse_node.NamedChildCount()) {
node->constructors.resize(child_count - excluded_child_count);
for (size_t i = 0; i < node->constructors.size(); ++i) {
current_node_ = parse_node.NthNamedChild(i + excluded_child_count);
std::string current_node_type = current_node_.GetType();
node->constructors.emplace_back();
if (current_node_type == parser::tokens::Constructor) {
node->constructors.back() = current_node_.GetValue();
node->constructors[i] = current_node_.GetValue();
} else if (current_node_type == parser::tokens::TupleType) {
node->constructors.back() = std::make_unique<TupleType>();
Visit(std::get<std::unique_ptr<TupleType>>(node->constructors.back()).get());
node->constructors[i] = std::make_unique<TupleType>();
Visit(std::get<std::unique_ptr<TupleType>>(node->constructors[i]).get());
} else {
// error
}
++current_node_n;
current_node_ = parse_node.NthNamedChild(current_node_n);
}
current_node_ = parse_node;