diff --git a/Userland/Libraries/LibCpp/Parser.cpp b/Userland/Libraries/LibCpp/Parser.cpp index 3155d20b31..2ddf77e55a 100644 --- a/Userland/Libraries/LibCpp/Parser.cpp +++ b/Userland/Libraries/LibCpp/Parser.cpp @@ -851,6 +851,7 @@ Optional Parser::peek(Token::Type type) const void Parser::save_state() { m_saved_states.append(m_state); + m_state.state_nodes.clear(); } void Parser::load_state() @@ -897,7 +898,7 @@ void Parser::error(StringView message) if (!m_saved_states.is_empty()) return; - + if (message.is_null() || message.is_empty()) message = ""; String formatted_message; @@ -941,23 +942,19 @@ Position Parser::position() const return peek().start(); } -RefPtr Parser::eof_node() const -{ - VERIFY(m_tokens.size()); - return node_at(m_tokens.last().end()); -} - RefPtr Parser::node_at(Position pos) const { + VERIFY(m_saved_states.is_empty()); auto index = index_of_node_at(pos); if (!index.has_value()) return nullptr; - return m_state.nodes[index.value()]; + return m_nodes[index.value()]; } Optional Parser::index_of_node_at(Position pos) const { VERIFY(!m_tokens.is_empty()); + VERIFY(m_saved_states.is_empty()); Optional match_node_index; auto node_span = [](const ASTNode& node) { @@ -966,12 +963,12 @@ Optional Parser::index_of_node_at(Position pos) const return Position { node.end().line - node.start().line, node.start().line != node.end().line ? 0 : node.end().column - node.start().column }; }; - for (size_t node_index = 0; node_index < m_state.nodes.size(); ++node_index) { - auto& node = m_state.nodes[node_index]; + for (size_t node_index = 0; node_index < m_nodes.size(); ++node_index) { + auto& node = m_nodes[node_index]; if (node.start() > pos || node.end() < pos) continue; - if (!match_node_index.has_value() || (node_span(node) <= node_span(m_state.nodes[match_node_index.value()]))) + if (!match_node_index.has_value() || (node_span(node) <= node_span(m_nodes[match_node_index.value()]))) match_node_index = node_index; } return match_node_index; diff --git a/Userland/Libraries/LibCpp/Parser.h b/Userland/Libraries/LibCpp/Parser.h index b2a5721db5..76d80bdd7b 100644 --- a/Userland/Libraries/LibCpp/Parser.h +++ b/Userland/Libraries/LibCpp/Parser.h @@ -24,7 +24,6 @@ public: NonnullRefPtr parse(); bool eof() const; - RefPtr eof_node() const; RefPtr node_at(Position) const; Optional index_of_node_at(Position) const; Optional token_at(Position) const; @@ -147,7 +146,7 @@ private: struct State { size_t token_index { 0 }; - NonnullRefPtrVector nodes; + NonnullRefPtrVector state_nodes; }; void error(StringView message = {}); @@ -157,9 +156,13 @@ private: create_ast_node(ASTNode& parent, const Position& start, Optional end, Args&&... args) { auto node = adopt_ref(*new T(&parent, start, end, m_filename, forward(args)...)); - if (!parent.is_dummy_node()) { - m_state.nodes.append(node); + + if (m_saved_states.is_empty()) { + m_nodes.append(node); + } else { + m_state.state_nodes.append(node); } + return node; } @@ -167,7 +170,7 @@ private: create_root_ast_node(const Position& start, Position end) { auto node = adopt_ref(*new TranslationUnit(nullptr, start, end, m_filename)); - m_state.nodes.append(node); + m_nodes.append(node); m_root_node = node; return node; } @@ -200,6 +203,7 @@ private: Vector m_saved_states; RefPtr m_root_node; Vector m_errors; + NonnullRefPtrVector m_nodes; Vector m_replaced_preprocessor_tokens; };