Procházet zdrojové kódy

LibCpp: Parse empty for loops

Itamar před 4 roky
rodič
revize
d482b3fd60

+ 5 - 2
Userland/Libraries/LibCpp/AST.cpp

@@ -394,8 +394,11 @@ NonnullRefPtrVector<Declaration> Statement::declarations() const
 
 
 NonnullRefPtrVector<Declaration> ForStatement::declarations() const
 NonnullRefPtrVector<Declaration> ForStatement::declarations() const
 {
 {
-    auto declarations = m_init->declarations();
-    declarations.append(m_body->declarations());
+    NonnullRefPtrVector<Declaration> declarations;
+    if (m_init)
+        declarations.append(m_init->declarations());
+    if (m_body)
+        declarations.append(m_body->declarations());
     return declarations;
     return declarations;
 }
 }
 
 

+ 10 - 3
Userland/Libraries/LibCpp/Parser.cpp

@@ -1204,13 +1204,20 @@ NonnullRefPtr<ForStatement> Parser::parse_for_statement(ASTNode& parent)
     auto for_statement = create_ast_node<ForStatement>(parent, position(), {});
     auto for_statement = create_ast_node<ForStatement>(parent, position(), {});
     consume(Token::Type::Keyword);
     consume(Token::Type::Keyword);
     consume(Token::Type::LeftParen);
     consume(Token::Type::LeftParen);
-    for_statement->m_init = parse_variable_declaration(*for_statement);
+    if (peek().type() != Token::Type::Semicolon)
+        for_statement->m_init = parse_variable_declaration(*for_statement, false);
     consume(Token::Type::Semicolon);
     consume(Token::Type::Semicolon);
-    for_statement->m_test = parse_expression(*for_statement);
+
+    if (peek().type() != Token::Type::Semicolon)
+        for_statement->m_test = parse_expression(*for_statement);
     consume(Token::Type::Semicolon);
     consume(Token::Type::Semicolon);
-    for_statement->m_update = parse_expression(*for_statement);
+
+    if (peek().type() != Token::Type::RightParen)
+        for_statement->m_update = parse_expression(*for_statement);
     consume(Token::Type::RightParen);
     consume(Token::Type::RightParen);
+
     for_statement->m_body = parse_statement(*for_statement);
     for_statement->m_body = parse_statement(*for_statement);
+
     for_statement->set_end(for_statement->m_body->end());
     for_statement->set_end(for_statement->m_body->end());
     return for_statement;
     return for_statement;
 }
 }