diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libs/languageserverprotocol/servercapabilities.cpp | 2 | ||||
-rw-r--r-- | src/plugins/android/androidbuildapkstep.cpp | 79 | ||||
-rw-r--r-- | src/plugins/android/androidbuildapkstep.h | 1 | ||||
-rw-r--r-- | src/plugins/android/androidmanager.cpp | 43 | ||||
-rw-r--r-- | src/plugins/android/androidmanager.h | 2 | ||||
-rw-r--r-- | src/plugins/baremetal/keiltoolchain.cpp | 99 | ||||
-rw-r--r-- | src/plugins/debugger/debuggerengine.cpp | 6 | ||||
-rw-r--r-- | src/plugins/debugger/peripheralregisterhandler.cpp | 261 | ||||
-rw-r--r-- | src/plugins/genericprojectmanager/genericproject.cpp | 10 | ||||
-rw-r--r-- | src/plugins/languageclient/client.cpp | 1 | ||||
-rw-r--r-- | src/plugins/projectexplorer/sessionmodel.cpp | 1 | ||||
-rw-r--r-- | src/plugins/remotelinux/makeinstallstep.cpp | 3 |
12 files changed, 307 insertions, 201 deletions
diff --git a/src/libs/languageserverprotocol/servercapabilities.cpp b/src/libs/languageserverprotocol/servercapabilities.cpp index a8e932ad50..a000ad2c89 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 0b8281fcb4..027de1edc9 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 e8a04ac1c7..49ef9dc94e 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 4ecf2a0480..20be799b02 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 718e518e77..e141636c17 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 eb6afe8e0e..80ae51240e 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 §ion) +{ + 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 c53e4dfe28..69573db219 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 0e0f035a97..fa9427a6e2 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 ®) +{ + 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 92470f4617..5c93e8691a 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 852142c174..50e743f71a 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 094a7bbc5f..9e92694116 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 02e1535773..8aa811a944 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(); |