diff --git a/Userland/DevTools/HackStudio/LanguageServers/Cpp/ParserAutoComplete.cpp b/Userland/DevTools/HackStudio/LanguageServers/Cpp/ParserAutoComplete.cpp index 3a26a3946c..5c6d9464fa 100644 --- a/Userland/DevTools/HackStudio/LanguageServers/Cpp/ParserAutoComplete.cpp +++ b/Userland/DevTools/HackStudio/LanguageServers/Cpp/ParserAutoComplete.cpp @@ -109,22 +109,29 @@ Vector ParserAutoComplete::get_suggestions(con return {}; } - if (!node->is_identifier()) { - if (is_empty_property(document, *node, position)) { - ASSERT(node->is_member_expression()); - return autocomplete_property(document, (MemberExpression&)(*node), ""); + if (node->is_identifier()) { + if (is_property(*node)) { + return autocomplete_property(document, (MemberExpression&)(*node->parent()), document.parser.text_of_node(*node)); } - return {}; + + return autocomplete_name(document, *node, document.parser.text_of_node(*node)); } - if (is_property(*node)) { - return autocomplete_property(document, (MemberExpression&)(*node->parent()), document.parser.text_of_node(*node)); + if (is_empty_property(document, *node, position)) { + ASSERT(node->is_member_expression()); + return autocomplete_property(document, (MemberExpression&)(*node), ""); } - return autocomplete_identifier(document, *node); + String partial_text = String::empty(); + auto containing_token = document.parser.token_at(position); + if (containing_token.has_value()) { + partial_text = document.parser.text_of_token(containing_token.value()); + } + + return autocomplete_name(document, *node, partial_text.view()); } -Vector ParserAutoComplete::autocomplete_identifier(const DocumentData& document, const ASTNode& node) const +Vector ParserAutoComplete::autocomplete_name(const DocumentData& document, const ASTNode& node, const StringView& partial_text) const { const Cpp::ASTNode* current = &node; NonnullRefPtrVector available_declarations; @@ -132,6 +139,9 @@ Vector ParserAutoComplete::autocomplete_identi available_declarations.append(current->declarations()); current = current->parent(); } + + available_declarations.append(get_declarations_in_outer_scope_including_headers(document)); + Vector available_names; auto add_name = [&available_names](auto& name) { if (name.is_null() || name.is_empty()) @@ -151,7 +161,6 @@ Vector ParserAutoComplete::autocomplete_identi } } - auto partial_text = document.parser.text_of_node(node); Vector suggestions; for (auto& name : available_names) { if (name.starts_with(partial_text)) { diff --git a/Userland/DevTools/HackStudio/LanguageServers/Cpp/ParserAutoComplete.h b/Userland/DevTools/HackStudio/LanguageServers/Cpp/ParserAutoComplete.h index 546f73a0ff..b83495be37 100644 --- a/Userland/DevTools/HackStudio/LanguageServers/Cpp/ParserAutoComplete.h +++ b/Userland/DevTools/HackStudio/LanguageServers/Cpp/ParserAutoComplete.h @@ -57,7 +57,7 @@ private: }; Vector autocomplete_property(const DocumentData&, const MemberExpression&, const StringView partial_text) const; - Vector autocomplete_identifier(const DocumentData&, const ASTNode&) const; + Vector autocomplete_name(const DocumentData&, const ASTNode&, const StringView& partial_text) const; String type_of(const DocumentData&, const Expression&) const; String type_of_property(const DocumentData&, const Identifier&) const; String type_of_variable(const Identifier&) const; diff --git a/Userland/Libraries/LibCpp/Parser.cpp b/Userland/Libraries/LibCpp/Parser.cpp index c5d00d5c6d..b62e7183e3 100644 --- a/Userland/Libraries/LibCpp/Parser.cpp +++ b/Userland/Libraries/LibCpp/Parser.cpp @@ -664,7 +664,7 @@ bool Parser::done() return m_state.token_index == m_tokens.size(); } -StringView Parser::text_of_token(const Cpp::Token& token) +StringView Parser::text_of_token(const Cpp::Token& token) const { ASSERT(token.m_start.line == token.m_end.line); ASSERT(token.m_start.column <= token.m_end.column); diff --git a/Userland/Libraries/LibCpp/Parser.h b/Userland/Libraries/LibCpp/Parser.h index b12c1a50a0..b55dce0775 100644 --- a/Userland/Libraries/LibCpp/Parser.h +++ b/Userland/Libraries/LibCpp/Parser.h @@ -45,6 +45,7 @@ public: Optional token_at(Position) const; RefPtr root_node() const { return m_root_node; } StringView text_of_node(const ASTNode&) const; + StringView text_of_token(const Cpp::Token& token) const; void print_tokens() const; Vector errors() const { return m_errors; } @@ -127,7 +128,6 @@ private: size_t token_index { 0 }; }; - StringView text_of_token(const Cpp::Token& token); void error(StringView message = {}); size_t node_span_size(const ASTNode& node) const;