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:
David Schulz
2024-03-22 12:40:25 +01:00
parent b27be7e2bf
commit 6e6d25d117
8 changed files with 126 additions and 84 deletions

View File

@@ -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)
{

View File

@@ -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);

View File

@@ -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);
}
}
}

View File

@@ -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] {