LSP: add symbol support class

Declutter the client and client manager by moving find usage and follow
symbol into this helper. This functionality was "temporary" put into the
client manager, but is more an implementation detail that shouldn't be
handled in that central place. Rename symbol will also go into this
helper class.

Task-number: QTCREATORBUG-21578
Change-Id: I56680f6ccbb8d244066561167178af7b341b8822
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
David Schulz
2020-05-06 10:26:31 +02:00
parent a35832385c
commit 4121eccf1e
9 changed files with 275 additions and 156 deletions

View File

@@ -100,6 +100,7 @@ Client::Client(BaseClientInterface *clientInterface)
, m_clientInterface(clientInterface)
, m_documentSymbolCache(this)
, m_hoverHandler(this)
, m_symbolSupport(this)
{
m_clientProviders.completionAssistProvider = new LanguageClientCompletionAssistProvider(this);
m_clientProviders.functionHintProvider = new FunctionHintAssistProvider(this);
@@ -553,43 +554,6 @@ void Client::unregisterCapabilities(const QList<Unregistration> &unregistrations
m_dynamicCapabilities.unregisterCapability(unregistrations);
}
template <typename Request>
static bool sendTextDocumentPositionParamsRequest(Client *client,
const Request &request,
const DynamicCapabilities &dynamicCapabilities,
const optional<bool> &serverCapability)
{
if (!request.isValid(nullptr))
return false;
const DocumentUri uri = request.params().value().textDocument().uri();
const bool supportedFile = client->isSupportedUri(uri);
bool sendMessage = dynamicCapabilities.isRegistered(Request::methodName).value_or(false);
if (sendMessage) {
const TextDocumentRegistrationOptions option(dynamicCapabilities.option(Request::methodName));
if (option.isValid(nullptr))
sendMessage = option.filterApplies(FilePath::fromString(QUrl(uri).adjusted(QUrl::PreferLocalFile).toString()));
else
sendMessage = supportedFile;
} else {
sendMessage = serverCapability.value_or(sendMessage) && supportedFile;
}
if (sendMessage)
client->sendContent(request);
return sendMessage;
}
bool Client::findLinkAt(GotoDefinitionRequest &request)
{
return LanguageClient::sendTextDocumentPositionParamsRequest(
this, request, m_dynamicCapabilities, m_serverCapabilities.definitionProvider());
}
bool Client::findUsages(FindReferencesRequest &request)
{
return LanguageClient::sendTextDocumentPositionParamsRequest(
this, request, m_dynamicCapabilities, m_serverCapabilities.referencesProvider());
}
TextEditor::HighlightingResult createHighlightingResult(const SymbolInformation &info)
{
if (!info.isValid(nullptr))
@@ -652,6 +616,11 @@ void Client::cursorPositionChanged(TextEditor::TextEditorWidget *widget)
sendContent(request);
}
SymbolSupport &Client::symbolSupport()
{
return m_symbolSupport;
}
void Client::requestCodeActions(const DocumentUri &uri, const QList<Diagnostic> &diagnostics)
{
const Utils::FilePath fileName = uri.toFilePath();