aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/clangtools/clangtoolrunner.cpp
diff options
context:
space:
mode:
authorDavid Schulz <[email protected]>2023-06-16 12:40:20 +0200
committerDavid Schulz <[email protected]>2023-06-19 08:38:06 +0000
commit8b16e40858d153a6c8ba95d816fa95e3a2006066 (patch)
tree85b7c564c7b73d28be94adf695ccd3e447677bac /src/plugins/clangtools/clangtoolrunner.cpp
parentd30689c9a9a1d17e9ea7225b9da5b1d8003351b4 (diff)
ClangTools: Utilize TaskTree to parse diagnostics from file
This reduces the time the main thread is blocked for reading the diagnostics from the result file. Change-Id: If6cc5671c709cb519b651c2b7ce3e8067e0b5f39 Reviewed-by: Jarek Kobus <[email protected]>
Diffstat (limited to 'src/plugins/clangtools/clangtoolrunner.cpp')
-rw-r--r--src/plugins/clangtools/clangtoolrunner.cpp36
1 files changed, 31 insertions, 5 deletions
diff --git a/src/plugins/clangtools/clangtoolrunner.cpp b/src/plugins/clangtools/clangtoolrunner.cpp
index 6681a9133dd..01b71fefe2f 100644
--- a/src/plugins/clangtools/clangtoolrunner.cpp
+++ b/src/plugins/clangtools/clangtoolrunner.cpp
@@ -3,6 +3,7 @@
#include "clangtoolrunner.h"
+#include "clangtoolslogfilereader.h"
#include "clangtoolstr.h"
#include "clangtoolsutils.h"
@@ -11,6 +12,9 @@
#include <cppeditor/clangdiagnosticconfigsmodel.h>
#include <cppeditor/cpptoolsreuse.h>
+#include <extensionsystem/pluginmanager.h>
+
+#include <utils/async.h>
#include <utils/process.h>
#include <utils/qtcassert.h>
#include <utils/temporaryfile.h>
@@ -20,6 +24,7 @@
#include <QFileInfo>
#include <QLoggingCategory>
+
static Q_LOGGING_CATEGORY(LOG, "qtc.clangtools.runner", QtWarningMsg)
using namespace CppEditor;
@@ -109,6 +114,7 @@ GroupItem clangToolTask(const AnalyzeInputData &input,
QString name;
FilePath executable;
FilePath outputFilePath;
+ QString errorMessage;
};
const TreeStorage<ClangToolStorage> storage;
@@ -160,9 +166,6 @@ GroupItem clangToolTask(const AnalyzeInputData &input,
};
const auto onProcessDone = [=](const Process &process) {
qCDebug(LOG).noquote() << "Output:\n" << process.cleanedStdOut();
- if (!outputHandler)
- return;
- outputHandler({true, input.unit.file, storage->outputFilePath, input.tool});
};
const auto onProcessError = [=](const Process &process) {
if (!outputHandler)
@@ -179,15 +182,38 @@ GroupItem clangToolTask(const AnalyzeInputData &input,
message = Tr::tr("%1 finished with exit code: %2.").arg(data.name).arg(process.exitCode());
else
message = Tr::tr("%1 crashed.").arg(data.name);
- outputHandler({false, input.unit.file, data.outputFilePath, input.tool, message, details});
+ outputHandler(
+ {false, input.unit.file, data.outputFilePath, {}, input.tool, message, details});
+ };
+
+ const auto onReadSetup = [=](Async<Diagnostics> &data) {
+ data.setConcurrentCallData(&readExportedDiagnostics,
+ storage->outputFilePath,
+ input.diagnosticsFilter,
+ &storage->errorMessage);
+ data.setFutureSynchronizer(ExtensionSystem::PluginManager::futureSynchronizer());
+ };
+ const auto onReadDone = [=](const Async<Diagnostics> &data) {
+ if (!outputHandler)
+ return;
+ outputHandler(
+ {true, input.unit.file, storage->outputFilePath, data.result(), input.tool});
+ };
+ const auto onReadError = [=](const Async<Diagnostics> &) {
+ if (!outputHandler)
+ return;
+ outputHandler(
+ {false, input.unit.file, storage->outputFilePath, {}, input.tool, storage->errorMessage});
};
const Group group {
Storage(storage),
onGroupSetup(onSetup),
Group {
+ sequential,
finishAllAndDone,
- ProcessTask(onProcessSetup, onProcessDone, onProcessError)
+ ProcessTask(onProcessSetup, onProcessDone, onProcessError),
+ AsyncTask<Diagnostics>(onReadSetup, onReadDone, onReadError)
}
};
return group;