access syntax changed, sync with grammar, type_chack_visitor in progress

This commit is contained in:
ProgramSnail 2023-04-21 14:27:55 +03:00
parent 3d74b1383e
commit 6fc91aafa0
19 changed files with 110221 additions and 102967 deletions

View file

@ -606,6 +606,12 @@ void BuildVisitor::Visit(SubExpressionToken& node) {
} else if (current_node_type == parser::tokens::ScopedStatement) {
node = std::make_unique<ScopedStatement>();
Visit(std::get<std::unique_ptr<ScopedStatement>>(node).get());
} if (current_node_type == parser::tokens::AccessExpression) {
node = std::make_unique<AccessExpression>();
Visit(std::get<std::unique_ptr<AccessExpression>>(node).get());
} else if (current_node_type == parser::tokens::Literal) {
node = std::make_unique<Literal>();
Visit(*std::get<std::unique_ptr<Literal>>(node));
} else {
// error
}
@ -766,9 +772,9 @@ void BuildVisitor::Visit(ReferenceExpression* node) {
for (size_t i = 0; i + 1 < child_count; ++i) {
std::string reference = parse_node.NthChild(i).GetValue();
if (reference == "~") {
node->references[i] = ReferenceType::Reference;
node->references[i] = utils::ReferenceType::Reference;
} else if (reference == "@") {
node->references[i] = ReferenceType::UniqueReference;
node->references[i] = utils::ReferenceType::UniqueReference;
}
}
}
@ -780,6 +786,18 @@ void BuildVisitor::Visit(ReferenceExpression* node) {
current_node_ = parse_node;
}
void BuildVisitor::Visit(AccessExpression* node) {
auto parse_node = current_node_;
current_node_ = parse_node.ChildByFieldName("name");
Visit(node->name.get());
current_node_ = parse_node.ChildByFieldName("id");
Visit(node->id);
current_node_ = parse_node;
}
// Other expressions
void BuildVisitor::Visit(FunctionArgument& node) {
@ -964,25 +982,8 @@ void BuildVisitor::Visit(NameExpression* node) {
current_node_ = parse_node.NthNamedChild(i);
std::string current_node_type = current_node_.GetType();
if (current_node_type != parser::tokens::TypeSubExpression && !namespaces_ended) {
if (current_node_type != parser::tokens::TypeSubExpression) {
namespaces_ended = true;
if (i + 1 == child_count) {
node->expressions.emplace_back();
if (current_node_type == parser::tokens::ExtendedName) {
node->expressions.back() = std::make_unique<ExtendedName>();
Visit(node->expressions.back());
} else if (current_node_type == parser::tokens::Literal) {
node->expressions.back() = std::make_unique<Literal>();
Visit(*std::get<std::unique_ptr<Literal>>(node->expressions.back()));
} else {
// error
}
break;
} else {
// error
}
}
if (!namespaces_ended) {
@ -990,7 +991,7 @@ void BuildVisitor::Visit(NameExpression* node) {
Visit(node->namespaces.back());
} else {
node->expressions.emplace_back();
Visit(node->expressions.back());
Visit(&node->expressions.back());
}
}
@ -1249,9 +1250,9 @@ void BuildVisitor::Visit(ExtendedScopedAnyType* node) {
for (size_t i = 0; i + 1 < child_count; ++i) {
std::string reference = parse_node.NthChild(i).GetValue();
if (reference == "~") {
node->references[i] = ReferenceType::Reference;
node->references[i] = utils::ReferenceType::Reference;
} else if (reference == "@") {
node->references[i] = ReferenceType::UniqueReference;
node->references[i] = utils::ReferenceType::UniqueReference;
}
}
}
@ -1428,27 +1429,4 @@ void BuildVisitor::Visit(Literal& node) {
current_node_ = parse_node;
}
void BuildVisitor::Visit(NameSubExpression& node) {
auto parse_node = current_node_;
current_node_ = parse_node.NthNamedChild(0);
std::string current_node_type = current_node_.GetType();
if (current_node_type == parser::tokens::ExtendedName) {
node = std::make_unique<ExtendedName>();
Visit(std::get<std::unique_ptr<ExtendedName>>(node).get());
} else if (current_node_type == parser::tokens::Literal) {
node = std::make_unique<Literal>();
Visit(*std::get<std::unique_ptr<Literal>>(node));
} else if (current_node_type == parser::tokens::SuperExpression) {
node = std::make_unique<SuperExpression>();
Visit(*std::get<std::unique_ptr<SuperExpression>>(node));
} else {
// error
}
current_node_ = parse_node;
}
} // namespace interpreter