1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 06:58:11 +00:00

LibCpp: Parse 'using namespace' declarations

This gets us a little bit closer to a fully capable C++ parser.
This commit is contained in:
Poseydon42 2023-01-26 23:17:57 +00:00 committed by Jelle Raaijmakers
parent 2896d7796d
commit 3cd04f40e1
6 changed files with 64 additions and 0 deletions

View file

@ -91,6 +91,8 @@ NonnullRefPtr<Declaration> Parser::parse_declaration(ASTNode& parent, Declaratio
return parse_constructor(parent);
case DeclarationType::Destructor:
return parse_destructor(parent);
case DeclarationType::UsingNamespace:
return parse_using_namespace_declaration(parent);
default:
error("unexpected declaration type"sv);
return create_ast_node<InvalidDeclaration>(parent, position(), position());
@ -624,6 +626,8 @@ Optional<Parser::DeclarationType> Parser::match_declaration_in_translation_unit(
return DeclarationType::Namespace;
if (match_variable_declaration())
return DeclarationType::Variable;
if (match_using_namespace_declaration())
return DeclarationType::UsingNamespace;
return {};
}
@ -1703,4 +1707,37 @@ NonnullRefPtr<Destructor> Parser::parse_destructor(ASTNode& parent)
return ctor;
}
bool Parser::match_using_namespace_declaration()
{
save_state();
ScopeGuard state_guard = [this] { load_state(); };
if (!match_keyword("using"))
return false;
consume();
if (!match_keyword("namespace"))
return false;
consume();
return true;
}
NonnullRefPtr<UsingNamespaceDeclaration> Parser::parse_using_namespace_declaration(ASTNode& parent)
{
auto decl = create_ast_node<UsingNamespaceDeclaration>(parent, position(), {});
consume_keyword("using");
consume_keyword("namespace");
auto name = parse_name(*decl);
decl->set_end(position());
consume(Token::Type::Semicolon);
decl->set_name(name);
return decl;
}
}