aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorOrgad Shaneh <orgad.shaneh@audiocodes.com>2017-06-02 15:03:36 +0300
committerOrgad Shaneh <orgad.shaneh@audiocodes.com>2017-06-02 15:13:51 +0300
commit89057b552b0b9bbe24d4e3552e12ae94aa713fa8 (patch)
treeed1dfaa961828b6e08e7f348d7567cf8b2248320 /src
parenta9d511ff7d3e42c6f516a98c036c624e969be2d8 (diff)
parentec3015663a536ebeb96a24b5cf5643b4324f6c54 (diff)
Merge remote-tracking branch 'origin/4.3'
Diffstat (limited to 'src')
-rw-r--r--src/libs/3rdparty/cplusplus/Symbols.h2
-rw-r--r--src/libs/libs.pro8
-rw-r--r--src/libs/qtcreatorcdbext/pytype.cpp9
-rw-r--r--src/libs/qtcreatorcdbext/qtcreatorcdbext.pro2
-rw-r--r--src/libs/utils/fileutils.h27
-rw-r--r--src/plugins/android/androidconfigurations.cpp12
-rw-r--r--src/plugins/android/androidtoolchain.cpp6
-rw-r--r--src/plugins/android/avddialog.cpp8
-rw-r--r--src/plugins/cmakeprojectmanager/cmakekitconfigwidget.cpp9
-rw-r--r--src/plugins/coreplugin/find/searchresultwidget.cpp1
-rw-r--r--src/plugins/git/gerrit/gerritmodel.cpp4
-rw-r--r--src/plugins/git/gitclient.cpp4
-rw-r--r--src/plugins/git/gitplugin.cpp1
-rw-r--r--src/plugins/projectexplorer/abi.cpp8
-rw-r--r--src/plugins/projectexplorer/gcctoolchain.cpp11
-rw-r--r--src/plugins/projectexplorer/jsonwizard/jsonwizardgeneratorfactory.cpp13
-rw-r--r--src/plugins/projectexplorer/msvctoolchain.cpp5
-rw-r--r--src/plugins/projectexplorer/projectwindow.cpp2
-rw-r--r--src/plugins/projectexplorer/toolchain.cpp2
-rw-r--r--src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp20
-rw-r--r--src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.h1
-rw-r--r--src/plugins/qmakeprojectmanager/qmakestep.cpp1
-rw-r--r--src/plugins/qtsupport/gettingstartedwelcomepage.cpp14
-rw-r--r--src/plugins/valgrind/valgrindengine.cpp7
m---------src/shared/qbs0
25 files changed, 145 insertions, 32 deletions
diff --git a/src/libs/3rdparty/cplusplus/Symbols.h b/src/libs/3rdparty/cplusplus/Symbols.h
index 4cd8141beb..e29f78bf01 100644
--- a/src/libs/3rdparty/cplusplus/Symbols.h
+++ b/src/libs/3rdparty/cplusplus/Symbols.h
@@ -503,7 +503,7 @@ protected:
virtual void visitSymbol0(SymbolVisitor *visitor);
private:
- bool _isVariadic;
+ bool _isVariadic = false;
bool _isVirtual;
FullySpecifiedType _type;
};
diff --git a/src/libs/libs.pro b/src/libs/libs.pro
index 34a5d938bf..178a7a4cb8 100644
--- a/src/libs/libs.pro
+++ b/src/libs/libs.pro
@@ -38,5 +38,11 @@ win32:SUBDIRS += utils/process_ctrlc_stub.pro
# Windows: Compile Qt Creator CDB extension if Debugging tools can be detected.
win32: isEmpty(QTC_SKIP_CDBEXT) {
include(qtcreatorcdbext/cdb_detect.pri)
- exists($$CDB_PATH):SUBDIRS += qtcreatorcdbext
+ exists($$CDB_PATH) {
+ SUBDIRS += qtcreatorcdbext
+ } else {
+ message("Compiling Qt Creator without a CDB extension.")
+ message("If CDB is installed in a none default path define a CDB_PATH")
+ message("environment variable pointing to your CDB installation.")
+ }
}
diff --git a/src/libs/qtcreatorcdbext/pytype.cpp b/src/libs/qtcreatorcdbext/pytype.cpp
index 2525a65114..ec67771824 100644
--- a/src/libs/qtcreatorcdbext/pytype.cpp
+++ b/src/libs/qtcreatorcdbext/pytype.cpp
@@ -40,6 +40,8 @@
#include <dbghelp.h>
#endif
+#include <regex>
+
constexpr bool debugPyType = false;
constexpr bool debuggingTypeEnabled() { return debugPyType || debugPyCdbextModule; }
@@ -289,6 +291,9 @@ int PyType::code() const
if (FAILED(ExtensionCommandContext::instance()->symbols()->CreateSymbolGroup2(&sg)))
return TypeCodeStruct;
+ if (knownType(name(), 0) != KT_Unknown)
+ return TypeCodeStruct;
+
const std::string helperValueName = SymbolGroupValue::pointedToSymbolName(0, name(true));
ULONG index = DEBUG_ANY_ID;
if (SUCCEEDED(sg->AddSymbol(helperValueName.c_str(), &index)))
@@ -411,6 +416,10 @@ PyType PyType::lookupType(const std::string &typeNameIn, ULONG64 module)
if (typeName == "__int64" || typeName == "unsigned __int64")
typeName.erase(typeName.find("__"), 2);
+ const static std::regex typeNameRE("^[a-zA-Z_][a-zA-Z0-9_]*!?[a-zA-Z0-9_<>:, \\*\\&\\[\\]]*$");
+ if (!std::regex_match(typeName, typeNameRE))
+ return PyType();
+
CIDebugSymbols *symbols = ExtensionCommandContext::instance()->symbols();
ULONG typeId;
HRESULT result = S_FALSE;
diff --git a/src/libs/qtcreatorcdbext/qtcreatorcdbext.pro b/src/libs/qtcreatorcdbext/qtcreatorcdbext.pro
index 058ed485b6..545656dc24 100644
--- a/src/libs/qtcreatorcdbext/qtcreatorcdbext.pro
+++ b/src/libs/qtcreatorcdbext/qtcreatorcdbext.pro
@@ -138,6 +138,8 @@ exists($$PYTHON_INSTALL_DIR) {
CONFIG(release, debug|release): deploy_python.recurse = Release
CONFIG(debug, debug|release): deploy_python.recurse = Debug
QMAKE_EXTRA_TARGETS += deploy_python
+} else {
+ message("Set PYTHON_INSTALL_DIR pointing to Python 3.5 or greater to enable the python dumpers for cdb.")
}
target.path = $$QTC_PREFIX/lib/$${DIRNAME} # TODO this should go to INSTALL_LIBRARY_PATH/$${DIRNAME}
diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h
index e1c3b47128..fc6d80f729 100644
--- a/src/libs/utils/fileutils.h
+++ b/src/libs/utils/fileutils.h
@@ -49,6 +49,11 @@ class QWidget;
QTCREATOR_UTILS_EXPORT QDebug operator<<(QDebug dbg, const Utils::FileName &c);
+// for withNTFSPermissions
+#ifdef Q_OS_WIN
+extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;
+#endif
+
QT_END_NAMESPACE
namespace Utils {
@@ -121,6 +126,28 @@ public:
static QString resolvePath(const QString &baseDir, const QString &fileName);
};
+// for actually finding out if e.g. directories are writable on Windows
+#ifdef Q_OS_WIN
+
+template <typename T>
+static T withNTFSPermissions(const std::function<T()> &task)
+{
+ qt_ntfs_permission_lookup++;
+ T result = task();
+ qt_ntfs_permission_lookup--;
+ return result;
+}
+
+#else // Q_OS_WIN
+
+template <typename T>
+static T withNTFSPermissions(const std::function<T()> &task)
+{
+ return task();
+}
+
+#endif // Q_OS_WIN
+
class QTCREATOR_UTILS_EXPORT FileReader
{
Q_DECLARE_TR_FUNCTIONS(Utils::FileUtils) // sic!
diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp
index 0aa9b46740..be5f6df961 100644
--- a/src/plugins/android/androidconfigurations.cpp
+++ b/src/plugins/android/androidconfigurations.cpp
@@ -100,18 +100,21 @@ namespace {
const QLatin1String ArmToolchainPrefix("arm-linux-androideabi");
const QLatin1String X86ToolchainPrefix("x86");
const QLatin1String MipsToolchainPrefix("mipsel-linux-android");
+ const QLatin1String Mips64ToolchainPrefix("mips64el-linux-android");
const QLatin1String AArch64ToolchainPrefix("aarch64-linux-android");
const QLatin1String X86_64ToolchainPrefix("x86_64");
const QLatin1String ArmToolsPrefix("arm-linux-androideabi");
const QLatin1String X86ToolsPrefix("i686-linux-android");
const QLatin1String MipsToolsPrefix("mipsel-linux-android");
+ const QLatin1String Mips64ToolsPrefix("mips64el-linux-android");
const QLatin1String AArch64ToolsPrefix("aarch64-linux-android");
const QLatin1String X86_64ToolsPrefix("x86_64-linux-android");
const QLatin1String ArmToolsDisplayName("arm");
const QLatin1String X86ToolsDisplayName("i686");
const QLatin1String MipsToolsDisplayName("mipsel");
+ const QLatin1String Mips64ToolsDisplayName("mips64el");
const QLatin1String AArch64ToolsDisplayName("aarch64");
const QLatin1String X86_64ToolsDisplayName("x86_64");
@@ -172,6 +175,9 @@ Abi AndroidConfig::abiForToolChainPrefix(const QString &toolchainPrefix)
} else if (toolchainPrefix == X86_64ToolchainPrefix) {
arch = Abi::X86Architecture;
wordWidth = 64;
+ } else if (toolchainPrefix == Mips64ToolchainPrefix) {
+ arch = Abi::MipsArchitecture;
+ wordWidth = 64;
}
return Abi(arch, Abi::LinuxOS, Abi::AndroidLinuxFlavor, Abi::ElfFormat, wordWidth);
@@ -189,6 +195,8 @@ QLatin1String AndroidConfig::toolchainPrefix(const Abi &abi)
return X86_64ToolchainPrefix;
return X86ToolchainPrefix;
case Abi::MipsArchitecture:
+ if (abi.wordWidth() == 64)
+ return Mips64ToolchainPrefix;
return MipsToolchainPrefix;
default:
return Unknown;
@@ -207,6 +215,8 @@ QLatin1String AndroidConfig::toolsPrefix(const Abi &abi)
return X86_64ToolsPrefix;
return X86ToolsPrefix;
case Abi::MipsArchitecture:
+ if (abi.wordWidth() == 64)
+ return Mips64ToolsPrefix;
return MipsToolsPrefix;
default:
return Unknown;
@@ -225,6 +235,8 @@ QLatin1String AndroidConfig::displayName(const Abi &abi)
return X86_64ToolsDisplayName;
return X86ToolsDisplayName;
case Abi::MipsArchitecture:
+ if (abi.wordWidth() == 64)
+ return Mips64ToolsDisplayName;
return MipsToolsDisplayName;
default:
return Unknown;
diff --git a/src/plugins/android/androidtoolchain.cpp b/src/plugins/android/androidtoolchain.cpp
index 0f8defe6d1..c8223dd81a 100644
--- a/src/plugins/android/androidtoolchain.cpp
+++ b/src/plugins/android/androidtoolchain.cpp
@@ -311,7 +311,7 @@ QList<AndroidToolChainFactory::AndroidToolChainInformation> AndroidToolChainFact
ati.version = fileName.mid(idx + 1);
QString platform = fileName.left(idx);
ati.abi = AndroidConfig::abiForToolChainPrefix(platform);
- if (ati.abi.architecture() == Abi::UnknownArchitecture) // e.g. mipsel which is not yet supported
+ if (ati.abi.architecture() == Abi::UnknownArchitecture)
continue;
ati.compilerCommand = AndroidConfigurations::currentConfig().gccPath(ati.abi, lang, ati.version);
result.append(ati);
@@ -399,7 +399,7 @@ AndroidToolChainFactory::autodetectToolChainsForNdk(const FileName &ndkPath,
QString version = fileName.mid(idx + 1);
QString platform = fileName.left(idx);
Abi abi = AndroidConfig::abiForToolChainPrefix(platform);
- if (abi.architecture() == Abi::UnknownArchitecture) // e.g. mipsel which is not yet supported
+ if (abi.architecture() == Abi::UnknownArchitecture)
continue;
QList<AndroidToolChain *> toolChainBundle;
for (Core::Id lang : {ProjectExplorer::Constants::CXX_LANGUAGE_ID, ProjectExplorer::Constants::C_LANGUAGE_ID}) {
@@ -447,7 +447,7 @@ QList<int> AndroidToolChainFactory::newestToolChainVersionForArch(const Abi &abi
QList<int> version = versionNumberFromString(fileName.mid(idx + 1));
QString platform = fileName.left(idx);
Abi abi = AndroidConfig::abiForToolChainPrefix(platform);
- if (abi.architecture() == Abi::UnknownArchitecture) // e.g. mipsel which is not yet supported
+ if (abi.architecture() == Abi::UnknownArchitecture)
continue;
QHash<Abi, QList<int> >::const_iterator it
= m_newestVersionForAbi.constFind(abi);
diff --git a/src/plugins/android/avddialog.cpp b/src/plugins/android/avddialog.cpp
index eb7da93e90..03d29d4e23 100644
--- a/src/plugins/android/avddialog.cpp
+++ b/src/plugins/android/avddialog.cpp
@@ -45,10 +45,12 @@ AvdDialog::AvdDialog(int minApiLevel, const QString &targetArch, const AndroidCo
m_hideTipTimer.setInterval(2000);
m_hideTipTimer.setSingleShot(true);
- if (targetArch.isEmpty())
- m_avdDialog.abiComboBox->addItems(QStringList({"armeabi-v7a", "armeabi", "x86", "mips"}));
- else
+ if (targetArch.isEmpty()) {
+ m_avdDialog.abiComboBox->addItems(QStringList({"armeabi-v7a", "armeabi", "x86", "mips",
+ "arm64-v8a", "x86_64", "mips64"}));
+ } else {
m_avdDialog.abiComboBox->addItems(QStringList(targetArch));
+ }
QRegExpValidator *v = new QRegExpValidator(m_allowedNameChars, this);
m_avdDialog.nameLineEdit->setValidator(v);
diff --git a/src/plugins/cmakeprojectmanager/cmakekitconfigwidget.cpp b/src/plugins/cmakeprojectmanager/cmakekitconfigwidget.cpp
index a3c0b396df..f0be80b42e 100644
--- a/src/plugins/cmakeprojectmanager/cmakekitconfigwidget.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakekitconfigwidget.cpp
@@ -279,11 +279,20 @@ QString CMakeGeneratorKitConfigWidget::toolTip() const
void CMakeGeneratorKitConfigWidget::changeGenerator()
{
QPointer<QDialog> changeDialog = new QDialog(m_changeButton);
+
+ // Disable help button in titlebar on windows:
+ Qt::WindowFlags flags = changeDialog->windowFlags();
+ flags &= ~Qt::WindowContextHelpButtonHint;
+ flags |= Qt::MSWindowsFixedSizeDialogHint;
+ changeDialog->setWindowFlags(flags);
+
changeDialog->setWindowTitle(tr("CMake Generator"));
auto *layout = new QGridLayout(changeDialog);
+ layout->setSizeConstraint(QLayout::SetFixedSize);
auto *cmakeLabel = new QLabel;
+ cmakeLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
auto *generatorCombo = new QComboBox;
auto *extraGeneratorCombo = new QComboBox;
diff --git a/src/plugins/coreplugin/find/searchresultwidget.cpp b/src/plugins/coreplugin/find/searchresultwidget.cpp
index 5bf7e49240..b09fc6e8fd 100644
--- a/src/plugins/coreplugin/find/searchresultwidget.cpp
+++ b/src/plugins/coreplugin/find/searchresultwidget.cpp
@@ -157,6 +157,7 @@ SearchResultWidget::SearchResultWidget(QWidget *parent) :
m_label = new QLabel(m_descriptionContainer);
m_label->setVisible(false);
m_searchTerm = new QLabel(m_descriptionContainer);
+ m_searchTerm->setTextFormat(Qt::PlainText);
m_searchTerm->setVisible(false);
descriptionLayout->addWidget(m_label);
descriptionLayout->addWidget(m_searchTerm);
diff --git a/src/plugins/git/gerrit/gerritmodel.cpp b/src/plugins/git/gerrit/gerritmodel.cpp
index 36e24ae292..7b7f61864d 100644
--- a/src/plugins/git/gerrit/gerritmodel.cpp
+++ b/src/plugins/git/gerrit/gerritmodel.cpp
@@ -546,7 +546,9 @@ static GerritUser parseGerritUser(const QJsonObject &object)
static int numberValue(const QJsonObject &object)
{
- return object.value("number").toString().toInt();
+ const QJsonValue number = object.value("number");
+ // Since Gerrit 2.14 (commits fa92467dc and b0cfe1401) the change and patch set numbers are int
+ return number.isString() ? number.toString().toInt() : number.toInt();
}
/* Parse gerrit query Json output.
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 0f838dcbb2..baf1e4edcc 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -86,7 +86,7 @@ const char stashNamePrefix[] = "stash@{";
const char noColorOption[] = "--no-color";
const char decorateOption[] = "--decorate";
const char showFormatC[] =
- "--pretty=format:commit %H%n"
+ "--pretty=format:commit %H%d%n"
"Author: %an <%ae>, %ad (%ar)%n"
"Committer: %cn <%ce>, %cd (%cr)%n"
"%n"
@@ -359,7 +359,7 @@ private:
void ShowController::reload()
{
- const QStringList args = {"show", "-s", noColorOption, decorateOption, showFormatC, m_id};
+ const QStringList args = {"show", "-s", noColorOption, showFormatC, m_id};
m_state = GettingDescription;
runCommand(QList<QStringList>() << args, GitPlugin::client()->encoding(m_directory, "i18n.commitEncoding"));
}
diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp
index 4e30062424..1fa2bcb37c 100644
--- a/src/plugins/git/gitplugin.cpp
+++ b/src/plugins/git/gitplugin.cpp
@@ -190,6 +190,7 @@ QString GitPlugin::invalidBranchAndRemoteNamePattern()
"|//" // no double slash
"|^[/-]" // no leading slash or dash
"|\"" // no quotes
+ "|\\*" // no asterisk
);
}
diff --git a/src/plugins/projectexplorer/abi.cpp b/src/plugins/projectexplorer/abi.cpp
index 070bea6bf3..4a99590d82 100644
--- a/src/plugins/projectexplorer/abi.cpp
+++ b/src/plugins/projectexplorer/abi.cpp
@@ -1187,6 +1187,14 @@ void ProjectExplorer::ProjectExplorerPlugin::testAbiFromTargetTriplet_data()
<< int(Abi::LinuxOS) << int(Abi::GenericLinuxFlavor)
<< int(Abi::ElfFormat) << 32;
+ QTest::newRow("mips64el-linux-android") << int(Abi::MipsArchitecture)
+ << int(Abi::LinuxOS) << int(Abi::AndroidLinuxFlavor)
+ << int(Abi::ElfFormat) << 64;
+
+ QTest::newRow("mips64el-unknown-linux-android") << int(Abi::MipsArchitecture)
+ << int(Abi::LinuxOS) << int(Abi::AndroidLinuxFlavor)
+ << int(Abi::ElfFormat) << 64;
+
QTest::newRow("mips64-linux-octeon-gnu") << int(Abi::MipsArchitecture)
<< int(Abi::LinuxOS) << int(Abi::GenericLinuxFlavor)
<< int(Abi::ElfFormat) << 64;
diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp
index a190434efd..9240aa7563 100644
--- a/src/plugins/projectexplorer/gcctoolchain.cpp
+++ b/src/plugins/projectexplorer/gcctoolchain.cpp
@@ -972,8 +972,13 @@ QList<ToolChain *> GccToolChainFactory::autoDetectToolchains(const QString &comp
return tc->typeId() == requiredTypeId
&& tc->compilerCommand() == compilerPath;
});
- if (!result.isEmpty())
+ if (!result.isEmpty()) {
+ for (ToolChain *tc : result) {
+ if (tc->isAutoDetected())
+ tc->setLanguage(language);
+ }
return result;
+ }
result = autoDetectToolChain(compilerPath, language, requiredAbi);
@@ -1632,6 +1637,10 @@ void ProjectExplorerPlugin::testGccAbiGuessing_data()
<< QString::fromLatin1("powerpc64-suse-linux")
<< QByteArray("#define __SIZEOF_SIZE_T__ 8\n")
<< QStringList({"ppc-linux-generic-elf-64bit"});
+ QTest::newRow("Linux 11 (64bit mips)")
+ << QString::fromLatin1("mips64el-linux-uclibc")
+ << QByteArray("#define __SIZEOF_SIZE_T__ 8")
+ << QStringList({"mips-linux-generic-elf-64bit"});
QTest::newRow("Mingw 1 (32bit)")
<< QString::fromLatin1("i686-w64-mingw32")
diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardgeneratorfactory.cpp b/src/plugins/projectexplorer/jsonwizard/jsonwizardgeneratorfactory.cpp
index c58395d8a5..6d96f67114 100644
--- a/src/plugins/projectexplorer/jsonwizard/jsonwizardgeneratorfactory.cpp
+++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardgeneratorfactory.cpp
@@ -212,18 +212,15 @@ JsonWizardGenerator::OverwriteResult JsonWizardGenerator::promptForOverwrite(Jso
if (overwriteDialog.exec() != QDialog::Accepted)
return OverwriteCanceled;
- const QStringList existingFilesToKeep = overwriteDialog.uncheckedFiles();
+ const QSet<QString> existingFilesToKeep = QSet<QString>::fromList(overwriteDialog.uncheckedFiles());
if (existingFilesToKeep.size() == files->size()) // All exist & all unchecked->Cancel.
return OverwriteCanceled;
// Set 'keep' attribute in files
- foreach (const QString &keepFile, existingFilesToKeep) {
- JsonWizard::GeneratorFile file
- = Utils::findOr(*files, JsonWizard::GeneratorFile(),
- [&keepFile](const JsonWizard::GeneratorFile &f)
- { return f.file.path() == keepFile; });
- if (!file.isValid())
- return OverwriteCanceled;
+ for (JsonWizard::GeneratorFile &file : *files) {
+ if (!existingFilesToKeep.contains(file.file.path()))
+ continue;
+
file.file.setAttributes(file.file.attributes() | GeneratedFile::KeepExistingFileAttribute);
}
return OverwriteOk;
diff --git a/src/plugins/projectexplorer/msvctoolchain.cpp b/src/plugins/projectexplorer/msvctoolchain.cpp
index af5c567f48..e931a0bd30 100644
--- a/src/plugins/projectexplorer/msvctoolchain.cpp
+++ b/src/plugins/projectexplorer/msvctoolchain.cpp
@@ -624,7 +624,10 @@ Utils::FileNameList MsvcToolChain::suggestedMkspecList() const
<< Utils::FileName::fromLatin1("winrt-x64-msvc2015");
break;
case Abi::WindowsMsvc2017Flavor:
- result << Utils::FileName::fromLatin1("win32-msvc2017");
+ result << Utils::FileName::fromLatin1("win32-msvc2017")
+ << Utils::FileName::fromLatin1("winrt-arm-msvc2017")
+ << Utils::FileName::fromLatin1("winrt-x86-msvc2017")
+ << Utils::FileName::fromLatin1("winrt-x64-msvc2017");
break;
default:
result.clear();
diff --git a/src/plugins/projectexplorer/projectwindow.cpp b/src/plugins/projectexplorer/projectwindow.cpp
index 7cbfcef34b..064e1cfffc 100644
--- a/src/plugins/projectexplorer/projectwindow.cpp
+++ b/src/plugins/projectexplorer/projectwindow.cpp
@@ -439,6 +439,8 @@ public:
void updatePanel()
{
ProjectItem *projectItem = m_projectsModel.rootItem()->childAt(0);
+ if (!projectItem)
+ return;
setPanel(projectItem->data(0, PanelWidgetRole).value<QWidget *>());
QModelIndex activeIndex = projectItem->activeIndex();
diff --git a/src/plugins/projectexplorer/toolchain.cpp b/src/plugins/projectexplorer/toolchain.cpp
index cb63643704..53e03e16ad 100644
--- a/src/plugins/projectexplorer/toolchain.cpp
+++ b/src/plugins/projectexplorer/toolchain.cpp
@@ -133,7 +133,7 @@ ToolChain::ToolChain(const ToolChain &other) :
void ToolChain::setLanguage(Core::Id language)
{
- QTC_ASSERT(!d->m_language.isValid(), return);
+ QTC_ASSERT(!d->m_language.isValid() || isAutoDetected(), return);
QTC_ASSERT(language.isValid(), return);
QTC_ASSERT(ToolChainManager::isLanguageSupported(language), return);
diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp
index 341ef74652..6022602f51 100644
--- a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp
@@ -258,7 +258,7 @@ bool QmakeProjectManagerPlugin::initialize(const QStringList &arguments, QString
connect(EditorManager::instance(), &EditorManager::currentEditorChanged,
this, &QmakeProjectManagerPlugin::updateBuildFileAction);
- updateRunQMakeAction();
+ updateActions();
return true;
}
@@ -277,9 +277,12 @@ void QmakeProjectManagerPlugin::projectChanged()
else
m_previousStartupProject = qobject_cast<QmakeProject *>(SessionManager::startupProject());
- if (m_previousStartupProject)
+ if (m_previousStartupProject) {
connect(m_previousStartupProject, &Project::activeTargetChanged,
this, &QmakeProjectManagerPlugin::activeTargetChanged);
+ connect(m_previousStartupProject, &QmakeProject::parsingFinished,
+ this, &QmakeProjectManagerPlugin::updateActions);
+ }
activeTargetChanged();
}
@@ -299,6 +302,12 @@ void QmakeProjectManagerPlugin::activeTargetChanged()
updateRunQMakeAction();
}
+void QmakeProjectManagerPlugin::updateActions()
+{
+ updateRunQMakeAction();
+ updateContextActions();
+}
+
void QmakeProjectManagerPlugin::updateRunQMakeAction()
{
bool enable = true;
@@ -307,6 +316,7 @@ void QmakeProjectManagerPlugin::updateRunQMakeAction()
auto pro = qobject_cast<QmakeProject *>(m_previousStartupProject);
m_runQMakeAction->setVisible(pro);
if (!pro
+ || !pro->rootProjectNode()
|| !pro->activeTarget()
|| !pro->activeTarget()->activeBuildConfiguration())
enable = false;
@@ -334,7 +344,11 @@ void QmakeProjectManagerPlugin::updateContextActions()
FileNode *fileNode = node ? node->asFileNode() : nullptr;
bool buildFilePossible = subProjectNode && fileNode && (fileNode->fileType() == FileType::Source);
- bool subProjectActionsVisible = qmakeProject && subProjectNode && (subProjectNode != qmakeProject->rootProjectNode());
+ bool subProjectActionsVisible = false;
+ if (qmakeProject && subProjectNode) {
+ if (QmakeProFileNode *rootNode = qmakeProject->rootProjectNode())
+ subProjectActionsVisible = subProjectNode != rootNode;
+ }
QString subProjectName;
if (subProjectActionsVisible)
diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.h b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.h
index 73e60b4bac..b6d94a9aea 100644
--- a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.h
+++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.h
@@ -65,6 +65,7 @@ private slots:
private:
void projectChanged();
void activeTargetChanged();
+ void updateActions();
void updateRunQMakeAction();
void updateContextActions();
void buildStateChanged(ProjectExplorer::Project *pro);
diff --git a/src/plugins/qmakeprojectmanager/qmakestep.cpp b/src/plugins/qmakeprojectmanager/qmakestep.cpp
index 25c9a34cbc..99dab8044d 100644
--- a/src/plugins/qmakeprojectmanager/qmakestep.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakestep.cpp
@@ -256,6 +256,7 @@ bool QMakeStep::init(QList<const BuildStep *> &earlierSteps)
QmakeProFileNode *node = static_cast<QmakeProject *>(qmakeBc->target()->project())->rootProjectNode();
if (qmakeBc->subNodeBuild())
node = qmakeBc->subNodeBuild();
+ QTC_ASSERT(node, return false);
QString proFile = node->filePath().toString();
QList<ProjectExplorer::Task> tasks = qtVersion->reportIssues(proFile, workingDirectory);
diff --git a/src/plugins/qtsupport/gettingstartedwelcomepage.cpp b/src/plugins/qtsupport/gettingstartedwelcomepage.cpp
index 4561ce5a0f..c5ca314c05 100644
--- a/src/plugins/qtsupport/gettingstartedwelcomepage.cpp
+++ b/src/plugins/qtsupport/gettingstartedwelcomepage.cpp
@@ -28,6 +28,7 @@
#include "exampleslistmodel.h"
#include "screenshotcropper.h"
+#include <utils/fileutils.h>
#include <utils/pathchooser.h>
#include <utils/winutils.h>
@@ -199,13 +200,16 @@ void ExamplesWelcomePage::openProject(const ExampleItem &item)
if (!proFileInfo.exists())
return;
- QFileInfo pathInfo(proFileInfo.path());
// If the Qt is a distro Qt on Linux, it will not be writable, hence compilation will fail
- if (!proFileInfo.isWritable()
- || !pathInfo.isWritable() /* path of .pro file */
- || !QFileInfo(pathInfo.path()).isWritable() /* shadow build directory */) {
+ // Same if it is installed in non-writable location for other reasons
+ const bool needsCopy = withNTFSPermissions<bool>([proFileInfo] {
+ QFileInfo pathInfo(proFileInfo.path());
+ return !proFileInfo.isWritable()
+ || !pathInfo.isWritable() /* path of .pro file */
+ || !QFileInfo(pathInfo.path()).isWritable() /* shadow build directory */;
+ });
+ if (needsCopy)
proFile = copyToAlternativeLocation(proFileInfo, filesToOpen, item.dependencies);
- }
// don't try to load help and files if loading the help request is being cancelled
if (proFile.isEmpty())
diff --git a/src/plugins/valgrind/valgrindengine.cpp b/src/plugins/valgrind/valgrindengine.cpp
index 8fe8d4e2a7..569b0d21f6 100644
--- a/src/plugins/valgrind/valgrindengine.cpp
+++ b/src/plugins/valgrind/valgrindengine.cpp
@@ -87,7 +87,8 @@ void ValgrindToolRunner::start()
run->setValgrindExecutable(m_settings->valgrindExecutable());
run->setValgrindArguments(genericToolArguments() + toolArguments());
run->setDevice(device());
- run->setDebuggee(runControl()->runnable().as<StandardRunnable>());
+ if (runControl()->runnable().is<StandardRunnable>())
+ run->setDebuggee(runControl()->runnable().as<StandardRunnable>());
connect(run, &ValgrindRunner::processOutputReceived,
this, &ValgrindToolRunner::receiveProcessOutput);
@@ -113,7 +114,9 @@ void ValgrindToolRunner::stop()
QString ValgrindToolRunner::executable() const
{
- return runControl()->runnable().as<StandardRunnable>().executable;
+ const Runnable &runnable = runControl()->runnable();
+ return runnable.is<StandardRunnable>() ?
+ runnable.as<StandardRunnable>().executable : QString();
}
QStringList ValgrindToolRunner::genericToolArguments() const
diff --git a/src/shared/qbs b/src/shared/qbs
-Subproject da5e38c5618b1ebc81f0049af3b959a65b90539
+Subproject 7687d8a145d1b00f855b306f9f364830f8dec8c