mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 14:18:12 +00:00
LibCpp: Differentiate between Type and NamedType
This adds a new ASTNode type called 'NamedType' which inherits from the Type node. Previously every Type node had a name field, but it was not logically accurate. For example, pointer types do not have a name (the pointed-to type may have one).
This commit is contained in:
parent
10cad8a874
commit
d7aa831a43
5 changed files with 55 additions and 29 deletions
|
@ -229,6 +229,11 @@ NonnullRefPtr<BlockStatement> Parser::parse_block_statement(ASTNode& parent)
|
|||
}
|
||||
|
||||
bool Parser::match_type()
|
||||
{
|
||||
return match_named_type();
|
||||
}
|
||||
|
||||
bool Parser::match_named_type()
|
||||
{
|
||||
save_state();
|
||||
ScopeGuard state_guard = [this] { load_state(); };
|
||||
|
@ -258,7 +263,7 @@ bool Parser::match_template_arguments()
|
|||
consume();
|
||||
|
||||
while (!eof() && peek().type() != Token::Type::Greater) {
|
||||
if (!match_type())
|
||||
if (!match_named_type())
|
||||
return false;
|
||||
parse_type(get_dummy_node());
|
||||
}
|
||||
|
@ -1148,35 +1153,38 @@ bool Parser::match_boolean_literal()
|
|||
|
||||
NonnullRefPtr<Type> Parser::parse_type(ASTNode& parent)
|
||||
{
|
||||
ScopeLogger<CPP_DEBUG> logger;
|
||||
LOG_SCOPE();
|
||||
|
||||
if (!match_type()) {
|
||||
if (!match_named_type()) {
|
||||
error("expected named named_type");
|
||||
auto token = consume();
|
||||
return create_ast_node<Type>(parent, token.start(), token.end());
|
||||
return create_ast_node<NamedType>(parent, token.start(), token.end());
|
||||
}
|
||||
|
||||
auto type = create_ast_node<Type>(parent, position(), {});
|
||||
auto named_type = create_ast_node<NamedType>(parent, position(), {});
|
||||
|
||||
auto qualifiers = parse_type_qualifiers();
|
||||
type->m_qualifiers = move(qualifiers);
|
||||
named_type->m_qualifiers = move(qualifiers);
|
||||
|
||||
if (match_keyword("auto")) {
|
||||
consume(Token::Type::Keyword);
|
||||
type->m_is_auto = true;
|
||||
} else {
|
||||
|
||||
if (match_keyword("struct")) {
|
||||
consume(Token::Type::Keyword); // Consume struct prefix
|
||||
}
|
||||
|
||||
if (!match_name()) {
|
||||
type->set_end(position());
|
||||
error(String::formatted("expected name instead of: {}", peek().text()));
|
||||
return type;
|
||||
}
|
||||
type->m_name = parse_name(*type);
|
||||
named_type->m_is_auto = true;
|
||||
named_type->set_end(position());
|
||||
return named_type;
|
||||
}
|
||||
|
||||
if (match_keyword("struct")) {
|
||||
consume(Token::Type::Keyword); // Consume struct prefix
|
||||
}
|
||||
|
||||
if (!match_name()) {
|
||||
named_type->set_end(position());
|
||||
error(String::formatted("expected name instead of: {}", peek().text()));
|
||||
return named_type;
|
||||
}
|
||||
named_type->m_name = parse_name(*named_type);
|
||||
|
||||
NonnullRefPtr<Type> type = named_type;
|
||||
while (!eof() && peek().type() == Token::Type::Asterisk) {
|
||||
type->set_end(position());
|
||||
auto asterisk = consume();
|
||||
|
@ -1184,7 +1192,7 @@ NonnullRefPtr<Type> Parser::parse_type(ASTNode& parent)
|
|||
type->set_parent(*ptr);
|
||||
ptr->m_pointee = type;
|
||||
ptr->set_end(position());
|
||||
return ptr;
|
||||
type = ptr;
|
||||
}
|
||||
|
||||
type->set_end(position());
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue