1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 18:17:44 +00:00

LibGUI+HackStudio: Add an opt-in autocompletion interface to TextEditor

...and use that to implement autocomplete in HackStudio.

Now everyone can have autocomplete :^)
This commit is contained in:
AnotherTest 2020-12-30 13:55:06 +03:30 committed by Andreas Kling
parent 7e457b98c3
commit 20b74e4ede
19 changed files with 211 additions and 162 deletions

View file

@ -32,10 +32,10 @@
namespace LanguageServers::Cpp {
Vector<AutoCompleteResponse> AutoComplete::get_suggestions(const String& code, const GUI::TextPosition& autocomplete_position)
Vector<GUI::AutocompleteProvider::Entry> AutoComplete::get_suggestions(const String& code, const GUI::TextPosition& autocomplete_position)
{
auto lines = code.split('\n', true);
Lexer lexer(code);
Cpp::Lexer lexer(code);
auto tokens = lexer.lex();
auto index_of_target_token = token_in_position(tokens, autocomplete_position);
@ -75,10 +75,10 @@ Optional<size_t> AutoComplete::token_in_position(const Vector<Cpp::Token>& token
return {};
}
Vector<AutoCompleteResponse> AutoComplete::identifier_prefixes(const Vector<String>& lines, const Vector<Cpp::Token>& tokens, size_t target_token_index)
Vector<GUI::AutocompleteProvider::Entry> 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<AutoCompleteResponse> suggestions;
Vector<GUI::AutocompleteProvider::Entry> suggestions;
HashTable<String> suggestions_lookup; // To avoid duplicate results
@ -88,7 +88,7 @@ Vector<AutoCompleteResponse> AutoComplete::identifier_prefixes(const Vector<Stri
continue;
auto text = text_of_token(lines, token);
if (text.starts_with(partial_input) && suggestions_lookup.set(text) == AK::HashSetResult::InsertedNewEntry) {
suggestions.append({ text, partial_input.length(), HackStudio::CompletionKind::Identifier });
suggestions.append({ text, partial_input.length(), GUI::AutocompleteProvider::CompletionKind::Identifier });
}
}
return suggestions;

View file

@ -35,18 +35,17 @@
namespace LanguageServers::Cpp {
using namespace ::Cpp;
using ::HackStudio::AutoCompleteResponse;
class AutoComplete {
public:
AutoComplete() = delete;
static Vector<AutoCompleteResponse> get_suggestions(const String& code, const GUI::TextPosition& autocomplete_position);
static Vector<GUI::AutocompleteProvider::Entry> get_suggestions(const String& code, const GUI::TextPosition& autocomplete_position);
private:
static Optional<size_t> token_in_position(const Vector<Cpp::Token>&, const GUI::TextPosition&);
static StringView text_of_token(const Vector<String>& lines, const Cpp::Token&);
static Vector<AutoCompleteResponse> identifier_prefixes(const Vector<String>& lines, const Vector<Cpp::Token>&, size_t target_token_index);
static Vector<GUI::AutocompleteProvider::Entry> identifier_prefixes(const Vector<String>& lines, const Vector<Cpp::Token>&, size_t target_token_index);
};
}

View file

@ -1,4 +1,4 @@
endpoint LanguageClient = 8002
{
AutoCompleteSuggestions(Vector<HackStudio::AutoCompleteResponse> suggestions) =|
AutoCompleteSuggestions(Vector<GUI::AutocompleteProvider::Entry> suggestions) =|
}

View file

@ -35,7 +35,7 @@
namespace LanguageServers::Shell {
Vector<AutoCompleteResponse> AutoComplete::get_suggestions(const String& code, size_t offset)
Vector<GUI::AutocompleteProvider::Entry> AutoComplete::get_suggestions(const String& code, size_t offset)
{
// FIXME: No need to reparse this every time!
auto ast = ::Shell::Parser { code }.parse();
@ -49,7 +49,7 @@ Vector<AutoCompleteResponse> AutoComplete::get_suggestions(const String& code, s
#endif
auto result = ast->complete_for_editor(m_shell, offset);
Vector<AutoCompleteResponse> completions;
Vector<GUI::AutocompleteProvider::Entry> completions;
for (auto& entry : result) {
#ifdef DEBUG_AUTOCOMPLETE
dbgln("Suggestion: '{}' starting at {}", entry.text_string, entry.input_offset);

View file

@ -34,8 +34,6 @@
namespace LanguageServers::Shell {
using namespace ::HackStudio;
class AutoComplete {
public:
AutoComplete()
@ -43,7 +41,7 @@ public:
{
}
Vector<AutoCompleteResponse> get_suggestions(const String& code, size_t autocomplete_position);
Vector<GUI::AutocompleteProvider::Entry> get_suggestions(const String& code, size_t autocomplete_position);
private:
NonnullRefPtr<::Shell::Shell> m_shell;