summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@qt.io>2020-08-25 06:18:26 +0200
committerDavid Schulz <david.schulz@qt.io>2020-09-04 09:48:44 +0000
commit7bbbdeac524e3c321ce3fade434a7ebf9a2db0b6 (patch)
treea94b19aa8050f9a84d535bb88db8a523261563fa
parent43ee53c233f22014befc99c12951d69379ec672e (diff)
downloadqt-creator-7bbbdeac524e3c321ce3fade434a7ebf9a2db0b6.tar.gz
ClangTools: use VFSoverlay if the clang tool supports it
check the help output of a clang tool whether virtual file system overlay is supported. Prepares for the vfso support of clazy-standalone. Change-Id: I157c94de1dda41c83945c9bc8a4c2e132b2e6551 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
-rw-r--r--src/plugins/clangtools/clangtidyclazyrunner.cpp27
-rw-r--r--src/plugins/clangtools/clangtoolrunner.cpp23
-rw-r--r--src/plugins/clangtools/clangtoolrunner.h2
-rw-r--r--src/plugins/clangtools/documentclangtoolrunner.cpp5
4 files changed, 33 insertions, 24 deletions
diff --git a/src/plugins/clangtools/clangtidyclazyrunner.cpp b/src/plugins/clangtools/clangtidyclazyrunner.cpp
index d3e2b34198..298b1d3ef9 100644
--- a/src/plugins/clangtools/clangtidyclazyrunner.cpp
+++ b/src/plugins/clangtools/clangtidyclazyrunner.cpp
@@ -72,21 +72,6 @@ static QStringList clazyChecksArguments(const ClangDiagnosticConfig diagnosticCo
return {};
}
-static QStringList mainToolArguments(const QString &mainFilePath, const QString &outputFilePath)
-{
- return {
- "-export-fixes=" + outputFilePath,
- QDir::toNativeSeparators(mainFilePath),
- };
-}
-
-static QString virtualFileSystemOverlay(const QString &overlayFilePath)
-{
- if (overlayFilePath.isEmpty())
- return {};
- return "--vfsoverlay=" + overlayFilePath;
-}
-
static QStringList clangArguments(const ClangDiagnosticConfig &diagnosticConfig,
const QStringList &baseOptions)
{
@@ -110,8 +95,7 @@ ClangTidyRunner::ClangTidyRunner(const ClangDiagnosticConfig &config, QObject *p
setExecutable(clangTidyExecutable());
setArgsCreator([this, config](const QStringList &baseOptions) {
return QStringList() << tidyChecksArguments(config)
- << mainToolArguments(fileToAnalyze(), outputFilePath())
- << virtualFileSystemOverlay(m_overlayFilePath)
+ << mainToolArguments()
<< "--"
<< clangArguments(config, baseOptions);
});
@@ -124,11 +108,10 @@ ClazyStandaloneRunner::ClazyStandaloneRunner(const ClangDiagnosticConfig &config
setOutputFileFormat(OutputFileFormat::Yaml);
setExecutable(clazyStandaloneExecutable());
setArgsCreator([this, config](const QStringList &baseOptions) {
- return QStringList()
- << clazyChecksArguments(config)
- << mainToolArguments(fileToAnalyze(), outputFilePath())
- << "--"
- << clangArguments(config, baseOptions);
+ return QStringList() << clazyChecksArguments(config)
+ << mainToolArguments()
+ << "--"
+ << clangArguments(config, baseOptions);
});
}
diff --git a/src/plugins/clangtools/clangtoolrunner.cpp b/src/plugins/clangtools/clangtoolrunner.cpp
index b0fc220e04..afc69b7549 100644
--- a/src/plugins/clangtools/clangtoolrunner.cpp
+++ b/src/plugins/clangtools/clangtoolrunner.cpp
@@ -73,6 +73,29 @@ void ClangToolRunner::init(const QString &outputDirPath,
connect(&m_process, &QProcess::readyRead, this, &ClangToolRunner::onProcessOutput);
}
+QStringList ClangToolRunner::mainToolArguments() const
+{
+ QStringList result;
+ result << "-export-fixes=" + m_outputFilePath;
+ if (!m_overlayFilePath.isEmpty() && supportsVFSOverlay())
+ result << "--vfsoverlay=" + m_overlayFilePath;
+ result << QDir::toNativeSeparators(m_fileToAnalyze);
+ return result;
+}
+
+bool ClangToolRunner::supportsVFSOverlay() const
+{
+ static QMap<QString, bool> vfsCapabilities;
+ auto it = vfsCapabilities.find(m_executable);
+ if (it == vfsCapabilities.end()) {
+ Utils::SynchronousProcess p;
+ Utils::SynchronousProcessResponse response = p.runBlocking(
+ Utils::CommandLine(m_executable, {"--help"}));
+ it = vfsCapabilities.insert(m_executable, response.allOutput().contains("vfsoverlay"));
+ }
+ return it.value();
+}
+
ClangToolRunner::~ClangToolRunner()
{
if (m_process.state() != QProcess::NotRunning) {
diff --git a/src/plugins/clangtools/clangtoolrunner.h b/src/plugins/clangtools/clangtoolrunner.h
index 87ec5d5f06..ba3c7372ce 100644
--- a/src/plugins/clangtools/clangtoolrunner.h
+++ b/src/plugins/clangtools/clangtoolrunner.h
@@ -59,6 +59,8 @@ public:
OutputFileFormat outputFileFormat() const { return m_outputFileFormat; }
QString fileToAnalyze() const { return m_fileToAnalyze; }
QString outputFilePath() const { return m_outputFilePath; }
+ QStringList mainToolArguments() const;
+ bool supportsVFSOverlay() const;
// compilerOptions is expected to contain everything except:
// (1) file to analyze
diff --git a/src/plugins/clangtools/documentclangtoolrunner.cpp b/src/plugins/clangtools/documentclangtoolrunner.cpp
index 382b8ece2e..23c613c7be 100644
--- a/src/plugins/clangtools/documentclangtoolrunner.cpp
+++ b/src/plugins/clangtools/documentclangtoolrunner.cpp
@@ -186,7 +186,7 @@ void DocumentClangToolRunner::run()
return createRunner<ClangTidyRunner>(config, env);
};
}
- if (config.isClazyEnabled() && !m_document->isModified()) {
+ if (config.isClazyEnabled()) {
m_runnerCreators << [this, env, config]() {
return createRunner<ClazyStandaloneRunner>(config, env);
};
@@ -218,7 +218,8 @@ void DocumentClangToolRunner::runNext()
auto [clangIncludeDir, clangVersion] = getClangIncludeDirAndVersion(m_currentRunner.get());
qCDebug(LOG) << Q_FUNC_INFO << m_currentRunner->executable() << clangIncludeDir
<< clangVersion << m_fileInfo.file;
- if (clangIncludeDir.isEmpty() || clangVersion.isEmpty()) {
+ if (clangIncludeDir.isEmpty() || clangVersion.isEmpty()
+ || (m_document->isModified() && !m_currentRunner->supportsVFSOverlay())) {
runNext();
} else {
AnalyzeUnit unit(m_fileInfo, clangIncludeDir, clangVersion);