optional variable deffinition added, annotations removed

This commit is contained in:
ProgramSnail 2023-06-08 19:22:56 +03:00
parent 7ce8513ad0
commit de7c1e062f
20 changed files with 178 additions and 57 deletions

View file

@ -1202,6 +1202,17 @@ void BuildVisitor::Visit(NameExpression* node) {
current_node_ = parse_node;
}
void BuildVisitor::Visit(OptionalName* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
current_node_ = parse_node.ChildByFieldName("name");
Visit(node->name);
current_node_ = parse_node;
}
void BuildVisitor::Visit(TupleName* node) {
SetPosition(node->base, current_node_);
@ -1213,7 +1224,7 @@ void BuildVisitor::Visit(TupleName* node) {
for (size_t i = 0; i < names_count; ++i) {
current_node_ = parse_node.NthNamedChild(i);
node->names[i] = std::make_unique<AnnotatedName>();
node->names[i] = std::make_unique<Name>();
Visit(node->names[i]);
}
@ -1231,27 +1242,21 @@ void BuildVisitor::Visit(VariantName* node) {
for (size_t i = 0; i < names_count; ++i) {
current_node_ = parse_node.NthNamedChild(i);
node->names[i] =std::make_unique<AnnotatedName>();
node->names[i] =std::make_unique<Name>();
Visit(node->names[i]);
}
current_node_ = parse_node;
}
void BuildVisitor::Visit(AnnotatedName* node) {
void BuildVisitor::Visit(Name* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
node->name = parse_node.ChildByFieldName("name").GetValue();
if (parse_node.NamedChildCount() > 1) {
current_node_ = parse_node.ChildByFieldName("type");
node->type.emplace();
Visit(node->type.value());
current_node_ = parse_node;
}
current_node_ = parse_node;
}
void BuildVisitor::Visit(AnyName& node) {
@ -1261,9 +1266,12 @@ void BuildVisitor::Visit(AnyName& node) {
std::string current_node_type = current_node_.GetType();
if (current_node_type == parser::tokens::AnnotatedName) {
node = std::make_unique<AnnotatedName>();
Visit(std::get<std::unique_ptr<AnnotatedName>>(node).get());
if (current_node_type == parser::tokens::Name) {
node = std::make_unique<Name>();
Visit(std::get<std::unique_ptr<Name>>(node).get());
} else if (current_node_type == parser::tokens::OptionalName) {
node = std::make_unique<OptionalName>();
Visit(std::get<std::unique_ptr<OptionalName>>(node).get());
} else if (current_node_type == parser::tokens::TupleName) {
node = std::make_unique<TupleName>();
Visit(std::get<std::unique_ptr<TupleName>>(node).get());