diff --git a/dist/changes-4.5.0.md b/dist/changes-4.5.0.md index 88c2bcfdc37..47f629a0252 100644 --- a/dist/changes-4.5.0.md +++ b/dist/changes-4.5.0.md @@ -14,10 +14,13 @@ General * Changed `File System` pane to tree view with top level directory selectable from `Computer`, `Home`, `Projects`, and individual project root directories (QTCREATORBUG-8305) +* Fixed crash when closing Qt Creator while searching for updates + (QTCREATORBUG-19165) Editing -* Added shortcut for sorting selected lines +* Added `Edit` > `Advanced` > `Sort Selected Lines`, replacing `Tools` > + `External` > `Text` > `Sort Selection` All Projects @@ -25,12 +28,27 @@ All Projects * Added support for changing the maximum number of lines shown in compile output (QTCREATORBUG-2200) +QMake Projects + +* Fixed support of wildcards in `INSTALLS` variable (QTCREATORBUG-17935) +* Fixed that `QMAKE_CFLAGS` was not passed to code model + CMake Projects * Added groups to CMake configuration UI * Added option to change configuration variable types +* Added option to unset configuration variable +* Improved handling of CMake configuration changes on disk (QTCREATORBUG-17555) +* Improved simplified project tree (QTCREATORBUG-19040) * Fixed that value was removed when renaming configuration variable (QTCREATORBUG-17926) +* Fixed that `PATH` environment was unnecessarily modified (QTCREATORBUG-18714) +* Fixed that QML errors in application output where not linked to the source + (QTCREATORBUG-18586) + +Qbs Projects + +* Fixed that custom `installRoot` was not saved (QTCREATORBUG-18895) C++ Support @@ -39,6 +57,7 @@ C++ Support * Fixed detection of macros defined by tool chain for `C` * Fixed that `Refactoring` context menu blocked UI while checking for available actions +* Fixed crash when refactoring class with errors (QTCREATORBUG-19180) * Clang Code Model * Added sanity check to `Clang Code Model Warnings` option (QTCREATORBUG-18864) @@ -52,6 +71,7 @@ C++ Support QML Support * Added wizards with different starting UI layouts +* Fixed that undo history was lost when reformatting file (QTCREATORBUG-18645) Python Support @@ -65,6 +85,11 @@ Debugging * LLDB / macOS * Added pretty printing of Core Foundation and Foundation string-like types (QTCREATORBUG-18638) +* CDB + * Fixed attaching to running process with command line arguments + (QTCREATORBUG-19034) +* QML + * Fixed changing values of ECMAScript strings (QTCREATORBUG-19032) QML Profiler @@ -73,11 +98,25 @@ QML Profiler Qt Quick Designer * Added option to only show visible items in navigator +* Fixed crash in integrated code editor (QTCREATORBUG-19079) +* Fixed crash when Ctrl-clicking on newly refactored QML file + (QTCREATORBUG-19064) +* Fixed filtering in Library view (QTCREATORBUG-19054) +* Fixed `Cmd + Left` in integrated code editor on macOS (QTCREATORBUG-19272) +* Fixed crash with `Become Last Sibling` and multiline expressions + (QTCREATORBUG-19284) Version Control Systems * Added query for saving modified files before opening commit editor (QTCREATORBUG-3857) +* Git + * Fixed issues with localized tool output (QTCREATORBUG-19017) + +Test Integration + +* Fixed issue with finding test target with CMake projects (QTCREATORBUG-17882, + QTCREATORBUG-18922, QTCREATORBUG-18932) Beautifier @@ -98,6 +137,7 @@ Platform Specific Windows +* Fixed detection of Visual Studio Build Tools 2017 (QTCREATORBUG-19053) * Fixed that environment variable keys were converted to upper case in build and run configurations (QTCREATORBUG-18915) @@ -111,8 +151,16 @@ Android * Removed support for local deployment (QTBUG-62995) * Removed support for Ant +* Added UI for managing Android SDKs (QTCREATORBUG-18978) +* Improved Android settings * Improved checks for minimum requirements of Android tools (QTCREATORBUG-18837) +iOS + +* Fixed check for minimum Xcode version (QTCREATORBUG-18091) +* Fixed switching between simulator device types with Xcode 9 + (QTCREATORBUG-19270) + Universal Windows Platform * Fixed deployment on Windows 10 Phone emulator @@ -122,19 +170,24 @@ Alessandro Portale Alexander Volkov Andre Hartmann André Pönitz +Benjamin Terrier Christian Kandeler Christian Stenger Claus Steuer Daniel Trevitz David Schulz +Donald Carr Eike Ziller +Filipe Azevedo Friedemann Kleint Ivan Donchevskii Jake Petroules Jaroslaw Kobus Jochen Becher +Kai Köhne Knud Dollereder Laurent Montel +Leena Miettinen Marco Benelli Marco Bubke Mitch Curtis @@ -145,10 +198,13 @@ Orgad Shaneh Robert Löhning Ryuji Kakemizu Samuel Gaist +scootergrisen +Sergey Belyashov Serhii Moroz Thiago Macieira Thomas Hartmann Tim Jenssen Tobias Hunger Ulf Hermann -Vikas Pachdha +Vikas Pachdha +Viktor Kireev diff --git a/src/plugins/android/androidsdkmanager.cpp b/src/plugins/android/androidsdkmanager.cpp index f71e22d5cb7..b01a971bb88 100644 --- a/src/plugins/android/androidsdkmanager.cpp +++ b/src/plugins/android/androidsdkmanager.cpp @@ -260,6 +260,7 @@ public: BuildToolsMarker = 0x080, SdkToolsMarker = 0x100, PlatformToolsMarker = 0x200, + EmulatorToolsMarker = 0x400, SectionMarkers = InstalledPackagesMarker | AvailablePackagesMarkers | AvailableUpdatesMarker }; @@ -278,6 +279,7 @@ private: BuildTools *parseBuildToolsPackage(const QStringList &data) const; SdkTools *parseSdkToolsPackage(const QStringList &data) const; PlatformTools *parsePlatformToolsPackage(const QStringList &data) const; + EmulatorTools *parseEmulatorToolsPackage(const QStringList &data) const; MarkerTag parseMarkers(const QString &line); MarkerTag m_currentSection = MarkerTag::None; @@ -292,7 +294,8 @@ const std::map markerTags { {SdkManagerOutputParser::MarkerTag::SystemImageMarker, "system-images"}, {SdkManagerOutputParser::MarkerTag::BuildToolsMarker, "build-tools"}, {SdkManagerOutputParser::MarkerTag::SdkToolsMarker, "tools"}, - {SdkManagerOutputParser::MarkerTag::PlatformToolsMarker, "platform-tools"} + {SdkManagerOutputParser::MarkerTag::PlatformToolsMarker, "platform-tools"}, + {SdkManagerOutputParser::MarkerTag::EmulatorToolsMarker, "emulator"} }; AndroidSdkManager::AndroidSdkManager(const AndroidConfig &config, QObject *parent): @@ -543,6 +546,10 @@ void SdkManagerOutputParser::parsePackageData(MarkerTag packageMarker, const QSt createPackage(&SdkManagerOutputParser::parsePlatformToolsPackage); break; + case MarkerTag::EmulatorToolsMarker: + createPackage(&SdkManagerOutputParser::parseEmulatorToolsPackage); + break; + case MarkerTag::PlatformMarker: createPackage(&SdkManagerOutputParser::parsePlatform); break; @@ -705,6 +712,22 @@ PlatformTools *SdkManagerOutputParser::parsePlatformToolsPackage(const QStringLi return platformTools; } +EmulatorTools *SdkManagerOutputParser::parseEmulatorToolsPackage(const QStringList &data) const +{ + EmulatorTools *emulatorTools = nullptr; + GenericPackageData packageData; + if (parseAbstractData(packageData, data, 1, "Emulator-tools")) { + emulatorTools = new EmulatorTools(packageData.revision, data.at(0)); + emulatorTools->setDescriptionText(packageData.description); + emulatorTools->setDisplayText(packageData.description); + emulatorTools->setInstalledLocation(packageData.installedLocation); + } else { + qCDebug(sdkManagerLog) << "Emulator-tools: Parsing failed. Minimum required data " + "unavailable:" << data; + } + return emulatorTools; +} + SdkManagerOutputParser::MarkerTag SdkManagerOutputParser::parseMarkers(const QString &line) { if (line.isEmpty()) diff --git a/src/plugins/android/androidsdkpackage.cpp b/src/plugins/android/androidsdkpackage.cpp index b7d15105854..94b7a2b87bf 100644 --- a/src/plugins/android/androidsdkpackage.cpp +++ b/src/plugins/android/androidsdkpackage.cpp @@ -253,4 +253,20 @@ AndroidSdkPackage::PackageType PlatformTools::type() const return AndroidSdkPackage::PlatformToolsPackage; } +EmulatorTools::EmulatorTools(QVersionNumber revision, QString sdkStylePathStr, QObject *parent): + AndroidSdkPackage(revision, sdkStylePathStr, parent) +{ + +} + +bool EmulatorTools::isValid() const +{ + return installedLocation().exists(); +} + +AndroidSdkPackage::PackageType EmulatorTools::type() const +{ + return AndroidSdkPackage::EmulatorToolsPackage; +} + } // namespace Android diff --git a/src/plugins/android/androidsdkpackage.h b/src/plugins/android/androidsdkpackage.h index 486c604b604..dac6a5662dc 100644 --- a/src/plugins/android/androidsdkpackage.h +++ b/src/plugins/android/androidsdkpackage.h @@ -52,8 +52,9 @@ public: PlatformToolsPackage = 1 << 3, SdkPlatformPackage = 1 << 4, SystemImagePackage = 1 << 5, + EmulatorToolsPackage = 1 << 6, AnyValidType = SdkToolsPackage | BuildToolsPackage | PlatformToolsPackage | - SdkPlatformPackage | SystemImagePackage + SdkPlatformPackage | SystemImagePackage | EmulatorToolsPackage }; enum PackageState { @@ -169,6 +170,17 @@ public: PackageType type() const override; }; +class EmulatorTools : public AndroidSdkPackage +{ +public: + EmulatorTools(QVersionNumber revision, QString sdkStylePathStr, QObject *parent = nullptr); + +// AndroidSdkPackage Overrides +public: + bool isValid() const override; + PackageType type() const override; +}; + class SdkTools : public AndroidSdkPackage { public: diff --git a/src/plugins/autotest/qtest/qttestparser.cpp b/src/plugins/autotest/qtest/qttestparser.cpp index a262148eccf..482e14f60b2 100644 --- a/src/plugins/autotest/qtest/qttestparser.cpp +++ b/src/plugins/autotest/qtest/qttestparser.cpp @@ -148,8 +148,8 @@ static CPlusPlus::Document::Ptr declaringDocument(CPlusPlus::Document::Ptr doc, } } - if (lookupItems.size()) { - if (CPlusPlus::Symbol *symbol = lookupItems.first().declaration()) { + for (const CPlusPlus::LookupItem &item : lookupItems) { + if (CPlusPlus::Symbol *symbol = item.declaration()) { if (CPlusPlus::Class *toeClass = symbol->asClass()) { const QString declFileName = QLatin1String(toeClass->fileId()->chars(), toeClass->fileId()->size()); diff --git a/src/plugins/autotest/quick/quicktesttreeitem.cpp b/src/plugins/autotest/quick/quicktesttreeitem.cpp index 953f31e6618..29f6aa4a7cc 100644 --- a/src/plugins/autotest/quick/quicktesttreeitem.cpp +++ b/src/plugins/autotest/quick/quicktesttreeitem.cpp @@ -123,8 +123,12 @@ TestConfiguration *QuickTestTreeItem::testConfiguration() const switch (type()) { case TestCase: { QStringList testFunctions; - for (int row = 0, count = childCount(); row < count; ++row) - testFunctions << name() + "::" + childItem(row)->name(); + for (int row = 0, count = childCount(); row < count; ++row) { + const TestTreeItem *child = childItem(row); + if (child->type() == TestTreeItem::TestSpecialFunction) + continue; + testFunctions << name() + "::" + child->name(); + } config = new QuickTestConfiguration; config->setTestCases(testFunctions); config->setProjectFile(proFile()); diff --git a/src/plugins/autotest/testnavigationwidget.cpp b/src/plugins/autotest/testnavigationwidget.cpp index aaeef64a1a6..299ad4d7681 100644 --- a/src/plugins/autotest/testnavigationwidget.cpp +++ b/src/plugins/autotest/testnavigationwidget.cpp @@ -101,7 +101,7 @@ TestNavigationWidget::TestNavigationWidget(QWidget *parent) : connect(m_model->parser(), &TestCodeParser::parsingFailed, this, &TestNavigationWidget::onParsingFinished); connect(m_model, &TestTreeModel::updatedActiveFrameworks, - [this] (int numberOfActive) { + this, [this] (int numberOfActive) { m_missingFrameworksWidget->setVisible(numberOfActive == 0); }); connect(m_progressTimer, &QTimer::timeout, diff --git a/src/plugins/clangcodemodel/clangutils.cpp b/src/plugins/clangcodemodel/clangutils.cpp index 8d04157d59e..63f97122462 100644 --- a/src/plugins/clangcodemodel/clangutils.cpp +++ b/src/plugins/clangcodemodel/clangutils.cpp @@ -95,6 +95,12 @@ public: addWrappedQtHeadersIncludePath(); } + void addToolchainAndProjectMacros() final + { + addMacros({ProjectExplorer::Macro("Q_CREATOR_RUN", "1")}); + CompilerOptionsBuilder::addToolchainAndProjectMacros(); + } + void addExtraOptions() final { addDummyUiHeaderOnDiskIncludePath(); diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.h b/src/plugins/cmakeprojectmanager/builddirmanager.h index d703aed5ad0..58fe11484cc 100644 --- a/src/plugins/cmakeprojectmanager/builddirmanager.h +++ b/src/plugins/cmakeprojectmanager/builddirmanager.h @@ -88,8 +88,9 @@ public: REPARSE_URGENT = 1, // Do not wait for more requests, start ASAP REPARSE_FORCE_CONFIGURATION = 2, // Force configuration arguments to cmake REPARSE_CHECK_CONFIGURATION = 4, // Check and warn if on-disk config and QtC config differ - REPARSE_IGNORE = 8, // Do not reparse:-) - REPARSE_FAIL = 16 // Do not reparse and raise a warning + REPARSE_SCAN = 8, + REPARSE_IGNORE = 16, // Do not reparse:-) + REPARSE_FAIL = 32 // Do not reparse and raise a warning }; signals: diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 81345fee8e4..a47a7ee91e2 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -390,25 +390,27 @@ bool CMakeProject::supportsKit(Kit *k, QString *errorMessage) const void CMakeProject::runCMake() { - if (isParsing()) + CMakeBuildConfiguration *bc = activeBc(this); + if (isParsing() || !bc) return; - CMakeBuildConfiguration *bc = activeBc(this); - if (bc) { - BuildDirParameters parameters(bc); - m_buildDirManager.setParametersAndRequestParse(parameters, - BuildDirManager::REPARSE_CHECK_CONFIGURATION, - BuildDirManager::REPARSE_CHECK_CONFIGURATION); - } + BuildDirParameters parameters(bc); + m_buildDirManager.setParametersAndRequestParse(parameters, + BuildDirManager::REPARSE_CHECK_CONFIGURATION, + BuildDirManager::REPARSE_CHECK_CONFIGURATION); } void CMakeProject::runCMakeAndScanProjectTree() { - if (!m_treeScanner.isFinished()) + CMakeBuildConfiguration *bc = activeBc(this); + if (isParsing() || !bc) return; + QTC_ASSERT(m_treeScanner.isFinished(), return); - m_waitingForScan = true; - runCMake(); + BuildDirParameters parameters(bc); + m_buildDirManager.setParametersAndRequestParse(parameters, + BuildDirManager::REPARSE_CHECK_CONFIGURATION | BuildDirManager::REPARSE_SCAN, + BuildDirManager::REPARSE_CHECK_CONFIGURATION | BuildDirManager::REPARSE_SCAN); } void CMakeProject::buildCMakeTarget(const QString &buildTarget) @@ -452,6 +454,8 @@ void CMakeProject::handleReparseRequest(int reparseParameters) m_delayedParsingTimer.setInterval((reparseParameters & BuildDirManager::REPARSE_URGENT) ? 0 : 1000); m_delayedParsingTimer.start(); m_delayedParsingParameters = m_delayedParsingParameters | reparseParameters; + if (m_allFiles.isEmpty()) + m_delayedParsingParameters |= BuildDirManager::REPARSE_SCAN; } void CMakeProject::startParsing(int reparseParameters) @@ -466,6 +470,7 @@ void CMakeProject::startParsing(int reparseParameters) emitParsingStarted(); + m_waitingForScan = reparseParameters & BuildDirManager::REPARSE_SCAN; m_waitingForParse = true; m_combinedScanAndParseResult = true; diff --git a/src/plugins/cpptools/compileroptionsbuilder.cpp b/src/plugins/cpptools/compileroptionsbuilder.cpp index 15a9ee430db..100c39bfc21 100644 --- a/src/plugins/cpptools/compileroptionsbuilder.cpp +++ b/src/plugins/cpptools/compileroptionsbuilder.cpp @@ -58,6 +58,7 @@ QStringList CompilerOptionsBuilder::build(CppTools::ProjectFile::Kind fileKind, addToolchainAndProjectMacros(); undefineClangVersionMacrosForMsvc(); undefineCppLanguageFeatureMacrosForMsvc2015(); + addDefineFunctionMacrosMsvc(); addPredefinedHeaderPathsOptions(); addPrecompiledHeaderOptions(pchUsage); @@ -389,6 +390,12 @@ void CompilerOptionsBuilder::undefineCppLanguageFeatureMacrosForMsvc2015() } } +void CompilerOptionsBuilder::addDefineFunctionMacrosMsvc() +{ + if (m_projectPart.toolchainType == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID) + addMacros({{"__FUNCSIG__", "\"\""}, {"__FUNCTION__", "\"\""}, {"__FUNCDNAME__", "\"\""}}); +} + QString CompilerOptionsBuilder::includeDirOption() const { return QLatin1String("-I"); diff --git a/src/plugins/cpptools/compileroptionsbuilder.h b/src/plugins/cpptools/compileroptionsbuilder.h index 6cd8d79be69..1f91bafcb18 100644 --- a/src/plugins/cpptools/compileroptionsbuilder.h +++ b/src/plugins/cpptools/compileroptionsbuilder.h @@ -64,11 +64,12 @@ public: void addWordWidth(); void addHeaderPathOptions(); void addPrecompiledHeaderOptions(PchUsage pchUsage); - void addToolchainAndProjectMacros(); + virtual void addToolchainAndProjectMacros(); void addMacros(const ProjectExplorer::Macros ¯os); void addMsvcCompatibilityVersion(); void undefineCppLanguageFeatureMacrosForMsvc2015(); + void addDefineFunctionMacrosMsvc(); void addProjectConfigFileInclude(); void undefineClangVersionMacrosForMsvc(); diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 6707e00b009..0a52fba2a65 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -2102,7 +2102,7 @@ void DebuggerPlugin::attachExternalApplication(RunControl *rc) ProcessHandle pid = rc->applicationProcessHandle(); RunConfiguration *runConfig = rc->runConfiguration(); auto runControl = new RunControl(runConfig, ProjectExplorer::Constants::DEBUG_RUN_MODE); - auto debugger = new DebuggerRunTool(runControl, guessKitFromAbis({rc->abi()})); + auto debugger = new DebuggerRunTool(runControl, guessKitFromAbis({rc->abi()}), false); debugger->setAttachPid(pid); debugger->setRunControlName(tr("Process %1").arg(pid.pid())); debugger->setStartMode(AttachExternal); diff --git a/src/plugins/debugger/debuggerruncontrol.cpp b/src/plugins/debugger/debuggerruncontrol.cpp index b2920700c18..57b1be11162 100644 --- a/src/plugins/debugger/debuggerruncontrol.cpp +++ b/src/plugins/debugger/debuggerruncontrol.cpp @@ -795,7 +795,7 @@ Internal::TerminalRunner *DebuggerRunTool::terminalRunner() const return d->terminalRunner; } -DebuggerRunTool::DebuggerRunTool(RunControl *runControl, Kit *kit) +DebuggerRunTool::DebuggerRunTool(RunControl *runControl, Kit *kit, bool allowTerminal) : RunWorker(runControl), d(new DebuggerRunToolPrivate) { setDisplayName("DebuggerRunTool"); @@ -839,7 +839,7 @@ DebuggerRunTool::DebuggerRunTool(RunControl *runControl, Kit *kit) // Normalize to work around QTBUG-17529 (QtDeclarative fails with 'File name case mismatch'...) m_runParameters.inferior.workingDirectory = FileUtils::normalizePathName(m_runParameters.inferior.workingDirectory); - setUseTerminal(m_runParameters.inferior.runMode == ApplicationLauncher::Console); + setUseTerminal(allowTerminal && m_runParameters.inferior.runMode == ApplicationLauncher::Console); } const QByteArray envBinary = qgetenv("QTC_DEBUGGER_PATH"); diff --git a/src/plugins/debugger/debuggerruncontrol.h b/src/plugins/debugger/debuggerruncontrol.h index 1795b9bf68f..5ab3e8efa8e 100644 --- a/src/plugins/debugger/debuggerruncontrol.h +++ b/src/plugins/debugger/debuggerruncontrol.h @@ -47,7 +47,8 @@ class DEBUGGER_EXPORT DebuggerRunTool : public ProjectExplorer::RunWorker public: explicit DebuggerRunTool(ProjectExplorer::RunControl *runControl, - ProjectExplorer::Kit *kit = nullptr); + ProjectExplorer::Kit *kit = nullptr, + bool allowTerminal = true); ~DebuggerRunTool(); Internal::DebuggerEngine *engine() const { return m_engine; } diff --git a/src/plugins/projectexplorer/applicationlauncher.cpp b/src/plugins/projectexplorer/applicationlauncher.cpp index da295063257..f0d84760c54 100644 --- a/src/plugins/projectexplorer/applicationlauncher.cpp +++ b/src/plugins/projectexplorer/applicationlauncher.cpp @@ -87,6 +87,7 @@ public: void bringToForeground(); qint64 applicationPID() const; bool isRunning() const; + bool isRemoteRunning() const; // Remote void doReportError(const QString &message); @@ -220,6 +221,11 @@ bool ApplicationLauncher::isRunning() const return d->isRunning(); } +bool ApplicationLauncher::isRemoteRunning() const +{ + return d->isRemoteRunning(); +} + bool ApplicationLauncherPrivate::isRunning() const { if (m_currentMode == ApplicationLauncher::Gui) @@ -227,6 +233,11 @@ bool ApplicationLauncherPrivate::isRunning() const return m_consoleProcess.isRunning(); } +bool ApplicationLauncherPrivate::isRemoteRunning() const +{ + return m_isLocal ? false : m_deviceProcess->state() == QProcess::Running; +} + ProcessHandle ApplicationLauncher::applicationPID() const { return ProcessHandle(d->applicationPID()); diff --git a/src/plugins/projectexplorer/applicationlauncher.h b/src/plugins/projectexplorer/applicationlauncher.h index a8570dbbaab..3c6178f815f 100644 --- a/src/plugins/projectexplorer/applicationlauncher.h +++ b/src/plugins/projectexplorer/applicationlauncher.h @@ -61,6 +61,7 @@ public: void stop(); bool isRunning() const; Utils::ProcessHandle applicationPID() const; + bool isRemoteRunning() const; QString errorString() const; QProcess::ProcessError processError() const; diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index ed699a9f2bf..7ce2bc145cf 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -275,7 +275,7 @@ bool QbsProject::addFilesToProduct(const QStringList &filePaths, } if (notAdded->count() != filePaths.count()) { m_projectData = m_qbsProject.projectData(); - rebuildProjectTree(); + delayedUpdateAfterParse(); } return notAdded->isEmpty(); } @@ -302,8 +302,7 @@ bool QbsProject::removeFilesFromProduct(const QStringList &filePaths, } if (notRemoved->count() != filePaths.count()) { m_projectData = m_qbsProject.projectData(); - rebuildProjectTree(); - emit fileListChanged(); + delayedUpdateAfterParse(); } return notRemoved->isEmpty(); } @@ -472,6 +471,11 @@ void QbsProject::updateAfterParse() emit fileListChanged(); } +void QbsProject::delayedUpdateAfterParse() +{ + QTimer::singleShot(0, this, &QbsProject::updateAfterParse); +} + void QbsProject::updateProjectNodes() { OpTimer opTimer("updateProjectNodes"); diff --git a/src/plugins/qbsprojectmanager/qbsproject.h b/src/plugins/qbsprojectmanager/qbsproject.h index fa12083716a..055618e6e12 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.h +++ b/src/plugins/qbsprojectmanager/qbsproject.h @@ -136,6 +136,7 @@ private: void handleRuleExecutionDone(); bool checkCancelStatus(); void updateAfterParse(); + void delayedUpdateAfterParse(); void updateProjectNodes(); void projectLoaded() override; diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanagerconstants.h b/src/plugins/qbsprojectmanager/qbsprojectmanagerconstants.h index cc6bcd8ed3e..8bc262710c0 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanagerconstants.h +++ b/src/plugins/qbsprojectmanager/qbsprojectmanagerconstants.h @@ -63,7 +63,7 @@ const char QBS_INSTALLSTEP_ID[] = "Qbs.InstallStep"; const char QBS_VARIANT_DEBUG[] = "debug"; const char QBS_VARIANT_RELEASE[] = "release"; -const char QBS_CONFIG_VARIANT_KEY[] = "qbs.buildVariant"; +const char QBS_CONFIG_VARIANT_KEY[] = "qbs.defaultBuildVariant"; const char QBS_CONFIG_PROFILE_KEY[] = "qbs.profile"; const char QBS_INSTALL_ROOT_KEY[] = "qbs.installRoot"; const char QBS_CONFIG_DECLARATIVE_DEBUG_KEY[] = "Qt.declarative.qmlDebugging"; diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 47ce2bad158..6255fd85fd3 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -55,6 +55,7 @@ #include #include #include +#include using namespace LanguageUtils; using namespace QmlJS; @@ -330,6 +331,19 @@ static inline QString extractComponentFromQml(const QString &source) return result; } +static QString normalizeJavaScriptExpression(const QString &expression) +{ + static const QRegularExpression regExp("\\n(\\s)+"); + + QString result = expression; + return result.replace(regExp, "\n"); +} + +static bool compareJavaScriptExpression(const QString &expression1, const QString &expression2) +{ + return normalizeJavaScriptExpression(expression1) == normalizeJavaScriptExpression(expression2); +} + } // anonymous namespace namespace QmlDesigner { @@ -1379,7 +1393,7 @@ void TextToModelMerger::syncExpressionProperty(AbstractProperty &modelProperty, { if (modelProperty.isBindingProperty()) { BindingProperty bindingProperty = modelProperty.toBindingProperty(); - if (bindingProperty.expression() != javascript + if (!compareJavaScriptExpression(bindingProperty.expression(), javascript) || astType.isEmpty() == bindingProperty.isDynamic() || astType != bindingProperty.dynamicTypeName()) { differenceHandler.bindingExpressionsDiffer(bindingProperty, javascript, astType); @@ -1574,7 +1588,7 @@ void ModelValidator::bindingExpressionsDiffer(BindingProperty &modelProperty, Q_UNUSED(modelProperty) Q_UNUSED(javascript) Q_UNUSED(astType) - Q_ASSERT(modelProperty.expression() == javascript); + Q_ASSERT(compareJavaScriptExpression(modelProperty.expression(), javascript)); Q_ASSERT(modelProperty.dynamicTypeName() == astType); Q_ASSERT(0); } diff --git a/src/plugins/valgrind/callgrind/callgrindparser.cpp b/src/plugins/valgrind/callgrind/callgrindparser.cpp index fec9f52c5c3..41254c3ec43 100644 --- a/src/plugins/valgrind/callgrind/callgrindparser.cpp +++ b/src/plugins/valgrind/callgrind/callgrindparser.cpp @@ -298,7 +298,9 @@ void Parser::Private::parseHeader(QIODevice *device) // now that we're done checking if we're done (heh) with the header, parse the address // and cost column descriptions. speed is unimportant here. - if (line.startsWith("positions: ")) { + if (line.startsWith('#')) { + continue; + } else if (line.startsWith("positions: ")) { QString values = getValue(line, 11); data->setPositions(values.split(QLatin1Char(' '), QString::SkipEmptyParts)); addressValuesCount = data->positions().count(); diff --git a/src/plugins/valgrind/valgrindconfigwidget.cpp b/src/plugins/valgrind/valgrindconfigwidget.cpp index 37c1ad67a58..11352b30885 100644 --- a/src/plugins/valgrind/valgrindconfigwidget.cpp +++ b/src/plugins/valgrind/valgrindconfigwidget.cpp @@ -62,8 +62,6 @@ ValgrindConfigWidget::ValgrindConfigWidget(ValgrindBaseSettings *settings, connect(m_ui->valgrindExeChooser, &Utils::PathChooser::rawPathChanged, m_settings, &ValgrindBaseSettings::setValgrindExecutable); - connect(m_settings, &ValgrindBaseSettings::valgrindExecutableChanged, - m_ui->valgrindExeChooser, &Utils::PathChooser::setPath); connect(m_ui->smcDetectionComboBox, static_cast(&QComboBox::currentIndexChanged), m_settings, &ValgrindBaseSettings::setSelfModifyingCodeDetection); diff --git a/src/plugins/valgrind/valgrindsettings.cpp b/src/plugins/valgrind/valgrindsettings.cpp index a494dbae3e1..08e2b627107 100644 --- a/src/plugins/valgrind/valgrindsettings.cpp +++ b/src/plugins/valgrind/valgrindsettings.cpp @@ -143,10 +143,7 @@ void ValgrindBaseSettings::toMap(QVariantMap &map) const void ValgrindBaseSettings::setValgrindExecutable(const QString &valgrindExecutable) { - if (m_valgrindExecutable != valgrindExecutable) { - m_valgrindExecutable = valgrindExecutable; - emit valgrindExecutableChanged(valgrindExecutable); - } + m_valgrindExecutable = valgrindExecutable; } void ValgrindBaseSettings::setSelfModifyingCodeDetection(int smcDetection) diff --git a/src/plugins/valgrind/valgrindsettings.h b/src/plugins/valgrind/valgrindsettings.h index b0d62e83172..4ec154158e0 100644 --- a/src/plugins/valgrind/valgrindsettings.h +++ b/src/plugins/valgrind/valgrindsettings.h @@ -78,7 +78,6 @@ public: void setSelfModifyingCodeDetection(int); signals: - void valgrindExecutableChanged(const QString &); void selfModifyingCodeDetectionChanged(int); private: diff --git a/src/shared/qbs b/src/shared/qbs index 2e4d332924e..acf142851ae 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 2e4d332924e17225d08ac11891828e6fefc3529b +Subproject commit acf142851aeec850083811afb012a3fbcba793c6