summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@theqtcompany.com>2015-08-04 13:14:45 +0200
committerEike Ziller <eike.ziller@theqtcompany.com>2015-08-04 13:14:48 +0200
commit2cb5281c2cf9215b8649445b681359c0cb673406 (patch)
tree0cd57a3acbcd5744ac4365f3f36b86cdd376523a
parent7332cf28ff5964d8ad1d391ff28bf7393946dd1b (diff)
parent0fac5deb5948ad3a38e567a2f8270108444a6e96 (diff)
downloadqt-creator-2cb5281c2cf9215b8649445b681359c0cb673406.tar.gz
Merge remote-tracking branch 'origin/3.5'
Change-Id: I8eeb30833ca9c1a021b367f8e47f9b89da8afe01
-rw-r--r--plugins/clangstaticanalyzer/clangstaticanalyzerconfigwidget.cpp26
-rw-r--r--plugins/clangstaticanalyzer/clangstaticanalyzerconstants.h1
-rw-r--r--plugins/clangstaticanalyzer/clangstaticanalyzerlicensecheck.h6
-rw-r--r--plugins/clangstaticanalyzer/clangstaticanalyzersettings.cpp31
-rw-r--r--plugins/clangstaticanalyzer/clangstaticanalyzersettings.h3
5 files changed, 54 insertions, 13 deletions
diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzerconfigwidget.cpp b/plugins/clangstaticanalyzer/clangstaticanalyzerconfigwidget.cpp
index 6bc81cac64..58fa6d0c47 100644
--- a/plugins/clangstaticanalyzer/clangstaticanalyzerconfigwidget.cpp
+++ b/plugins/clangstaticanalyzer/clangstaticanalyzerconfigwidget.cpp
@@ -40,11 +40,31 @@ ClangStaticAnalyzerConfigWidget::ClangStaticAnalyzerConfigWidget(
chooser->setHistoryCompleter(QLatin1String("ClangStaticAnalyzer.ClangCommand.History"));
chooser->setPromptDialogTitle(tr("Clang Command"));
const auto validator = [chooser](Utils::FancyLineEdit *edit, QString *errorMessage) {
- return chooser->defaultValidationFunction()(edit, errorMessage)
- && isClangExecutableUsable(chooser->fileName().toString(), errorMessage);
+ const QString currentFilePath = chooser->fileName().toString();
+ Utils::PathChooser pc;
+ Utils::PathChooser *helperPathChooser;
+ if (currentFilePath.isEmpty()) {
+ pc.setExpectedKind(chooser->expectedKind());
+ pc.setPath(edit->placeholderText());
+ helperPathChooser = &pc;
+ } else {
+ helperPathChooser = chooser;
+ }
+ return chooser->defaultValidationFunction()(helperPathChooser->lineEdit(), errorMessage)
+ && isClangExecutableUsable(helperPathChooser->fileName().toString(), errorMessage);
};
chooser->setValidationFunction(validator);
- chooser->setPath(settings->clangExecutable());
+ bool clangExeIsSet;
+ const QString clangExe = settings->clangExecutable(&clangExeIsSet);
+ chooser->lineEdit()->setPlaceholderText(settings->defaultClangExecutable());
+ if (clangExeIsSet) {
+ chooser->setPath(clangExe);
+ } else {
+ // Setting an empty string does not trigger the validator, as that is the initial value
+ // in the line edit.
+ chooser->setPath(QLatin1String(" "));
+ chooser->lineEdit()->clear();
+ }
connect(m_ui->clangExecutableChooser, &Utils::PathChooser::changed,
[settings](const QString &path) { settings->setClangExecutable(path); });
diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzerconstants.h b/plugins/clangstaticanalyzer/clangstaticanalyzerconstants.h
index 1114730614..bc696b5b9d 100644
--- a/plugins/clangstaticanalyzer/clangstaticanalyzerconstants.h
+++ b/plugins/clangstaticanalyzer/clangstaticanalyzerconstants.h
@@ -22,7 +22,6 @@
namespace ClangStaticAnalyzer {
namespace Constants {
-const char CLANG_EXECUTABLE_BASE_NAME[] = "clang";
const char SETTINGS_ID[] = "ClangStaticAnalyzer";
const char CLANGSTATICANALYZER_RUN_MODE[] = "ClangStaticAnalyzer.RunMode";
diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzerlicensecheck.h b/plugins/clangstaticanalyzer/clangstaticanalyzerlicensecheck.h
index 7b0d09ba9d..13a303207c 100644
--- a/plugins/clangstaticanalyzer/clangstaticanalyzerlicensecheck.h
+++ b/plugins/clangstaticanalyzer/clangstaticanalyzerlicensecheck.h
@@ -31,8 +31,12 @@ inline bool enterpriseFeaturesAvailable()
= ExtensionSystem::PluginManager::getObject<LicenseChecker::LicenseCheckerPlugin>();
if (licenseChecker && licenseChecker->hasValidLicense()) {
- if (licenseChecker->enterpriseFeatures())
+ if (licenseChecker->enterpriseFeatures()) {
return true;
+ } else {
+ qWarning() << "License does not cover enterprise features, "
+ "disabling Clang Static Analyzer";
+ }
} else {
qWarning() << "Invalid license, disabling Clang Static Analyzer";
}
diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzersettings.cpp b/plugins/clangstaticanalyzer/clangstaticanalyzersettings.cpp
index 97c456ff81..3ab12ef958 100644
--- a/plugins/clangstaticanalyzer/clangstaticanalyzersettings.cpp
+++ b/plugins/clangstaticanalyzer/clangstaticanalyzersettings.cpp
@@ -46,14 +46,34 @@ ClangStaticAnalyzerSettings *ClangStaticAnalyzerSettings::instance()
return &instance;
}
-QString ClangStaticAnalyzerSettings::clangExecutable() const
+static QString clangExecutableFileName()
{
+ return QLatin1String(Utils::HostOsInfo::isWindowsHost() ? "clang-cl.exe" : "clang");
+}
+
+QString ClangStaticAnalyzerSettings::defaultClangExecutable() const
+{
+ const QString shippedBinary = Core::ICore::libexecPath() + QLatin1Char('/')
+ + clangExecutableFileName();
+ if (QFileInfo(shippedBinary).isExecutable())
+ return shippedBinary;
+ return clangExecutableFileName();
+}
+
+QString ClangStaticAnalyzerSettings::clangExecutable(bool *isSet) const
+{
+ if (m_clangExecutable.isEmpty()) {
+ if (isSet)
+ *isSet = false;
+ return defaultClangExecutable();
+ }
+ if (isSet)
+ *isSet = true;
return m_clangExecutable;
}
void ClangStaticAnalyzerSettings::setClangExecutable(const QString &exectuable)
{
- QTC_ASSERT(!exectuable.isEmpty(), return);
m_clangExecutable = exectuable;
}
@@ -73,10 +93,7 @@ void ClangStaticAnalyzerSettings::readSettings()
QSettings *settings = Core::ICore::settings();
settings->beginGroup(QLatin1String(Constants::SETTINGS_ID));
- const QString defaultClangExecutable = Utils::HostOsInfo::withExecutableSuffix(
- QLatin1String(Constants::CLANG_EXECUTABLE_BASE_NAME));
- setClangExecutable(settings->value(QLatin1String(clangExecutableKey),
- defaultClangExecutable).toString());
+ setClangExecutable(settings->value(QLatin1String(clangExecutableKey)).toString());
const int defaultSimultaneousProcesses = qMax(0, QThread::idealThreadCount() / 2);
setSimultaneousProcesses(settings->value(QLatin1String(simultaneousProcessesKey),
@@ -89,7 +106,7 @@ void ClangStaticAnalyzerSettings::writeSettings() const
{
QSettings *settings = Core::ICore::settings();
settings->beginGroup(QLatin1String(Constants::SETTINGS_ID));
- settings->setValue(QLatin1String(clangExecutableKey), clangExecutable());
+ settings->setValue(QLatin1String(clangExecutableKey), m_clangExecutable);
settings->setValue(QLatin1String(simultaneousProcessesKey), simultaneousProcesses());
settings->endGroup();
}
diff --git a/plugins/clangstaticanalyzer/clangstaticanalyzersettings.h b/plugins/clangstaticanalyzer/clangstaticanalyzersettings.h
index 70f85d4912..c4b9794736 100644
--- a/plugins/clangstaticanalyzer/clangstaticanalyzersettings.h
+++ b/plugins/clangstaticanalyzer/clangstaticanalyzersettings.h
@@ -31,7 +31,8 @@ public:
void writeSettings() const;
- QString clangExecutable() const;
+ QString defaultClangExecutable() const;
+ QString clangExecutable(bool *isSet = nullptr) const;
void setClangExecutable(const QString &exectuable);
int simultaneousProcesses() const;