mirror of
https://codeberg.org/ProgramSnail/lang_2023.git
synced 2025-12-09 00:18:44 +00:00
fixes, build_visitor TupleType and VariantType fix
This commit is contained in:
parent
692f7ea3ec
commit
b723fd6a65
12 changed files with 321 additions and 241 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue