forked from qt-creator/qt-creator
LanguageClient: export DiagnosticManager
Change-Id: I60b3e6b14bf364da60fb8b3de6d5d5cc1cd2e634 Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
@@ -1427,20 +1427,6 @@ ClangdClient::ClangdClient(Project *project, const Utils::FilePath &jsonDbDir)
|
|||||||
}
|
}
|
||||||
setCurrentProject(project);
|
setCurrentProject(project);
|
||||||
setDocumentChangeUpdateThreshold(d->settings.documentUpdateThreshold);
|
setDocumentChangeUpdateThreshold(d->settings.documentUpdateThreshold);
|
||||||
|
|
||||||
const auto textMarkCreator = [this](const Utils::FilePath &filePath,
|
|
||||||
const Diagnostic &diag, bool isProjectFile) {
|
|
||||||
if (d->isTesting)
|
|
||||||
emit textMarkCreated(filePath);
|
|
||||||
return new ClangdTextMark(filePath, diag, isProjectFile, this);
|
|
||||||
};
|
|
||||||
const auto hideDiagsHandler = []{ ClangDiagnosticManager::clearTaskHubIssues(); };
|
|
||||||
static const auto diagsFilter = [](const Diagnostic &diag) {
|
|
||||||
const Diagnostic::Code code = diag.code().value_or(Diagnostic::Code());
|
|
||||||
const QString * const codeString = Utils::get_if<QString>(&code);
|
|
||||||
return !codeString || *codeString != "drv_unknown_argument";
|
|
||||||
};
|
|
||||||
setDiagnosticsHandlers(textMarkCreator, hideDiagsHandler, diagsFilter);
|
|
||||||
setSymbolStringifier(displayNameFromDocumentSymbol);
|
setSymbolStringifier(displayNameFromDocumentSymbol);
|
||||||
setSemanticTokensHandler([this](TextDocument *doc, const QList<ExpandedSemanticToken> &tokens,
|
setSemanticTokensHandler([this](TextDocument *doc, const QList<ExpandedSemanticToken> &tokens,
|
||||||
int version, bool force) {
|
int version, bool force) {
|
||||||
@@ -1615,6 +1601,44 @@ const LanguageClient::Client::CustomInspectorTabs ClangdClient::createCustomInsp
|
|||||||
return {std::make_pair(new MemoryUsageWidget(this), tr("Memory Usage"))};
|
return {std::make_pair(new MemoryUsageWidget(this), tr("Memory Usage"))};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ClangdDiagnosticManager : public LanguageClient::DiagnosticManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using LanguageClient::DiagnosticManager::DiagnosticManager;
|
||||||
|
|
||||||
|
void hideDiagnostics(const Utils::FilePath &filePath) override
|
||||||
|
{
|
||||||
|
DiagnosticManager::hideDiagnostics(filePath);
|
||||||
|
ClangDiagnosticManager::clearTaskHubIssues();
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<Diagnostic> filteredDiagnostics(const QList<Diagnostic> &diagnostics) const override
|
||||||
|
{
|
||||||
|
return Utils::filtered(diagnostics, [](const Diagnostic &diag){
|
||||||
|
const Diagnostic::Code code = diag.code().value_or(Diagnostic::Code());
|
||||||
|
const QString * const codeString = Utils::get_if<QString>(&code);
|
||||||
|
return !codeString || *codeString != "drv_unknown_argument";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
TextMark *createTextMark(const Utils::FilePath &filePath,
|
||||||
|
const Diagnostic &diagnostic,
|
||||||
|
bool isProjectFile) const override
|
||||||
|
{
|
||||||
|
return new ClangdTextMark(filePath, diagnostic, isProjectFile, client());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
DiagnosticManager *ClangdClient::createDiagnosticManager()
|
||||||
|
{
|
||||||
|
auto diagnosticManager = new ClangdDiagnosticManager(this);
|
||||||
|
if (d->isTesting) {
|
||||||
|
connect(diagnosticManager, &DiagnosticManager::textMarkCreated,
|
||||||
|
this, &ClangdClient::textMarkCreated);
|
||||||
|
}
|
||||||
|
return diagnosticManager;
|
||||||
|
}
|
||||||
|
|
||||||
RefactoringChangesData *ClangdClient::createRefactoringChangesBackend() const
|
RefactoringChangesData *ClangdClient::createRefactoringChangesBackend() const
|
||||||
{
|
{
|
||||||
return new CppEditor::CppRefactoringChangesData(
|
return new CppEditor::CppRefactoringChangesData(
|
||||||
|
@@ -112,6 +112,7 @@ private:
|
|||||||
TextEditor::TextDocument *doc) override;
|
TextEditor::TextDocument *doc) override;
|
||||||
const CustomInspectorTabs createCustomInspectorTabs() override;
|
const CustomInspectorTabs createCustomInspectorTabs() override;
|
||||||
TextEditor::RefactoringChangesData *createRefactoringChangesBackend() const override;
|
TextEditor::RefactoringChangesData *createRefactoringChangesBackend() const override;
|
||||||
|
LanguageClient::DiagnosticManager *createDiagnosticManager() override;
|
||||||
|
|
||||||
class Private;
|
class Private;
|
||||||
class FollowSymbolData;
|
class FollowSymbolData;
|
||||||
|
@@ -81,7 +81,6 @@ static Q_LOGGING_CATEGORY(LOGLSPCLIENT, "qtc.languageclient.client", QtWarningMs
|
|||||||
Client::Client(BaseClientInterface *clientInterface)
|
Client::Client(BaseClientInterface *clientInterface)
|
||||||
: m_id(Utils::Id::fromString(QUuid::createUuid().toString()))
|
: m_id(Utils::Id::fromString(QUuid::createUuid().toString()))
|
||||||
, m_clientInterface(clientInterface)
|
, m_clientInterface(clientInterface)
|
||||||
, m_diagnosticManager(this)
|
|
||||||
, m_documentSymbolCache(this)
|
, m_documentSymbolCache(this)
|
||||||
, m_hoverHandler(this)
|
, m_hoverHandler(this)
|
||||||
, m_symbolSupport(this)
|
, m_symbolSupport(this)
|
||||||
@@ -158,6 +157,7 @@ Client::~Client()
|
|||||||
// do not handle messages while shutting down
|
// do not handle messages while shutting down
|
||||||
disconnect(m_clientInterface.data(), &BaseClientInterface::messageReceived,
|
disconnect(m_clientInterface.data(), &BaseClientInterface::messageReceived,
|
||||||
this, &Client::handleMessage);
|
this, &Client::handleMessage);
|
||||||
|
delete m_diagnosticManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ClientCapabilities generateClientCapabilities()
|
static ClientCapabilities generateClientCapabilities()
|
||||||
@@ -598,7 +598,8 @@ void Client::activateDocument(TextEditor::TextDocument *document)
|
|||||||
{
|
{
|
||||||
const FilePath &filePath = document->filePath();
|
const FilePath &filePath = document->filePath();
|
||||||
auto uri = DocumentUri::fromFilePath(filePath);
|
auto uri = DocumentUri::fromFilePath(filePath);
|
||||||
m_diagnosticManager.showDiagnostics(uri, m_documentVersions.value(filePath));
|
if (m_diagnosticManager)
|
||||||
|
m_diagnosticManager->showDiagnostics(uri, m_documentVersions.value(filePath));
|
||||||
m_tokenSupport.updateSemanticTokens(document);
|
m_tokenSupport.updateSemanticTokens(document);
|
||||||
// only replace the assist provider if the language server support it
|
// only replace the assist provider if the language server support it
|
||||||
updateCompletionProvider(document);
|
updateCompletionProvider(document);
|
||||||
@@ -622,7 +623,8 @@ void Client::activateDocument(TextEditor::TextDocument *document)
|
|||||||
|
|
||||||
void Client::deactivateDocument(TextEditor::TextDocument *document)
|
void Client::deactivateDocument(TextEditor::TextDocument *document)
|
||||||
{
|
{
|
||||||
m_diagnosticManager.hideDiagnostics(document->filePath());
|
if (m_diagnosticManager)
|
||||||
|
m_diagnosticManager->hideDiagnostics(document->filePath());
|
||||||
resetAssistProviders(document);
|
resetAssistProviders(document);
|
||||||
document->setFormatter(nullptr);
|
document->setFormatter(nullptr);
|
||||||
m_tokenSupport.clearHighlight(document);
|
m_tokenSupport.clearHighlight(document);
|
||||||
@@ -1075,20 +1077,22 @@ void Client::removeAssistProcessor(TextEditor::IAssistProcessor *processor)
|
|||||||
|
|
||||||
QList<Diagnostic> Client::diagnosticsAt(const DocumentUri &uri, const QTextCursor &cursor) const
|
QList<Diagnostic> Client::diagnosticsAt(const DocumentUri &uri, const QTextCursor &cursor) const
|
||||||
{
|
{
|
||||||
return m_diagnosticManager.diagnosticsAt(uri, cursor);
|
if (m_diagnosticManager)
|
||||||
|
return m_diagnosticManager->diagnosticsAt(uri, cursor);
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Client::hasDiagnostic(const LanguageServerProtocol::DocumentUri &uri,
|
bool Client::hasDiagnostic(const LanguageServerProtocol::DocumentUri &uri,
|
||||||
const LanguageServerProtocol::Diagnostic &diag) const
|
const LanguageServerProtocol::Diagnostic &diag) const
|
||||||
{
|
{
|
||||||
return m_diagnosticManager.hasDiagnostic(uri, documentForFilePath(uri.toFilePath()), diag);
|
if (m_diagnosticManager)
|
||||||
|
return m_diagnosticManager->hasDiagnostic(uri, documentForFilePath(uri.toFilePath()), diag);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::setDiagnosticsHandlers(const TextMarkCreator &textMarkCreator,
|
DiagnosticManager *Client::createDiagnosticManager()
|
||||||
const HideDiagnosticsHandler &hideHandler,
|
|
||||||
const DiagnosticsFilter &filter)
|
|
||||||
{
|
{
|
||||||
m_diagnosticManager.setDiagnosticsHandlers(textMarkCreator, hideHandler, filter);
|
return new DiagnosticManager(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::setSemanticTokensHandler(const SemanticTokensHandler &handler)
|
void Client::setSemanticTokensHandler(const SemanticTokensHandler &handler)
|
||||||
@@ -1165,7 +1169,8 @@ bool Client::reset()
|
|||||||
updateEditorToolBar(m_openedDocument.keys());
|
updateEditorToolBar(m_openedDocument.keys());
|
||||||
m_serverCapabilities = ServerCapabilities();
|
m_serverCapabilities = ServerCapabilities();
|
||||||
m_dynamicCapabilities.reset();
|
m_dynamicCapabilities.reset();
|
||||||
m_diagnosticManager.clearDiagnostics();
|
if (m_diagnosticManager)
|
||||||
|
m_diagnosticManager->clearDiagnostics();
|
||||||
for (auto it = m_openedDocument.cbegin(); it != m_openedDocument.cend(); ++it)
|
for (auto it = m_openedDocument.cbegin(); it != m_openedDocument.cend(); ++it)
|
||||||
it.key()->disconnect(this);
|
it.key()->disconnect(this);
|
||||||
m_openedDocument.clear();
|
m_openedDocument.clear();
|
||||||
@@ -1503,9 +1508,11 @@ void Client::handleDiagnostics(const PublishDiagnosticsParams ¶ms)
|
|||||||
const DocumentUri &uri = params.uri();
|
const DocumentUri &uri = params.uri();
|
||||||
|
|
||||||
const QList<Diagnostic> &diagnostics = params.diagnostics();
|
const QList<Diagnostic> &diagnostics = params.diagnostics();
|
||||||
m_diagnosticManager.setDiagnostics(uri, diagnostics, params.version());
|
if (!m_diagnosticManager)
|
||||||
|
m_diagnosticManager = createDiagnosticManager();
|
||||||
|
m_diagnosticManager->setDiagnostics(uri, diagnostics, params.version());
|
||||||
if (LanguageClientManager::clientForUri(uri) == this) {
|
if (LanguageClientManager::clientForUri(uri) == this) {
|
||||||
m_diagnosticManager.showDiagnostics(uri, m_documentVersions.value(uri.toFilePath()));
|
m_diagnosticManager->showDiagnostics(uri, m_documentVersions.value(uri.toFilePath()));
|
||||||
if (m_autoRequestCodeActions)
|
if (m_autoRequestCodeActions)
|
||||||
requestCodeActions(uri, diagnostics);
|
requestCodeActions(uri, diagnostics);
|
||||||
}
|
}
|
||||||
|
@@ -188,8 +188,6 @@ public:
|
|||||||
const QTextCursor &cursor) const;
|
const QTextCursor &cursor) const;
|
||||||
bool hasDiagnostic(const LanguageServerProtocol::DocumentUri &uri,
|
bool hasDiagnostic(const LanguageServerProtocol::DocumentUri &uri,
|
||||||
const LanguageServerProtocol::Diagnostic &diag) const;
|
const LanguageServerProtocol::Diagnostic &diag) const;
|
||||||
void setDiagnosticsHandlers(const TextMarkCreator &textMarkCreator,
|
|
||||||
const HideDiagnosticsHandler &hideHandler, const DiagnosticsFilter &filter);
|
|
||||||
void setSemanticTokensHandler(const SemanticTokensHandler &handler);
|
void setSemanticTokensHandler(const SemanticTokensHandler &handler);
|
||||||
void setSymbolStringifier(const LanguageServerProtocol::SymbolStringifier &stringifier);
|
void setSymbolStringifier(const LanguageServerProtocol::SymbolStringifier &stringifier);
|
||||||
LanguageServerProtocol::SymbolStringifier symbolStringifier() const;
|
LanguageServerProtocol::SymbolStringifier symbolStringifier() const;
|
||||||
@@ -227,6 +225,7 @@ protected:
|
|||||||
const QString &message);
|
const QString &message);
|
||||||
void handleMessage(const LanguageServerProtocol::BaseMessage &message);
|
void handleMessage(const LanguageServerProtocol::BaseMessage &message);
|
||||||
virtual void handleDiagnostics(const LanguageServerProtocol::PublishDiagnosticsParams ¶ms);
|
virtual void handleDiagnostics(const LanguageServerProtocol::PublishDiagnosticsParams ¶ms);
|
||||||
|
virtual DiagnosticManager *createDiagnosticManager();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void sendMessage(const LanguageServerProtocol::BaseMessage &message);
|
void sendMessage(const LanguageServerProtocol::BaseMessage &message);
|
||||||
@@ -300,7 +299,7 @@ private:
|
|||||||
QHash<TextEditor::TextEditorWidget *, LanguageServerProtocol::MessageId> m_highlightRequests;
|
QHash<TextEditor::TextEditorWidget *, LanguageServerProtocol::MessageId> m_highlightRequests;
|
||||||
int m_restartsLeft = 5;
|
int m_restartsLeft = 5;
|
||||||
QScopedPointer<BaseClientInterface> m_clientInterface;
|
QScopedPointer<BaseClientInterface> m_clientInterface;
|
||||||
DiagnosticManager m_diagnosticManager;
|
DiagnosticManager *m_diagnosticManager = nullptr;
|
||||||
DocumentSymbolCache m_documentSymbolCache;
|
DocumentSymbolCache m_documentSymbolCache;
|
||||||
HoverHandler m_hoverHandler;
|
HoverHandler m_hoverHandler;
|
||||||
QHash<LanguageServerProtocol::DocumentUri, TextEditor::HighlightingResults> m_highlights;
|
QHash<LanguageServerProtocol::DocumentUri, TextEditor::HighlightingResults> m_highlights;
|
||||||
|
@@ -75,9 +75,6 @@ private:
|
|||||||
DiagnosticManager::DiagnosticManager(Client *client)
|
DiagnosticManager::DiagnosticManager(Client *client)
|
||||||
: m_client(client)
|
: m_client(client)
|
||||||
{
|
{
|
||||||
m_textMarkCreator = [this](const FilePath &filePath, const Diagnostic &diagnostic, bool /*isProjectFile*/) {
|
|
||||||
return createTextMark(filePath, diagnostic);
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DiagnosticManager::~DiagnosticManager()
|
DiagnosticManager::~DiagnosticManager()
|
||||||
@@ -85,20 +82,16 @@ DiagnosticManager::~DiagnosticManager()
|
|||||||
clearDiagnostics();
|
clearDiagnostics();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DiagnosticManager::setDiagnostics(const LanguageServerProtocol::DocumentUri &uri,
|
void DiagnosticManager::setDiagnostics(const DocumentUri &uri,
|
||||||
const QList<LanguageServerProtocol::Diagnostic> &diagnostics,
|
const QList<Diagnostic> &diagnostics,
|
||||||
const Utils::optional<int> &version)
|
const Utils::optional<int> &version)
|
||||||
{
|
{
|
||||||
hideDiagnostics(uri.toFilePath());
|
hideDiagnostics(uri.toFilePath());
|
||||||
const QList<Diagnostic> filteredDiags = m_filter
|
m_diagnostics[uri] = {version, filteredDiagnostics(diagnostics)};
|
||||||
? Utils::filtered(diagnostics, m_filter) : diagnostics;
|
|
||||||
m_diagnostics[uri] = {version, filteredDiags};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DiagnosticManager::hideDiagnostics(const Utils::FilePath &filePath)
|
void DiagnosticManager::hideDiagnostics(const Utils::FilePath &filePath)
|
||||||
{
|
{
|
||||||
if (m_hideHandler)
|
|
||||||
m_hideHandler();
|
|
||||||
if (auto doc = TextDocument::textDocumentForFilePath(filePath)) {
|
if (auto doc = TextDocument::textDocumentForFilePath(filePath)) {
|
||||||
for (BaseTextEditor *editor : BaseTextEditor::textEditorsForDocument(doc))
|
for (BaseTextEditor *editor : BaseTextEditor::textEditorsForDocument(doc))
|
||||||
editor->editorWidget()->setExtraSelections(TextEditorWidget::CodeWarningsSelection, {});
|
editor->editorWidget()->setExtraSelections(TextEditorWidget::CodeWarningsSelection, {});
|
||||||
@@ -106,6 +99,11 @@ void DiagnosticManager::hideDiagnostics(const Utils::FilePath &filePath)
|
|||||||
qDeleteAll(m_marks.take(filePath));
|
qDeleteAll(m_marks.take(filePath));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QList<Diagnostic> DiagnosticManager::filteredDiagnostics(const QList<Diagnostic> &diagnostics) const
|
||||||
|
{
|
||||||
|
return diagnostics;
|
||||||
|
}
|
||||||
|
|
||||||
static QTextEdit::ExtraSelection toDiagnosticsSelections(const Diagnostic &diagnostic,
|
static QTextEdit::ExtraSelection toDiagnosticsSelections(const Diagnostic &diagnostic,
|
||||||
QTextDocument *textDocument)
|
QTextDocument *textDocument)
|
||||||
{
|
{
|
||||||
@@ -134,8 +132,10 @@ void DiagnosticManager::showDiagnostics(const DocumentUri &uri, int version)
|
|||||||
&& m_client->project()->isKnownFile(filePath);
|
&& m_client->project()->isKnownFile(filePath);
|
||||||
for (const Diagnostic &diagnostic : versionedDiagnostics.diagnostics) {
|
for (const Diagnostic &diagnostic : versionedDiagnostics.diagnostics) {
|
||||||
extraSelections << toDiagnosticsSelections(diagnostic, doc->document());
|
extraSelections << toDiagnosticsSelections(diagnostic, doc->document());
|
||||||
marks.append(m_textMarkCreator(filePath, diagnostic, isProjectFile));
|
marks.append(createTextMark(filePath, diagnostic, isProjectFile));
|
||||||
}
|
}
|
||||||
|
if (!marks.isEmpty())
|
||||||
|
emit textMarkCreated(filePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (BaseTextEditor *editor : BaseTextEditor::textEditorsForDocument(doc)) {
|
for (BaseTextEditor *editor : BaseTextEditor::textEditorsForDocument(doc)) {
|
||||||
@@ -146,7 +146,8 @@ void DiagnosticManager::showDiagnostics(const DocumentUri &uri, int version)
|
|||||||
}
|
}
|
||||||
|
|
||||||
TextEditor::TextMark *DiagnosticManager::createTextMark(const FilePath &filePath,
|
TextEditor::TextMark *DiagnosticManager::createTextMark(const FilePath &filePath,
|
||||||
const Diagnostic &diagnostic) const
|
const Diagnostic &diagnostic,
|
||||||
|
bool isProjectFile) const
|
||||||
{
|
{
|
||||||
static const auto icon = QIcon::fromTheme("edit-copy", Utils::Icons::COPY.icon());
|
static const auto icon = QIcon::fromTheme("edit-copy", Utils::Icons::COPY.icon());
|
||||||
static const QString tooltip = tr("Copy to Clipboard");
|
static const QString tooltip = tr("Copy to Clipboard");
|
||||||
@@ -202,13 +203,4 @@ bool DiagnosticManager::hasDiagnostic(const LanguageServerProtocol::DocumentUri
|
|||||||
return it->diagnostics.contains(diag);
|
return it->diagnostics.contains(diag);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DiagnosticManager::setDiagnosticsHandlers(const TextMarkCreator &textMarkCreator,
|
|
||||||
const HideDiagnosticsHandler &removalHandler,
|
|
||||||
const DiagnosticsFilter &filter)
|
|
||||||
{
|
|
||||||
m_textMarkCreator = textMarkCreator;
|
|
||||||
m_hideHandler = removalHandler;
|
|
||||||
m_filter = filter;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace LanguageClient
|
} // namespace LanguageClient
|
||||||
|
@@ -25,6 +25,8 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "languageclient_global.h"
|
||||||
|
|
||||||
#include <languageserverprotocol/lsptypes.h>
|
#include <languageserverprotocol/lsptypes.h>
|
||||||
|
|
||||||
#include <utils/id.h>
|
#include <utils/id.h>
|
||||||
@@ -42,24 +44,21 @@ namespace LanguageClient {
|
|||||||
|
|
||||||
class Client;
|
class Client;
|
||||||
|
|
||||||
using TextMarkCreator = std::function<TextEditor::TextMark *(const Utils::FilePath &,
|
class LANGUAGECLIENT_EXPORT DiagnosticManager : public QObject
|
||||||
const LanguageServerProtocol::Diagnostic &, bool)>;
|
|
||||||
using HideDiagnosticsHandler = std::function<void()>;
|
|
||||||
using DiagnosticsFilter = std::function<bool(const LanguageServerProtocol::Diagnostic &)>;
|
|
||||||
|
|
||||||
class DiagnosticManager
|
|
||||||
{
|
{
|
||||||
Q_DECLARE_TR_FUNCTIONS(LanguageClient::DiagnosticManager)
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit DiagnosticManager(Client *client);
|
explicit DiagnosticManager(Client *client);
|
||||||
~DiagnosticManager();
|
~DiagnosticManager();
|
||||||
|
|
||||||
void setDiagnostics(const LanguageServerProtocol::DocumentUri &uri,
|
virtual void setDiagnostics(const LanguageServerProtocol::DocumentUri &uri,
|
||||||
const QList<LanguageServerProtocol::Diagnostic> &diagnostics,
|
const QList<LanguageServerProtocol::Diagnostic> &diagnostics,
|
||||||
const Utils::optional<int> &version);
|
const Utils::optional<int> &version);
|
||||||
|
|
||||||
void showDiagnostics(const LanguageServerProtocol::DocumentUri &uri, int version);
|
virtual void showDiagnostics(const LanguageServerProtocol::DocumentUri &uri, int version);
|
||||||
void hideDiagnostics(const Utils::FilePath &filePath);
|
virtual void hideDiagnostics(const Utils::FilePath &filePath);
|
||||||
|
virtual QList<LanguageServerProtocol::Diagnostic> filteredDiagnostics(
|
||||||
|
const QList<LanguageServerProtocol::Diagnostic> &diagnostics) const;
|
||||||
|
|
||||||
void clearDiagnostics();
|
void clearDiagnostics();
|
||||||
|
|
||||||
@@ -70,22 +69,22 @@ public:
|
|||||||
const TextEditor::TextDocument *doc,
|
const TextEditor::TextDocument *doc,
|
||||||
const LanguageServerProtocol::Diagnostic &diag) const;
|
const LanguageServerProtocol::Diagnostic &diag) const;
|
||||||
|
|
||||||
void setDiagnosticsHandlers(const TextMarkCreator &shownHandler,
|
signals:
|
||||||
const HideDiagnosticsHandler &removalHandler,
|
void textMarkCreated(const Utils::FilePath &path);
|
||||||
const DiagnosticsFilter &filter);
|
|
||||||
|
protected:
|
||||||
|
Client *client() const { return m_client; }
|
||||||
|
virtual TextEditor::TextMark *createTextMark(const Utils::FilePath &filePath,
|
||||||
|
const LanguageServerProtocol::Diagnostic &diagnostic,
|
||||||
|
bool isProjectFile) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TextEditor::TextMark *createTextMark(const Utils::FilePath &filePath,
|
|
||||||
const LanguageServerProtocol::Diagnostic &diagnostic) const;
|
|
||||||
struct VersionedDiagnostics {
|
struct VersionedDiagnostics {
|
||||||
Utils::optional<int> version;
|
Utils::optional<int> version;
|
||||||
QList<LanguageServerProtocol::Diagnostic> diagnostics;
|
QList<LanguageServerProtocol::Diagnostic> diagnostics;
|
||||||
};
|
};
|
||||||
QMap<LanguageServerProtocol::DocumentUri, VersionedDiagnostics> m_diagnostics;
|
QMap<LanguageServerProtocol::DocumentUri, VersionedDiagnostics> m_diagnostics;
|
||||||
QMap<Utils::FilePath, QList<TextEditor::TextMark *>> m_marks;
|
QMap<Utils::FilePath, QList<TextEditor::TextMark *>> m_marks;
|
||||||
TextMarkCreator m_textMarkCreator;
|
|
||||||
HideDiagnosticsHandler m_hideHandler;
|
|
||||||
DiagnosticsFilter m_filter;
|
|
||||||
Client *m_client;
|
Client *m_client;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user