diff options
author | David Schulz <[email protected]> | 2023-06-16 12:40:20 +0200 |
---|---|---|
committer | David Schulz <[email protected]> | 2023-06-19 08:38:06 +0000 |
commit | 8b16e40858d153a6c8ba95d816fa95e3a2006066 (patch) | |
tree | 85b7c564c7b73d28be94adf695ccd3e447677bac /src/plugins/clangtools/clangtoolrunner.cpp | |
parent | d30689c9a9a1d17e9ea7225b9da5b1d8003351b4 (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.cpp | 36 |
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; |