ClangTools: Move run settings to projects mode

Make the global run settings available per project in project mode and
thus remove the diagnostic config selection from the
selectable-files-dialog:

 * Extract the classes RunSettings and RunSettingsWidget instead of
   duplicating stuff.
 * Ensure to pick up the old settings
 * Add some convenience buttons/links in projects mode allowing to
   restore the global settings, to open the global settings and to
   navigate (back) to the analyzer mode.

Change-Id: I1b91b6f8e58a87a025774e4643c46e176b2a8885
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
This commit is contained in:
Nikolai Kosjar
2019-09-13 10:49:14 +02:00
parent bdea56794f
commit 4750969c2b
24 changed files with 630 additions and 508 deletions

View File

@@ -29,21 +29,38 @@
#include <coreplugin/icore.h>
#include <utils/hostosinfo.h>
#include <utils/qtcassert.h>
#include <QFileInfo>
#include <QThread>
static const char simultaneousProcessesKey[] = "simultaneousProcesses";
static const char buildBeforeAnalysisKey[] = "buildBeforeAnalysis";
static const char diagnosticConfigIdKey[] = "diagnosticConfigId";
static const char clangTidyExecutableKey[] = "clangTidyExecutable";
static const char clazyStandaloneExecutableKey[] = "clazyStandaloneExecutable";
static const char clangTidyExecutableKey[] = "ClangTidyExecutable";
static const char clazyStandaloneExecutableKey[] = "ClazyStandaloneExecutable";
static const char parallelJobsKey[] = "ParallelJobs";
static const char buildBeforeAnalysisKey[] = "BuildBeforeAnalysis";
static const char oldDiagnosticConfigIdKey[] = "diagnosticConfigId";
namespace ClangTools {
namespace Internal {
RunSettings::RunSettings()
: m_parallelJobs(qMax(0, QThread::idealThreadCount() / 2))
{
}
void RunSettings::fromMap(const QVariantMap &map, const QString &prefix)
{
m_diagnosticConfigId = Core::Id::fromSetting(map.value(prefix + diagnosticConfigIdKey));
m_parallelJobs = map.value(prefix + parallelJobsKey).toInt();
m_buildBeforeAnalysis = map.value(prefix + buildBeforeAnalysisKey).toBool();
}
void RunSettings::toMap(QVariantMap &map, const QString &prefix) const
{
map.insert(prefix + diagnosticConfigIdKey, m_diagnosticConfigId.toSetting());
map.insert(prefix + parallelJobsKey, m_parallelJobs);
map.insert(prefix + buildBeforeAnalysisKey, m_buildBeforeAnalysis);
}
ClangToolsSettings::ClangToolsSettings()
{
readSettings();
@@ -55,134 +72,69 @@ ClangToolsSettings *ClangToolsSettings::instance()
return &instance;
}
int ClangToolsSettings::savedSimultaneousProcesses() const
static QVariantMap convertToMapFromVersionBefore410(QSettings *s)
{
return m_savedSimultaneousProcesses;
}
const char oldParallelJobsKey[] = "simultaneousProcesses";
const char oldBuildBeforeAnalysisKey[] = "buildBeforeAnalysis";
int ClangToolsSettings::simultaneousProcesses() const
{
return m_simultaneousProcesses;
}
QVariantMap map;
map.insert(diagnosticConfigIdKey, s->value(oldDiagnosticConfigIdKey));
map.insert(parallelJobsKey, s->value(oldParallelJobsKey));
map.insert(buildBeforeAnalysisKey, s->value(oldBuildBeforeAnalysisKey));
void ClangToolsSettings::setSimultaneousProcesses(int processes)
{
m_simultaneousProcesses = processes;
}
s->remove(oldDiagnosticConfigIdKey);
s->remove(oldParallelJobsKey);
s->remove(oldBuildBeforeAnalysisKey);
bool ClangToolsSettings::savedBuildBeforeAnalysis() const
{
return m_savedBuildBeforeAnalysis;
}
bool ClangToolsSettings::buildBeforeAnalysis() const
{
return m_buildBeforeAnalysis;
}
void ClangToolsSettings::setBuildBeforeAnalysis(bool build)
{
m_buildBeforeAnalysis = build;
}
Core::Id ClangToolsSettings::savedDiagnosticConfigId() const
{
return m_savedDiagnosticConfigId;
}
Core::Id ClangToolsSettings::diagnosticConfigId() const
{
return m_diagnosticConfigId;
}
void ClangToolsSettings::setDiagnosticConfigId(Core::Id id)
{
m_diagnosticConfigId = id;
}
void ClangToolsSettings::updateSavedBuildBeforeAnalysiIfRequired()
{
if (m_savedBuildBeforeAnalysis == m_buildBeforeAnalysis)
return;
m_savedBuildBeforeAnalysis = m_buildBeforeAnalysis;
emit buildBeforeAnalysisChanged(m_savedBuildBeforeAnalysis);
}
QString ClangToolsSettings::savedClazyStandaloneExecutable() const
{
return m_savedClazyStandaloneExecutable;
}
QString ClangToolsSettings::savedClangTidyExecutable() const
{
return m_savedClangTidyExecutable;
}
QString ClangToolsSettings::clazyStandaloneExecutable() const
{
return m_clazyStandaloneExecutable;
}
void ClangToolsSettings::setClazyStandaloneExecutable(const QString &path)
{
m_clazyStandaloneExecutable = path;
}
QString ClangToolsSettings::clangTidyExecutable() const
{
return m_clangTidyExecutable;
}
void ClangToolsSettings::setClangTidyExecutable(const QString &path)
{
m_clangTidyExecutable = path;
return map;
}
void ClangToolsSettings::readSettings()
{
QSettings *settings = Core::ICore::settings();
settings->beginGroup(QLatin1String(Constants::SETTINGS_ID));
QSettings *s = Core::ICore::settings();
s->beginGroup(Constants::SETTINGS_ID);
m_clangTidyExecutable = s->value(clangTidyExecutableKey).toString();
m_clazyStandaloneExecutable = s->value(clazyStandaloneExecutableKey).toString();
const int defaultSimultaneousProcesses = qMax(0, QThread::idealThreadCount() / 2);
m_savedSimultaneousProcesses = m_simultaneousProcesses
= settings->value(QString(simultaneousProcessesKey),
defaultSimultaneousProcesses).toInt();
bool write = false;
m_buildBeforeAnalysis = settings->value(QString(buildBeforeAnalysisKey), true).toBool();
QVariantMap map;
if (!s->value(oldDiagnosticConfigIdKey).isNull()) {
map = convertToMapFromVersionBefore410(s);
write = true;
} else {
QVariantMap defaults;
defaults.insert(diagnosticConfigIdKey, m_runSettings.diagnosticConfigId().toSetting());
defaults.insert(parallelJobsKey, m_runSettings.parallelJobs());
defaults.insert(buildBeforeAnalysisKey, m_runSettings.buildBeforeAnalysis());
map = defaults;
for (QVariantMap::ConstIterator it = defaults.constBegin(); it != defaults.constEnd(); ++it)
map.insert(it.key(), s->value(it.key(), it.value()));
}
m_savedClangTidyExecutable = m_clangTidyExecutable
= settings->value(QLatin1String(clangTidyExecutableKey)).toString();
m_savedClazyStandaloneExecutable = m_clazyStandaloneExecutable
= settings->value(QLatin1String(clazyStandaloneExecutableKey)).toString();
// Run settings
m_runSettings.fromMap(map);
m_diagnosticConfigId = Core::Id::fromSetting(settings->value(QString(diagnosticConfigIdKey)));
if (!m_diagnosticConfigId.isValid())
m_diagnosticConfigId = "Builtin.TidyAndClazy";
s->endGroup();
m_savedDiagnosticConfigId = m_diagnosticConfigId;
updateSavedBuildBeforeAnalysiIfRequired();
settings->endGroup();
if (write)
writeSettings();
}
void ClangToolsSettings::writeSettings()
{
QSettings *settings = Core::ICore::settings();
settings->beginGroup(QString(Constants::SETTINGS_ID));
settings->setValue(QString(simultaneousProcessesKey), m_simultaneousProcesses);
settings->setValue(QString(buildBeforeAnalysisKey), m_buildBeforeAnalysis);
settings->setValue(QString(clangTidyExecutableKey), m_clangTidyExecutable);
settings->setValue(QString(clazyStandaloneExecutableKey), m_clazyStandaloneExecutable);
settings->setValue(QString(diagnosticConfigIdKey), m_diagnosticConfigId.toSetting());
QSettings *s = Core::ICore::settings();
s->beginGroup(Constants::SETTINGS_ID);
m_savedSimultaneousProcesses = m_simultaneousProcesses;
m_savedDiagnosticConfigId = m_diagnosticConfigId;
m_savedClangTidyExecutable = m_clangTidyExecutable;
m_savedClazyStandaloneExecutable = m_clazyStandaloneExecutable;
updateSavedBuildBeforeAnalysiIfRequired();
s->setValue(clangTidyExecutableKey, m_clangTidyExecutable);
s->setValue(clazyStandaloneExecutableKey, m_clazyStandaloneExecutable);
settings->endGroup();
QVariantMap map;
m_runSettings.toMap(map);
for (QVariantMap::ConstIterator it = map.constBegin(); it != map.constEnd(); ++it)
s->setValue(it.key(), it.value());
s->endGroup();
}
} // namespace Internal