forked from qt-creator/qt-creator
LanguageClient: generate issue pane entries for diagnostics
The clang code model already generated issue pane entries for received diagnostics. Move the tracking of these issue pane entries to the generic language client support and also generate entries for other language servers. Fixes: QTCREATORBUG-30549 Change-Id: I29f2ffbf199c3fdc5ca59a670f5033c833b96a49 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
@@ -356,7 +356,6 @@ public:
|
||||
|
||||
QHash<TextDocument *, HighlightingData> highlightingData;
|
||||
QHash<Utils::FilePath, CppEditor::BaseEditorDocumentParser::Configuration> parserConfigs;
|
||||
QHash<Utils::FilePath, Tasks> issuePaneEntries;
|
||||
QHash<Utils::FilePath, int> openedExtraFiles;
|
||||
|
||||
VersionedDataCache<const TextDocument *, ClangdAstNode> astCache;
|
||||
@@ -690,30 +689,14 @@ const LanguageClient::Client::CustomInspectorTabs ClangdClient::createCustomInsp
|
||||
|
||||
class ClangdDiagnosticManager : public LanguageClient::DiagnosticManager
|
||||
{
|
||||
using LanguageClient::DiagnosticManager::DiagnosticManager;
|
||||
|
||||
ClangdClient *getClient() const { return qobject_cast<ClangdClient *>(client()); }
|
||||
|
||||
bool isCurrentDocument(const Utils::FilePath &filePath) const
|
||||
public:
|
||||
ClangdDiagnosticManager(LanguageClient::Client *client)
|
||||
: LanguageClient::DiagnosticManager(client)
|
||||
{
|
||||
const IDocument * const doc = EditorManager::currentDocument();
|
||||
return doc && doc->filePath() == filePath;
|
||||
}
|
||||
|
||||
void showDiagnostics(const Utils::FilePath &filePath, int version) override
|
||||
{
|
||||
getClient()->clearTasks(filePath);
|
||||
DiagnosticManager::showDiagnostics(filePath, version);
|
||||
if (isCurrentDocument(filePath))
|
||||
getClient()->switchIssuePaneEntries(filePath);
|
||||
}
|
||||
|
||||
void hideDiagnostics(const Utils::FilePath &filePath) override
|
||||
{
|
||||
DiagnosticManager::hideDiagnostics(filePath);
|
||||
if (isCurrentDocument(filePath))
|
||||
TaskHub::clearTasks(Constants::TASK_CATEGORY_DIAGNOSTICS);
|
||||
setTaskCategory(Constants::TASK_CATEGORY_DIAGNOSTICS);
|
||||
setForceCreateTasks(false);
|
||||
}
|
||||
private:
|
||||
|
||||
QList<Diagnostic> filteredDiagnostics(const QList<Diagnostic> &diagnostics) const override
|
||||
{
|
||||
@@ -729,7 +712,18 @@ class ClangdDiagnosticManager : public LanguageClient::DiagnosticManager
|
||||
const Diagnostic &diagnostic,
|
||||
bool isProjectFile) const override
|
||||
{
|
||||
return new ClangdTextMark(doc, diagnostic, isProjectFile, getClient());
|
||||
return new ClangdTextMark(
|
||||
doc, diagnostic, isProjectFile, qobject_cast<ClangdClient *>(client()));
|
||||
}
|
||||
|
||||
QString taskText(const Diagnostic &diagnostic) const override
|
||||
{
|
||||
QString text = diagnostic.message();
|
||||
auto splitIndex = text.indexOf("\n\n");
|
||||
if (splitIndex >= 0)
|
||||
text.truncate(splitIndex);
|
||||
|
||||
return diagnosticCategoryPrefixRemoved(text);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -938,24 +932,6 @@ void ClangdClient::updateParserConfig(const Utils::FilePath &filePath,
|
||||
emit configChanged();
|
||||
}
|
||||
|
||||
void ClangdClient::switchIssuePaneEntries(const FilePath &filePath)
|
||||
{
|
||||
TaskHub::clearTasks(Constants::TASK_CATEGORY_DIAGNOSTICS);
|
||||
const Tasks tasks = d->issuePaneEntries.value(filePath);
|
||||
for (const Task &t : tasks)
|
||||
TaskHub::addTask(t);
|
||||
}
|
||||
|
||||
void ClangdClient::addTask(const ProjectExplorer::Task &task)
|
||||
{
|
||||
d->issuePaneEntries[task.file] << task;
|
||||
}
|
||||
|
||||
void ClangdClient::clearTasks(const Utils::FilePath &filePath)
|
||||
{
|
||||
d->issuePaneEntries[filePath].clear();
|
||||
}
|
||||
|
||||
std::optional<bool> ClangdClient::hasVirtualFunctionAt(TextDocument *doc, int revision,
|
||||
const Range &range)
|
||||
{
|
||||
|
||||
@@ -97,9 +97,6 @@ public:
|
||||
|
||||
void updateParserConfig(const Utils::FilePath &filePath,
|
||||
const CppEditor::BaseEditorDocumentParser::Configuration &config);
|
||||
void switchIssuePaneEntries(const Utils::FilePath &filePath);
|
||||
void addTask(const ProjectExplorer::Task &task);
|
||||
void clearTasks(const Utils::FilePath &filePath);
|
||||
std::optional<bool> hasVirtualFunctionAt(TextEditor::TextDocument *doc, int revision,
|
||||
const LanguageServerProtocol::Range &range);
|
||||
|
||||
|
||||
@@ -457,10 +457,8 @@ void ClangModelManagerSupport::onCurrentEditorChanged(IEditor *editor)
|
||||
const FilePath filePath = editor->document()->filePath();
|
||||
if (auto processor = ClangEditorDocumentProcessor::get(filePath)) {
|
||||
processor->semanticRehighlight();
|
||||
if (const auto client = clientForFile(filePath)) {
|
||||
if (const auto client = clientForFile(filePath))
|
||||
client->updateParserConfig(filePath, processor->parserConfig());
|
||||
client->switchIssuePaneEntries(filePath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,8 +16,6 @@
|
||||
#include <cppeditor/cppeditorconstants.h>
|
||||
#include <cppeditor/cpptoolsreuse.h>
|
||||
|
||||
#include <projectexplorer/task.h>
|
||||
|
||||
#include <utils/fadingindicator.h>
|
||||
#include <utils/qtcassert.h>
|
||||
#include <utils/stringutils.h>
|
||||
@@ -204,34 +202,6 @@ ClangDiagnostic convertDiagnostic(const ClangdDiagnostic &src,
|
||||
return target;
|
||||
}
|
||||
|
||||
Task createTask(const ClangDiagnostic &diagnostic)
|
||||
{
|
||||
Task::TaskType taskType = Task::TaskType::Unknown;
|
||||
QIcon icon;
|
||||
|
||||
switch (diagnostic.severity) {
|
||||
case ClangDiagnostic::Severity::Fatal:
|
||||
case ClangDiagnostic::Severity::Error:
|
||||
taskType = Task::TaskType::Error;
|
||||
icon = ::Utils::Icons::CODEMODEL_ERROR.icon();
|
||||
break;
|
||||
case ClangDiagnostic::Severity::Warning:
|
||||
taskType = Task::TaskType::Warning;
|
||||
icon = ::Utils::Icons::CODEMODEL_WARNING.icon();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return Task(taskType,
|
||||
diagnosticCategoryPrefixRemoved(diagnostic.text),
|
||||
diagnostic.location.targetFilePath,
|
||||
diagnostic.location.targetLine,
|
||||
Constants::TASK_CATEGORY_DIAGNOSTICS,
|
||||
icon,
|
||||
Task::NoOptions);
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
ClangdTextMark::ClangdTextMark(TextEditor::TextDocument *doc,
|
||||
@@ -258,7 +228,6 @@ ClangdTextMark::ClangdTextMark(TextEditor::TextDocument *doc,
|
||||
setLineAnnotation(diagnostic.message());
|
||||
setColor(isError ? Theme::CodeModel_Error_TextMarkColor
|
||||
: Theme::CodeModel_Warning_TextMarkColor);
|
||||
client->addTask(createTask(m_diagnostic));
|
||||
}
|
||||
|
||||
setActionsProvider([diag = m_diagnostic] {
|
||||
|
||||
Reference in New Issue
Block a user