1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 14:38:11 +00:00

HackStudio: Integate with C++ parser-based autocomplete

By default, C++ auto completion will still be performed by the
lexer-based logic.
However, the parser-based logic can be switched on via the menubar.
This commit is contained in:
Itamar 2021-01-23 16:55:19 +02:00 committed by Andreas Kling
parent 8ed96eb27c
commit fa18010477
14 changed files with 70 additions and 11 deletions

View file

@ -25,7 +25,8 @@
*/
#include "ClientConnection.h"
#include "AutoComplete.h"
#include "LexerAutoComplete.h"
#include "ParserAutoComplete.h"
#include <AK/Debug.h>
#include <AK/HashMap.h>
#include <LibCore/File.h>
@ -146,7 +147,16 @@ void ClientConnection::handle(const Messages::LanguageServer::AutoCompleteSugges
return;
}
auto suggestions = AutoComplete::get_suggestions(document->text(), { (size_t)message.cursor_line(), (size_t)max(message.cursor_column(), message.cursor_column() - 1) });
Vector<GUI::AutocompleteProvider::Entry> suggestions;
switch (m_auto_complete_mode) {
case AutoCompleteMode::Lexer:
suggestions = LexerAutoComplete::get_suggestions(document->text(), { (size_t)message.cursor_line(), (size_t)max(message.cursor_column(), message.cursor_column() - 1) });
break;
case AutoCompleteMode::Parser: {
auto engine = ParserAutoComplete(document->text());
suggestions = engine.get_suggestions({ (size_t)message.cursor_line(), (size_t)max(message.cursor_column(), message.cursor_column() - 1) });
}
}
post_message(Messages::LanguageClient::AutoCompleteSuggestions(move(suggestions)));
}
@ -170,4 +180,15 @@ void ClientConnection::handle(const Messages::LanguageServer::SetFileContent& me
document->set_text(content.view());
}
void ClientConnection::handle(const Messages::LanguageServer::SetAutoCompleteMode& message)
{
#ifdef DEBUG_CPP_LANGUAGE_SERVER
dbgln("SetAutoCompleteMode: {}", message.mode());
#endif
if (message.mode() == "Parser")
m_auto_complete_mode = AutoCompleteMode::Parser;
else
m_auto_complete_mode = AutoCompleteMode::Lexer;
}
}