mirror of
https://github.com/RGBCube/serenity
synced 2025-06-01 02:38:13 +00:00
HackStudio: Relay completions requests to the language server unfiltered
Previously, the client would decide when to ask the server for completions, and it would only do so for identifiers that had spans (determined via the highlighter!). Swap this around and make the server decide if it wants to complete something. This commit also adds a CompletionKind (which only has one value: Identifier), to work with other kinds of completions as well.
This commit is contained in:
parent
b42c6ea281
commit
9e73b0b696
12 changed files with 125 additions and 50 deletions
|
@ -32,7 +32,7 @@
|
|||
|
||||
namespace LanguageServers::Cpp {
|
||||
|
||||
Vector<String> AutoComplete::get_suggestions(const String& code, GUI::TextPosition autocomplete_position)
|
||||
Vector<AutoCompleteResponse> AutoComplete::get_suggestions(const String& code, GUI::TextPosition autocomplete_position)
|
||||
{
|
||||
auto lines = code.split('\n', true);
|
||||
Lexer lexer(code);
|
||||
|
@ -46,7 +46,7 @@ Vector<String> AutoComplete::get_suggestions(const String& code, GUI::TextPositi
|
|||
|
||||
#ifdef DEBUG_AUTOCOMPLETE
|
||||
for (auto& suggestion : suggestions) {
|
||||
dbg() << "suggestion: " << suggestion;
|
||||
dbg() << "suggestion: " << suggestion.completion;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -71,10 +71,10 @@ Optional<size_t> AutoComplete::token_in_position(const Vector<Cpp::Token>& token
|
|||
return {};
|
||||
}
|
||||
|
||||
Vector<String> AutoComplete::identifier_prefixes(const Vector<String> lines, const Vector<Cpp::Token>& tokens, size_t target_token_index)
|
||||
Vector<AutoCompleteResponse> AutoComplete::identifier_prefixes(const Vector<String> lines, const Vector<Cpp::Token>& tokens, size_t target_token_index)
|
||||
{
|
||||
auto partial_input = text_of_token(lines, tokens[target_token_index]);
|
||||
Vector<String> suggestions;
|
||||
Vector<AutoCompleteResponse> suggestions;
|
||||
|
||||
HashTable<String> suggestions_lookup; // To avoid duplicate results
|
||||
|
||||
|
@ -85,7 +85,7 @@ Vector<String> AutoComplete::identifier_prefixes(const Vector<String> lines, con
|
|||
auto text = text_of_token(lines, token);
|
||||
if (text.starts_with(partial_input) && !suggestions_lookup.contains(text)) {
|
||||
suggestions_lookup.set(text);
|
||||
suggestions.append(text);
|
||||
suggestions.append({ text, partial_input.length(), HackStudio::CompletionKind::Identifier });
|
||||
}
|
||||
}
|
||||
return suggestions;
|
||||
|
|
|
@ -28,23 +28,25 @@
|
|||
|
||||
#include <AK/String.h>
|
||||
#include <AK/Vector.h>
|
||||
#include <DevTools/HackStudio/AutoCompleteResponse.h>
|
||||
#include <LibCpp/Lexer.h>
|
||||
#include <LibGUI/TextPosition.h>
|
||||
|
||||
namespace LanguageServers::Cpp {
|
||||
|
||||
using namespace ::Cpp;
|
||||
using ::HackStudio::AutoCompleteResponse;
|
||||
|
||||
class AutoComplete {
|
||||
public:
|
||||
AutoComplete() = delete;
|
||||
|
||||
static Vector<String> get_suggestions(const String& code, GUI::TextPosition autocomplete_position);
|
||||
static Vector<AutoCompleteResponse> get_suggestions(const String& code, GUI::TextPosition autocomplete_position);
|
||||
|
||||
private:
|
||||
static Optional<size_t> token_in_position(const Vector<Cpp::Token>&, GUI::TextPosition);
|
||||
static String text_of_token(const Vector<String> lines, const Cpp::Token&);
|
||||
static Vector<String> identifier_prefixes(const Vector<String> lines, const Vector<Cpp::Token>&, size_t target_token_index);
|
||||
static Vector<AutoCompleteResponse> identifier_prefixes(const Vector<String> lines, const Vector<Cpp::Token>&, size_t target_token_index);
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -159,7 +159,7 @@ void ClientConnection::handle(const Messages::LanguageServer::AutoCompleteSugges
|
|||
return;
|
||||
}
|
||||
|
||||
Vector<String> suggestions = AutoComplete::get_suggestions(document->text(), { (size_t)message.cursor_line(), (size_t)message.cursor_column() });
|
||||
auto suggestions = AutoComplete::get_suggestions(document->text(), { (size_t)message.cursor_line(), (size_t)message.cursor_column() });
|
||||
post_message(Messages::LanguageClient::AutoCompleteSuggestions(move(suggestions)));
|
||||
}
|
||||
|
||||
|
|
|
@ -28,11 +28,13 @@
|
|||
|
||||
#include <AK/HashMap.h>
|
||||
#include <AK/LexicalPath.h>
|
||||
#include <DevTools/HackStudio/LanguageServers/LanguageClientEndpoint.h>
|
||||
#include <DevTools/HackStudio/LanguageServers/LanguageServerEndpoint.h>
|
||||
#include <DevTools/HackStudio/AutoCompleteResponse.h>
|
||||
#include <LibGUI/TextDocument.h>
|
||||
#include <LibIPC/ClientConnection.h>
|
||||
|
||||
#include <DevTools/HackStudio/LanguageServers/LanguageClientEndpoint.h>
|
||||
#include <DevTools/HackStudio/LanguageServers/LanguageServerEndpoint.h>
|
||||
|
||||
namespace LanguageServers::Cpp {
|
||||
|
||||
class ClientConnection final
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue