aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorThe Qt Project <gerrit-noreply@qt-project.org>2020-02-05 11:00:37 +0000
committerThe Qt Project <gerrit-noreply@qt-project.org>2020-02-05 11:00:37 +0000
commit183048b58754bacf98088c7a6d5564777eef4be9 (patch)
tree985161b6bda3e83ba56ee32b85ffa463a1638ea4 /src
parent3449618a85c6885b56f5fff3b5d3877accb9dd0f (diff)
parent5c121d57911d91f19b066803ad38ca4815255dde (diff)
Merge "Merge remote-tracking branch 'origin/4.11'"
Diffstat (limited to 'src')
-rw-r--r--src/libs/languageserverprotocol/servercapabilities.cpp2
-rw-r--r--src/plugins/android/androidbuildapkstep.cpp79
-rw-r--r--src/plugins/android/androidbuildapkstep.h1
-rw-r--r--src/plugins/android/androidmanager.cpp43
-rw-r--r--src/plugins/android/androidmanager.h2
-rw-r--r--src/plugins/baremetal/keiltoolchain.cpp99
-rw-r--r--src/plugins/debugger/debuggerengine.cpp6
-rw-r--r--src/plugins/debugger/peripheralregisterhandler.cpp261
-rw-r--r--src/plugins/genericprojectmanager/genericproject.cpp10
-rw-r--r--src/plugins/languageclient/client.cpp1
-rw-r--r--src/plugins/projectexplorer/sessionmodel.cpp1
-rw-r--r--src/plugins/remotelinux/makeinstallstep.cpp3
12 files changed, 307 insertions, 201 deletions
diff --git a/src/libs/languageserverprotocol/servercapabilities.cpp b/src/libs/languageserverprotocol/servercapabilities.cpp
index a8e932ad50a..a000ad2c891 100644
--- a/src/libs/languageserverprotocol/servercapabilities.cpp
+++ b/src/libs/languageserverprotocol/servercapabilities.cpp
@@ -162,7 +162,7 @@ bool ServerCapabilities::isValid(QStringList *error) const
&& checkOptional<bool>(error, documentHighlightProviderKey)
&& checkOptional<bool>(error, documentSymbolProviderKey)
&& checkOptional<bool>(error, workspaceSymbolProviderKey)
- && checkOptional<bool>(error, codeActionProviderKey)
+ && checkOptional<bool, CodeActionOptions>(error, codeActionProviderKey)
&& checkOptional<CodeLensOptions>(error, codeLensProviderKey)
&& checkOptional<bool>(error, documentFormattingProviderKey)
&& checkOptional<bool>(error, documentRangeFormattingProviderKey)
diff --git a/src/plugins/android/androidbuildapkstep.cpp b/src/plugins/android/androidbuildapkstep.cpp
index 0b8281fcb46..027de1edc9b 100644
--- a/src/plugins/android/androidbuildapkstep.cpp
+++ b/src/plugins/android/androidbuildapkstep.cpp
@@ -226,11 +226,10 @@ bool AndroidBuildApkStep::init()
QString outputDir = bc->buildDirectory().pathAppended(Constants::ANDROID_BUILDDIRECTORY).toString();
- QString inputFile;
if (node)
- inputFile = node->data(Constants::AndroidDeploySettingsFile).toString();
+ m_inputFile = node->data(Constants::AndroidDeploySettingsFile).toString();
- if (inputFile.isEmpty()) {
+ if (m_inputFile.isEmpty()) {
m_skipBuilding = true;
return true;
}
@@ -242,7 +241,7 @@ bool AndroidBuildApkStep::init()
return false;
}
- QStringList arguments = {"--input", inputFile,
+ QStringList arguments = {"--input", m_inputFile,
"--output", outputDir,
"--android-platform", AndroidManager::buildTargetSDK(target()),
"--jdk", AndroidConfigurations::currentConfig().openJDKLocation().toString()};
@@ -358,6 +357,8 @@ bool AndroidBuildApkStep::verifyCertificatePassword()
static bool copyFileIfNewer(const QString &sourceFileName,
const QString &destinationFileName)
{
+ if (sourceFileName == destinationFileName)
+ return true;
if (QFile::exists(destinationFileName)) {
QFileInfo destinationFileInfo(destinationFileName);
QFileInfo sourceFileInfo(sourceFileName);
@@ -398,48 +399,56 @@ void AndroidBuildApkStep::doRun()
if (!node)
return false;
- FilePath deploymentSettingsFile = FilePath::fromString(node->data(Android::Constants::AndroidDeploySettingsFile).toString());
- if (deploymentSettingsFile.exists())
- return true; // cmake creates this file for us
+ bool inputExists = QFile::exists(m_inputFile);
+ if (inputExists && !AndroidManager::isQtCreatorGenerated(FilePath::fromString(m_inputFile)))
+ return true; // use the generated file if it was not generated by qtcreator
auto targets = node->data(Android::Constants::AndroidTargets).toStringList();
if (targets.isEmpty())
- return true; // qmake does this job for us
+ return inputExists; // qmake does this job for us
- QJsonObject deploySettings = Android::AndroidManager::deploymentSettings(target());
- QJsonObject architectures;
- // Copy targets to android build folder
- QString applicationBinary = target()->activeRunConfiguration()->buildTargetInfo().targetFilePath.toFileInfo().fileName();
- for (const auto &abi : androidAbis) {
- QString targetSuffix = QString{"_%1.so"}.arg(abi);
- if (applicationBinary.endsWith(targetSuffix)) {
- // Keep only TargetName from "lib[TargetName]_abi.so"
- applicationBinary.remove(0, 3).chop(targetSuffix.size());
- }
+ QtSupport::BaseQtVersion *version = QtSupport::QtKitAspect::qtVersion(target()->kit());
+ if (!version)
+ return false;
- Utils::FilePath androidLibsDir = bc->buildDirectory()
- .pathAppended("android-build/libs")
- .pathAppended(abi);
+ QJsonObject deploySettings = Android::AndroidManager::deploymentSettings(target());
+ QString applicationBinary;
+ if (version->qtVersion() < QtSupport::QtVersionNumber(5, 14, 0)) {
+ QTC_ASSERT(androidAbis.size() == 1, return false);
+ applicationBinary = target()->activeRunConfiguration()->buildTargetInfo().targetFilePath.toString();
+ Utils::FilePath androidLibsDir = bc->buildDirectory().pathAppended("android-build/libs").pathAppended(androidAbis.first());
for (const auto &target : targets) {
- if (target.endsWith(targetSuffix)) {
- if (!copyFileIfNewer(target, androidLibsDir.pathAppended(QFileInfo{target}.fileName()).toString()))
- return false;
- if (abi == "x86") {
- architectures[abi] = "i686-linux-android";
- } else if (abi == "x86_64") {
- architectures[abi] = "x86_64-linux-android";
- } else if (abi == "arm64-v8a") {
- architectures[abi] = "aarch64-linux-android";
- } else {
- architectures[abi] = "arm-linux-androideabi";
+ if (!copyFileIfNewer(target, androidLibsDir.pathAppended(QFileInfo{target}.fileName()).toString()))
+ return false;
+ }
+ deploySettings["target-architecture"] = androidAbis.first();
+ } else {
+ applicationBinary = target()->activeRunConfiguration()->buildTargetInfo().targetFilePath.toFileInfo().fileName();
+ QJsonObject architectures;
+
+ // Copy targets to android build folder
+ for (const auto &abi : androidAbis) {
+ QString targetSuffix = QString{"_%1.so"}.arg(abi);
+ if (applicationBinary.endsWith(targetSuffix)) {
+ // Keep only TargetName from "lib[TargetName]_abi.so"
+ applicationBinary.remove(0, 3).chop(targetSuffix.size());
+ }
+
+ Utils::FilePath androidLibsDir = bc->buildDirectory()
+ .pathAppended("android-build/libs")
+ .pathAppended(abi);
+ for (const auto &target : targets) {
+ if (target.endsWith(targetSuffix)) {
+ if (!copyFileIfNewer(target, androidLibsDir.pathAppended(QFileInfo{target}.fileName()).toString()))
+ return false;
+ architectures[abi] = AndroidManager::archTriplet(abi);
}
}
}
+ deploySettings["architectures"] = architectures;
}
-
deploySettings["application-binary"] = applicationBinary;
- deploySettings["architectures"] = architectures;
QString extraLibs = node->data(Android::Constants::AndroidExtraLibs).toString();
if (!extraLibs.isEmpty())
@@ -458,7 +467,7 @@ void AndroidBuildApkStep::doRun()
qmlRootPath = target()->project()->rootProjectDirectory().toString();
deploySettings["qml-root-path"] = qmlRootPath;
- QFile f{deploymentSettingsFile.toString()};
+ QFile f{m_inputFile};
if (!f.open(QIODevice::WriteOnly))
return false;
f.write(QJsonDocument{deploySettings}.toJson());
diff --git a/src/plugins/android/androidbuildapkstep.h b/src/plugins/android/androidbuildapkstep.h
index e8a04ac1c7c..49ef9dc94e9 100644
--- a/src/plugins/android/androidbuildapkstep.h
+++ b/src/plugins/android/androidbuildapkstep.h
@@ -108,6 +108,7 @@ private:
QString m_command;
QString m_argumentsPasswordConcealed;
bool m_skipBuilding = false;
+ QString m_inputFile;
};
namespace Internal {
diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp
index 4ecf2a04800..20be799b028 100644
--- a/src/plugins/android/androidmanager.cpp
+++ b/src/plugins/android/androidmanager.cpp
@@ -54,17 +54,18 @@
#include <utils/qtcassert.h>
#include <utils/synchronousprocess.h>
+#include <QApplication>
#include <QDir>
+#include <QDomDocument>
#include <QFileSystemWatcher>
+#include <QJsonDocument>
#include <QList>
#include <QLoggingCategory>
+#include <QMessageBox>
#include <QProcess>
#include <QRegExp>
-#include <QMessageBox>
-#include <QApplication>
-#include <QDomDocument>
-#include <QVersionNumber>
#include <QRegularExpression>
+#include <QVersionNumber>
namespace {
const QLatin1String AndroidManifestName("AndroidManifest.xml");
@@ -76,6 +77,7 @@ namespace {
const QString activityRegEx("(?<token>launchable-activity: )(.*?)(name=)'(?<target>.*?)'");
const QString apkVersionRegEx("(?<token>package: )(.*?)(versionCode=)'(?<target>.*?)'");
const QString versionCodeRegEx("(?<token>versionCode=)(?<version>\\d*)");
+ const QString qtcSignature("This file is generated by QtCreator to be read by androiddeployqt and should not be modified by hand.");
static Q_LOGGING_CATEGORY(androidManagerLog, "qtc.android.androidManager", QtWarningMsg)
@@ -266,6 +268,18 @@ QStringList AndroidManager::applicationAbis(const Target *target)
return qt->androidAbis();
}
+QString AndroidManager::archTriplet(const QString &abi)
+{
+ if (abi == "x86") {
+ return {"i686-linux-android"};
+ } else if (abi == "x86_64") {
+ return {"x86_64-linux-android"};
+ } else if (abi == "arm64-v8a") {
+ return {"aarch64-linux-android"};
+ }
+ return {"arm-linux-androideabi"};
+}
+
QJsonObject AndroidManager::deploymentSettings(const Target *target)
{
QtSupport::BaseQtVersion *qt = QtSupport::QtKitAspect::qtVersion(target->kit());
@@ -276,11 +290,20 @@ QJsonObject AndroidManager::deploymentSettings(const Target *target)
if (!tc || tc->typeId() != Constants::ANDROID_TOOLCHAIN_TYPEID)
return {};
QJsonObject settings;
- settings["_description"] = "This file is generated by QtCreator to be read by androiddeployqt and should not be modified by hand.";
+ settings["_description"] = qtcSignature;
settings["qt"] = qt->prefix().toString();
settings["ndk"] = AndroidConfigurations::currentConfig().ndkLocation().toString();
settings["sdk"] = AndroidConfigurations::currentConfig().sdkLocation().toString();
- settings["stdcpp-path"] = AndroidConfigurations::currentConfig().toolchainPath().pathAppended("sysroot/usr/lib/").toString();
+ if (qt->qtVersion() < QtSupport::QtVersionNumber(5, 14, 0)) {
+ const QStringList abis = applicationAbis(target);
+ QTC_ASSERT(abis.size() == 1, return {});
+ settings["stdcpp-path"] = AndroidConfigurations::currentConfig().toolchainPath()
+ .pathAppended("sysroot/usr/lib/")
+ .pathAppended(archTriplet(abis.first()))
+ .pathAppended("libc++_shared.so").toString();
+ } else {
+ settings["stdcpp-path"] = AndroidConfigurations::currentConfig().toolchainPath().pathAppended("sysroot/usr/lib/").toString();
+ }
settings["toolchain-prefix"] = "llvm";
settings["tool-prefix"] = "llvm";
settings["useLLVM"] = true;
@@ -288,6 +311,14 @@ QJsonObject AndroidManager::deploymentSettings(const Target *target)
return settings;
}
+bool AndroidManager::isQtCreatorGenerated(const FilePath &deploymentFile)
+{
+ QFile f{deploymentFile.toString()};
+ if (!f.open(QIODevice::ReadOnly))
+ return false;
+ return QJsonDocument::fromJson(f.readAll()).object()["_description"].toString() == qtcSignature;
+}
+
Utils::FilePath AndroidManager::dirPath(const ProjectExplorer::Target *target)
{
if (auto *bc = target->activeBuildConfiguration())
diff --git a/src/plugins/android/androidmanager.h b/src/plugins/android/androidmanager.h
index 718e518e77a..e141636c176 100644
--- a/src/plugins/android/androidmanager.h
+++ b/src/plugins/android/androidmanager.h
@@ -96,6 +96,7 @@ public:
static int minimumSDK(const ProjectExplorer::Kit *kit);
static QStringList applicationAbis(const ProjectExplorer::Target *target);
+ static QString archTriplet(const QString &abi);
static Utils::FilePath dirPath(const ProjectExplorer::Target *target);
static Utils::FilePath manifestPath(ProjectExplorer::Target *target);
@@ -126,6 +127,7 @@ public:
static SdkToolResult runAaptCommand(const QStringList &args, int timeoutS = 30);
static QJsonObject deploymentSettings(const ProjectExplorer::Target *target);
+ static bool isQtCreatorGenerated(const Utils::FilePath &deploymentFile);
private:
static SdkToolResult runCommand(const Utils::CommandLine &command,
diff --git a/src/plugins/baremetal/keiltoolchain.cpp b/src/plugins/baremetal/keiltoolchain.cpp
index eb6afe8e0ed..80ae51240eb 100644
--- a/src/plugins/baremetal/keiltoolchain.cpp
+++ b/src/plugins/baremetal/keiltoolchain.cpp
@@ -401,48 +401,89 @@ KeilToolchainFactory::KeilToolchainFactory()
setUserCreatable(true);
}
+// Parse the 'tools.ini' file to fetch a toolchain version.
+// Note: We can't use QSettings here!
+static QString extractVersion(const QString &toolsFile, const QString &section)
+{
+ QFile f(toolsFile);
+ if (!f.open(QIODevice::ReadOnly))
+ return {};
+ QTextStream in(&f);
+ enum State { Enter, Lookup, Exit } state = Enter;
+ while (!in.atEnd()) {
+ const QString line = in.readLine().trimmed();
+ // Search for section.
+ const int firstBracket = line.indexOf('[');
+ const int lastBracket = line.lastIndexOf(']');
+ const bool hasSection = (firstBracket == 0 && lastBracket != -1
+ && (lastBracket + 1) == line.size());
+ switch (state) {
+ case Enter:
+ if (hasSection) {
+ const auto content = line.midRef(firstBracket + 1,
+ lastBracket - firstBracket - 1);
+ if (content == section)
+ state = Lookup;
+ }
+ break;
+ case Lookup: {
+ if (hasSection)
+ return {}; // Next section found.
+ const int versionIndex = line.indexOf("VERSION=");
+ if (versionIndex < 0)
+ continue;
+ QString version = line.mid(8);
+ if (version.startsWith('V'))
+ version.remove(0, 1);
+ return version;
+ }
+ break;
+ default:
+ return {};
+ }
+ }
+ return {};
+}
+
QList<ToolChain *> KeilToolchainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown)
{
#ifdef Q_OS_WIN64
- static const char kRegistryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Keil\\Products";
+ static const char kRegistryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Microsoft\\" \
+ "Windows\\CurrentVersion\\Uninstall\\Keil µVision4";
#else
- static const char kRegistryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Keil\\Products";
+ static const char kRegistryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\" \
+ "Windows\\CurrentVersion\\Uninstall\\Keil µVision4";
#endif
- struct Entry {
- QString productKey;
- QString subExePath;
- };
-
- // Dictionary for know toolchains.
- static const std::array<Entry, 2> knowToolchains = {{
- {QString("MDK"), QString("\\ARMCC\\bin\\armcc.exe")},
- {QString("C51"), QString("\\BIN\\c51.exe")},
- }};
-
Candidates candidates;
QSettings registry(kRegistryNode, QSettings::NativeFormat);
const auto productGroups = registry.childGroups();
for (const QString &productKey : productGroups) {
- const Entry entry = Utils::findOrDefault(knowToolchains,
- [productKey](const Entry &entry) {
- return entry.productKey == productKey; });
-
- if (entry.productKey.isEmpty())
+ if (!productKey.startsWith("App"))
continue;
-
registry.beginGroup(productKey);
- QString compilerPath = registry.value("Path").toString();
- if (!compilerPath.isEmpty()) {
- // Build full compiler path.
- compilerPath += entry.subExePath;
- const FilePath fn = FilePath::fromString(compilerPath);
- if (compilerExists(fn)) {
- QString version = registry.value("Version").toString();
- if (version.startsWith('V'))
- version.remove(0, 1);
- candidates.push_back({fn, version});
+ const FilePath productPath(FilePath::fromString(registry.value("ProductDir")
+ .toString()));
+ // Fetch the toolchain executable path.
+ FilePath compilerPath;
+ if (productPath.endsWith("ARM"))
+ compilerPath = productPath.pathAppended("\\ARMCC\\bin\\armcc.exe");
+ else if (productPath.endsWith("C51"))
+ compilerPath = productPath.pathAppended("\\BIN\\c51.exe");
+
+ if (compilerPath.exists()) {
+ // Fetch the toolchain version.
+ const QDir rootDir(registry.value("Directory").toString());
+ const QString toolsFilePath = rootDir.absoluteFilePath("tools.ini");
+ for (auto index = 1; index <= 2; ++index) {
+ const QString section = registry.value(
+ QStringLiteral("Section %1").arg(index)).toString();
+ const QString version = extractVersion(toolsFilePath, section);
+ if (!version.isEmpty()) {
+ candidates.push_back({compilerPath, version});
+ break;
+ }
}
}
registry.endGroup();
diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp
index c53e4dfe289..69573db219a 100644
--- a/src/plugins/debugger/debuggerengine.cpp
+++ b/src/plugins/debugger/debuggerengine.cpp
@@ -2286,6 +2286,12 @@ void DebuggerEngine::openDisassemblerView(const Location &location)
void DebuggerEngine::raiseWatchersWindow()
{
if (d->m_watchersView && d->m_watchersWindow) {
+ auto currentPerspective = DebuggerMainWindow::currentPerspective();
+ QTC_ASSERT(currentPerspective, return);
+ // if a companion engine has taken over - do not raise the watchers
+ if (currentPerspective->name() != d->m_engine->displayName())
+ return;
+
if (auto dock = qobject_cast<QDockWidget *>(d->m_watchersWindow->parentWidget())) {
if (QAction *act = dock->toggleViewAction()) {
if (!act->isChecked())
diff --git a/src/plugins/debugger/peripheralregisterhandler.cpp b/src/plugins/debugger/peripheralregisterhandler.cpp
index 0e0f035a979..fa9427a6e2a 100644
--- a/src/plugins/debugger/peripheralregisterhandler.cpp
+++ b/src/plugins/debugger/peripheralregisterhandler.cpp
@@ -52,6 +52,8 @@ constexpr char kBitRange[] = "bitRange";
constexpr char kBitWidth[] = "bitWidth";
constexpr char kDerivedFrom[] = "derivedFrom";
constexpr char kDescription[] = "description";
+constexpr char kDevice[] = "device";
+constexpr char kDisplayName[] = "displayName";
constexpr char kField[] = "field";
constexpr char kFields[] = "fields";
constexpr char kGroupName[] = "groupName";
@@ -559,135 +561,147 @@ PeripheralRegisterHandler::PeripheralRegisterHandler(DebuggerEngine *engine)
setHeader({tr("Name"), tr("Value"), tr("Access")});
}
-static PeripheralRegisterGroups availablePeripheralRegisterGroups(
- const QString &filePath)
-{
- QFile f(filePath);
- if (!f.open(QIODevice::ReadOnly))
- return {};
+static void handleField(QXmlStreamReader &in, PeripheralRegister &reg)
+{
+ PeripheralRegisterField fld;
+ while (in.readNextStartElement()) {
+ const auto elementName = in.name();
+ if (elementName == kName) {
+ fld.name = in.readElementText();
+ } else if (elementName == kDescription) {
+ fld.description = in.readElementText();
+ } else if (elementName == kAccess) {
+ fld.access = decodeAccess(in.readElementText());
+ } else if (elementName == kBitRange) {
+ const QString elementText = in.readElementText();
+ const int startBracket = elementText.indexOf('[');
+ const int endBracket = elementText.indexOf(']');
+ if (startBracket == -1 || endBracket == -1 || (endBracket - startBracket) <= 0)
+ continue;
+ const QString range = elementText.mid(startBracket + 1, endBracket - 1);
+ const QStringList items = range.split(':');
+ enum { MaxBit, MinBit, BitsCount };
+ if (items.count() != BitsCount)
+ continue;
+ const int from = int(decodeNumeric(items.at(MinBit)));
+ const int to = int(decodeNumeric(items.at(MaxBit)));
+ fld.bitOffset = from;
+ fld.bitWidth = to - from + 1;
+ } else if (elementName == kBitOffset) {
+ fld.bitOffset = int(decodeNumeric(in.readElementText()));
+ } else if (elementName == kBitWidth) {
+ fld.bitWidth = int(decodeNumeric(in.readElementText()));
+ } else {
+ in.skipCurrentElement();
+ }
+ }
- QXmlStreamReader in(&f);
+ // Inherit the field access from the register access if the filed
+ // has not the access rights description.
+ if (fld.access == PeripheralRegisterAccess::Unknown)
+ fld.access = reg.access;
+
+ reg.fields.push_back(fld);
+}
+
+static void handleRegister(QXmlStreamReader &in, PeripheralRegisterGroup &group)
+{
+ PeripheralRegister reg;
+ while (in.readNextStartElement()) {
+ const auto elementName = in.name();
+ if (elementName == kName) {
+ reg.name = in.readElementText();
+ } else if (elementName == kDisplayName) {
+ reg.displayName = in.readElementText();
+ } else if (elementName == kDescription) {
+ reg.description = in.readElementText();
+ } else if (elementName == kAddressOffset) {
+ reg.addressOffset = decodeNumeric(in.readElementText());
+ } else if (elementName == kSize) {
+ reg.size = int(decodeNumeric(in.readElementText()));
+ } else if (elementName == kAccess) {
+ reg.access = decodeAccess(in.readElementText());
+ } else if (elementName == kResetvalue) {
+ reg.resetValue = decodeNumeric(in.readElementText());
+ } else if (elementName == kFields) {
+ while (in.readNextStartElement()) {
+ const auto elementName = in.name();
+ if (elementName == kField)
+ handleField(in, reg);
+ else
+ in.skipCurrentElement();
+ }
+ } else {
+ in.skipCurrentElement();
+ }
+ }
+ group.registers.push_back(reg);
+}
+
+static void handleGroup(QXmlStreamReader &in, PeripheralRegisterGroups &groups)
+{
+ PeripheralRegisterGroup group;
- PeripheralRegisterGroups foundGroups;
+ const auto fromGroupName = in.attributes().value(kDerivedFrom);
+ if (!fromGroupName.isEmpty()) {
+ const auto groupEnd = groups.cend();
+ const auto groupIt = std::find_if(groups.cbegin(), groupEnd,
+ [fromGroupName](const PeripheralRegisterGroup &group) {
+ return fromGroupName == group.name;
+ });
+ if (groupIt != groupEnd)
+ group = *groupIt;
+ }
- while (!in.atEnd()) {
- const auto token = in.readNext();
- if (token == QXmlStreamReader::EndElement
- && in.name() == QLatin1String(kPeripherals)) {
- break;
- } else if (token != QXmlStreamReader::StartElement
- || in.name() != QLatin1String(kPeripheral)) {
- continue;
+ while (in.readNextStartElement()) {
+ const auto elementName = in.name();
+ if (elementName == kName) {
+ group.name = in.readElementText();
+ } else if (elementName == kDescription) {
+ group.description = in.readElementText();
+ } else if (elementName == kGroupName) {
+ group.displayName = in.readElementText();
+ } else if (elementName == kBaseAddress) {
+ group.baseAddress = decodeNumeric(in.readElementText());
+ } else if (elementName == kSize) {
+ group.size = int(decodeNumeric(in.readElementText()));
+ } else if (elementName == kAccess) {
+ group.access = decodeAccess(in.readElementText());
+ } else if (elementName == kRegisters) {
+ while (in.readNextStartElement()) {
+ const auto elementName = in.name();
+ if (elementName == kRegister)
+ handleRegister(in, group);
+ else
+ in.skipCurrentElement();
+ }
+ } else {
+ in.skipCurrentElement();
}
+ }
+ groups.push_back(group);
+}
- PeripheralRegisterGroup group;
+static PeripheralRegisterGroups availablePeripheralRegisterGroups(const QString &filePath)
+{
+ QFile f(filePath);
+ if (!f.open(QIODevice::ReadOnly))
+ return {};
- const auto fromGroupName = in.attributes().value(
- QLatin1String(kDerivedFrom));
- const auto foundGroupEnd = foundGroups.cend();
- const auto foundGroupIt = std::find_if(
- foundGroups.cbegin(), foundGroupEnd,
- [fromGroupName](const PeripheralRegisterGroup &foundGroup) {
- return fromGroupName == foundGroup.name;
- });
- if (foundGroupIt != foundGroupEnd)
- group = *foundGroupIt;
-
- while (!in.atEnd()) {
- const auto token = in.readNext();
- if (token == QXmlStreamReader::EndElement
- && in.name() == QLatin1String(kPeripheral)) {
- foundGroups.push_back(group);
- break;
- } else if (token == QXmlStreamReader::StartElement) {
+ QXmlStreamReader in(&f);
+ PeripheralRegisterGroups groups;
+ while (in.readNextStartElement()) {
+ const auto elementName = in.name();
+ if (elementName == kDevice) {
+ while (in.readNextStartElement()) {
const auto elementName = in.name();
- if (elementName == QLatin1String(kName)) {
- group.name = in.readElementText();
- } else if (elementName == QLatin1String(kDescription)) {
- group.description = in.readElementText();
- } else if (elementName == QLatin1String(kGroupName)) {
- group.displayName = in.readElementText();
- } else if (elementName == QLatin1String(kBaseAddress)) {
- group.baseAddress = decodeNumeric(in.readElementText());
- } else if (elementName == QLatin1String(kSize)) {
- group.size = int(decodeNumeric(in.readElementText()));
- } else if (elementName == QLatin1String(kAccess)) {
- group.access = decodeAccess(in.readElementText());
- } else if (elementName == QLatin1String(kRegisters)
- || elementName == QLatin1String(kRegister)) {
- PeripheralRegister reg;
- while (!in.atEnd()) {
- const auto token = in.readNext();
- if (token == QXmlStreamReader::EndElement
- && in.name() == QLatin1String(kRegister)) {
- group.registers.push_back(reg);
- break;
- } else if (token == QXmlStreamReader::StartElement) {
- const auto elementName = in.name();
- if (elementName == QLatin1String(kRegister)) {
- continue;
- } else if (elementName == QLatin1String(kName)) {
- reg.name = in.readElementText();
- } else if (elementName == QLatin1String(kDescription)) {
- reg.description = in.readElementText();
- } else if (elementName == QLatin1String(kAddressOffset)) {
- reg.addressOffset = decodeNumeric(in.readElementText());
- } else if (elementName == QLatin1String(kSize)) {
- reg.size = int(decodeNumeric(in.readElementText()));
- } else if (elementName == QLatin1String(kAccess)) {
- reg.access = decodeAccess(in.readElementText());
- } else if (elementName == QLatin1String(kResetvalue)) {
- reg.resetValue = decodeNumeric(in.readElementText());
- } else if (elementName == QLatin1String(kFields)
- || elementName == QLatin1String(kField)) {
- PeripheralRegisterField fld;
- while (!in.atEnd()) {
- const auto token = in.readNext();
- if (token == QXmlStreamReader::EndElement
- && in.name() == QLatin1String(kField)) {
- reg.fields.push_back(fld);
- break;
- } else if (token == QXmlStreamReader::StartElement) {
- const auto elementName = in.name();
- if (elementName == QLatin1String(kField)) {
- continue;
- } else if (elementName == QLatin1String(kName)) {
- fld.name = in.readElementText();
- } else if (elementName == QLatin1String(kDescription)) {
- fld.description = in.readElementText();
- } else if (elementName == QLatin1String(kAccess)) {
- fld.access = decodeAccess(in.readElementText());
- } else if (elementName == QLatin1String(kBitRange)) {
- const QString elementText = in.readElementText();
- const int startBracket = elementText.indexOf('[');
- const int endBracket = elementText.indexOf(']');
- if (startBracket == -1 || endBracket == -1
- || (endBracket - startBracket) <= 0) {
- continue;
- }
- const QString range = elementText.mid(
- startBracket + 1, endBracket - 1);
- const QStringList items = range.split(':');
- enum { MaxBit, MinBit, BitsCount };
- if (items.count() != BitsCount)
- continue;
- const int from = int(decodeNumeric(items.at(MinBit)));
- const int to = int(decodeNumeric(items.at(MaxBit)));
- fld.bitOffset = from;
- fld.bitWidth = to - from + 1;
- } else if (elementName == QLatin1String(kBitOffset)) {
- fld.bitOffset = int(decodeNumeric(in.readElementText()));
- } else if (elementName == QLatin1String(kBitWidth)) {
- fld.bitWidth = int(decodeNumeric(in.readElementText()));
- } else {
- in.skipCurrentElement();
- }
- }
- }
- } else {
- in.skipCurrentElement();
- }
- }
+ if (elementName == kPeripherals) {
+ while (in.readNextStartElement()) {
+ const auto elementName = in.name();
+ if (elementName == kPeripheral)
+ handleGroup(in, groups);
+ else
+ in.skipCurrentElement();
}
} else {
in.skipCurrentElement();
@@ -695,8 +709,7 @@ static PeripheralRegisterGroups availablePeripheralRegisterGroups(
}
}
}
-
- return foundGroups;
+ return groups;
}
void PeripheralRegisterHandler::updateRegisterGroups()
diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp
index 92470f46177..5c93e8691a3 100644
--- a/src/plugins/genericprojectmanager/genericproject.cpp
+++ b/src/plugins/genericprojectmanager/genericproject.cpp
@@ -587,10 +587,12 @@ void GenericBuildSystem::updateDeploymentData()
hasDeploymentData = QFileInfo::exists(deploymentFilePath.toString());
}
if (hasDeploymentData) {
- DeploymentData deploymentData;
- deploymentData.addFilesFromDeploymentFile(deploymentFilePath.toString(),
- projectDirectory().toString());
- setDeploymentData(deploymentData);
+ if (target) {
+ DeploymentData deploymentData;
+ deploymentData.addFilesFromDeploymentFile(deploymentFilePath.toString(),
+ projectDirectory().toString());
+ setDeploymentData(deploymentData);
+ }
if (m_deployFileWatcher.files() != QStringList(deploymentFilePath.toString())) {
m_deployFileWatcher.removeFiles(m_deployFileWatcher.files());
m_deployFileWatcher.addFile(deploymentFilePath.toString(),
diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp
index 852142c1745..50e743f71a7 100644
--- a/src/plugins/languageclient/client.cpp
+++ b/src/plugins/languageclient/client.cpp
@@ -913,7 +913,6 @@ bool Client::reset()
m_openedDocument.clear();
m_serverCapabilities = ServerCapabilities();
m_dynamicCapabilities.reset();
- m_project = nullptr;
for (const DocumentUri &uri : m_diagnostics.keys())
removeDiagnostics(uri);
for (TextEditor::TextDocument *document : m_resetAssistProvider.keys())
diff --git a/src/plugins/projectexplorer/sessionmodel.cpp b/src/plugins/projectexplorer/sessionmodel.cpp
index 094a7bbc5f9..9e926941166 100644
--- a/src/plugins/projectexplorer/sessionmodel.cpp
+++ b/src/plugins/projectexplorer/sessionmodel.cpp
@@ -234,6 +234,7 @@ void SessionModel::deleteSessions(const QStringList &sessions)
return;
beginResetModel();
SessionManager::deleteSessions(sessions);
+ m_sortedSessions = SessionManager::sessions();
endResetModel();
}
diff --git a/src/plugins/remotelinux/makeinstallstep.cpp b/src/plugins/remotelinux/makeinstallstep.cpp
index 02e15357738..8aa811a9443 100644
--- a/src/plugins/remotelinux/makeinstallstep.cpp
+++ b/src/plugins/remotelinux/makeinstallstep.cpp
@@ -179,7 +179,8 @@ void MakeInstallStep::finish(bool success)
if (success) {
m_deploymentData = DeploymentData();
m_deploymentData.setLocalInstallRoot(installRoot());
- QDirIterator dit(installRoot().toString(), QDir::Files, QDirIterator::Subdirectories);
+ QDirIterator dit(installRoot().toString(), QDir::Files | QDir::Hidden,
+ QDirIterator::Subdirectories);
while (dit.hasNext()) {
dit.next();
const QFileInfo fi = dit.fileInfo();