diff options
1395 files changed, 13484 insertions, 13757 deletions
@@ -18,11 +18,11 @@ Prerequisites: * Qt WebEngine module for QtWebEngine based help viewer * On Windows: * ActiveState Active Perl - * MinGW with g++ 4.9 or Visual Studio 2015 or later + * MinGW with g++ 5.3 or Visual Studio 2015 or later * jom * Python 3.5 or later (optional, needed for the python enabled debug helper) * On Mac OS X: latest Xcode -* On Linux: g++ 4.9 or later +* On Linux: g++ 5.3 or later * LLVM/Clang 6.0.0 or later (optional, needed for the Clang Code Model, see the section "Get LLVM/Clang for the Clang Code Model") * CMake (only for manual builds of LLVM/Clang) diff --git a/dist/changes-4.8.0.md b/dist/changes-4.8.0.md new file mode 100644 index 0000000000..0598b4fb01 --- /dev/null +++ b/dist/changes-4.8.0.md @@ -0,0 +1,64 @@ +Qt Creator version 4.8 contains bug fixes and new features. + +The most important changes are listed in this document. For a complete +list of changes, see the Git log for the Qt Creator sources that +you can check out from the public Git repository. For example: + + git clone git://code.qt.io/qt-creator/qt-creator.git + git log --cherry-pick --pretty=oneline origin/4.7..v4.8.0 + +General + +* Added `HostOs:PathListSeparator` and `HostOs:ExecutableSuffix` Qt Creator + variables +* Added `Create Folder` to context menu of path choosers if the path does not + exist + +Editing + +* Made it possible to change default editors in MIME type settings + +Help + +All Projects + +* Added option for parallel jobs to `make` step, which is enabled by default + if `MAKEFLAGS` are not set (QTCREATORBUG-18414) +* Improved handling of relative file paths for custom error parsers + (QTCREATORBUG-20605) +* Fixed that `make` step required C++ tool chain + +QMake Projects + +C++ Support + +QML Support + +* Fixed indentation in object literals with ternary operator (QTCREATORBUG-7103) +* Fixed that symbols from closed projects were still shown in Locator + (QTCREATORBUG-13459) + +Python Support + +Debugging + +Clang Static Analyzer + +QML Profiler + +Version Control Systems + +* Git + * Improved behavior if no merge tool is configured + +Image Viewer + +Test Integration + +Platform Specific + +Windows + +Android + +Credits for these changes go to: @@ -23,7 +23,18 @@ qtcdocsdir.name = QTC_DOCS_DIR qtcdocsdir.value = $$IDE_SOURCE_TREE/doc qtccopyrightyear.name = QTCREATOR_COPYRIGHT_YEAR qtccopyrightyear.value = $$QTCREATOR_COPYRIGHT_YEAR -QDOC_ENV += qtcname qtcid qtccasedid qtcver qtcvertag qtdocs qdocindex qtcdocsdir qtccopyrightyear +qtcsourcedir.name = IDE_SOURCE_TREE +qtcsourcedir.value = $$IDE_SOURCE_TREE +QDOC_ENV += qtcname \ + qtcid \ + qtccasedid \ + qtcver \ + qtcvertag \ + qtdocs \ + qdocindex \ + qtcdocsdir \ + qtccopyrightyear \ + qtcsourcedir DOC_INDEX_PATHS += $$IDE_BUILD_TREE/doc DOC_HTML_INSTALLDIR = $$INSTALL_DOC_PATH diff --git a/qbs/modules/clang_defines/clang_defines.qbs b/qbs/modules/clang_defines/clang_defines.qbs new file mode 100644 index 0000000000..361941c2c9 --- /dev/null +++ b/qbs/modules/clang_defines/clang_defines.qbs @@ -0,0 +1,18 @@ +import qbs +import qbs.FileInfo + +Module { + Depends { name: "cpp" } + Depends { name: "libclang"; required: false } + + cpp.defines: libclang.present ? [ + 'CLANG_VERSION="' + libclang.llvmVersion + '"', + 'CLANG_RESOURCE_DIR="' + FileInfo.joinPaths(libclang.llvmLibDir, "clang", + libclang.llvmVersion, "include") + '"', + 'CLANG_BINDIR="' + libclang.llvmBinDir + '"', + ] : [ + 'CLANG_VERSION=""', + 'CLANG_RESOURCE_DIR=""', + 'CLANG_BINDIR=""', + ] +} diff --git a/qbs/modules/libclang/libclang.qbs b/qbs/modules/libclang/libclang.qbs index bb427bc4f8..b13ba888ff 100644 --- a/qbs/modules/libclang/libclang.qbs +++ b/qbs/modules/libclang/libclang.qbs @@ -55,9 +55,7 @@ Module { return incl != llvmIncludeDir; }) property stringList llvmToolingCxxFlags: clangProbe.llvmToolingCxxFlags - property bool toolingEnabled: !Environment.getEnv("QTC_NO_CLANG_LIBTOOLING") - && Utilities.versionCompare(llvmVersion, "6") > 0 - && Utilities.versionCompare(llvmVersion, "7") < 0 + property bool toolingEnabled: Environment.getEnv("QTC_ENABLE_CLANG_LIBTOOLING") validate: { if (!clangProbe.found) { diff --git a/qbs/modules/qtc/qtc.qbs b/qbs/modules/qtc/qtc.qbs index 9d739f926b..976dbf7cb3 100644 --- a/qbs/modules/qtc/qtc.qbs +++ b/qbs/modules/qtc/qtc.qbs @@ -4,16 +4,16 @@ import qbs.FileInfo import "qtc.js" as HelperFunctions Module { - property string qtcreator_display_version: '4.7.1' + property string qtcreator_display_version: '4.8.0-beta1' property string ide_version_major: '4' property string ide_version_minor: '7' - property string ide_version_release: '1' + property string ide_version_release: '82' property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.' + ide_version_release property string ide_compat_version_major: '4' property string ide_compat_version_minor: '7' - property string ide_compat_version_release: '0' + property string ide_compat_version_release: '82' property string qtcreator_compat_version: ide_compat_version_major + '.' + ide_compat_version_minor + '.' + ide_compat_version_release diff --git a/qtcreator.pri b/qtcreator.pri index 6a65bf602c..15f544ff4d 100644 --- a/qtcreator.pri +++ b/qtcreator.pri @@ -1,12 +1,12 @@ !isEmpty(QTCREATOR_PRI_INCLUDED):error("qtcreator.pri already included") QTCREATOR_PRI_INCLUDED = 1 -QTCREATOR_VERSION = 4.7.1 -QTCREATOR_COMPAT_VERSION = 4.7.0 +QTCREATOR_VERSION = 4.7.82 +QTCREATOR_COMPAT_VERSION = 4.7.82 VERSION = $$QTCREATOR_VERSION -QTCREATOR_DISPLAY_VERSION = 4.7.1 +QTCREATOR_DISPLAY_VERSION = 4.8.0-beta1 QTCREATOR_COPYRIGHT_YEAR = 2018 -BINARY_ARTIFACTS_BRANCH = 4.7 +BINARY_ARTIFACTS_BRANCH = master isEmpty(IDE_DISPLAY_NAME): IDE_DISPLAY_NAME = Qt Creator isEmpty(IDE_ID): IDE_ID = qtcreator diff --git a/qtcreator.pro b/qtcreator.pro index c4324555ba..214740353a 100644 --- a/qtcreator.pro +++ b/qtcreator.pro @@ -19,7 +19,7 @@ DISTFILES += dist/copyright_template.txt \ README.md \ $$files(dist/changes-*) \ qtcreator.qbs \ - qbs/pluginjson/pluginjson.qbs \ + $$files(qbs/*, true) \ $$files(scripts/*.py) \ $$files(scripts/*.sh) \ $$files(scripts/*.pl) diff --git a/scripts/deployqt.py b/scripts/deployqt.py index 35c664b37e..4efe99761c 100755 --- a/scripts/deployqt.py +++ b/scripts/deployqt.py @@ -220,16 +220,22 @@ def deploy_libclang(install_dir, llvm_install_dir, chrpath_bin): os.path.join(install_dir, 'bin'))) deployinfo.append((os.path.join(llvm_install_dir, 'bin', 'clang.exe'), clangbindirtarget)) + deployinfo.append((os.path.join(llvm_install_dir, 'bin', 'clang-cl.exe'), + clangbindirtarget)) + deployinfo.append((os.path.join(llvm_install_dir, 'bin', 'clangd.exe'), + clangbindirtarget)) resourcetarget = os.path.join(clanglibdirtarget, 'clang') else: libsources = glob(os.path.join(llvm_install_dir, 'lib', 'libclang.so*')) for libsource in libsources: deployinfo.append((libsource, os.path.join(install_dir, 'lib', 'qtcreator'))) clangbinary = os.path.join(llvm_install_dir, 'bin', 'clang') + clangdbinary = os.path.join(llvm_install_dir, 'bin', 'clangd') clangbinary_targetdir = os.path.join(install_dir, 'libexec', 'qtcreator', 'clang', 'bin') if not os.path.exists(clangbinary_targetdir): os.makedirs(clangbinary_targetdir) deployinfo.append((clangbinary, clangbinary_targetdir)) + deployinfo.append((clangdbinary, clangbinary_targetdir)) # copy link target if clang is actually a symlink if os.path.islink(clangbinary): linktarget = os.readlink(clangbinary) diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py index 21a7da4c11..6f8871f977 100644 --- a/share/qtcreator/debugger/lldbbridge.py +++ b/share/qtcreator/debugger/lldbbridge.py @@ -1505,7 +1505,7 @@ class Dumper(DumperBase): self.reportResult('', args) def executeNextI(self, args): - self.currentThread().StepInstruction(lldb.eOnlyThisThread) + self.currentThread().StepInstruction(True) self.reportResult('', args) def executeStep(self, args): @@ -1527,7 +1527,7 @@ class Dumper(DumperBase): self.reportResult('', args) def executeStepI(self, args): - self.currentThread().StepInstruction(lldb.eOnlyThisThread) + self.currentThread().StepInstruction(False) self.reportResult('', args) def executeStepOut(self, args = {}): diff --git a/share/qtcreator/qml/qmlpuppet/commands/changeauxiliarycommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/changeauxiliarycommand.cpp index 9a99d45420..7f67b2112d 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/changeauxiliarycommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/changeauxiliarycommand.cpp @@ -29,9 +29,7 @@ namespace QmlDesigner { -ChangeAuxiliaryCommand::ChangeAuxiliaryCommand() -{ -} +ChangeAuxiliaryCommand::ChangeAuxiliaryCommand() = default; ChangeAuxiliaryCommand::ChangeAuxiliaryCommand(const QVector<PropertyValueContainer> &auxiliaryChangeVector) : m_auxiliaryChangeVector (auxiliaryChangeVector) diff --git a/share/qtcreator/qml/qmlpuppet/commands/changebindingscommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/changebindingscommand.cpp index 940bb8ef35..1846b260b2 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/changebindingscommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/changebindingscommand.cpp @@ -29,9 +29,7 @@ namespace QmlDesigner { -ChangeBindingsCommand::ChangeBindingsCommand() -{ -} +ChangeBindingsCommand::ChangeBindingsCommand() = default; ChangeBindingsCommand::ChangeBindingsCommand(const QVector<PropertyBindingContainer> &bindingChangeVector) : m_bindingChangeVector (bindingChangeVector) diff --git a/share/qtcreator/qml/qmlpuppet/commands/changefileurlcommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/changefileurlcommand.cpp index 012941d39a..d67c07be93 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/changefileurlcommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/changefileurlcommand.cpp @@ -30,9 +30,7 @@ namespace QmlDesigner { -ChangeFileUrlCommand::ChangeFileUrlCommand() -{ -} +ChangeFileUrlCommand::ChangeFileUrlCommand() = default; ChangeFileUrlCommand::ChangeFileUrlCommand(const QUrl &fileUrl) : m_fileUrl(fileUrl) diff --git a/share/qtcreator/qml/qmlpuppet/commands/changeidscommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/changeidscommand.cpp index cbe2282278..a0a41df654 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/changeidscommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/changeidscommand.cpp @@ -29,9 +29,7 @@ namespace QmlDesigner { -ChangeIdsCommand::ChangeIdsCommand() -{ -} +ChangeIdsCommand::ChangeIdsCommand() = default; ChangeIdsCommand::ChangeIdsCommand(const QVector<IdContainer> &idVector) : m_idVector(idVector) diff --git a/share/qtcreator/qml/qmlpuppet/commands/changenodesourcecommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/changenodesourcecommand.cpp index 271fbef1b9..be0cd34ca1 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/changenodesourcecommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/changenodesourcecommand.cpp @@ -30,9 +30,7 @@ namespace QmlDesigner { -ChangeNodeSourceCommand::ChangeNodeSourceCommand() -{ -} +ChangeNodeSourceCommand::ChangeNodeSourceCommand() = default; ChangeNodeSourceCommand::ChangeNodeSourceCommand(qint32 newInstanceId, const QString &newNodeSource) : m_instanceId(newInstanceId), m_nodeSource(newNodeSource) diff --git a/share/qtcreator/qml/qmlpuppet/commands/changevaluescommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/changevaluescommand.cpp index 5f11eca87a..f8b2604e48 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/changevaluescommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/changevaluescommand.cpp @@ -29,9 +29,7 @@ namespace QmlDesigner { -ChangeValuesCommand::ChangeValuesCommand() -{ -} +ChangeValuesCommand::ChangeValuesCommand() = default; ChangeValuesCommand::ChangeValuesCommand(const QVector<PropertyValueContainer> &valueChangeVector) : m_valueChangeVector (valueChangeVector) diff --git a/share/qtcreator/qml/qmlpuppet/commands/clearscenecommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/clearscenecommand.cpp index c4dc3863f3..349a93ad6a 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/clearscenecommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/clearscenecommand.cpp @@ -29,9 +29,7 @@ namespace QmlDesigner { -ClearSceneCommand::ClearSceneCommand() -{ -} +ClearSceneCommand::ClearSceneCommand() = default; QDataStream &operator<<(QDataStream &out, const ClearSceneCommand &/*command*/) { diff --git a/share/qtcreator/qml/qmlpuppet/commands/completecomponentcommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/completecomponentcommand.cpp index 3012bee180..bbe8f30557 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/completecomponentcommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/completecomponentcommand.cpp @@ -30,9 +30,7 @@ namespace QmlDesigner { -CompleteComponentCommand::CompleteComponentCommand() -{ -} +CompleteComponentCommand::CompleteComponentCommand() = default; CompleteComponentCommand::CompleteComponentCommand(const QVector<qint32> &container) : m_instanceVector(container) diff --git a/share/qtcreator/qml/qmlpuppet/commands/componentcompletedcommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/componentcompletedcommand.cpp index 38f5d53c9a..87f880cb2b 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/componentcompletedcommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/componentcompletedcommand.cpp @@ -32,9 +32,7 @@ namespace QmlDesigner { -ComponentCompletedCommand::ComponentCompletedCommand() -{ -} +ComponentCompletedCommand::ComponentCompletedCommand() = default; ComponentCompletedCommand::ComponentCompletedCommand(const QVector<qint32> &container) : m_instanceVector(container) diff --git a/share/qtcreator/qml/qmlpuppet/commands/createinstancescommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/createinstancescommand.cpp index 1efcdf9a06..58dd93153b 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/createinstancescommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/createinstancescommand.cpp @@ -30,9 +30,7 @@ namespace QmlDesigner { -CreateInstancesCommand::CreateInstancesCommand() -{ -} +CreateInstancesCommand::CreateInstancesCommand() = default; CreateInstancesCommand::CreateInstancesCommand(const QVector<InstanceContainer> &container) : m_instanceVector(container) diff --git a/share/qtcreator/qml/qmlpuppet/commands/createscenecommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/createscenecommand.cpp index f28f5c278c..71dfb4ee47 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/createscenecommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/createscenecommand.cpp @@ -29,9 +29,7 @@ namespace QmlDesigner { -CreateSceneCommand::CreateSceneCommand() -{ -} +CreateSceneCommand::CreateSceneCommand() = default; CreateSceneCommand::CreateSceneCommand(const QVector<InstanceContainer> &instanceContainer, const QVector<ReparentContainer> &reparentContainer, diff --git a/share/qtcreator/qml/qmlpuppet/commands/debugoutputcommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/debugoutputcommand.cpp index 70c824fd02..f52501ad9d 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/debugoutputcommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/debugoutputcommand.cpp @@ -29,9 +29,7 @@ namespace QmlDesigner { -DebugOutputCommand::DebugOutputCommand() -{ -} +DebugOutputCommand::DebugOutputCommand() = default; DebugOutputCommand::DebugOutputCommand(const QString &text, DebugOutputCommand::Type type, const QVector<qint32> &instanceIds) : m_instanceIds(instanceIds) diff --git a/share/qtcreator/qml/qmlpuppet/commands/endpuppetcommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/endpuppetcommand.cpp index 0a2c591be3..8fdfd9412c 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/endpuppetcommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/endpuppetcommand.cpp @@ -29,9 +29,7 @@ namespace QmlDesigner { -EndPuppetCommand::EndPuppetCommand() -{ -} +EndPuppetCommand::EndPuppetCommand() = default; QDataStream &operator<<(QDataStream &out, const EndPuppetCommand &/*command*/) { diff --git a/share/qtcreator/qml/qmlpuppet/commands/informationchangedcommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/informationchangedcommand.cpp index 82521f223a..0c846a7ed3 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/informationchangedcommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/informationchangedcommand.cpp @@ -34,9 +34,7 @@ namespace QmlDesigner { -InformationChangedCommand::InformationChangedCommand() -{ -} +InformationChangedCommand::InformationChangedCommand() = default; InformationChangedCommand::InformationChangedCommand(const QVector<InformationContainer> &informationVector) : m_informationVector(informationVector) diff --git a/share/qtcreator/qml/qmlpuppet/commands/pixmapchangedcommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/pixmapchangedcommand.cpp index e5ea2d3298..fd7887b160 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/pixmapchangedcommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/pixmapchangedcommand.cpp @@ -33,9 +33,7 @@ namespace QmlDesigner { -PixmapChangedCommand::PixmapChangedCommand() -{ -} +PixmapChangedCommand::PixmapChangedCommand() = default; PixmapChangedCommand::PixmapChangedCommand(const QVector<ImageContainer> &imageVector) : m_imageVector(imageVector) diff --git a/share/qtcreator/qml/qmlpuppet/commands/puppetalivecommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/puppetalivecommand.cpp index 0f63fd99b1..1690e3a5b8 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/puppetalivecommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/puppetalivecommand.cpp @@ -27,9 +27,7 @@ namespace QmlDesigner { -PuppetAliveCommand::PuppetAliveCommand() -{ -} +PuppetAliveCommand::PuppetAliveCommand() = default; QDataStream &operator<<(QDataStream &out, const PuppetAliveCommand &/*command*/) { diff --git a/share/qtcreator/qml/qmlpuppet/commands/removeinstancescommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/removeinstancescommand.cpp index 714aef5a91..2706344a61 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/removeinstancescommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/removeinstancescommand.cpp @@ -30,9 +30,7 @@ namespace QmlDesigner { -RemoveInstancesCommand::RemoveInstancesCommand() -{ -} +RemoveInstancesCommand::RemoveInstancesCommand() = default; RemoveInstancesCommand::RemoveInstancesCommand(const QVector<qint32> &idVector) : m_instanceIdVector(idVector) diff --git a/share/qtcreator/qml/qmlpuppet/commands/removepropertiescommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/removepropertiescommand.cpp index 57fa40819c..0a5735f0fe 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/removepropertiescommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/removepropertiescommand.cpp @@ -29,9 +29,7 @@ namespace QmlDesigner { -RemovePropertiesCommand::RemovePropertiesCommand() -{ -} +RemovePropertiesCommand::RemovePropertiesCommand() = default; RemovePropertiesCommand::RemovePropertiesCommand(const QVector<PropertyAbstractContainer> &properties) : m_properties(properties) diff --git a/share/qtcreator/qml/qmlpuppet/commands/removesharedmemorycommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/removesharedmemorycommand.cpp index 93c355337f..fe9b8f1f2b 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/removesharedmemorycommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/removesharedmemorycommand.cpp @@ -30,9 +30,7 @@ namespace QmlDesigner { -RemoveSharedMemoryCommand::RemoveSharedMemoryCommand() -{ -} +RemoveSharedMemoryCommand::RemoveSharedMemoryCommand() = default; RemoveSharedMemoryCommand::RemoveSharedMemoryCommand(const QString &typeName, const QVector<qint32> &keyNumberVector) : m_typeName(typeName), diff --git a/share/qtcreator/qml/qmlpuppet/commands/reparentinstancescommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/reparentinstancescommand.cpp index f7a029879d..7491975ef2 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/reparentinstancescommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/reparentinstancescommand.cpp @@ -30,9 +30,7 @@ namespace QmlDesigner { -ReparentInstancesCommand::ReparentInstancesCommand() -{ -} +ReparentInstancesCommand::ReparentInstancesCommand() = default; ReparentInstancesCommand::ReparentInstancesCommand(const QVector<ReparentContainer> &container) : m_reparentInstanceVector(container) diff --git a/share/qtcreator/qml/qmlpuppet/commands/statepreviewimagechangedcommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/statepreviewimagechangedcommand.cpp index 1aa49d1652..b2109cde82 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/statepreviewimagechangedcommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/statepreviewimagechangedcommand.cpp @@ -31,9 +31,7 @@ namespace QmlDesigner { -StatePreviewImageChangedCommand::StatePreviewImageChangedCommand() -{ -} +StatePreviewImageChangedCommand::StatePreviewImageChangedCommand() = default; StatePreviewImageChangedCommand::StatePreviewImageChangedCommand(const QVector<ImageContainer> &imageVector) : m_previewVector(imageVector) diff --git a/share/qtcreator/qml/qmlpuppet/commands/valueschangedcommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/valueschangedcommand.cpp index 249cf38432..73e360122a 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/valueschangedcommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/valueschangedcommand.cpp @@ -36,7 +36,7 @@ namespace QmlDesigner { // using cache as a container which deletes sharedmemory pointers at process exit -typedef QCache<qint32, SharedMemory> GlobalSharedMemoryContainer; +using GlobalSharedMemoryContainer = QCache<qint32, SharedMemory>; Q_GLOBAL_STATIC_WITH_ARGS(GlobalSharedMemoryContainer, globalSharedMemoryContainer, (10000)) ValuesChangedCommand::ValuesChangedCommand() @@ -88,7 +88,7 @@ static SharedMemory *createSharedMemory(qint32 key, int byteCount) delete sharedMemory; } - return 0; + return nullptr; } QDataStream &operator<<(QDataStream &out, const ValuesChangedCommand &command) diff --git a/share/qtcreator/qml/qmlpuppet/container/addimportcontainer.cpp b/share/qtcreator/qml/qmlpuppet/container/addimportcontainer.cpp index 109630ee53..2e605fbae8 100644 --- a/share/qtcreator/qml/qmlpuppet/container/addimportcontainer.cpp +++ b/share/qtcreator/qml/qmlpuppet/container/addimportcontainer.cpp @@ -30,9 +30,7 @@ namespace QmlDesigner { -AddImportContainer::AddImportContainer() -{ -} +AddImportContainer::AddImportContainer() = default; AddImportContainer::AddImportContainer(const QUrl &url, const QString &fileName, const QString &version, const QString &alias, const QStringList &importPathList) : m_url(url), diff --git a/share/qtcreator/qml/qmlpuppet/container/imagecontainer.cpp b/share/qtcreator/qml/qmlpuppet/container/imagecontainer.cpp index 77efa1af5c..798e448108 100644 --- a/share/qtcreator/qml/qmlpuppet/container/imagecontainer.cpp +++ b/share/qtcreator/qml/qmlpuppet/container/imagecontainer.cpp @@ -39,7 +39,7 @@ namespace QmlDesigner { // using cache as a container which deletes sharedmemory pointers at process exit -typedef QCache<qint32, SharedMemory> GlobalSharedMemoryContainer; +using GlobalSharedMemoryContainer = QCache<qint32, SharedMemory>; Q_GLOBAL_STATIC_WITH_ARGS(GlobalSharedMemoryContainer, globalSharedMemoryContainer, (10000)) ImageContainer::ImageContainer() @@ -91,14 +91,14 @@ static SharedMemory *createSharedMemory(qint32 key, int byteCount) { SharedMemory *sharedMemory = (*globalSharedMemoryContainer())[key]; - if (sharedMemory == 0) { + if (sharedMemory == nullptr) { sharedMemory = new SharedMemory(QString(imageKeyTemplateString).arg(key)); bool sharedMemoryIsCreated = sharedMemory->create(byteCount); if (sharedMemoryIsCreated) { globalSharedMemoryContainer()->insert(key, sharedMemory); } else { delete sharedMemory; - sharedMemory = 0; + sharedMemory = nullptr; } } else { bool sharedMemoryIsAttached = sharedMemory->isAttached(); @@ -117,7 +117,7 @@ static SharedMemory *createSharedMemory(qint32 key, int byteCount) if (!sharedMemory->isAttached()) { globalSharedMemoryContainer()->remove(key); - sharedMemory = 0; + sharedMemory = nullptr; } } @@ -165,7 +165,7 @@ QDataStream &operator<<(QDataStream &out, const ImageContainer &container) } else { SharedMemory *sharedMemory = createSharedMemory(container.keyNumber(), image.byteCount() + extraDataSize); - out << qint32(sharedMemory != 0); // send if shared memory is used + out << qint32(sharedMemory != nullptr); // send if shared memory is used if (sharedMemory) writeSharedMemory(sharedMemory, image); diff --git a/share/qtcreator/qml/qmlpuppet/container/instancecontainer.cpp b/share/qtcreator/qml/qmlpuppet/container/instancecontainer.cpp index 8562f7bc86..72056e8852 100644 --- a/share/qtcreator/qml/qmlpuppet/container/instancecontainer.cpp +++ b/share/qtcreator/qml/qmlpuppet/container/instancecontainer.cpp @@ -40,9 +40,7 @@ static TypeName properDelemitingOfType(const TypeName &typeName) return convertedTypeName; } -InstanceContainer::InstanceContainer() -{ -} +InstanceContainer::InstanceContainer() = default; InstanceContainer::InstanceContainer(qint32 instanceId, const TypeName &type, diff --git a/share/qtcreator/qml/qmlpuppet/container/mockuptypecontainer.cpp b/share/qtcreator/qml/qmlpuppet/container/mockuptypecontainer.cpp index 5c6a299509..6a1d980ad8 100644 --- a/share/qtcreator/qml/qmlpuppet/container/mockuptypecontainer.cpp +++ b/share/qtcreator/qml/qmlpuppet/container/mockuptypecontainer.cpp @@ -29,10 +29,7 @@ namespace QmlDesigner { -QmlDesigner::MockupTypeContainer::MockupTypeContainer() -{ - -} +QmlDesigner::MockupTypeContainer::MockupTypeContainer() = default; QmlDesigner::MockupTypeContainer::MockupTypeContainer(const QmlDesigner::TypeName &type, const QString &importUri, diff --git a/share/qtcreator/qml/qmlpuppet/container/sharedmemory_qt.cpp b/share/qtcreator/qml/qmlpuppet/container/sharedmemory_qt.cpp index 929c47f41f..6548d8f513 100644 --- a/share/qtcreator/qml/qmlpuppet/container/sharedmemory_qt.cpp +++ b/share/qtcreator/qml/qmlpuppet/container/sharedmemory_qt.cpp @@ -27,18 +27,14 @@ namespace QmlDesigner { -SharedMemory::SharedMemory() -{ -} +SharedMemory::SharedMemory() = default; SharedMemory::SharedMemory(const QString &key) : m_sharedMemory(key) { } -SharedMemory::~SharedMemory() -{ -} +SharedMemory::~SharedMemory() = default; void SharedMemory::setKey(const QString &key) { diff --git a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceglobal.h b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceglobal.h index c7ceef01b2..a7f9b3629b 100644 --- a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceglobal.h +++ b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceglobal.h @@ -30,8 +30,8 @@ namespace QmlDesigner { -typedef QByteArray PropertyName; -typedef QList<PropertyName> PropertyNameList; -typedef QByteArray TypeName; +using PropertyName = QByteArray; +using PropertyNameList = QList<PropertyName>; +using TypeName = QByteArray; } diff --git a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.h b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.h index 6d742615e5..0fddbde5c0 100644 --- a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.h +++ b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.h @@ -59,7 +59,7 @@ public: TestModus // No preview images and synchronized }; - explicit NodeInstanceServerInterface(QObject *parent = 0); + explicit NodeInstanceServerInterface(QObject *parent = nullptr); virtual void createInstances(const CreateInstancesCommand &command) = 0; virtual void changeFileUrl(const ChangeFileUrlCommand &command) = 0; diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/anchorchangesnodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/anchorchangesnodeinstance.h index a9072b6058..d7cc1c582b 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/anchorchangesnodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/anchorchangesnodeinstance.h @@ -41,8 +41,8 @@ namespace Internal { class AnchorChangesNodeInstance : public ObjectNodeInstance { public: - typedef QSharedPointer<AnchorChangesNodeInstance> Pointer; - typedef QWeakPointer<AnchorChangesNodeInstance> WeakPointer; + using Pointer = QSharedPointer<AnchorChangesNodeInstance>; + using WeakPointer = QWeakPointer<AnchorChangesNodeInstance>; static Pointer create(QObject *objectToBeWrapped); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/behaviornodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/behaviornodeinstance.h index b18f4882cb..9ab68aeb2d 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/behaviornodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/behaviornodeinstance.h @@ -33,8 +33,8 @@ namespace Internal { class BehaviorNodeInstance : public ObjectNodeInstance { public: - typedef QSharedPointer<BehaviorNodeInstance> Pointer; - typedef QWeakPointer<BehaviorNodeInstance> WeakPointer; + using Pointer = QSharedPointer<BehaviorNodeInstance>; + using WeakPointer = QWeakPointer<BehaviorNodeInstance>; BehaviorNodeInstance(QObject *object); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/componentnodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/componentnodeinstance.h index 24ae2dd5d2..27b115ad77 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/componentnodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/componentnodeinstance.h @@ -37,8 +37,9 @@ namespace Internal { class ComponentNodeInstance : public ObjectNodeInstance { public: - typedef QSharedPointer<ComponentNodeInstance> Pointer; - typedef QWeakPointer<ComponentNodeInstance> WeakPointer; + using Pointer = QSharedPointer<ComponentNodeInstance>; + using WeakPointer = QWeakPointer<ComponentNodeInstance>; + ComponentNodeInstance(QQmlComponent *component); static Pointer create(QObject *objectToBeWrapped); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/dummynodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/dummynodeinstance.h index 6a1711399e..3505b0cc29 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/dummynodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/dummynodeinstance.h @@ -35,8 +35,8 @@ namespace Internal { class DummyNodeInstance : public ObjectNodeInstance { public: - typedef QSharedPointer<DummyNodeInstance> Pointer; - typedef QWeakPointer<DummyNodeInstance> WeakPointer; + using Pointer = QSharedPointer<DummyNodeInstance>; + using WeakPointer = QWeakPointer<DummyNodeInstance>; static Pointer create(); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri index a1f143a495..300f80d2b3 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri @@ -22,6 +22,7 @@ HEADERS += $$PWD/servernodeinstance.h HEADERS += $$PWD/anchorchangesnodeinstance.h HEADERS += $$PWD/positionernodeinstance.h HEADERS += $$PWD/layoutnodeinstance.h +HEADERS += $$PWD/qt3dpresentationnodeinstance.h SOURCES += $$PWD/qt5nodeinstanceserver.cpp SOURCES += $$PWD/qt5testnodeinstanceserver.cpp @@ -45,3 +46,4 @@ SOURCES += $$PWD/servernodeinstance.cpp SOURCES += $$PWD/anchorchangesnodeinstance.cpp SOURCES += $$PWD/positionernodeinstance.cpp SOURCES += $$PWD/layoutnodeinstance.cpp +SOURCES += $$PWD/qt3dpresentationnodeinstance.cpp diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/layoutnodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/layoutnodeinstance.h index f7d0d3e3a6..4f6225af2c 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/layoutnodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/layoutnodeinstance.h @@ -34,8 +34,8 @@ class LayoutNodeInstance : public QuickItemNodeInstance { public: - typedef QSharedPointer<LayoutNodeInstance> Pointer; - typedef QWeakPointer<LayoutNodeInstance> WeakPointer; + using Pointer = QSharedPointer<LayoutNodeInstance>; + using WeakPointer = QWeakPointer<LayoutNodeInstance>; static Pointer create(QObject *objectToBeWrapped); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h index e43c804ca6..2aebef1174 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h @@ -65,10 +65,11 @@ class NodeInstanceServer : public NodeInstanceServerInterface { Q_OBJECT public: - typedef QPair<QPointer<QObject>, PropertyName> ObjectPropertyPair; - typedef QPair<qint32, QString> IdPropertyPair; - typedef QPair<ServerNodeInstance, PropertyName> InstancePropertyPair; - typedef QPair<QString, QPointer<QObject> > DummyPair; + using ObjectPropertyPair = QPair<QPointer<QObject>, PropertyName>; + using IdPropertyPair = QPair<qint32, QString>; + using InstancePropertyPair= QPair<ServerNodeInstance, PropertyName>; + using DummyPair = QPair<QString, QPointer<QObject> >; + explicit NodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstancesignalspy.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstancesignalspy.h index 3dc00ed7cc..2965e06106 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstancesignalspy.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstancesignalspy.h @@ -36,8 +36,9 @@ namespace QmlDesigner { namespace Internal { class ObjectNodeInstance; -typedef QSharedPointer<ObjectNodeInstance> ObjectNodeInstancePointer; -typedef QWeakPointer<ObjectNodeInstance> ObjectNodeInstanceWeakPointer; + +using ObjectNodeInstancePointer = QSharedPointer<ObjectNodeInstance>; +using ObjectNodeInstanceWeakPointer = QWeakPointer<ObjectNodeInstance>; class NodeInstanceSignalSpy : public QObject { diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.h index 5977d3d31c..07c5d50b6e 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.h @@ -60,8 +60,8 @@ class WidgetNodeInstance; class ObjectNodeInstance { public: - typedef QSharedPointer<ObjectNodeInstance> Pointer; - typedef QWeakPointer<ObjectNodeInstance> WeakPointer; + using Pointer = QSharedPointer<ObjectNodeInstance>; + using WeakPointer = QWeakPointer<ObjectNodeInstance>; virtual ~ObjectNodeInstance(); void destroy(); @@ -163,7 +163,7 @@ public: void setInLayoutable(bool isInLayoutable); virtual void refreshLayoutable(); - bool hasBindingForProperty(const PropertyName &propertyName, bool *hasChanged = 0) const; + bool hasBindingForProperty(const PropertyName &propertyName, bool *hasChanged = nullptr) const; QQmlContext *context() const; QQmlEngine *engine() const; diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/positionernodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/positionernodeinstance.h index 7575014ea8..63e31297e7 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/positionernodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/positionernodeinstance.h @@ -37,8 +37,8 @@ namespace Internal { class PositionerNodeInstance : public QuickItemNodeInstance { public: - typedef QSharedPointer<PositionerNodeInstance> Pointer; - typedef QWeakPointer<PositionerNodeInstance> WeakPointer; + using Pointer = QSharedPointer<PositionerNodeInstance>; + using WeakPointer = QWeakPointer<PositionerNodeInstance>; static Pointer create(QObject *objectToBeWrapped); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qmlpropertychangesnodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qmlpropertychangesnodeinstance.h index 017a0eb710..be16da972d 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qmlpropertychangesnodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qmlpropertychangesnodeinstance.h @@ -39,8 +39,8 @@ class QmlPropertyChangesNodeInstance; class QmlPropertyChangesNodeInstance : public ObjectNodeInstance { public: - typedef QSharedPointer<QmlPropertyChangesNodeInstance> Pointer; - typedef QWeakPointer<QmlPropertyChangesNodeInstance> WeakPointer; + using Pointer = QSharedPointer<QmlPropertyChangesNodeInstance>; + using WeakPointer = QWeakPointer<QmlPropertyChangesNodeInstance>; static Pointer create(QObject *objectToBeWrapped); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qmlstatenodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qmlstatenodeinstance.h index 5c09bb7ab7..9870223fa7 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qmlstatenodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qmlstatenodeinstance.h @@ -34,8 +34,8 @@ namespace Internal { class QmlStateNodeInstance : public ObjectNodeInstance { public: - typedef QSharedPointer<QmlStateNodeInstance> Pointer; - typedef QWeakPointer<QmlStateNodeInstance> WeakPointer; + using Pointer = QSharedPointer<QmlStateNodeInstance>; + using WeakPointer = QWeakPointer<QmlStateNodeInstance>; static Pointer create(QObject *objectToBeWrapped); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qmltransitionnodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qmltransitionnodeinstance.h index dc1f01dec4..f24fd3bac2 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qmltransitionnodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qmltransitionnodeinstance.h @@ -33,8 +33,8 @@ namespace Internal { class QmlTransitionNodeInstance : public ObjectNodeInstance { public: - typedef QSharedPointer<QmlTransitionNodeInstance> Pointer; - typedef QWeakPointer<QmlTransitionNodeInstance> WeakPointer; + using Pointer = QSharedPointer<QmlTransitionNodeInstance>; + using WeakPointer = QWeakPointer<QmlTransitionNodeInstance>; static Pointer create(QObject *objectToBeWrapped); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt3dpresentationnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt3dpresentationnodeinstance.cpp new file mode 100644 index 0000000000..0fedfa7b74 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt3dpresentationnodeinstance.cpp @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "qt3dpresentationnodeinstance.h" +#include <QQuickItem> + +namespace QmlDesigner { +namespace Internal { + +Qt3DPresentationNodeInstance::Qt3DPresentationNodeInstance(QObject *object) + : ObjectNodeInstance(object) +{ +} + +Qt3DPresentationNodeInstance::Pointer Qt3DPresentationNodeInstance::create(QObject *object) +{ + Pointer instance(new Qt3DPresentationNodeInstance(object)); + instance->populateResetHashes(); + + return instance; +} + +PropertyNameList Qt3DPresentationNodeInstance::ignoredProperties() const +{ + static const PropertyNameList properties({"source"}); + return properties; +} +} // namespace Internal +} // namespace QmlDesigner diff --git a/src/plugins/qmljseditor/qmljspreviewrunner.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt3dpresentationnodeinstance.h index 631311cb96..df41c2085f 100644 --- a/src/plugins/qmljseditor/qmljspreviewrunner.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt3dpresentationnodeinstance.h @@ -25,28 +25,24 @@ #pragma once -#include <QObject> +#include "objectnodeinstance.h" -#include <projectexplorer/applicationlauncher.h> - -namespace QmlJSEditor { +namespace QmlDesigner { namespace Internal { -class QmlJSPreviewRunner : public QObject +class Qt3DPresentationNodeInstance : public ObjectNodeInstance { - Q_OBJECT public: - explicit QmlJSPreviewRunner(QObject *parent = 0); - - bool isReady() const; - void run(const QString &filename); + using Pointer = QSharedPointer<Qt3DPresentationNodeInstance>; + using WeakPointer = QWeakPointer<Qt3DPresentationNodeInstance>; -private: - QString m_qmlViewerDefaultPath; + static Pointer create(QObject *objectToBeWrapped); - ProjectExplorer::ApplicationLauncher m_applicationLauncher; + PropertyNameList ignoredProperties() const override; +protected: + Qt3DPresentationNodeInstance(QObject *item); }; } // namespace Internal -} // namespace QmlJSEditor +} // namespace QmlDesigner diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h index bf78df2212..8aab24178b 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h @@ -38,8 +38,8 @@ namespace Internal { class QuickItemNodeInstance : public ObjectNodeInstance { public: - typedef QSharedPointer<QuickItemNodeInstance> Pointer; - typedef QWeakPointer<QuickItemNodeInstance> WeakPointer; + using Pointer = QSharedPointer<QuickItemNodeInstance>; + using WeakPointer = QWeakPointer<QuickItemNodeInstance>; ~QuickItemNodeInstance() override; diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp index 2f090517dc..11234b9521 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp @@ -36,6 +36,7 @@ #include "positionernodeinstance.h" #include "layoutnodeinstance.h" #include "debugoutputcommand.h" +#include "qt3dpresentationnodeinstance.h" #include "quickitemnodeinstance.h" @@ -161,6 +162,8 @@ Internal::ObjectNodeInstance::Pointer ServerNodeInstance::createInstance(QObject if (objectToBeWrapped == 0) instance = Internal::DummyNodeInstance::create(); + else if (isSubclassOf(objectToBeWrapped, "Q3DSPresentationItem")) + instance = Internal::Qt3DPresentationNodeInstance::create(objectToBeWrapped); else if (isSubclassOf(objectToBeWrapped, "QQuickBasePositioner")) instance = Internal::PositionerNodeInstance::create(objectToBeWrapped); else if (isSubclassOf(objectToBeWrapped, "QQuickLayout")) diff --git a/share/qtcreator/qml/qmlpuppet/types/enumeration.cpp b/share/qtcreator/qml/qmlpuppet/types/enumeration.cpp index a77f460f4f..12435838ea 100644 --- a/share/qtcreator/qml/qmlpuppet/types/enumeration.cpp +++ b/share/qtcreator/qml/qmlpuppet/types/enumeration.cpp @@ -31,9 +31,7 @@ namespace QmlDesigner { -Enumeration::Enumeration() -{ -} +Enumeration::Enumeration() = default; Enumeration::Enumeration(const EnumerationName &enumerationName) : m_enumerationName(enumerationName) diff --git a/share/qtcreator/qml/qmlpuppet/types/enumeration.h b/share/qtcreator/qml/qmlpuppet/types/enumeration.h index 84028dd24a..d7bc3ac049 100644 --- a/share/qtcreator/qml/qmlpuppet/types/enumeration.h +++ b/share/qtcreator/qml/qmlpuppet/types/enumeration.h @@ -32,7 +32,7 @@ namespace QmlDesigner { -typedef QByteArray EnumerationName; +using EnumerationName = QByteArray; class Enumeration { diff --git a/share/qtcreator/templates/wizards/projects/consoleapp/CMakeLists.txt b/share/qtcreator/templates/wizards/projects/consoleapp/CMakeLists.txt index 0d3c1252fa..4beef640b7 100644 --- a/share/qtcreator/templates/wizards/projects/consoleapp/CMakeLists.txt +++ b/share/qtcreator/templates/wizards/projects/consoleapp/CMakeLists.txt @@ -1,6 +1,6 @@ -cmake_minimum_required(VERSION 2.8.12) +cmake_minimum_required(VERSION 3.0.0) -project(%{ProjectName}) +project(%{ProjectName} VERSION 0.1 LANGUAGES CXX) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) diff --git a/src/libs/3rdparty/optional/optional.hpp b/src/libs/3rdparty/optional/optional.hpp index 13df7c92ac..607696d8e1 100644 --- a/src/libs/3rdparty/optional/optional.hpp +++ b/src/libs/3rdparty/optional/optional.hpp @@ -498,6 +498,7 @@ public: // 20.5.4.5, Observers explicit constexpr operator bool() const noexcept { return initialized(); } + constexpr bool has_value() const noexcept { return initialized(); } constexpr T const* operator ->() const { return TR2_OPTIONAL_ASSERTED_EXPRESSION(initialized(), dataptr()); @@ -693,7 +694,8 @@ public: explicit constexpr operator bool() const noexcept { return ref != nullptr; } - + constexpr bool has_value() const noexcept { return ref != nullptr; } + template <class V> constexpr typename decay<T>::type value_or(V&& v) const { diff --git a/src/libs/aggregation/aggregate.h b/src/libs/aggregation/aggregate.h index 13881d85d8..8c3332bf81 100644 --- a/src/libs/aggregation/aggregate.h +++ b/src/libs/aggregation/aggregate.h @@ -40,7 +40,7 @@ class AGGREGATION_EXPORT Aggregate : public QObject Q_OBJECT public: - Aggregate(QObject *parent = 0); + Aggregate(QObject *parent = nullptr); ~Aggregate() override; void add(QObject *component); @@ -52,7 +52,7 @@ public: if (T *result = qobject_cast<T *>(component)) return result; } - return (T *)0; + return nullptr; } template <typename T> QList<T *> components() { @@ -84,19 +84,19 @@ private: template <typename T> T *query(Aggregate *obj) { if (!obj) - return (T *)0; + return nullptr; return obj->template component<T>(); } template <typename T> T *query(QObject *obj) { if (!obj) - return (T *)0; + return nullptr; T *result = qobject_cast<T *>(obj); if (!result) { QReadLocker locker(&Aggregate::lock()); Aggregate *parentAggregation = Aggregate::parentAggregate(obj); - result = (parentAggregation ? query<T>(parentAggregation) : 0); + result = (parentAggregation ? query<T>(parentAggregation) : nullptr); } return result; } diff --git a/src/libs/clangsupport/clangrefactoringservermessages.h b/src/libs/clangsupport/clangrefactoringservermessages.h index cdcc309c2d..dd1cb3a6d7 100644 --- a/src/libs/clangsupport/clangrefactoringservermessages.h +++ b/src/libs/clangsupport/clangrefactoringservermessages.h @@ -30,5 +30,7 @@ #include "requestsourcelocationforrenamingmessage.h" #include "requestsourcerangesanddiagnosticsforquerymessage.h" #include "requestsourcerangesforquerymessage.h" -#include "updateprojectpartsmessage.h" +#include "removegeneratedfilesmessage.h" #include "removeprojectpartsmessage.h" +#include "updategeneratedfilesmessage.h" +#include "updateprojectpartsmessage.h" diff --git a/src/libs/clangsupport/clangsupport-lib.pri b/src/libs/clangsupport/clangsupport-lib.pri index 857bc39ddd..c7064262aa 100644 --- a/src/libs/clangsupport/clangsupport-lib.pri +++ b/src/libs/clangsupport/clangsupport-lib.pri @@ -87,7 +87,10 @@ SOURCES += \ $$PWD/writemessageblock.cpp \ $$PWD/filepathcaching.cpp \ $$PWD/filepathid.cpp \ - $$PWD/baseserverproxy.cpp + $$PWD/baseserverproxy.cpp \ + $$PWD/updategeneratedfilesmessage.cpp \ + $$PWD/removegeneratedfilesmessage.cpp \ + $$PWD/generatedfiles.cpp HEADERS += \ $$PWD/cancelmessage.h \ @@ -202,6 +205,9 @@ HEADERS += \ $$PWD/nativefilepath.h \ $$PWD/filepathview.h \ $$PWD/compilermacro.h \ - $$PWD/projectpartpchproviderinterface.h + $$PWD/projectpartpchproviderinterface.h \ + $$PWD/updategeneratedfilesmessage.h \ + $$PWD/removegeneratedfilesmessage.h \ + $$PWD/generatedfiles.h contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols diff --git a/src/libs/clangsupport/clangsupport_global.h b/src/libs/clangsupport/clangsupport_global.h index 01e9e2c7f4..75454a5288 100644 --- a/src/libs/clangsupport/clangsupport_global.h +++ b/src/libs/clangsupport/clangsupport_global.h @@ -177,7 +177,9 @@ enum class MessageType : quint8 { CancelMessage, UpdateProjectPartsMessage, RemoveProjectPartsMessage, - PrecompiledHeadersUpdatedMessage + PrecompiledHeadersUpdatedMessage, + UpdateGeneratedFilesMessage, + RemoveGeneratedFilesMessage }; template<MessageType messageEnumeration> diff --git a/src/libs/clangsupport/codecompletion.cpp b/src/libs/clangsupport/codecompletion.cpp index fb321d664a..6e1b9ca53f 100644 --- a/src/libs/clangsupport/codecompletion.cpp +++ b/src/libs/clangsupport/codecompletion.cpp @@ -36,6 +36,7 @@ static const char *completionKindToString(CodeCompletion::Kind kind) switch (kind) { case CodeCompletion::Other: return "Other"; case CodeCompletion::FunctionCompletionKind: return "Function"; + case CodeCompletion::FunctionDefinitionCompletionKind: return "FunctionDefinitionCompletion"; case CodeCompletion::TemplateFunctionCompletionKind: return "TemplateFunction"; case CodeCompletion::FunctionOverloadCompletionKind: return "FunctionOverload"; case CodeCompletion::ConstructorCompletionKind: return "Constructor"; @@ -77,6 +78,8 @@ QDebug operator<<(QDebug debug, const CodeCompletion &message) debug.nospace() << message.priority << ", "; debug.nospace() << completionKindToString(message.completionKind) << ", "; debug.nospace() << availabilityToString(message.availability) << ", "; + if (!message.requiredFixIts.isEmpty()) + debug.nospace() << message.requiredFixIts << ", "; debug.nospace() << message.hasParameters; debug.nospace() << ")"; diff --git a/src/libs/clangsupport/codecompletion.h b/src/libs/clangsupport/codecompletion.h index 974b3c3f9a..e3553f22a8 100644 --- a/src/libs/clangsupport/codecompletion.h +++ b/src/libs/clangsupport/codecompletion.h @@ -27,8 +27,9 @@ #include "clangsupport_global.h" #include "codecompletionchunk.h" +#include "fixitcontainer.h" -#include <utf8string.h> +#include <sqlite/utf8string.h> #include <QDataStream> #include <QVector> @@ -44,6 +45,7 @@ public: enum Kind : quint32 { Other = 0, FunctionCompletionKind, + FunctionDefinitionCompletionKind, FunctionOverloadCompletionKind, TemplateFunctionCompletionKind, ConstructorCompletionKind, @@ -90,6 +92,7 @@ public: out << message.text; out << message.briefComment; out << message.chunks; + out << message.requiredFixIts; out << message.priority; out << static_cast<quint32>(message.completionKind); out << static_cast<quint32>(message.availability); @@ -106,6 +109,7 @@ public: in >> message.text; in >> message.briefComment; in >> message.chunks; + in >> message.requiredFixIts; in >> message.priority; in >> completionKind; in >> availability; @@ -120,13 +124,15 @@ public: friend bool operator==(const CodeCompletion &first, const CodeCompletion &second) { return first.text == second.text - && first.completionKind == second.completionKind; + && first.completionKind == second.completionKind + && first.requiredFixIts == second.requiredFixIts; } public: Utf8String text; Utf8String briefComment; CodeCompletionChunks chunks; + QVector<FixItContainer> requiredFixIts; quint32 priority = 0; Kind completionKind = Other; Availability availability = NotAvailable; diff --git a/src/libs/clangsupport/completionsmessage.cpp b/src/libs/clangsupport/completionsmessage.cpp index b6324f6a64..d41f3dfe97 100644 --- a/src/libs/clangsupport/completionsmessage.cpp +++ b/src/libs/clangsupport/completionsmessage.cpp @@ -29,23 +29,11 @@ namespace ClangBackEnd { -#define RETURN_TEXT_FOR_CASE(enumValue) case CompletionCorrection::enumValue: return #enumValue -static const char *completionCorrectionToText(CompletionCorrection correction) -{ - switch (correction) { - RETURN_TEXT_FOR_CASE(NoCorrection); - RETURN_TEXT_FOR_CASE(DotToArrowCorrection); - default: return "UnhandledCompletionCorrection"; - } -} -#undef RETURN_TEXT_FOR_CASE - QDebug operator<<(QDebug debug, const CompletionsMessage &message) { debug.nospace() << "CompletionsMessage("; debug.nospace() << message.codeCompletions << ", " - << completionCorrectionToText(message.neededCorrection) << ", " << message.ticketNumber; debug.nospace() << ")"; diff --git a/src/libs/clangsupport/completionsmessage.h b/src/libs/clangsupport/completionsmessage.h index b77710a93b..f23256c06f 100644 --- a/src/libs/clangsupport/completionsmessage.h +++ b/src/libs/clangsupport/completionsmessage.h @@ -38,18 +38,15 @@ class CompletionsMessage public: CompletionsMessage() = default; CompletionsMessage(const CodeCompletions &codeCompletions, - CompletionCorrection neededCorrection, quint64 ticketNumber) : codeCompletions(codeCompletions) , ticketNumber(ticketNumber) - , neededCorrection(neededCorrection) { } friend QDataStream &operator<<(QDataStream &out, const CompletionsMessage &message) { out << message.codeCompletions; - out << static_cast<quint32>(message.neededCorrection); out << message.ticketNumber; return out; @@ -57,28 +54,21 @@ public: friend QDataStream &operator>>(QDataStream &in, CompletionsMessage &message) { - quint32 neededCorrection; - in >> message.codeCompletions; - in >> neededCorrection; in >> message.ticketNumber; - message.neededCorrection = static_cast<CompletionCorrection>(neededCorrection); - return in; } friend bool operator==(const CompletionsMessage &first, const CompletionsMessage &second) { return first.ticketNumber == second.ticketNumber - && first.neededCorrection == second.neededCorrection && first.codeCompletions == second.codeCompletions; } public: CodeCompletions codeCompletions; quint64 ticketNumber = 0; - CompletionCorrection neededCorrection = CompletionCorrection::NoCorrection; }; CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const CompletionsMessage &message); diff --git a/src/libs/clangsupport/filecontainerv2.h b/src/libs/clangsupport/filecontainerv2.h index c75205cfa4..aa7248fb5e 100644 --- a/src/libs/clangsupport/filecontainerv2.h +++ b/src/libs/clangsupport/filecontainerv2.h @@ -40,7 +40,7 @@ public: FileContainer(FilePath &&filePath, Utils::SmallString &&unsavedFileContent, - Utils::SmallStringVector &&commandLineArguments, + Utils::SmallStringVector &&commandLineArguments = {}, quint32 documentRevision = 0) : filePath(std::move(filePath)), unsavedFileContent(std::move(unsavedFileContent)), @@ -77,8 +77,8 @@ public: friend bool operator<(const FileContainer &first, const FileContainer &second) { - return std::tie(first.documentRevision, first.filePath, first.unsavedFileContent, first.commandLineArguments) - < std::tie(second.documentRevision, second.filePath, second.unsavedFileContent, second.commandLineArguments); + return std::tie(first.filePath, first.documentRevision, first.unsavedFileContent, first.commandLineArguments) + < std::tie(second.filePath, second.documentRevision, second.unsavedFileContent, second.commandLineArguments); } FileContainer clone() const diff --git a/src/libs/clangsupport/filepath.h b/src/libs/clangsupport/filepath.h index 50f6f44323..9ff019de76 100644 --- a/src/libs/clangsupport/filepath.h +++ b/src/libs/clangsupport/filepath.h @@ -133,7 +133,9 @@ public: friend bool operator==(const FilePath &first, const FilePath &second) { - return first.toStringView() == second.toStringView(); + return first.slashIndex() == second.slashIndex() + && first.name() == second.name() + && first.directory() == second.directory(); } friend bool operator==(const FilePath &first, const FilePathView &second) @@ -148,7 +150,8 @@ public: friend bool operator<(const FilePath &first, const FilePath &second) { - return first.toStringView() < second.toStringView(); + return std::make_tuple(first.slashIndex(), first.name(), first.directory()) + < std::make_tuple(second.slashIndex(), second.name(), second.directory()); } FilePath clone() const diff --git a/src/libs/clangsupport/filepathcache.h b/src/libs/clangsupport/filepathcache.h index 9d68b0c497..d0c8a529df 100644 --- a/src/libs/clangsupport/filepathcache.h +++ b/src/libs/clangsupport/filepathcache.h @@ -121,7 +121,7 @@ public: { Utils::SmallStringView directoryPath = filePath.directory(); - int directoryId = m_directyPathCache.stringId(directoryPath, + int directoryId = m_directoryPathCache.stringId(directoryPath, [&] (const Utils::SmallStringView) { return m_filePathStorage.fetchDirectoryId(directoryPath); }); @@ -143,7 +143,7 @@ public: auto fetchFilePath = [&] (int id) { return m_filePathStorage.fetchDirectoryPath(id); }; - Utils::PathString directoryPath = m_directyPathCache.string(filePathId.directoryId, + Utils::PathString directoryPath = m_directoryPathCache.string(filePathId.directoryId, fetchFilePath); @@ -158,7 +158,7 @@ public: } private: - mutable DirectoryPathCache m_directyPathCache; + mutable DirectoryPathCache m_directoryPathCache; mutable FileNameCache m_fileNameCache; FilePathStorage &m_filePathStorage; }; diff --git a/src/libs/clangsupport/generatedfiles.cpp b/src/libs/clangsupport/generatedfiles.cpp new file mode 100644 index 0000000000..554d84d2f4 --- /dev/null +++ b/src/libs/clangsupport/generatedfiles.cpp @@ -0,0 +1,99 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "generatedfiles.h" + +namespace ClangBackEnd { +template<class Type> +void GeneratedFiles::updateInternal(Type &&fileContainers) +{ + V2::FileContainers unionFileContainers; + unionFileContainers.reserve(m_fileContainers.size() + fileContainers.size()); + + auto compare = [] (const V2::FileContainer &first, const V2::FileContainer &second) { + return first.filePath < second.filePath; + }; + + std::set_union(std::make_move_iterator(fileContainers.begin()), + std::make_move_iterator(fileContainers.end()), + std::make_move_iterator(m_fileContainers.begin()), + std::make_move_iterator(m_fileContainers.end()), + std::back_inserter(unionFileContainers), + compare); + + m_fileContainers = std::move(unionFileContainers); +} + +void GeneratedFiles::update(V2::FileContainers &&fileContainers) +{ + updateInternal(std::move(fileContainers)); +} + +void GeneratedFiles::update(const V2::FileContainers &fileContainers) +{ + updateInternal(fileContainers); +} + +class Compare { +public: + bool operator()(const FilePath &first, const FilePath &second) + { + return first < second; + } + bool operator()(const V2::FileContainer &first, const V2::FileContainer &second) + { + return first.filePath < second.filePath; + } + bool operator()(const V2::FileContainer &first, const FilePath &second) + { + return first.filePath < second; + } + bool operator()(const FilePath &first, const V2::FileContainer &second) + { + return second.filePath < first; + } +}; + +void GeneratedFiles::remove(const FilePaths &filePaths) +{ + V2::FileContainers differenceFileContainers; + differenceFileContainers.reserve(m_fileContainers.size()); + + std::set_difference(std::make_move_iterator(m_fileContainers.begin()), + std::make_move_iterator(m_fileContainers.end()), + filePaths.begin(), + filePaths.end(), + std::back_inserter(differenceFileContainers), + Compare{}); + + m_fileContainers = std::move(differenceFileContainers); +} + +const V2::FileContainers &GeneratedFiles::fileContainers() const +{ + return m_fileContainers; +} + +} // namespace ClangBackEnd diff --git a/src/plugins/clangcodemodel/clangassistproposal.h b/src/libs/clangsupport/generatedfiles.h index 4353b43fb2..1838e7dab4 100644 --- a/src/plugins/clangcodemodel/clangassistproposal.h +++ b/src/libs/clangsupport/generatedfiles.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2018 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt Creator. @@ -25,21 +25,24 @@ #pragma once -#include "clangassistproposalmodel.h" +#include <filecontainerv2.h> -#include <texteditor/codeassist/genericproposal.h> +namespace ClangBackEnd { -namespace ClangCodeModel { -namespace Internal { - -class ClangAssistProposal : public TextEditor::GenericProposal +class CLANGSUPPORT_EXPORT GeneratedFiles { public: - ClangAssistProposal(int cursorPos, TextEditor::GenericProposalModelPtr model); + void update(V2::FileContainers &&fileContainers); + void update(const V2::FileContainers &fileContainers); + void remove(const FilePaths &filePaths); + + const V2::FileContainers &fileContainers() const; +private: + template<class Type> + void updateInternal(Type &&fileContainers); - bool isCorrective(TextEditor::TextEditorWidget *editorWidget) const override; - void makeCorrection(TextEditor::TextEditorWidget *editorWidget) override; +private: + V2::FileContainers m_fileContainers; }; -} // namespace Internal -} // namespace ClangCodeModel +} // namespace ClangBackEnd diff --git a/src/libs/clangsupport/pchmanagerserverinterface.cpp b/src/libs/clangsupport/pchmanagerserverinterface.cpp index 549e835450..256aa228ac 100644 --- a/src/libs/clangsupport/pchmanagerserverinterface.cpp +++ b/src/libs/clangsupport/pchmanagerserverinterface.cpp @@ -26,7 +26,9 @@ #include "pchmanagerserverinterface.h" #include "messageenvelop.h" +#include "removegeneratedfilesmessage.h" #include "removeprojectpartsmessage.h" +#include "updategeneratedfilesmessage.h" #include "updateprojectpartsmessage.h" #include <QDebug> @@ -45,6 +47,12 @@ void PchManagerServerInterface::dispatch(const MessageEnvelop &messageEnvelop) case MessageType::RemoveProjectPartsMessage: removeProjectParts(messageEnvelop.message<RemoveProjectPartsMessage>()); break; + case MessageType::UpdateGeneratedFilesMessage: + updateGeneratedFiles(messageEnvelop.message<UpdateGeneratedFilesMessage>()); + break; + case MessageType::RemoveGeneratedFilesMessage: + removeGeneratedFiles(messageEnvelop.message<RemoveGeneratedFilesMessage>()); + break; default: qWarning() << "Unknown IpcClientMessage"; } diff --git a/src/libs/clangsupport/pchmanagerserverinterface.h b/src/libs/clangsupport/pchmanagerserverinterface.h index 48ac0d3679..eb2a4310a5 100644 --- a/src/libs/clangsupport/pchmanagerserverinterface.h +++ b/src/libs/clangsupport/pchmanagerserverinterface.h @@ -32,8 +32,6 @@ namespace ClangBackEnd { class PchManagerClientInterface; -class RemoveProjectPartsMessage; -class UpdateProjectPartsMessage; class CLANGSUPPORT_EXPORT PchManagerServerInterface : public ProjectManagementServerInterface { diff --git a/src/libs/clangsupport/pchmanagerserverproxy.cpp b/src/libs/clangsupport/pchmanagerserverproxy.cpp index fbf4866542..dedbb23d50 100644 --- a/src/libs/clangsupport/pchmanagerserverproxy.cpp +++ b/src/libs/clangsupport/pchmanagerserverproxy.cpp @@ -28,7 +28,9 @@ #include "endmessage.h" #include "messageenvelop.h" #include "pchmanagerclientinterface.h" +#include "removegeneratedfilesmessage.h" #include "removeprojectpartsmessage.h" +#include "updategeneratedfilesmessage.h" #include "updateprojectpartsmessage.h" #include <QIODevice> @@ -56,4 +58,14 @@ void PchManagerServerProxy::removeProjectParts(RemoveProjectPartsMessage &&messa m_writeMessageBlock.write(message); } +void PchManagerServerProxy::updateGeneratedFiles(UpdateGeneratedFilesMessage &&message) +{ + m_writeMessageBlock.write(message); +} + +void PchManagerServerProxy::removeGeneratedFiles(RemoveGeneratedFilesMessage &&message) +{ + m_writeMessageBlock.write(message); +} + } // namespace ClangBackEnd diff --git a/src/libs/clangsupport/pchmanagerserverproxy.h b/src/libs/clangsupport/pchmanagerserverproxy.h index 30ae12782c..570de91a03 100644 --- a/src/libs/clangsupport/pchmanagerserverproxy.h +++ b/src/libs/clangsupport/pchmanagerserverproxy.h @@ -52,6 +52,8 @@ public: void end() override; void updateProjectParts(UpdateProjectPartsMessage &&message) override; void removeProjectParts(RemoveProjectPartsMessage &&message) override; + void updateGeneratedFiles(UpdateGeneratedFilesMessage &&message) override; + void removeGeneratedFiles(RemoveGeneratedFilesMessage &&message) override; }; } // namespace ClangBackEnd diff --git a/src/libs/clangsupport/projectmanagementserverinterface.h b/src/libs/clangsupport/projectmanagementserverinterface.h index eb06960dc3..08d6edbb0c 100644 --- a/src/libs/clangsupport/projectmanagementserverinterface.h +++ b/src/libs/clangsupport/projectmanagementserverinterface.h @@ -29,7 +29,9 @@ namespace ClangBackEnd { +class RemoveGeneratedFilesMessage; class RemoveProjectPartsMessage; +class UpdateGeneratedFilesMessage; class UpdateProjectPartsMessage; class ProjectManagementServerInterface : public IpcServerInterface @@ -37,6 +39,8 @@ class ProjectManagementServerInterface : public IpcServerInterface public: virtual void updateProjectParts(UpdateProjectPartsMessage &&message) = 0; virtual void removeProjectParts(RemoveProjectPartsMessage &&message) = 0; + virtual void updateGeneratedFiles(UpdateGeneratedFilesMessage &&message) = 0; + virtual void removeGeneratedFiles(RemoveGeneratedFilesMessage &&message) = 0; protected: ~ProjectManagementServerInterface() = default; diff --git a/src/libs/clangsupport/refactoringserverinterface.cpp b/src/libs/clangsupport/refactoringserverinterface.cpp index e9a2456d74..a95837f80a 100644 --- a/src/libs/clangsupport/refactoringserverinterface.cpp +++ b/src/libs/clangsupport/refactoringserverinterface.cpp @@ -50,9 +50,15 @@ void RefactoringServerInterface::dispatch(const MessageEnvelop &messageEnvelop) case MessageType::UpdateProjectPartsMessage: updateProjectParts(messageEnvelop.message<UpdateProjectPartsMessage>()); break; + case MessageType::UpdateGeneratedFilesMessage: + updateGeneratedFiles(messageEnvelop.message<UpdateGeneratedFilesMessage>()); + break; case MessageType::RemoveProjectPartsMessage: removeProjectParts(messageEnvelop.message<RemoveProjectPartsMessage>()); break; + case MessageType::RemoveGeneratedFilesMessage: + removeGeneratedFiles(messageEnvelop.message<RemoveGeneratedFilesMessage>()); + break; case MessageType::CancelMessage: cancel(); break; diff --git a/src/libs/clangsupport/refactoringserverproxy.cpp b/src/libs/clangsupport/refactoringserverproxy.cpp index 809a66fe57..3bc8fe20af 100644 --- a/src/libs/clangsupport/refactoringserverproxy.cpp +++ b/src/libs/clangsupport/refactoringserverproxy.cpp @@ -69,6 +69,16 @@ void RefactoringServerProxy::removeProjectParts(RemoveProjectPartsMessage &&mess m_writeMessageBlock.write(message); } +void RefactoringServerProxy::updateGeneratedFiles(UpdateGeneratedFilesMessage &&message) +{ + m_writeMessageBlock.write(message); +} + +void RefactoringServerProxy::removeGeneratedFiles(RemoveGeneratedFilesMessage &&message) +{ + m_writeMessageBlock.write(message); +} + void RefactoringServerProxy::cancel() { m_writeMessageBlock.write(CancelMessage()); diff --git a/src/libs/clangsupport/refactoringserverproxy.h b/src/libs/clangsupport/refactoringserverproxy.h index e5006e66e9..55ae20d441 100644 --- a/src/libs/clangsupport/refactoringserverproxy.h +++ b/src/libs/clangsupport/refactoringserverproxy.h @@ -55,6 +55,8 @@ public: void requestSourceRangesForQueryMessage(RequestSourceRangesForQueryMessage &&message) override; void updateProjectParts(UpdateProjectPartsMessage &&message) override; void removeProjectParts(RemoveProjectPartsMessage &&message) override; + void updateGeneratedFiles(UpdateGeneratedFilesMessage &&message) override; + void removeGeneratedFiles(RemoveGeneratedFilesMessage &&message) override; void cancel() override; }; diff --git a/src/libs/clangsupport/removegeneratedfilesmessage.cpp b/src/libs/clangsupport/removegeneratedfilesmessage.cpp new file mode 100644 index 0000000000..2ed92a8169 --- /dev/null +++ b/src/libs/clangsupport/removegeneratedfilesmessage.cpp @@ -0,0 +1,37 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "removegeneratedfilesmessage.h" + +namespace ClangBackEnd { + +QDebug operator<<(QDebug debug, const RemoveGeneratedFilesMessage &message) +{ + debug.nospace() << "RemoveGeneratedFilesMessage(" + << message.generatedFiles << ")"; + + return debug; +} +} // namespace ClangBackEnd diff --git a/src/libs/clangsupport/removegeneratedfilesmessage.h b/src/libs/clangsupport/removegeneratedfilesmessage.h new file mode 100644 index 0000000000..6aebaccb27 --- /dev/null +++ b/src/libs/clangsupport/removegeneratedfilesmessage.h @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include <clangsupport_global.h> + +#include "filepath.h" + +namespace ClangBackEnd { + +class RemoveGeneratedFilesMessage +{ +public: + RemoveGeneratedFilesMessage() = default; + RemoveGeneratedFilesMessage(FilePaths &&generatedFiles) + : generatedFiles(std::move(generatedFiles)) + {} + + FilePaths takeGeneratedFiles() + { + return std::move(generatedFiles); + } + + friend QDataStream &operator<<(QDataStream &out, const RemoveGeneratedFilesMessage &message) + { + out << message.generatedFiles; + + return out; + } + + friend QDataStream &operator>>(QDataStream &in, RemoveGeneratedFilesMessage &message) + { + in >> message.generatedFiles; + + return in; + } + + friend bool operator==(const RemoveGeneratedFilesMessage &first, + const RemoveGeneratedFilesMessage &second) + { + return first.generatedFiles == second.generatedFiles; + } + + RemoveGeneratedFilesMessage clone() const + { + return *this; + } + +public: + FilePaths generatedFiles; +}; + +CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const RemoveGeneratedFilesMessage &message); + +DECLARE_MESSAGE(RemoveGeneratedFilesMessage) +} // namespace ClangBackEnd diff --git a/src/libs/clangsupport/updategeneratedfilesmessage.cpp b/src/libs/clangsupport/updategeneratedfilesmessage.cpp new file mode 100644 index 0000000000..9ef71a0df5 --- /dev/null +++ b/src/libs/clangsupport/updategeneratedfilesmessage.cpp @@ -0,0 +1,38 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "updategeneratedfilesmessage.h" + +namespace ClangBackEnd { + +QDebug operator<<(QDebug debug, const UpdateGeneratedFilesMessage &message) +{ + debug.nospace() << "UpdateGeneratedFilesMessage(" + << message.generatedFiles << ")"; + + return debug; +} + +} // namespace ClangBackEnd diff --git a/src/libs/clangsupport/updategeneratedfilesmessage.h b/src/libs/clangsupport/updategeneratedfilesmessage.h new file mode 100644 index 0000000000..fabfda0125 --- /dev/null +++ b/src/libs/clangsupport/updategeneratedfilesmessage.h @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include "filecontainerv2.h" + +namespace ClangBackEnd { + +class UpdateGeneratedFilesMessage +{ +public: + UpdateGeneratedFilesMessage() = default; + UpdateGeneratedFilesMessage(V2::FileContainers &&generatedFiles) + : generatedFiles(std::move(generatedFiles)) + {} + + V2::FileContainers takeGeneratedFiles() + { + return std::move(generatedFiles); + } + + friend QDataStream &operator<<(QDataStream &out, const UpdateGeneratedFilesMessage &message) + { + out << message.generatedFiles; + + return out; + } + + friend QDataStream &operator>>(QDataStream &in, UpdateGeneratedFilesMessage &message) + { + in >> message.generatedFiles; + + return in; + } + + friend bool operator==(const UpdateGeneratedFilesMessage &first, + const UpdateGeneratedFilesMessage &second) + { + return first.generatedFiles == second.generatedFiles; + } + + UpdateGeneratedFilesMessage clone() const + { + return *this; + } + +public: + V2::FileContainers generatedFiles; +}; + +CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const UpdateGeneratedFilesMessage &message); + +DECLARE_MESSAGE(UpdateGeneratedFilesMessage) +} // namespace ClangBackEnd diff --git a/src/libs/clangsupport/updateprojectpartsmessage.h b/src/libs/clangsupport/updateprojectpartsmessage.h index 8c2ee5befe..e923d7ba03 100644 --- a/src/libs/clangsupport/updateprojectpartsmessage.h +++ b/src/libs/clangsupport/updateprojectpartsmessage.h @@ -34,10 +34,8 @@ class UpdateProjectPartsMessage { public: UpdateProjectPartsMessage() = default; - UpdateProjectPartsMessage(V2::ProjectPartContainers &&projectsParts, - V2::FileContainers &&generatedFiles) - : projectsParts(std::move(projectsParts)), - generatedFiles(std::move(generatedFiles)) + UpdateProjectPartsMessage(V2::ProjectPartContainers &&projectsParts) + : projectsParts(std::move(projectsParts)) {} V2::ProjectPartContainers takeProjectsParts() @@ -45,15 +43,9 @@ public: return std::move(projectsParts); } - V2::FileContainers takeGeneratedFiles() - { - return std::move(generatedFiles); - } - friend QDataStream &operator<<(QDataStream &out, const UpdateProjectPartsMessage &message) { out << message.projectsParts; - out << message.generatedFiles; return out; } @@ -61,7 +53,6 @@ public: friend QDataStream &operator>>(QDataStream &in, UpdateProjectPartsMessage &message) { in >> message.projectsParts; - in >> message.generatedFiles; return in; } @@ -69,19 +60,16 @@ public: friend bool operator==(const UpdateProjectPartsMessage &first, const UpdateProjectPartsMessage &second) { - return first.projectsParts == second.projectsParts - && first.generatedFiles == second.generatedFiles; + return first.projectsParts == second.projectsParts; } UpdateProjectPartsMessage clone() const { - return UpdateProjectPartsMessage(Utils::clone(projectsParts), - Utils::clone(generatedFiles)); + return *this; } public: V2::ProjectPartContainers projectsParts; - V2::FileContainers generatedFiles; }; CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const UpdateProjectPartsMessage &message); diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp index 93f3654e4f..d892948468 100644 --- a/src/libs/cplusplus/CppDocument.cpp +++ b/src/libs/cplusplus/CppDocument.cpp @@ -142,34 +142,34 @@ protected: using SymbolVisitor::visit; - virtual bool preVisit(Symbol *) + bool preVisit(Symbol *) override { return ! _scope; } - virtual bool visit(UsingNamespaceDirective *) { return false; } - virtual bool visit(UsingDeclaration *) { return false; } - virtual bool visit(NamespaceAlias *) { return false; } - virtual bool visit(Declaration *) { return false; } - virtual bool visit(Argument *) { return false; } - virtual bool visit(TypenameArgument *) { return false; } - virtual bool visit(BaseClass *) { return false; } - virtual bool visit(ForwardClassDeclaration *) { return false; } + bool visit(UsingNamespaceDirective *) override { return false; } + bool visit(UsingDeclaration *) override { return false; } + bool visit(NamespaceAlias *) override { return false; } + bool visit(Declaration *) override { return false; } + bool visit(Argument *) override { return false; } + bool visit(TypenameArgument *) override { return false; } + bool visit(BaseClass *) override { return false; } + bool visit(ForwardClassDeclaration *) override { return false; } - virtual bool visit(Enum *symbol) + bool visit(Enum *symbol) override { return process(symbol); } - virtual bool visit(Function *symbol) + bool visit(Function *symbol) override { return process(symbol); } - virtual bool visit(Namespace *symbol) + bool visit(Namespace *symbol) override { return process(symbol); } - virtual bool visit(Class *symbol) + bool visit(Class *symbol) override { return process(symbol); } - virtual bool visit(Block *symbol) + bool visit(Block *symbol) override { return process(symbol); } - virtual bool visit(Template *symbol) + bool visit(Template *symbol) override { if (Symbol *decl = symbol->declaration()) { if (decl->isFunction() || decl->isClass() || decl->isDeclaration()) @@ -179,19 +179,19 @@ protected: } // Objective-C - virtual bool visit(ObjCBaseClass *) { return false; } - virtual bool visit(ObjCBaseProtocol *) { return false; } - virtual bool visit(ObjCForwardClassDeclaration *) { return false; } - virtual bool visit(ObjCForwardProtocolDeclaration *) { return false; } - virtual bool visit(ObjCPropertyDeclaration *) { return false; } + bool visit(ObjCBaseClass *) override { return false; } + bool visit(ObjCBaseProtocol *) override { return false; } + bool visit(ObjCForwardClassDeclaration *) override { return false; } + bool visit(ObjCForwardProtocolDeclaration *) override { return false; } + bool visit(ObjCPropertyDeclaration *) override { return false; } - virtual bool visit(ObjCClass *symbol) + bool visit(ObjCClass *symbol) override { return process(symbol); } - virtual bool visit(ObjCProtocol *symbol) + bool visit(ObjCProtocol *symbol) override { return process(symbol); } - virtual bool visit(ObjCMethod *symbol) + bool visit(ObjCMethod *symbol) override { return process(symbol); } }; @@ -209,10 +209,10 @@ public: errorCount(0) { } - virtual void report(int level, - const StringLiteral *fileId, - unsigned line, unsigned column, - const char *format, va_list ap) + void report(int level, + const StringLiteral *fileId, + unsigned line, unsigned column, + const char *format, va_list ap) override { if (level == Error) { ++errorCount; diff --git a/src/libs/cplusplus/CppRewriter.cpp b/src/libs/cplusplus/CppRewriter.cpp index 1ce9cc2dfa..aec22d8248 100644 --- a/src/libs/cplusplus/CppRewriter.cpp +++ b/src/libs/cplusplus/CppRewriter.cpp @@ -73,52 +73,52 @@ public: return (!temps.isEmpty()) ? temps.takeLast() : ty; } - virtual void visit(UndefinedType *) + void visit(UndefinedType *) override { temps.append(FullySpecifiedType()); } - virtual void visit(VoidType *) + void visit(VoidType *) override { temps.append(control()->voidType()); } - virtual void visit(IntegerType *type) + void visit(IntegerType *type) override { temps.append(control()->integerType(type->kind())); } - virtual void visit(FloatType *type) + void visit(FloatType *type) override { temps.append(control()->floatType(type->kind())); } - virtual void visit(PointerToMemberType *type) + void visit(PointerToMemberType *type) override { const Name *memberName = rewrite->rewriteName(type->memberName()); const FullySpecifiedType elementType = rewrite->rewriteType(type->elementType()); temps.append(control()->pointerToMemberType(memberName, elementType)); } - virtual void visit(PointerType *type) + void visit(PointerType *type) override { const FullySpecifiedType elementType = rewrite->rewriteType(type->elementType()); temps.append(control()->pointerType(elementType)); } - virtual void visit(ReferenceType *type) + void visit(ReferenceType *type) override { const FullySpecifiedType elementType = rewrite->rewriteType(type->elementType()); temps.append(control()->referenceType(elementType, type->isRvalueReference())); } - virtual void visit(ArrayType *type) + void visit(ArrayType *type) override { const FullySpecifiedType elementType = rewrite->rewriteType(type->elementType()); temps.append(control()->arrayType(elementType, type->size())); } - virtual void visit(NamedType *type) + void visit(NamedType *type) override { FullySpecifiedType ty = rewrite->env->apply(type->name(), rewrite); if (! ty->isUndefinedType()) { @@ -129,7 +129,7 @@ public: } } - virtual void visit(Function *type) + void visit(Function *type) override { Function *funTy = control()->newFunction(0, 0); funTy->copy(type); @@ -158,55 +158,55 @@ public: temps.append(funTy); } - virtual void visit(Namespace *type) + void visit(Namespace *type) override { qWarning() << Q_FUNC_INFO; temps.append(type); } - virtual void visit(Class *type) + void visit(Class *type) override { qWarning() << Q_FUNC_INFO; temps.append(type); } - virtual void visit(Enum *type) + void visit(Enum *type) override { qWarning() << Q_FUNC_INFO; temps.append(type); } - virtual void visit(ForwardClassDeclaration *type) + void visit(ForwardClassDeclaration *type) override { qWarning() << Q_FUNC_INFO; temps.append(type); } - virtual void visit(ObjCClass *type) + void visit(ObjCClass *type) override { qWarning() << Q_FUNC_INFO; temps.append(type); } - virtual void visit(ObjCProtocol *type) + void visit(ObjCProtocol *type) override { qWarning() << Q_FUNC_INFO; temps.append(type); } - virtual void visit(ObjCMethod *type) + void visit(ObjCMethod *type) override { qWarning() << Q_FUNC_INFO; temps.append(type); } - virtual void visit(ObjCForwardClassDeclaration *type) + void visit(ObjCForwardClassDeclaration *type) override { qWarning() << Q_FUNC_INFO; temps.append(type); } - virtual void visit(ObjCForwardProtocolDeclaration *type) + void visit(ObjCForwardProtocolDeclaration *type) override { qWarning() << Q_FUNC_INFO; temps.append(type); @@ -242,19 +242,19 @@ public: return (!temps.isEmpty()) ? temps.takeLast() : name; } - virtual void visit(const QualifiedNameId *name) + void visit(const QualifiedNameId *name) override { const Name *base = rewrite->rewriteName(name->base()); const Name *n = rewrite->rewriteName(name->name()); temps.append(control()->qualifiedNameId(base, n)); } - virtual void visit(const Identifier *name) + void visit(const Identifier *name) override { temps.append(control()->identifier(name->chars(), name->size())); } - virtual void visit(const TemplateNameId *name) + void visit(const TemplateNameId *name) override { QVarLengthArray<FullySpecifiedType, 8> args(name->templateArgumentCount()); for (unsigned i = 0; i < name->templateArgumentCount(); ++i) @@ -263,23 +263,23 @@ public: args.data(), args.size())); } - virtual void visit(const DestructorNameId *name) + void visit(const DestructorNameId *name) override { temps.append(control()->destructorNameId(identifier(name->identifier()))); } - virtual void visit(const OperatorNameId *name) + void visit(const OperatorNameId *name) override { temps.append(control()->operatorNameId(name->kind())); } - virtual void visit(const ConversionNameId *name) + void visit(const ConversionNameId *name) override { FullySpecifiedType ty = rewrite->rewriteType(name->type()); temps.append(control()->conversionNameId(ty)); } - virtual void visit(const SelectorNameId *name) + void visit(const SelectorNameId *name) override { QVarLengthArray<const Name *, 8> names(name->nameCount()); for (unsigned i = 0; i < name->nameCount(); ++i) diff --git a/src/libs/cplusplus/DeprecatedGenTemplateInstance.cpp b/src/libs/cplusplus/DeprecatedGenTemplateInstance.cpp index 90cd52ef6b..db39d0b20d 100644 --- a/src/libs/cplusplus/DeprecatedGenTemplateInstance.cpp +++ b/src/libs/cplusplus/DeprecatedGenTemplateInstance.cpp @@ -81,48 +81,48 @@ private: return previousType; } - virtual void visit(VoidType *) + void visit(VoidType *) override { // nothing to do } - virtual void visit(IntegerType *) + void visit(IntegerType *) override { // nothing to do } - virtual void visit(FloatType *) + void visit(FloatType *) override { // nothing to do } - virtual void visit(PointerToMemberType *) + void visit(PointerToMemberType *) override { qDebug() << Q_FUNC_INFO; // ### TODO } - virtual void visit(PointerType *ptrTy) + void visit(PointerType *ptrTy) override { _type.setType(control()->pointerType(q->apply(ptrTy->elementType()))); } - virtual void visit(ReferenceType *refTy) + void visit(ReferenceType *refTy) override { _type.setType(control()->referenceType(q->apply(refTy->elementType()), refTy->isRvalueReference())); } - virtual void visit(ArrayType *arrayTy) + void visit(ArrayType *arrayTy) override { _type.setType(control()->arrayType(q->apply(arrayTy->elementType()), arrayTy->size())); } - virtual void visit(NamedType *ty) + void visit(NamedType *ty) override { FullySpecifiedType n = q->apply(ty->name()); _type.setType(n.type()); } - virtual void visit(Function *funTy) + void visit(Function *funTy) override { Function *fun = control()->newFunction(/*sourceLocation=*/ 0, funTy->name()); fun->setEnclosingScope(funTy->enclosingScope()); @@ -149,47 +149,47 @@ private: _type.setType(fun); } - virtual void visit(Namespace *) + void visit(Namespace *) override { qDebug() << Q_FUNC_INFO; } - virtual void visit(Class *) + void visit(Class *) override { qDebug() << Q_FUNC_INFO; } - virtual void visit(Enum *) + void visit(Enum *) override { qDebug() << Q_FUNC_INFO; } - virtual void visit(ForwardClassDeclaration *) + void visit(ForwardClassDeclaration *) override { qDebug() << Q_FUNC_INFO; } - virtual void visit(ObjCClass *) + void visit(ObjCClass *) override { qDebug() << Q_FUNC_INFO; } - virtual void visit(ObjCProtocol *) + void visit(ObjCProtocol *) override { qDebug() << Q_FUNC_INFO; } - virtual void visit(ObjCMethod *) + void visit(ObjCMethod *) override { qDebug() << Q_FUNC_INFO; } - virtual void visit(ObjCForwardClassDeclaration *) + void visit(ObjCForwardClassDeclaration *) override { qDebug() << Q_FUNC_INFO; } - virtual void visit(ObjCForwardProtocolDeclaration *) + void visit(ObjCForwardProtocolDeclaration *) override { qDebug() << Q_FUNC_INFO; } @@ -229,7 +229,7 @@ private: return previousType; } - virtual void visit(const Identifier *name) + void visit(const Identifier *name) override { int index = findSubstitution(name->identifier()); @@ -240,7 +240,7 @@ private: _type = control()->namedType(name); } - virtual void visit(const TemplateNameId *name) + void visit(const TemplateNameId *name) override { QVarLengthArray<FullySpecifiedType, 8> arguments(name->templateArgumentCount()); for (unsigned i = 0; i < name->templateArgumentCount(); ++i) { @@ -294,31 +294,31 @@ private: return 0; } - virtual void visit(const QualifiedNameId *name) + void visit(const QualifiedNameId *name) override { if (const Name *n = instantiate(name)) _type = control()->namedType(n); } - virtual void visit(const DestructorNameId *name) + void visit(const DestructorNameId *name) override { Overview oo; qWarning() << "ignored name:" << oo.prettyName(name); } - virtual void visit(const OperatorNameId *name) + void visit(const OperatorNameId *name) override { Overview oo; qWarning() << "ignored name:" << oo.prettyName(name); } - virtual void visit(const ConversionNameId *name) + void visit(const ConversionNameId *name) override { Overview oo; qWarning() << "ignored name:" << oo.prettyName(name); } - virtual void visit(const SelectorNameId *name) + void visit(const SelectorNameId *name) override { Overview oo; qWarning() << "ignored name:" << oo.prettyName(name); diff --git a/src/libs/cplusplus/Icons.cpp b/src/libs/cplusplus/Icons.cpp index 5e5297b403..5f2397d0e5 100644 --- a/src/libs/cplusplus/Icons.cpp +++ b/src/libs/cplusplus/Icons.cpp @@ -30,8 +30,6 @@ #include <cplusplus/Symbols.h> #include <cplusplus/Type.h> -#include <utils/icon.h> - using namespace CPlusPlus; using CPlusPlus::Icons; @@ -42,16 +40,17 @@ QIcon Icons::iconForSymbol(const Symbol *symbol) QIcon Icons::keywordIcon() { - return iconForType(KeywordIconType); + return iconForType(Utils::CodeModelIcon::Keyword); } QIcon Icons::macroIcon() { - return iconForType(MacroIconType); + return iconForType(Utils::CodeModelIcon::Macro); } -Icons::IconType Icons::iconTypeForSymbol(const Symbol *symbol) +Utils::CodeModelIcon::Type Icons::iconTypeForSymbol(const Symbol *symbol) { + using namespace Utils::CodeModelIcon; if (const Template *templ = symbol->asTemplate()) { if (Symbol *decl = templ->declaration()) return iconTypeForSymbol(decl); @@ -67,244 +66,53 @@ Icons::IconType Icons::iconTypeForSymbol(const Symbol *symbol) if (function->isSlot()) { if (function->isPublic()) - return SlotPublicIconType; + return SlotPublic; else if (function->isProtected()) - return SlotProtectedIconType; + return SlotProtected; else if (function->isPrivate()) - return SlotPrivateIconType; + return SlotPrivate; } else if (function->isSignal()) { - return SignalIconType; + return Signal; } else if (symbol->isPublic()) { - return symbol->isStatic() ? FuncPublicStaticIconType : FuncPublicIconType; + return symbol->isStatic() ? FuncPublicStatic : FuncPublic; } else if (symbol->isProtected()) { - return symbol->isStatic() ? FuncProtectedStaticIconType : FuncProtectedIconType; + return symbol->isStatic() ? FuncProtectedStatic : FuncProtected; } else if (symbol->isPrivate()) { - return symbol->isStatic() ? FuncPrivateStaticIconType : FuncPrivateIconType; + return symbol->isStatic() ? FuncPrivateStatic : FuncPrivate; } } else if (symbol->enclosingScope() && symbol->enclosingScope()->isEnum()) { - return EnumeratorIconType; + return Enumerator; } else if (symbol->isDeclaration() || symbol->isArgument()) { if (symbol->isPublic()) { - return symbol->isStatic() ? VarPublicStaticIconType : VarPublicIconType; + return symbol->isStatic() ? VarPublicStatic : VarPublic; } else if (symbol->isProtected()) { - return symbol->isStatic() ? VarProtectedStaticIconType : VarProtectedIconType; + return symbol->isStatic() ? VarProtectedStatic : VarProtected; } else if (symbol->isPrivate()) { - return symbol->isStatic() ? VarPrivateStaticIconType : VarPrivateIconType; + return symbol->isStatic() ? VarPrivateStatic : VarPrivate; } } else if (symbol->isEnum()) { - return EnumIconType; + return Utils::CodeModelIcon::Enum; } else if (symbol->isForwardClassDeclaration()) { - return ClassIconType; // TODO: Store class key in ForwardClassDeclaration + return Utils::CodeModelIcon::Class; // TODO: Store class key in ForwardClassDeclaration } else if (const Class *klass = symbol->asClass()) { - return klass->isStruct() ? StructIconType : ClassIconType; + return klass->isStruct() ? Struct : Utils::CodeModelIcon::Class; } else if (symbol->isObjCClass() || symbol->isObjCForwardClassDeclaration()) { - return ClassIconType; + return Utils::CodeModelIcon::Class; } else if (symbol->isObjCProtocol() || symbol->isObjCForwardProtocolDeclaration()) { - return ClassIconType; + return Utils::CodeModelIcon::Class; } else if (symbol->isObjCMethod()) { - return FuncPublicIconType; + return FuncPublic; } else if (symbol->isNamespace()) { - return NamespaceIconType; + return Utils::CodeModelIcon::Namespace; } else if (symbol->isTypenameArgument()) { - return ClassIconType; + return Utils::CodeModelIcon::Class; } else if (symbol->isQtPropertyDeclaration() || symbol->isObjCPropertyDeclaration()) { - return PropertyIconType; + return Property; } else if (symbol->isUsingNamespaceDirective() || symbol->isUsingDeclaration()) { // TODO: Might be nice to have a different icons for these things - return NamespaceIconType; + return Utils::CodeModelIcon::Namespace; } - return UnknownIconType; -} - -QIcon Icons::iconForType(IconType type) -{ - using namespace Utils; - - static const IconMaskAndColor classRelationIcon { - QLatin1String(":/codemodel/images/classrelation.png"), Theme::IconsCodeModelOverlayForegroundColor}; - static const IconMaskAndColor classRelationBackgroundIcon { - QLatin1String(":/codemodel/images/classrelationbackground.png"), Theme::IconsCodeModelOverlayBackgroundColor}; - static const IconMaskAndColor classMemberFunctionIcon { - QLatin1String(":/codemodel/images/classmemberfunction.png"), Theme::IconsCodeModelFunctionColor}; - static const IconMaskAndColor classMemberVariableIcon { - QLatin1String(":/codemodel/images/classmembervariable.png"), Theme::IconsCodeModelVariableColor}; - static const IconMaskAndColor functionIcon { - QLatin1String(":/codemodel/images/member.png"), Theme::IconsCodeModelFunctionColor}; - static const IconMaskAndColor variableIcon { - QLatin1String(":/codemodel/images/member.png"), Theme::IconsCodeModelVariableColor}; - static const IconMaskAndColor signalIcon { - QLatin1String(":/codemodel/images/signal.png"), Theme::IconsCodeModelFunctionColor}; - static const IconMaskAndColor slotIcon { - QLatin1String(":/codemodel/images/slot.png"), Theme::IconsCodeModelFunctionColor}; - static const IconMaskAndColor propertyIcon { - QLatin1String(":/codemodel/images/property.png"), Theme::IconsCodeModelOverlayForegroundColor}; - static const IconMaskAndColor propertyBackgroundIcon { - QLatin1String(":/codemodel/images/propertybackground.png"), Theme::IconsCodeModelOverlayBackgroundColor}; - static const IconMaskAndColor protectedIcon { - QLatin1String(":/codemodel/images/protected.png"), Theme::IconsCodeModelOverlayForegroundColor}; - static const IconMaskAndColor protectedBackgroundIcon { - QLatin1String(":/codemodel/images/protectedbackground.png"), Theme::IconsCodeModelOverlayBackgroundColor}; - static const IconMaskAndColor privateIcon { - QLatin1String(":/codemodel/images/private.png"), Theme::IconsCodeModelOverlayForegroundColor}; - static const IconMaskAndColor privateBackgroundIcon { - QLatin1String(":/codemodel/images/privatebackground.png"), Theme::IconsCodeModelOverlayBackgroundColor}; - static const IconMaskAndColor staticIcon { - QLatin1String(":/codemodel/images/static.png"), Theme::IconsCodeModelOverlayForegroundColor}; - static const IconMaskAndColor staticBackgroundIcon { - QLatin1String(":/codemodel/images/staticbackground.png"), Theme::IconsCodeModelOverlayBackgroundColor}; - - switch (type) { - case ClassIconType: { - const static QIcon icon(Icon({ - classRelationBackgroundIcon, classRelationIcon, - {QLatin1String(":/codemodel/images/classparent.png"), Theme::IconsCodeModelClassColor}, - classMemberFunctionIcon, classMemberVariableIcon - }, Icon::Tint).icon()); - return icon; - } - case StructIconType: { - const static QIcon icon(Icon({ - classRelationBackgroundIcon, classRelationIcon, - {QLatin1String(":/codemodel/images/classparent.png"), Theme::IconsCodeModelStructColor}, - classMemberFunctionIcon, classMemberVariableIcon - }, Icon::Tint).icon()); - return icon; - } - case EnumIconType: { - const static QIcon icon(Icon({ - {QLatin1String(":/codemodel/images/enum.png"), Theme::IconsCodeModelEnumColor} - }, Icon::Tint).icon()); - return icon; - } - case EnumeratorIconType: { - const static QIcon icon(Icon({ - {QLatin1String(":/codemodel/images/enumerator.png"), Theme::IconsCodeModelEnumColor} - }, Icon::Tint).icon()); - return icon; - } - case FuncPublicIconType: { - const static QIcon icon(Icon({ - functionIcon}, Icon::Tint).icon()); - return icon; - } - case FuncProtectedIconType: { - const static QIcon icon(Icon({ - functionIcon, protectedBackgroundIcon, protectedIcon - }, Icon::Tint).icon()); - return icon; - } - case FuncPrivateIconType: { - const static QIcon icon(Icon({ - functionIcon, privateBackgroundIcon, privateIcon - }, Icon::Tint).icon()); - return icon; - } - case FuncPublicStaticIconType: { - const static QIcon icon(Icon({ - functionIcon, staticBackgroundIcon, staticIcon - }, Icon::Tint).icon()); - return icon; - } - case FuncProtectedStaticIconType: { - const static QIcon icon(Icon({ - functionIcon, staticBackgroundIcon, staticIcon, protectedBackgroundIcon, protectedIcon - }, Icon::Tint).icon()); - return icon; - } - case FuncPrivateStaticIconType: { - const static QIcon icon(Icon({ - functionIcon, staticBackgroundIcon, staticIcon, privateBackgroundIcon, privateIcon - }, Icon::Tint).icon()); - return icon; - } - case NamespaceIconType: { - const static QIcon icon(Icon({ - {QLatin1String(":/utils/images/namespace.png"), Theme::IconsCodeModelKeywordColor} - }, Icon::Tint).icon()); - return icon; - } - case VarPublicIconType: { - const static QIcon icon(Icon({ - variableIcon - }, Icon::Tint).icon()); - return icon; - } - case VarProtectedIconType: { - const static QIcon icon(Icon({ - variableIcon, protectedBackgroundIcon, protectedIcon - }, Icon::Tint).icon()); - return icon; - } - case VarPrivateIconType: { - const static QIcon icon(Icon({ - variableIcon, privateBackgroundIcon, privateIcon - }, Icon::Tint).icon()); - return icon; - } - case VarPublicStaticIconType: { - const static QIcon icon(Icon({ - variableIcon, staticBackgroundIcon, staticIcon - }, Icon::Tint).icon()); - return icon; - } - case VarProtectedStaticIconType: { - const static QIcon icon(Icon({ - variableIcon, staticBackgroundIcon, staticIcon, protectedBackgroundIcon, protectedIcon - }, Icon::Tint).icon()); - return icon; - } - case VarPrivateStaticIconType: { - const static QIcon icon(Icon({ - variableIcon, staticBackgroundIcon, staticIcon, privateBackgroundIcon, privateIcon - }, Icon::Tint).icon()); - return icon; - } - case SignalIconType: { - const static QIcon icon(Icon({ - signalIcon - }, Icon::Tint).icon()); - return icon; - } - case SlotPublicIconType: { - const static QIcon icon(Icon({ - slotIcon - }, Icon::Tint).icon()); - return icon; - } - case SlotProtectedIconType: { - const static QIcon icon(Icon({ - slotIcon, protectedBackgroundIcon, protectedIcon - }, Icon::Tint).icon()); - return icon; - } - case SlotPrivateIconType: { - const static QIcon icon(Icon({ - slotIcon, privateBackgroundIcon, privateIcon - }, Icon::Tint).icon()); - return icon; - } - case KeywordIconType: { - const static QIcon icon(Icon({ - {QLatin1String(":/codemodel/images/keyword.png"), Theme::IconsCodeModelKeywordColor} - }, Icon::Tint).icon()); - return icon; - } - case MacroIconType: { - const static QIcon icon(Icon({ - {QLatin1String(":/codemodel/images/macro.png"), Theme::IconsCodeModelMacroColor} - }, Icon::Tint).icon()); - return icon; - } - case PropertyIconType: { - const static QIcon icon(Icon({ - variableIcon, propertyBackgroundIcon, propertyIcon - }, Icon::Tint).icon()); - return icon; - } - default: - break; - } - return QIcon(); + return Unknown; } diff --git a/src/libs/cplusplus/Icons.h b/src/libs/cplusplus/Icons.h index a5aaa33d60..05b067f246 100644 --- a/src/libs/cplusplus/Icons.h +++ b/src/libs/cplusplus/Icons.h @@ -26,6 +26,7 @@ #pragma once #include <cplusplus/CPlusPlusForwardDeclarations.h> +#include <utils/utilsicons.h> #include <QIcon> @@ -41,36 +42,7 @@ public: static QIcon keywordIcon(); static QIcon macroIcon(); - enum IconType { - ClassIconType = 0, - StructIconType, - EnumIconType, - EnumeratorIconType, - FuncPublicIconType, - FuncProtectedIconType, - FuncPrivateIconType, - FuncPublicStaticIconType, - FuncProtectedStaticIconType, - FuncPrivateStaticIconType, - NamespaceIconType, - VarPublicIconType, - VarProtectedIconType, - VarPrivateIconType, - VarPublicStaticIconType, - VarProtectedStaticIconType, - VarPrivateStaticIconType, - SignalIconType, - SlotPublicIconType, - SlotProtectedIconType, - SlotPrivateIconType, - KeywordIconType, - MacroIconType, - PropertyIconType, - UnknownIconType - }; - - static IconType iconTypeForSymbol(const Symbol *symbol); - static QIcon iconForType(IconType type); + static Utils::CodeModelIcon::Type iconTypeForSymbol(const Symbol *symbol); private: Icons() {} diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp index 37b9ce8b30..034ea6fcc1 100644 --- a/src/libs/cplusplus/ResolveExpression.cpp +++ b/src/libs/cplusplus/ResolveExpression.cpp @@ -659,7 +659,7 @@ public: accept(tu->ast()); } - virtual bool preVisit(AST *) + bool preVisit(AST *) override { if (_block) return false; @@ -667,7 +667,7 @@ public: return true; } - virtual bool visit(SimpleNameAST *ast) + bool visit(SimpleNameAST *ast) override { if (ast->name && ast->name->identifier() @@ -678,7 +678,7 @@ public: return false; } - virtual bool visit(MemberAccessAST *ast) + bool visit(MemberAccessAST *ast) override { accept(ast->base_expression); return false; diff --git a/src/libs/cplusplus/cplusplus-lib.pri b/src/libs/cplusplus/cplusplus-lib.pri index 0931855a55..94e988f0bb 100644 --- a/src/libs/cplusplus/cplusplus-lib.pri +++ b/src/libs/cplusplus/cplusplus-lib.pri @@ -84,5 +84,3 @@ SOURCES += \ $$PWD/findcdbbreakpoint.cpp \ $$PWD/PPToken.cpp \ $$PWD/cppmodelmanagerbase.cpp - -RESOURCES += $$PWD/cplusplus.qrc diff --git a/src/libs/cplusplus/cplusplus.qbs b/src/libs/cplusplus/cplusplus.qbs index 4eb6581498..b08745263e 100644 --- a/src/libs/cplusplus/cplusplus.qbs +++ b/src/libs/cplusplus/cplusplus.qbs @@ -122,7 +122,6 @@ Project { "SymbolNameVisitor.cpp", "SymbolNameVisitor.h", "TypeOfExpression.cpp", "TypeOfExpression.h", "TypePrettyPrinter.cpp", "TypePrettyPrinter.h", - "cplusplus.qrc", "findcdbbreakpoint.cpp", "findcdbbreakpoint.h", "pp-cctype.h", "pp-engine.cpp", "pp-engine.h", diff --git a/src/libs/cplusplus/cplusplus.qrc b/src/libs/cplusplus/cplusplus.qrc deleted file mode 100644 index 357db691c0..0000000000 --- a/src/libs/cplusplus/cplusplus.qrc +++ /dev/null @@ -1,44 +0,0 @@ -<RCC> - <qresource prefix="/codemodel"> - <file>images/enum.png</file> - <file>images/enum@2x.png</file> - <file>images/enumerator.png</file> - <file>images/enumerator@2x.png</file> - <file>images/keyword.png</file> - <file>images/keyword@2x.png</file> - <file>images/macro.png</file> - <file>images/macro@2x.png</file> - <file>images/signal.png</file> - <file>images/signal@2x.png</file> - <file>images/slot.png</file> - <file>images/slot@2x.png</file> - <file>images/member.png</file> - <file>images/member@2x.png</file> - <file>images/private.png</file> - <file>images/private@2x.png</file> - <file>images/privatebackground.png</file> - <file>images/privatebackground@2x.png</file> - <file>images/property.png</file> - <file>images/property@2x.png</file> - <file>images/propertybackground.png</file> - <file>images/propertybackground@2x.png</file> - <file>images/protected.png</file> - <file>images/protected@2x.png</file> - <file>images/protectedbackground.png</file> - <file>images/protectedbackground@2x.png</file> - <file>images/static.png</file> - <file>images/static@2x.png</file> - <file>images/staticbackground.png</file> - <file>images/staticbackground@2x.png</file> - <file>images/classmemberfunction.png</file> - <file>images/classmemberfunction@2x.png</file> - <file>images/classmembervariable.png</file> - <file>images/classmembervariable@2x.png</file> - <file>images/classparent.png</file> - <file>images/classparent@2x.png</file> - <file>images/classrelation.png</file> - <file>images/classrelation@2x.png</file> - <file>images/classrelationbackground.png</file> - <file>images/classrelationbackground@2x.png</file> - </qresource> -</RCC> diff --git a/src/libs/extensionsystem/invoker.cpp b/src/libs/extensionsystem/invoker.cpp index d4a19804a0..1506c4910a 100644 --- a/src/libs/extensionsystem/invoker.cpp +++ b/src/libs/extensionsystem/invoker.cpp @@ -34,7 +34,7 @@ InvokerBase::InvokerBase() nag = true; success = true; connectionType = Qt::AutoConnection; - target = 0; + target = nullptr; } InvokerBase::~InvokerBase() diff --git a/src/libs/extensionsystem/optionsparser.cpp b/src/libs/extensionsystem/optionsparser.cpp index 9dc6327b65..c3daed5daa 100644 --- a/src/libs/extensionsystem/optionsparser.cpp +++ b/src/libs/extensionsystem/optionsparser.cpp @@ -265,9 +265,9 @@ bool OptionsParser::checkForUnknownOption() void OptionsParser::forceDisableAllPluginsExceptTestedAndForceEnabled() { - for (const PluginManagerPrivate::TestSpec &testSpec : m_pmPrivate->testSpecs) + for (const PluginManagerPrivate::TestSpec &testSpec : qAsConst(m_pmPrivate->testSpecs)) testSpec.pluginSpec->d->setForceEnabled(true); - for (PluginSpec *spec : m_pmPrivate->pluginSpecs) { + for (PluginSpec *spec : qAsConst(m_pmPrivate->pluginSpecs)) { if (!spec->isForceEnabled() && !spec->isRequired()) spec->d->setForceDisabled(true); } diff --git a/src/libs/extensionsystem/pluginerroroverview.cpp b/src/libs/extensionsystem/pluginerroroverview.cpp index a5d82a1c62..828bd013f4 100644 --- a/src/libs/extensionsystem/pluginerroroverview.cpp +++ b/src/libs/extensionsystem/pluginerroroverview.cpp @@ -65,7 +65,7 @@ PluginErrorOverview::~PluginErrorOverview() void PluginErrorOverview::showDetails(QListWidgetItem *item) { if (item) { - PluginSpec *spec = item->data(Qt::UserRole).value<PluginSpec *>(); + auto *spec = item->data(Qt::UserRole).value<PluginSpec *>(); m_ui->pluginError->setText(spec->errorString()); } else { m_ui->pluginError->clear(); diff --git a/src/libs/extensionsystem/pluginmanager.cpp b/src/libs/extensionsystem/pluginmanager.cpp index d92a4ec67b..9edb0cdb62 100644 --- a/src/libs/extensionsystem/pluginmanager.cpp +++ b/src/libs/extensionsystem/pluginmanager.cpp @@ -256,8 +256,8 @@ namespace ExtensionSystem { using namespace Internal; -static Internal::PluginManagerPrivate *d = 0; -static PluginManager *m_instance = 0; +static Internal::PluginManagerPrivate *d = nullptr; +static PluginManager *m_instance = nullptr; /*! Gets the unique plugin manager instance. @@ -282,7 +282,7 @@ PluginManager::PluginManager() PluginManager::~PluginManager() { delete d; - d = 0; + d = nullptr; } /*! @@ -625,7 +625,7 @@ void PluginManager::remoteArguments(const QString &serializedArgument, QObject * arguments); if (socketParent && socket) { socket->setParent(socketParent); - socket = 0; + socket = nullptr; } } } @@ -829,7 +829,7 @@ void PluginManagerPrivate::nextDelayedInitialize() if (delayedInitializeQueue.isEmpty()) { m_isInitializationDone = true; delete delayedInitializeTimer; - delayedInitializeTimer = 0; + delayedInitializeTimer = nullptr; profilingSummary(); emit q->initializationDone(); #ifdef WITH_TESTS @@ -845,12 +845,6 @@ void PluginManagerPrivate::nextDelayedInitialize() \internal */ PluginManagerPrivate::PluginManagerPrivate(PluginManager *pluginManager) : - delayedInitializeTimer(0), - shutdownEventLoop(0), - m_profileElapsedMS(0), - m_profilingVerbosity(0), - settings(0), - globalSettings(0), q(pluginManager) { } @@ -907,7 +901,7 @@ void PluginManagerPrivate::stopAll() if (delayedInitializeTimer && delayedInitializeTimer->isActive()) { delayedInitializeTimer->stop(); delete delayedInitializeTimer; - delayedInitializeTimer = 0; + delayedInitializeTimer = nullptr; } QList<PluginSpec *> queue = loadQueue(); foreach (PluginSpec *spec, queue) { @@ -927,8 +921,8 @@ void PluginManagerPrivate::deleteAll() #ifdef WITH_TESTS -typedef QMap<QObject *, QStringList> TestPlan; // Object -> selected test functions -typedef QMapIterator<QObject *, QStringList> TestPlanIterator; +using TestPlan = QMap<QObject *, QStringList>; // Object -> selected test functions +using TestPlanIterator = QMapIterator<QObject *, QStringList>; static bool isTestFunction(const QMetaMethod &metaMethod) { @@ -999,7 +993,7 @@ static QStringList matchingTestFunctions(const QStringList &testFunctions, static QObject *objectWithClassName(const QList<QObject *> &objects, const QString &className) { - return Utils::findOr(objects, 0, [className] (QObject *object) -> bool { + return Utils::findOr(objects, nullptr, [className] (QObject *object) -> bool { QString candidate = QString::fromUtf8(object->metaObject()->className()); const int colonIndex = candidate.lastIndexOf(QLatin1Char(':')); if (colonIndex != -1 && colonIndex < candidate.size() - 1) @@ -1159,7 +1153,7 @@ void PluginManagerPrivate::addObject(QObject *obj) { { QWriteLocker lock(&m_lock); - if (obj == 0) { + if (obj == nullptr) { qWarning() << "PluginManagerPrivate::addObject(): trying to add null object"; return; } @@ -1188,7 +1182,7 @@ void PluginManagerPrivate::addObject(QObject *obj) */ void PluginManagerPrivate::removeObject(QObject *obj) { - if (obj == 0) { + if (obj == nullptr) { qWarning() << "PluginManagerPrivate::removeObject(): trying to remove null object"; return; } @@ -1265,7 +1259,7 @@ void PluginManagerPrivate::shutdown() */ void PluginManagerPrivate::asyncShutdownFinished() { - IPlugin *plugin = qobject_cast<IPlugin *>(sender()); + auto *plugin = qobject_cast<IPlugin *>(sender()); Q_ASSERT(plugin); asynchronousPlugins.removeAll(plugin->pluginSpec()); if (asynchronousPlugins.isEmpty()) @@ -1442,7 +1436,7 @@ void PluginManagerPrivate::readPluginPaths() pluginCategories.insert(QString(), QList<PluginSpec *>()); foreach (const QString &pluginFile, pluginFiles(pluginPaths)) { - PluginSpec *spec = new PluginSpec; + auto *spec = new PluginSpec; if (!spec->d->read(pluginFile)) { // not a Qt Creator plugin delete spec; continue; @@ -1505,7 +1499,7 @@ PluginSpec *PluginManagerPrivate::pluginForOption(const QString &option, bool *r return spec; } } - return 0; + return nullptr; } PluginSpec *PluginManagerPrivate::pluginByName(const QString &name) const diff --git a/src/libs/extensionsystem/pluginmanager_p.h b/src/libs/extensionsystem/pluginmanager_p.h index 6b7a2cc75b..b21a3f7ce4 100644 --- a/src/libs/extensionsystem/pluginmanager_p.h +++ b/src/libs/extensionsystem/pluginmanager_p.h @@ -55,7 +55,7 @@ class EXTENSIONSYSTEM_EXPORT PluginManagerPrivate : public QObject Q_OBJECT public: PluginManagerPrivate(PluginManager *pluginManager); - virtual ~PluginManagerPrivate(); + ~PluginManagerPrivate() override; // Object pool operations void addObject(QObject *obj); @@ -106,19 +106,19 @@ public: QStringList disabledPlugins; QStringList forceEnabledPlugins; // delayed initialization - QTimer *delayedInitializeTimer; + QTimer *delayedInitializeTimer = nullptr; QList<PluginSpec *> delayedInitializeQueue; // ansynchronous shutdown QList<PluginSpec *> asynchronousPlugins; // plugins that have requested async shutdown - QEventLoop *shutdownEventLoop; // used for async shutdown + QEventLoop *shutdownEventLoop = nullptr; // used for async shutdown QStringList arguments; QScopedPointer<QTime> m_profileTimer; QHash<const PluginSpec *, int> m_profileTotal; - int m_profileElapsedMS; - unsigned m_profilingVerbosity; - QSettings *settings; - QSettings *globalSettings; + int m_profileElapsedMS = 0; + unsigned m_profilingVerbosity = 0; + QSettings *settings = nullptr; + QSettings *globalSettings = nullptr; // Look in argument descriptions of the specs for the option. PluginSpec *pluginForOption(const QString &option, bool *requiresArgument) const; diff --git a/src/libs/extensionsystem/pluginspec.cpp b/src/libs/extensionsystem/pluginspec.cpp index b439c54f64..501ceba009 100644 --- a/src/libs/extensionsystem/pluginspec.cpp +++ b/src/libs/extensionsystem/pluginspec.cpp @@ -182,7 +182,7 @@ PluginSpec::PluginSpec() PluginSpec::~PluginSpec() { delete d; - d = 0; + d = nullptr; } /*! @@ -963,7 +963,7 @@ bool PluginSpecPrivate::loadLibrary() + QString::fromLatin1(": ") + loader.errorString(); return false; } - IPlugin *pluginObject = qobject_cast<IPlugin*>(loader.instance()); + auto *pluginObject = qobject_cast<IPlugin*>(loader.instance()); if (!pluginObject) { hasError = true; errorString = QCoreApplication::translate("PluginSpec", "Plugin is not valid (does not derive from IPlugin)"); @@ -1065,6 +1065,6 @@ void PluginSpecPrivate::kill() if (!plugin) return; delete plugin; - plugin = 0; + plugin = nullptr; state = PluginSpec::Deleted; } diff --git a/src/libs/extensionsystem/pluginspec.h b/src/libs/extensionsystem/pluginspec.h index 25c08cd412..e7c2987ebe 100644 --- a/src/libs/extensionsystem/pluginspec.h +++ b/src/libs/extensionsystem/pluginspec.h @@ -106,7 +106,7 @@ public: QVector<PluginDependency> dependencies() const; QJsonObject metaData() const; - typedef QVector<PluginArgumentDescription> PluginArgumentDescriptions; + using PluginArgumentDescriptions = QVector<PluginArgumentDescription>; PluginArgumentDescriptions argumentDescriptions() const; // other information, valid after 'Read' state is reached diff --git a/src/libs/extensionsystem/pluginview.cpp b/src/libs/extensionsystem/pluginview.cpp index af80a2747a..65b44307be 100644 --- a/src/libs/extensionsystem/pluginview.cpp +++ b/src/libs/extensionsystem/pluginview.cpp @@ -110,7 +110,7 @@ public: int columnCount() const { return 4; } - QVariant data(int column, int role) const + QVariant data(int column, int role) const override { if (role == HiddenByDefaultRole) return m_spec->isHiddenByDefault() || !m_spec->isAvailableForHostPlatform(); @@ -177,7 +177,7 @@ public: return QVariant(); } - bool setData(int column, const QVariant &data, int role) + bool setData(int column, const QVariant &data, int role) override { if (column == LoadedColumn && role == Qt::CheckStateRole) return m_view->setPluginsEnabled(QSet<PluginSpec *>() << m_spec, data.toBool()); @@ -189,7 +189,7 @@ public: return m_spec->isAvailableForHostPlatform() && !m_spec->isRequired(); } - Qt::ItemFlags flags(int column) const + Qt::ItemFlags flags(int column) const override { Qt::ItemFlags ret = Qt::ItemIsSelectable; @@ -221,7 +221,7 @@ public: int columnCount() const { return 4; } - QVariant data(int column, int role) const + QVariant data(int column, int role) const override { if (role == HiddenByDefaultRole) return false; @@ -260,7 +260,7 @@ public: return QVariant(); } - bool setData(int column, const QVariant &data, int role) + bool setData(int column, const QVariant &data, int role) override { if (column == LoadedColumn && role == Qt::CheckStateRole) { const QList<PluginSpec *> affectedPlugins = @@ -273,7 +273,7 @@ public: return false; } - Qt::ItemFlags flags(int column) const + Qt::ItemFlags flags(int column) const override { Qt::ItemFlags ret = Qt::ItemIsSelectable | Qt::ItemIsEnabled; if (column == LoadedColumn) @@ -290,7 +290,7 @@ public: class PluginFilterModel : public CategorySortFilterModel { public: - PluginFilterModel(QObject *parent = 0) : CategorySortFilterModel(parent) {} + PluginFilterModel(QObject *parent = nullptr) : CategorySortFilterModel(parent) {} void setShowHidden(bool show) { @@ -355,7 +355,7 @@ PluginView::PluginView(QWidget *parent) m_sortModel->setFilterKeyColumn(-1/*all*/); m_categoryView->setModel(m_sortModel); - QGridLayout *gridLayout = new QGridLayout(this); + auto *gridLayout = new QGridLayout(this); gridLayout->setContentsMargins(2, 2, 2, 2); gridLayout->addWidget(m_categoryView, 1, 0, 1, 1); @@ -367,10 +367,10 @@ PluginView::PluginView(QWidget *parent) this, &PluginView::updatePlugins); connect(m_categoryView, &QAbstractItemView::activated, - [this](const QModelIndex &idx) { pluginActivated(pluginForIndex(idx)); }); + [this](const QModelIndex &idx) { emit pluginActivated(pluginForIndex(idx)); }); connect(m_categoryView->selectionModel(), &QItemSelectionModel::currentChanged, - [this](const QModelIndex &idx) { currentPluginChanged(pluginForIndex(idx)); }); + [this](const QModelIndex &idx) { emit currentPluginChanged(pluginForIndex(idx)); }); updatePlugins(); } @@ -378,9 +378,7 @@ PluginView::PluginView(QWidget *parent) /*! \internal */ -PluginView::~PluginView() -{ -} +PluginView::~PluginView() = default; /*! Returns the current selection in the list of plugins. @@ -411,7 +409,7 @@ PluginSpec *PluginView::pluginForIndex(const QModelIndex &index) const { const QModelIndex &sourceIndex = m_sortModel->mapToSource(index); PluginItem *item = m_model->itemForIndexAtLevel<2>(sourceIndex); - return item ? item->m_spec: 0; + return item ? item->m_spec: nullptr; } void PluginView::updatePlugins() @@ -432,7 +430,7 @@ void PluginView::updatePlugins() foreach (CollectionItem *collection, collections) m_model->rootItem()->appendChild(collection); - m_model->layoutChanged(); + emit m_model->layoutChanged(); m_categoryView->expandAll(); } diff --git a/src/libs/modelinglib/qmt/config/stereotypedefinitionparser.cpp b/src/libs/modelinglib/qmt/config/stereotypedefinitionparser.cpp index f73d4afc3b..fe070fc08a 100644 --- a/src/libs/modelinglib/qmt/config/stereotypedefinitionparser.cpp +++ b/src/libs/modelinglib/qmt/config/stereotypedefinitionparser.cpp @@ -168,7 +168,6 @@ public: IconCommandParameter(int keyword, ShapeValueF::Unit unit, ShapeValueF::Origin origin = ShapeValueF::OriginSmart) : m_keyword(keyword), - m_type(ShapeValue), m_unit(unit), m_origin(origin) { diff --git a/src/libs/qmljs/qmljsbind.cpp b/src/libs/qmljs/qmljsbind.cpp index f823aff50b..92516dee2e 100644 --- a/src/libs/qmljs/qmljsbind.cpp +++ b/src/libs/qmljs/qmljsbind.cpp @@ -29,6 +29,8 @@ #include "qmljsdocument.h" #include "qmljsmodelmanagerinterface.h" +#include <utils/algorithm.h> + using namespace LanguageUtils; using namespace QmlJS; using namespace QmlJS::AST; @@ -178,6 +180,17 @@ bool Bind::visit(AST::Program *) return true; } +void Bind::endVisit(UiProgram *) +{ + if (_doc->language() == Dialect::QmlQbs) { + static const QString qbsBaseImport = QStringLiteral("qbs"); + static auto isQbsBaseImport = [] (const ImportInfo &ii) { + return ii.name() == qbsBaseImport; }; + if (!Utils::anyOf(_imports, isQbsBaseImport)) + _imports += ImportInfo::moduleImport(qbsBaseImport, ComponentVersion(), QString()); + } +} + bool Bind::visit(UiImport *ast) { ComponentVersion version; diff --git a/src/libs/qmljs/qmljsbind.h b/src/libs/qmljs/qmljsbind.h index 81da23b6fa..e584abef7b 100644 --- a/src/libs/qmljs/qmljsbind.h +++ b/src/libs/qmljs/qmljsbind.h @@ -66,6 +66,7 @@ protected: bool visit(AST::UiProgram *ast) override; bool visit(AST::Program *ast) override; + void endVisit(AST::UiProgram *) override; // Ui bool visit(AST::UiImport *ast) override; diff --git a/src/libs/qmljs/qmljscodeformatter.cpp b/src/libs/qmljs/qmljscodeformatter.cpp index 8c34cdc4ac..973338395c 100644 --- a/src/libs/qmljs/qmljscodeformatter.cpp +++ b/src/libs/qmljs/qmljscodeformatter.cpp @@ -177,6 +177,7 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block) case Property: enter(property_start); break; case Function: enter(function_start); break; case Signal: enter(signal_start); break; + case Enum: enter(enum_start); break; case On: case As: case List: @@ -215,6 +216,11 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block) default: leave(true); continue; } break; + case enum_start: + switch (kind) { + case LeftBrace: enter(objectliteral_open); break; + } break; + case signal_start: switch (kind) { case Colon: enter(binding_assignment); break; // oops, was a binding @@ -284,7 +290,7 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block) if (tryInsideExpression()) break; switch (kind) { - case Comma: + case Comma: leave(true); break; case Delimiter: enter(expression_continuation); break; case RightBracket: case RightParenthesis: leave(); continue; @@ -336,11 +342,11 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block) if (tryInsideExpression()) break; switch (kind) { + case Comma: leave(); break; case Delimiter: enter(expression_continuation); break; case RightBracket: case RightParenthesis: leave(); continue; // error recovery case RightBrace: leave(); continue; // so we also leave objectliteral_open - case Comma: leave(); break; } break; case bracket_element_start: @@ -931,6 +937,8 @@ CodeFormatter::TokenKind CodeFormatter::extendedTokenKind(const QmlJS::Token &to return On; if (text == QLatin1String("list")) return List; + if (text == QLatin1String("enum")) + return Enum; } else if (kind == Keyword) { const char char1 = text.at(0).toLatin1(); const char char2 = text.at(1).toLatin1(); diff --git a/src/libs/qmljs/qmljscodeformatter.h b/src/libs/qmljs/qmljscodeformatter.h index 990ec080ce..55fe2d2d86 100644 --- a/src/libs/qmljs/qmljscodeformatter.h +++ b/src/libs/qmljs/qmljscodeformatter.h @@ -109,6 +109,8 @@ public: // must be public to make Q_GADGET introspection work property_name, // after the type property_maybe_initializer, // after the identifier + enum_start, // after 'enum' + signal_start, // after 'signal' signal_maybe_arglist, // after identifier signal_arglist_open, // after '(' @@ -197,6 +199,7 @@ protected: Comma, Dot, Delimiter, + RegExp, EndOfExistingTokenKinds, @@ -209,6 +212,7 @@ protected: Delete, Do, Else, + Enum, Finally, For, Function, diff --git a/src/libs/qmljs/qmljsicons.cpp b/src/libs/qmljs/qmljsicons.cpp index 411c0d2c37..58eeae732a 100644 --- a/src/libs/qmljs/qmljsicons.cpp +++ b/src/libs/qmljs/qmljsicons.cpp @@ -123,20 +123,20 @@ QIcon Icons::icon(Node *node) QIcon Icons::objectDefinitionIcon() { - return CPlusPlus::Icons::iconForType(CPlusPlus::Icons::ClassIconType); + return Utils::CodeModelIcon::iconForType(Utils::CodeModelIcon::Class); } QIcon Icons::scriptBindingIcon() { - return CPlusPlus::Icons::iconForType(CPlusPlus::Icons::VarPublicIconType); + return Utils::CodeModelIcon::iconForType(Utils::CodeModelIcon::VarPublic); } QIcon Icons::publicMemberIcon() { - return CPlusPlus::Icons::iconForType(CPlusPlus::Icons::FuncPublicIconType); + return Utils::CodeModelIcon::iconForType(Utils::CodeModelIcon::FuncPublic); } QIcon Icons::functionDeclarationIcon() { - return CPlusPlus::Icons::iconForType(CPlusPlus::Icons::FuncPublicIconType); + return Utils::CodeModelIcon::iconForType(Utils::CodeModelIcon::FuncPublic); } diff --git a/src/libs/qmljs/qmljsreformatter.cpp b/src/libs/qmljs/qmljsreformatter.cpp index 2116fa7467..91d4db897e 100644 --- a/src/libs/qmljs/qmljsreformatter.cpp +++ b/src/libs/qmljs/qmljsreformatter.cpp @@ -187,7 +187,7 @@ protected: { SourceLocation fixedLoc = commentLoc; fixCommentLocation(fixedLoc); - if (precededByEmptyLine(fixedLoc)) + if (precededByEmptyLine(fixedLoc) && !_result.endsWith(QLatin1String("\n\n"))) newLine(); outCommentText(toString(fixedLoc)); // don't use the sourceloc overload here if (followedByNewLine(fixedLoc)) diff --git a/src/libs/qtcreatorcdbext/eventcallback.cpp b/src/libs/qtcreatorcdbext/eventcallback.cpp index 2e5e69abca..caafd9c3e2 100644 --- a/src/libs/qtcreatorcdbext/eventcallback.cpp +++ b/src/libs/qtcreatorcdbext/eventcallback.cpp @@ -173,14 +173,16 @@ STDMETHODIMP EventCallback::Exception( __in ULONG FirstChance ) { - // Report the exception as GBMI and set potential stop reason - const ExtensionContext::StopReasonMap parameters = - exceptionParameters(*Ex, FirstChance); + if ((FirstChance && ExtensionContext::instance().parameters().firstChanceException != 0) + || (!FirstChance && ExtensionContext::instance().parameters().secondChanceException != 0)) { + // Report the exception as GBMI and set potential stop reason + const ExtensionContext::StopReasonMap parameters = exceptionParameters(*Ex, FirstChance); - std::ostringstream str; - formatGdbmiHash(str, parameters); - ExtensionContext::instance().setStopReason(parameters, "exception"); - ExtensionContext::instance().report('E', 0, 0, "exception", "%s", str.str().c_str()); + std::ostringstream str; + formatGdbmiHash(str, parameters); + ExtensionContext::instance().setStopReason(parameters, "exception"); + ExtensionContext::instance().report('E', 0, 0, "exception", "%s", str.str().c_str()); + } return m_wrapped ? m_wrapped->Exception(Ex, FirstChance) : S_OK; } diff --git a/src/libs/qtcreatorcdbext/extensioncontext.h b/src/libs/qtcreatorcdbext/extensioncontext.h index e52abc4e86..1cdbb77a92 100644 --- a/src/libs/qtcreatorcdbext/extensioncontext.h +++ b/src/libs/qtcreatorcdbext/extensioncontext.h @@ -43,6 +43,8 @@ struct Parameters unsigned maxStringLength = 10000; unsigned maxArraySize = 100; unsigned maxStackDepth = 1000; + unsigned firstChanceException = 1; + unsigned secondChanceException = 1; }; // Global singleton with context. diff --git a/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp b/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp index 61c41de761..fad25230a3 100644 --- a/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp +++ b/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp @@ -965,6 +965,12 @@ extern "C" HRESULT CALLBACK setparameter(CIDebugClient *, PCSTR args) } else if (!token.compare(0, equalsPos, "maxArraySize")) { if (integerFromString(value, &ExtensionContext::instance().parameters().maxArraySize)) ++success; + } else if (!token.compare(0, equalsPos, "firstChance")) { + if (integerFromString(value, &ExtensionContext::instance().parameters().firstChanceException)) + ++success; + } else if (!token.compare(0, equalsPos, "secondChance")) { + if (integerFromString(value, &ExtensionContext::instance().parameters().secondChanceException)) + ++success; } else if (!token.compare(0, equalsPos, "maxStackDepth")) { if (integerFromString(value, &ExtensionContext::instance().parameters().maxStackDepth)) ++success; diff --git a/src/libs/sqlite/utf8string.h b/src/libs/sqlite/utf8string.h index cd1d6fdb55..f23237d2be 100644 --- a/src/libs/sqlite/utf8string.h +++ b/src/libs/sqlite/utf8string.h @@ -116,6 +116,26 @@ public: byteArray.append(textToAppend.byteArray); } + void chop(int n) + { + byteArray.chop(n); + } + + int indexOf(const Utf8String &text) const + { + return byteArray.indexOf(text.byteArray); + } + + int indexOf(const char *text) const + { + return byteArray.indexOf(text); + } + + int indexOf(char character) const + { + return byteArray.indexOf(character); + } + bool contains(const Utf8String &text) const { return byteArray.contains(text.byteArray); @@ -151,6 +171,16 @@ public: return byteArray.endsWith(text.byteArray); } + bool endsWith(const char *text) const + { + return byteArray.endsWith(text); + } + + bool endsWith(char character) const + { + return byteArray.endsWith(character); + } + bool isNull() const { return byteArray.isNull(); diff --git a/src/libs/tracing/safecastable.h b/src/libs/tracing/safecastable.h new file mode 100644 index 0000000000..7c1fae2e7a --- /dev/null +++ b/src/libs/tracing/safecastable.h @@ -0,0 +1,62 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +namespace Timeline { + +template<class Base> +class SafeCastable +{ +public: + template<class Derived> + bool is() const + { + return static_cast<const Base *>(this)->classId() == Derived::staticClassId; + } + + template<class Derived> + Derived &asRef() + { + Q_ASSERT(is<Derived>()); + return static_cast<Derived &>(*this); + } + + template<class Derived> + const Derived &asConstRef() const + { + Q_ASSERT(is<Derived>()); + return static_cast<const Derived &>(*this); + } + + template<class Derived> + Derived &&asRvalueRef() + { + Q_ASSERT(is<Derived>()); + return static_cast<Derived &&>(*this); + } +}; + +} // namespace Timeline diff --git a/src/libs/tracing/timelinemodel.cpp b/src/libs/tracing/timelinemodel.cpp index e2f28e1849..c7b7c98904 100644 --- a/src/libs/tracing/timelinemodel.cpp +++ b/src/libs/tracing/timelinemodel.cpp @@ -59,7 +59,6 @@ namespace Timeline { */ void TimelineModel::computeNesting() { - Q_D(TimelineModel); QLinkedList<int> parents; for (int range = 0; range != count(); ++range) { TimelineModelPrivate::Range ¤t = d->ranges[range]; @@ -107,43 +106,26 @@ void TimelineModel::computeNesting() int TimelineModel::collapsedRowCount() const { - Q_D(const TimelineModel); return d->collapsedRowCount; } void TimelineModel::setCollapsedRowCount(int rows) { - Q_D(TimelineModel); - if (d->collapsedRowCount != rows) { + if (d->collapsedRowCount != rows) d->collapsedRowCount = rows; - emit collapsedRowCountChanged(); - if (!d->expanded) { - emit rowCountChanged(); - emit heightChanged(); // collapsed rows have a fixed size - } - } } int TimelineModel::expandedRowCount() const { - Q_D(const TimelineModel); return d->expandedRowCount; } void TimelineModel::setExpandedRowCount(int rows) { - Q_D(TimelineModel); if (d->expandedRowCount != rows) { - int prevHeight = height(); if (d->rowOffsets.length() > rows) d->rowOffsets.resize(rows); d->expandedRowCount = rows; - emit expandedRowCountChanged(); - if (d->expanded) { - emit rowCountChanged(); - if (height() != prevHeight) - emit heightChanged(); - } } } @@ -159,16 +141,21 @@ TimelineModel::TimelineModelPrivate::TimelineModelPrivate(int modelId) : } TimelineModel::TimelineModel(TimelineModelAggregator *parent) : - QObject(parent), d_ptr(new TimelineModelPrivate(parent->generateModelId())) + QObject(parent), d(std::make_unique<TimelineModelPrivate>(parent->generateModelId())) { connect(this, &TimelineModel::contentChanged, this, &TimelineModel::labelsChanged); connect(this, &TimelineModel::contentChanged, this, &TimelineModel::detailsChanged); + connect(this, &TimelineModel::hiddenChanged, this, &TimelineModel::heightChanged); + connect(this, &TimelineModel::expandedChanged, this, &TimelineModel::heightChanged); + connect(this, &TimelineModel::expandedRowHeightChanged, this, &TimelineModel::heightChanged); + connect(this, &TimelineModel::expandedChanged, this, &TimelineModel::rowCountChanged); + connect(this, &TimelineModel::contentChanged, this, &TimelineModel::rowCountChanged); + connect(this, &TimelineModel::contentChanged, + this, [this]() { emit expandedRowHeightChanged(-1, -1); }); } TimelineModel::~TimelineModel() { - Q_D(TimelineModel); - delete d; } bool TimelineModel::isEmpty() const @@ -178,7 +165,6 @@ bool TimelineModel::isEmpty() const int TimelineModel::modelId() const { - Q_D(const TimelineModel); return d->modelId; } @@ -195,7 +181,6 @@ int TimelineModel::collapsedRowOffset(int rowNumber) const int TimelineModel::expandedRowHeight(int rowNumber) const { - Q_D(const TimelineModel); if (d->rowOffsets.size() > rowNumber) return d->rowOffsets[rowNumber] - (rowNumber > 0 ? d->rowOffsets[rowNumber - 1] : 0); return TimelineModelPrivate::DefaultRowHeight; @@ -203,7 +188,6 @@ int TimelineModel::expandedRowHeight(int rowNumber) const int TimelineModel::expandedRowOffset(int rowNumber) const { - Q_D(const TimelineModel); if (rowNumber == 0) return 0; @@ -217,7 +201,6 @@ int TimelineModel::expandedRowOffset(int rowNumber) const void TimelineModel::setExpandedRowHeight(int rowNumber, int height) { - Q_D(TimelineModel); if (height < TimelineModelPrivate::DefaultRowHeight) height = TimelineModelPrivate::DefaultRowHeight; @@ -231,8 +214,6 @@ void TimelineModel::setExpandedRowHeight(int rowNumber, int height) d->rowOffsets[offsetRow] += difference; } emit expandedRowHeightChanged(rowNumber, height); - if (d->expanded) - emit heightChanged(); } } @@ -248,7 +229,6 @@ int TimelineModel::rowHeight(int rowNumber) const int TimelineModel::height() const { - Q_D(const TimelineModel); if (d->hidden || isEmpty()) return 0; @@ -266,25 +246,21 @@ int TimelineModel::height() const */ int TimelineModel::count() const { - Q_D(const TimelineModel); return d->ranges.count(); } qint64 TimelineModel::duration(int index) const { - Q_D(const TimelineModel); return d->ranges[index].duration; } qint64 TimelineModel::startTime(int index) const { - Q_D(const TimelineModel); return d->ranges[index].start; } qint64 TimelineModel::endTime(int index) const { - Q_D(const TimelineModel); return d->ranges[index].start + d->ranges[index].duration; } @@ -309,7 +285,6 @@ int TimelineModel::typeId(int index) const */ int TimelineModel::firstIndex(qint64 startTime) const { - Q_D(const TimelineModel); int index = d->firstIndexNoParents(startTime); if (index == -1) return -1; @@ -343,7 +318,6 @@ int TimelineModel::TimelineModelPrivate::firstIndexNoParents(qint64 startTime) c */ int TimelineModel::lastIndex(qint64 endTime) const { - Q_D(const TimelineModel); // in the "starttime" list, find the last event that starts before endtime // lowerBound() never returns "invalid", so handle this manually. @@ -364,8 +338,6 @@ int TimelineModel::lastIndex(qint64 endTime) const */ int TimelineModel::bestIndex(qint64 timestamp) const { - Q_D(const TimelineModel); - if (d->ranges.isEmpty()) return -1; @@ -390,7 +362,6 @@ int TimelineModel::bestIndex(qint64 timestamp) const int TimelineModel::parentIndex(int index) const { - Q_D(const TimelineModel); return d->ranges[index].parent; } @@ -467,7 +438,6 @@ QRgb TimelineModel::colorByHue(int hue) const */ int TimelineModel::insert(qint64 startTime, qint64 duration, int selectionId) { - Q_D(TimelineModel); /* Doing insert-sort here is preferable as most of the time the times will actually be * presorted in the right way. So usually this will just result in appending. */ int index = d->insertStart(TimelineModelPrivate::Range(startTime, duration, selectionId)); @@ -485,7 +455,6 @@ int TimelineModel::insert(qint64 startTime, qint64 duration, int selectionId) */ int TimelineModel::insertStart(qint64 startTime, int selectionId) { - Q_D(TimelineModel); int index = d->insertStart(TimelineModelPrivate::Range(startTime, 0, selectionId)); if (index < d->ranges.size() - 1) d->incrementStartIndices(index); @@ -497,52 +466,38 @@ int TimelineModel::insertStart(qint64 startTime, int selectionId) */ void TimelineModel::insertEnd(int index, qint64 duration) { - Q_D(TimelineModel); d->ranges[index].duration = duration; d->insertEnd(TimelineModelPrivate::RangeEnd(index, d->ranges[index].start + duration)); } bool TimelineModel::expanded() const { - Q_D(const TimelineModel); return d->expanded; } void TimelineModel::setExpanded(bool expanded) { - Q_D(TimelineModel); if (expanded != d->expanded) { - int prevHeight = height(); d->expanded = expanded; emit expandedChanged(); - if (prevHeight != height()) - emit heightChanged(); - if (d->collapsedRowCount != d->expandedRowCount) - emit rowCountChanged(); } } bool TimelineModel::hidden() const { - Q_D(const TimelineModel); return d->hidden; } void TimelineModel::setHidden(bool hidden) { - Q_D(TimelineModel); if (hidden != d->hidden) { - int prevHeight = height(); d->hidden = hidden; emit hiddenChanged(); - if (height() != prevHeight) - emit heightChanged(); } } void TimelineModel::setDisplayName(const QString &displayName) { - Q_D(TimelineModel); if (d->displayName != displayName) { d->displayName = displayName; emit displayNameChanged(); @@ -551,13 +506,11 @@ void TimelineModel::setDisplayName(const QString &displayName) QString TimelineModel::displayName() const { - Q_D(const TimelineModel); return d->displayName; } int TimelineModel::rowCount() const { - Q_D(const TimelineModel); return d->expanded ? d->expandedRowCount : d->collapsedRowCount; } @@ -600,15 +553,11 @@ int TimelineModel::collapsedRow(int index) const */ int TimelineModel::selectionId(int index) const { - Q_D(const TimelineModel); return d->ranges[index].selectionId; } void TimelineModel::clear() { - Q_D(TimelineModel); - bool hadRowHeights = !d->rowOffsets.empty(); - bool wasEmpty = isEmpty(); setExpandedRowCount(1); setCollapsedRowCount(1); setExpanded(false); @@ -616,27 +565,18 @@ void TimelineModel::clear() d->rowOffsets.clear(); d->ranges.clear(); d->endTimes.clear(); - if (hadRowHeights) - emit expandedRowHeightChanged(-1, -1); - if (!wasEmpty) { - emit contentChanged(); - emit heightChanged(); - emit labelsChanged(); - emit detailsChanged(); - } + emit contentChanged(); } int TimelineModel::nextItemBySelectionId(int selectionId, qint64 time, int currentItem) const { - Q_D(const TimelineModel); - return d->nextItemById([d, selectionId](int index) { + return d->nextItemById([this, selectionId](int index) { return d->ranges[index].selectionId == selectionId; }, time, currentItem); } int TimelineModel::nextItemByTypeId(int requestedTypeId, qint64 time, int currentItem) const { - Q_D(const TimelineModel); return d->nextItemById([this, requestedTypeId](int index) { return typeId(index) == requestedTypeId; }, time, currentItem); @@ -644,15 +584,13 @@ int TimelineModel::nextItemByTypeId(int requestedTypeId, qint64 time, int curren int TimelineModel::prevItemBySelectionId(int selectionId, qint64 time, int currentItem) const { - Q_D(const TimelineModel); - return d->prevItemById([d, selectionId](int index) { + return d->prevItemById([this, selectionId](int index) { return d->ranges[index].selectionId == selectionId; }, time, currentItem); } int TimelineModel::prevItemByTypeId(int requestedTypeId, qint64 time, int currentItem) const { - Q_D(const TimelineModel); return d->prevItemById([this, requestedTypeId](int index) { return typeId(index) == requestedTypeId; }, time, currentItem); diff --git a/src/libs/tracing/timelinemodel.h b/src/libs/tracing/timelinemodel.h index abf0953bac..65d4784e07 100644 --- a/src/libs/tracing/timelinemodel.h +++ b/src/libs/tracing/timelinemodel.h @@ -30,6 +30,8 @@ #include <QVariant> #include <QColor> +#include <memory> + namespace Timeline { class TimelineModelAggregator; @@ -42,8 +44,8 @@ class TRACING_EXPORT TimelineModel : public QObject Q_PROPERTY(bool hidden READ hidden WRITE setHidden NOTIFY hiddenChanged) Q_PROPERTY(bool expanded READ expanded WRITE setExpanded NOTIFY expandedChanged) Q_PROPERTY(int height READ height NOTIFY heightChanged) - Q_PROPERTY(int expandedRowCount READ expandedRowCount NOTIFY expandedRowCountChanged) - Q_PROPERTY(int collapsedRowCount READ collapsedRowCount NOTIFY collapsedRowCountChanged) + Q_PROPERTY(int expandedRowCount READ expandedRowCount NOTIFY contentChanged) + Q_PROPERTY(int collapsedRowCount READ collapsedRowCount NOTIFY contentChanged) Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged) Q_PROPERTY(QVariantList labels READ labels NOTIFY labelsChanged) Q_PROPERTY(int count READ count NOTIFY contentChanged) @@ -120,8 +122,6 @@ signals: void expandedRowHeightChanged(int row, int height); void contentChanged(); void heightChanged(); - void expandedRowCountChanged(); - void collapsedRowCountChanged(); void rowCountChanged(); void displayNameChanged(); void labelsChanged(); @@ -143,8 +143,7 @@ protected: virtual void clear(); private: - TimelineModelPrivate *d_ptr; - Q_DECLARE_PRIVATE(TimelineModel) + std::unique_ptr<TimelineModelPrivate> d; }; } // namespace Timeline diff --git a/src/libs/tracing/traceevent.h b/src/libs/tracing/traceevent.h index 780ebf7ad9..7f097315eb 100644 --- a/src/libs/tracing/traceevent.h +++ b/src/libs/tracing/traceevent.h @@ -26,13 +26,14 @@ #pragma once #include "tracing_global.h" +#include "safecastable.h" #include <QHash> #include <QMetaType> namespace Timeline { -class TraceEvent +class TraceEvent : public SafeCastable<TraceEvent> { public: qint64 timestamp() const { return m_timestamp; } @@ -43,9 +44,11 @@ public: bool isValid() const { return m_typeIndex != -1; } + qint32 classId() const { return m_classId; } + protected: - TraceEvent(qint64 timestamp = -1, qint32 typeIndex = -1) - : m_timestamp(timestamp), m_typeIndex(typeIndex) + TraceEvent(qint32 classId, qint64 timestamp = -1, qint32 typeIndex = -1) + : m_timestamp(timestamp), m_typeIndex(typeIndex), m_classId(classId) {} TraceEvent(const TraceEvent &) = default; @@ -56,6 +59,7 @@ protected: private: qint64 m_timestamp; qint32 m_typeIndex; + qint32 m_classId; }; } // namespace Timeline diff --git a/src/libs/tracing/traceeventtype.h b/src/libs/tracing/traceeventtype.h index 58a3e180cd..9a667d6fd7 100644 --- a/src/libs/tracing/traceeventtype.h +++ b/src/libs/tracing/traceeventtype.h @@ -26,6 +26,7 @@ #pragma once #include "tracing_global.h" +#include "safecastable.h" #include <QHash> #include <QMetaType> @@ -33,7 +34,7 @@ namespace Timeline { -class TraceEventType +class TraceEventType : public SafeCastable<TraceEventType> { public: const QString &displayName() const { return m_displayName; } @@ -42,9 +43,11 @@ public: quint8 feature() const { return m_feature; } void setFeature(quint8 feature) { m_feature = feature; } + qint32 classId() const { return m_classId; } + protected: - TraceEventType(quint8 feature = 255, const QString &displayName = QString()) - : m_displayName(displayName), m_feature(feature) + TraceEventType(qint32 classId, quint8 feature = 255, const QString &displayName = QString()) + : m_displayName(displayName), m_classId(classId), m_feature(feature) {} TraceEventType(const TraceEventType &) = default; @@ -54,6 +57,7 @@ protected: private: QString m_displayName; + qint32 m_classId; quint8 m_feature; }; diff --git a/src/libs/tracing/tracing.pro b/src/libs/tracing/tracing.pro index 1ef079a20b..a12f03a860 100644 --- a/src/libs/tracing/tracing.pro +++ b/src/libs/tracing/tracing.pro @@ -25,6 +25,7 @@ SOURCES += \ HEADERS += \ $$PWD/flamegraph.h \ $$PWD/flamegraphattached.h \ + $$PWD/safecastable.h \ $$PWD/tracing_global.h \ $$PWD/timelinemodel.h \ $$PWD/timelinemodel_p.h \ diff --git a/src/libs/tracing/tracing.qbs b/src/libs/tracing/tracing.qbs index d91c765db0..4705d9adc7 100644 --- a/src/libs/tracing/tracing.qbs +++ b/src/libs/tracing/tracing.qbs @@ -17,6 +17,7 @@ Project { "README", "flamegraph.cpp", "flamegraph.h", "flamegraphattached.h", + "safecastable.h", "timelineabstractrenderer.cpp", "timelineabstractrenderer.h", "timelineabstractrenderer_p.h", "timelineformattime.cpp", "timelineformattime.h", diff --git a/src/libs/utils/algorithm.h b/src/libs/utils/algorithm.h index 7692b987fe..42dd638fbf 100644 --- a/src/libs/utils/algorithm.h +++ b/src/libs/utils/algorithm.h @@ -229,7 +229,7 @@ protected: Container *container; public: - typedef Container container_type; + using container_type = Container; explicit SetInsertIterator (Container &x) : container(&x) {} SetInsertIterator<Container> &operator=(const typename Container::value_type &value) @@ -253,7 +253,7 @@ template <class Container> Container *container; public: - typedef Container container_type; + using container_type = Container; explicit MapInsertIterator (Container &x) : container(&x) {} MapInsertIterator<Container> &operator=(const std::pair<const typename Container::key_type, typename Container::mapped_type> &value) @@ -627,6 +627,20 @@ Container<T> qobject_container_cast(const Container<Base> &container) } ////////////////// +// static_container_cast +///////////////// +template <class T, template<typename> class Container, typename Base> +Container<T> static_container_cast(const Container<Base> &container) +{ + Container<T> result; + reserve(result, container.size()); + auto ins = inserter(result); + for (Base val : container) + ins = static_cast<T>(val); + return result; +} + +////////////////// // sort ///////////////// template <typename Container> @@ -713,15 +727,15 @@ auto toConstReferences(const SourceContainer &sources) ///////////////// template<class C, typename P> -Q_REQUIRED_RESULT Utils::optional<typename C::value_type> take(C &container, P predicate) +Q_REQUIRED_RESULT optional<typename C::value_type> take(C &container, P predicate) { const auto end = std::end(container); const auto it = std::find_if(std::begin(container), end, predicate); if (it == end) - return Utils::nullopt; + return nullopt; - Utils::optional<typename C::value_type> result = Utils::make_optional(std::move(*it)); + optional<typename C::value_type> result = Utils::make_optional(std::move(*it)); container.erase(it); return result; } diff --git a/src/libs/utils/ansiescapecodehandler.h b/src/libs/utils/ansiescapecodehandler.h index 0451297621..b2e848f845 100644 --- a/src/libs/utils/ansiescapecodehandler.h +++ b/src/libs/utils/ansiescapecodehandler.h @@ -33,8 +33,8 @@ namespace Utils { class QTCREATOR_UTILS_EXPORT FormattedText { public: - FormattedText() { } - FormattedText(const FormattedText &other) : text(other.text), format(other.format) { } + FormattedText() = default; + FormattedText(const FormattedText &other) = default; FormattedText(const QString &txt, const QTextCharFormat &fmt = QTextCharFormat()) : text(txt), format(fmt) { } diff --git a/src/libs/utils/appmainwindow.h b/src/libs/utils/appmainwindow.h index c93695550d..916772a5d1 100644 --- a/src/libs/utils/appmainwindow.h +++ b/src/libs/utils/appmainwindow.h @@ -45,7 +45,7 @@ signals: #ifdef Q_OS_WIN protected: virtual bool winEvent(MSG *message, long *result); - virtual bool event(QEvent *event); + bool event(QEvent *event) override; #endif private: diff --git a/src/libs/utils/basetreeview.cpp b/src/libs/utils/basetreeview.cpp index 59ce925588..bae4c16fef 100644 --- a/src/libs/utils/basetreeview.cpp +++ b/src/libs/utils/basetreeview.cpp @@ -50,19 +50,19 @@ class BaseTreeViewPrivate : public QObject { public: explicit BaseTreeViewPrivate(BaseTreeView *parent) - : q(parent), m_settings(0), m_expectUserChanges(false), m_progressIndicator(0) + : q(parent) { m_settingsTimer.setSingleShot(true); connect(&m_settingsTimer, &QTimer::timeout, this, &BaseTreeViewPrivate::doSaveState); } - bool eventFilter(QObject *, QEvent *event) + bool eventFilter(QObject *, QEvent *event) override { if (event->type() == QEvent::MouseMove) { // At this time we don't know which section will get which size. // But we know that a resizedSection() will be emitted later. - QMouseEvent *me = static_cast<QMouseEvent *>(event); + const auto *me = static_cast<QMouseEvent *>(event); if (me->buttons() & Qt::LeftButton) m_expectUserChanges = true; } @@ -219,11 +219,11 @@ public: public: BaseTreeView *q; QMap<int, int> m_userHandled; // column -> width, "not present" means "automatic" - QSettings *m_settings; + QSettings *m_settings = nullptr; QTimer m_settingsTimer; QString m_settingsKey; - bool m_expectUserChanges; - ProgressIndicator *m_progressIndicator; + bool m_expectUserChanges = false; + ProgressIndicator *m_progressIndicator = nullptr; }; class BaseTreeViewDelegate : public QItemDelegate @@ -232,7 +232,7 @@ public: BaseTreeViewDelegate(QObject *parent): QItemDelegate(parent) {} QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, - const QModelIndex &index) const + const QModelIndex &index) const override { Q_UNUSED(option); QLabel *label = new QLabel(parent); @@ -283,7 +283,7 @@ BaseTreeView::~BaseTreeView() void BaseTreeView::setModel(QAbstractItemModel *m) { - if (BaseTreeModel *oldModel = qobject_cast<BaseTreeModel *>(model())) { + if (auto oldModel = qobject_cast<BaseTreeModel *>(model())) { disconnect(oldModel, &BaseTreeModel::requestExpansion, this, &BaseTreeView::expand); disconnect(oldModel, &BaseTreeModel::requestCollapse, this, &BaseTreeView::collapse); } @@ -291,7 +291,7 @@ void BaseTreeView::setModel(QAbstractItemModel *m) TreeView::setModel(m); if (m) { - if (BaseTreeModel *newModel = qobject_cast<BaseTreeModel *>(m)) { + if (auto newModel = qobject_cast<BaseTreeModel *>(m)) { connect(newModel, &BaseTreeModel::requestExpansion, this, &BaseTreeView::expand); connect(newModel, &BaseTreeModel::requestCollapse, this, &BaseTreeView::collapse); } @@ -309,6 +309,7 @@ void BaseTreeView::setModel(QAbstractItemModel *m) void BaseTreeView::mousePressEvent(QMouseEvent *ev) { ItemViewEvent ive(ev, this); + QTC_ASSERT(model(), return); if (!model()->setData(ive.index(), QVariant::fromValue(ive), ItemViewEventRole)) TreeView::mousePressEvent(ev); // Resizing columns by clicking on the empty space seems to be controversial. @@ -321,6 +322,7 @@ void BaseTreeView::mousePressEvent(QMouseEvent *ev) void BaseTreeView::mouseReleaseEvent(QMouseEvent *ev) { ItemViewEvent ive(ev, this); + QTC_ASSERT(model(), return); if (!model()->setData(ive.index(), QVariant::fromValue(ive), ItemViewEventRole)) TreeView::mouseReleaseEvent(ev); } @@ -444,15 +446,17 @@ ItemViewEvent::ItemViewEvent(QEvent *ev, QAbstractItemView *view) m_index = view->indexAt(m_pos); break; default: - m_index = selection->currentIndex(); + m_index = selection ? selection->currentIndex() : QModelIndex(); break; } - m_selectedRows = selection->selectedRows(); - if (m_selectedRows.isEmpty()) { - QModelIndex current = selection->currentIndex(); - if (current.isValid()) - m_selectedRows.append(current); + if (selection) { + m_selectedRows = selection->selectedRows(); + if (m_selectedRows.isEmpty()) { + QModelIndex current = selection->currentIndex(); + if (current.isValid()) + m_selectedRows.append(current); + } } } diff --git a/src/libs/utils/basetreeview.h b/src/libs/utils/basetreeview.h index 653d9fb22b..923c69b042 100644 --- a/src/libs/utils/basetreeview.h +++ b/src/libs/utils/basetreeview.h @@ -110,7 +110,7 @@ template <class T> T *checkEventType(QEvent *ev) class QTCREATOR_UTILS_EXPORT ItemViewEvent { public: - ItemViewEvent() {} + ItemViewEvent() = default; ItemViewEvent(QEvent *ev, QAbstractItemView *view); template <class T> T *as() const { diff --git a/src/libs/utils/changeset.cpp b/src/libs/utils/changeset.cpp index 86548a482e..7ee4339182 100644 --- a/src/libs/utils/changeset.cpp +++ b/src/libs/utils/changeset.cpp @@ -116,8 +116,8 @@ QList<ChangeSet::EditOp> ChangeSet::operationList() const void ChangeSet::clear() { - m_string = 0; - m_cursor = 0; + m_string = nullptr; + m_cursor = nullptr; m_operationList.clear(); m_error = false; } @@ -334,14 +334,14 @@ void ChangeSet::apply(QString *s) { m_string = s; apply_helper(); - m_string = 0; + m_string = nullptr; } void ChangeSet::apply(QTextCursor *textCursor) { m_cursor = textCursor; apply_helper(); - m_cursor = 0; + m_cursor = nullptr; } QString ChangeSet::textAt(int pos, int length) diff --git a/src/libs/utils/changeset.h b/src/libs/utils/changeset.h index d445237b44..4b63cfb727 100644 --- a/src/libs/utils/changeset.h +++ b/src/libs/utils/changeset.h @@ -49,26 +49,25 @@ public: Copy }; - EditOp(): type(Unset), pos1(0), pos2(0), length1(0), length2(0) {} - EditOp(Type t): type(t), pos1(0), pos2(0), length1(0), length2(0) {} - - Type type; - int pos1; - int pos2; - int length1; - int length2; + EditOp() = default; + EditOp(Type t): type(t) {} + + Type type = Unset; + int pos1 = 0; + int pos2 = 0; + int length1 = 0; + int length2 = 0; QString text; }; struct Range { - Range() - : start(0), end(0) {} + Range() = default; Range(int start, int end) : start(start), end(end) {} - int start; - int end; + int start = 0; + int end = 0; }; public: diff --git a/src/libs/utils/checkablemessagebox.cpp b/src/libs/utils/checkablemessagebox.cpp index 8813db0bea..70413886fa 100644 --- a/src/libs/utils/checkablemessagebox.cpp +++ b/src/libs/utils/checkablemessagebox.cpp @@ -52,7 +52,6 @@ class CheckableMessageBoxPrivate { public: CheckableMessageBoxPrivate(QDialog *q) - : clickedButton(0) { QSizePolicy sizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); @@ -63,7 +62,7 @@ public: pixmapLabel->setSizePolicy(sizePolicy); pixmapLabel->setVisible(false); - QSpacerItem *pixmapSpacer = + auto pixmapSpacer = new QSpacerItem(0, 5, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding); messageLabel = new QLabel(q); @@ -72,9 +71,9 @@ public: messageLabel->setOpenExternalLinks(true); messageLabel->setTextInteractionFlags(Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse); - QSpacerItem *checkBoxRightSpacer = + auto checkBoxRightSpacer = new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum); - QSpacerItem *buttonSpacer = + auto buttonSpacer = new QSpacerItem(0, 1, QSizePolicy::Minimum, QSizePolicy::Minimum); checkBox = new QCheckBox(q); @@ -84,30 +83,30 @@ public: buttonBox->setOrientation(Qt::Horizontal); buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok); - QVBoxLayout *verticalLayout = new QVBoxLayout(); + auto verticalLayout = new QVBoxLayout(); verticalLayout->addWidget(pixmapLabel); verticalLayout->addItem(pixmapSpacer); - QHBoxLayout *horizontalLayout_2 = new QHBoxLayout(); + auto horizontalLayout_2 = new QHBoxLayout(); horizontalLayout_2->addLayout(verticalLayout); horizontalLayout_2->addWidget(messageLabel); - QHBoxLayout *horizontalLayout = new QHBoxLayout(); + auto horizontalLayout = new QHBoxLayout(); horizontalLayout->addWidget(checkBox); horizontalLayout->addItem(checkBoxRightSpacer); - QVBoxLayout *verticalLayout_2 = new QVBoxLayout(q); + auto verticalLayout_2 = new QVBoxLayout(q); verticalLayout_2->addLayout(horizontalLayout_2); verticalLayout_2->addLayout(horizontalLayout); verticalLayout_2->addItem(buttonSpacer); verticalLayout_2->addWidget(buttonBox); } - QLabel *pixmapLabel; - QLabel *messageLabel; - QCheckBox *checkBox; - QDialogButtonBox *buttonBox; - QAbstractButton *clickedButton; + QLabel *pixmapLabel = nullptr; + QLabel *messageLabel = nullptr; + QCheckBox *checkBox = nullptr; + QDialogButtonBox *buttonBox = nullptr; + QAbstractButton *clickedButton = nullptr; }; CheckableMessageBox::CheckableMessageBox(QWidget *parent) : @@ -215,7 +214,7 @@ QPushButton *CheckableMessageBox::addButton(const QString &text, QDialogButtonBo QDialogButtonBox::StandardButton CheckableMessageBox::defaultButton() const { foreach (QAbstractButton *b, d->buttonBox->buttons()) - if (QPushButton *pb = qobject_cast<QPushButton *>(b)) + if (auto *pb = qobject_cast<QPushButton *>(b)) if (pb->isDefault()) return d->buttonBox->standardButton(pb); return QDialogButtonBox::NoButton; diff --git a/src/libs/utils/classnamevalidatinglineedit.cpp b/src/libs/utils/classnamevalidatinglineedit.cpp index 62bc091ab7..ca032a0c44 100644 --- a/src/libs/utils/classnamevalidatinglineedit.cpp +++ b/src/libs/utils/classnamevalidatinglineedit.cpp @@ -45,17 +45,14 @@ struct ClassNameValidatingLineEditPrivate { QRegExp m_nameRegexp; QString m_namespaceDelimiter; - bool m_namespacesEnabled; - bool m_lowerCaseFileName; - bool m_forceFirstCapitalLetter; + bool m_namespacesEnabled = false; + bool m_lowerCaseFileName = true; + bool m_forceFirstCapitalLetter = false; }; // Match something like "Namespace1::Namespace2::ClassName". ClassNameValidatingLineEditPrivate:: ClassNameValidatingLineEditPrivate() : - m_namespaceDelimiter(QLatin1String("::")), - m_namespacesEnabled(false), - m_lowerCaseFileName(true), - m_forceFirstCapitalLetter(false) + m_namespaceDelimiter(QLatin1String("::")) { } diff --git a/src/libs/utils/completinglineedit.cpp b/src/libs/utils/completinglineedit.cpp index 5ae7448288..4711ee8e72 100644 --- a/src/libs/utils/completinglineedit.cpp +++ b/src/libs/utils/completinglineedit.cpp @@ -43,7 +43,7 @@ bool CompletingLineEdit::event(QEvent *e) if (e->type() == QEvent::ShortcutOverride) { if (QCompleter *comp = completer()) { if (comp->popup() && comp->popup()->isVisible()) { - QKeyEvent *ke = static_cast<QKeyEvent *>(e); + auto ke = static_cast<QKeyEvent *>(e); if (ke->key() == Qt::Key_Escape && !ke->modifiers()) { ke->accept(); return true; diff --git a/src/libs/utils/completingtextedit.cpp b/src/libs/utils/completingtextedit.cpp index 5f55778134..f4d7b0441c 100644 --- a/src/libs/utils/completingtextedit.cpp +++ b/src/libs/utils/completingtextedit.cpp @@ -55,17 +55,15 @@ public: bool acceptsCompletionPrefix(const QString &prefix) const; - QCompleter *m_completer; - int m_completionLengthThreshold; + QCompleter *m_completer = nullptr; + int m_completionLengthThreshold = 3; private: CompletingTextEdit *m_backPointer; }; CompletingTextEditPrivate::CompletingTextEditPrivate(CompletingTextEdit *textEdit) - : m_completer(0), - m_completionLengthThreshold(3), - m_backPointer(textEdit) + : m_backPointer(textEdit) { } @@ -107,7 +105,7 @@ CompletingTextEdit::~CompletingTextEdit() void CompletingTextEdit::setCompleter(QCompleter *c) { if (completer()) - disconnect(completer(), 0, this, 0); + disconnect(completer(), nullptr, this, nullptr); d->m_completer = c; @@ -153,12 +151,12 @@ void CompletingTextEdit::keyPressEvent(QKeyEvent *e) } const bool isShortcut = ((e->modifiers() & Qt::ControlModifier) && e->key() == Qt::Key_E); // CTRL+E - if (completer() == 0 || !isShortcut) // do not process the shortcut when we have a completer + if (completer() == nullptr || !isShortcut) // do not process the shortcut when we have a completer QTextEdit::keyPressEvent(e); const bool ctrlOrShift = e->modifiers() & (Qt::ControlModifier | Qt::ShiftModifier); const QString text = e->text(); - if (completer() == 0 || (ctrlOrShift && text.isEmpty())) + if (completer() == nullptr || (ctrlOrShift && text.isEmpty())) return; const bool hasModifier = (e->modifiers() != Qt::NoModifier) && !ctrlOrShift; @@ -183,7 +181,7 @@ void CompletingTextEdit::keyPressEvent(QKeyEvent *e) void CompletingTextEdit::focusInEvent(QFocusEvent *e) { - if (completer() != 0) + if (completer() != nullptr) completer()->setWidget(this); QTextEdit::focusInEvent(e); } @@ -193,7 +191,7 @@ bool CompletingTextEdit::event(QEvent *e) // workaround for QTCREATORBUG-9453 if (e->type() == QEvent::ShortcutOverride && completer() && completer()->popup() && completer()->popup()->isVisible()) { - QKeyEvent *ke = static_cast<QKeyEvent *>(e); + auto ke = static_cast<QKeyEvent *>(e); if (ke->key() == Qt::Key_Escape && !ke->modifiers()) { ke->accept(); return true; diff --git a/src/libs/utils/consoleprocess_p.h b/src/libs/utils/consoleprocess_p.h index 8fa610a709..5d8d193493 100644 --- a/src/libs/utils/consoleprocess_p.h +++ b/src/libs/utils/consoleprocess_p.h @@ -48,32 +48,32 @@ struct ConsoleProcessPrivate { ConsoleProcessPrivate(); static QString m_defaultConsoleProcess; - ConsoleProcess::Mode m_mode; + ConsoleProcess::Mode m_mode = ConsoleProcess::Run; QString m_workingDir; Environment m_environment; - qint64 m_appPid; + qint64 m_appPid = 0; int m_appCode; QString m_executable; QProcess::ExitStatus m_appStatus; QLocalServer m_stubServer; - QLocalSocket *m_stubSocket; - QTemporaryFile *m_tempFile; - QProcess::ProcessError m_error; + QLocalSocket *m_stubSocket = nullptr; + QTemporaryFile *m_tempFile = nullptr; + QProcess::ProcessError m_error = QProcess::UnknownError; QString m_errorString; #ifdef Q_OS_UNIX QProcess m_process; QByteArray m_stubServerDir; - QSettings *m_settings; - bool m_stubConnected; - qint64 m_stubPid; - QTimer *m_stubConnectTimer; + QSettings *m_settings = nullptr; + bool m_stubConnected = false; + qint64 m_stubPid = 0; + QTimer *m_stubConnectTimer = nullptr; #else - qint64 m_appMainThreadId; - PROCESS_INFORMATION *m_pid; - HANDLE m_hInferior; - QWinEventNotifier *inferiorFinishedNotifier; - QWinEventNotifier *processFinishedNotifier; + qint64 m_appMainThreadId = 0; + PROCESS_INFORMATION *m_pid = nullptr; + HANDLE m_hInferior = NULL; + QWinEventNotifier *inferiorFinishedNotifier = nullptr; + QWinEventNotifier *processFinishedNotifier = nullptr; #endif }; diff --git a/src/libs/utils/consoleprocess_unix.cpp b/src/libs/utils/consoleprocess_unix.cpp index 223f8ebdab..be07027f6e 100644 --- a/src/libs/utils/consoleprocess_unix.cpp +++ b/src/libs/utils/consoleprocess_unix.cpp @@ -43,18 +43,7 @@ namespace Utils { -ConsoleProcessPrivate::ConsoleProcessPrivate() : - m_mode(ConsoleProcess::Run), - m_appPid(0), - m_stubSocket(0), - m_tempFile(0), - m_error(QProcess::UnknownError), - m_settings(0), - m_stubConnected(false), - m_stubPid(0), - m_stubConnectTimer(0) -{ -} +ConsoleProcessPrivate::ConsoleProcessPrivate() = default; ConsoleProcess::ConsoleProcess(QObject *parent) : QObject(parent), d(new ConsoleProcessPrivate) diff --git a/src/libs/utils/consoleprocess_win.cpp b/src/libs/utils/consoleprocess_win.cpp index f12d31e8af..344642542e 100644 --- a/src/libs/utils/consoleprocess_win.cpp +++ b/src/libs/utils/consoleprocess_win.cpp @@ -36,19 +36,7 @@ namespace Utils { -ConsoleProcessPrivate::ConsoleProcessPrivate() : - m_mode(ConsoleProcess::Run), - m_appPid(0), - m_stubSocket(0), - m_tempFile(0), - m_error(QProcess::UnknownError), - m_appMainThreadId(0), - m_pid(0), - m_hInferior(NULL), - inferiorFinishedNotifier(0), - processFinishedNotifier(0) -{ -} +ConsoleProcessPrivate::ConsoleProcessPrivate() = default; ConsoleProcess::ConsoleProcess(QObject *parent) : QObject(parent), d(new ConsoleProcessPrivate) @@ -95,7 +83,7 @@ bool ConsoleProcess::start(const QString &program, const QString &args) stubServerShutdown(); emitError(QProcess::FailedToStart, msgCannotCreateTempFile(d->m_tempFile->errorString())); delete d->m_tempFile; - d->m_tempFile = 0; + d->m_tempFile = nullptr; return false; } QTextStream out(d->m_tempFile); @@ -109,7 +97,7 @@ bool ConsoleProcess::start(const QString &program, const QString &args) stubServerShutdown(); emitError(QProcess::FailedToStart, msgCannotWriteTempFile()); delete d->m_tempFile; - d->m_tempFile = 0; + d->m_tempFile = nullptr; return false; } } @@ -143,9 +131,9 @@ bool ConsoleProcess::start(const QString &program, const QString &args) if (!success) { delete d->m_pid; - d->m_pid = 0; + d->m_pid = nullptr; delete d->m_tempFile; - d->m_tempFile = 0; + d->m_tempFile = nullptr; stubServerShutdown(); emitError(QProcess::FailedToStart, tr("The process \"%1\" could not be started: %2").arg(cmdLine, winErrorMessage(GetLastError()))); return false; @@ -183,7 +171,7 @@ void ConsoleProcess::stop() bool ConsoleProcess::isRunning() const { - return d->m_pid != 0; + return d->m_pid != nullptr; } QString ConsoleProcess::stubServerListen() @@ -198,7 +186,7 @@ QString ConsoleProcess::stubServerListen() void ConsoleProcess::stubServerShutdown() { delete d->m_stubSocket; - d->m_stubSocket = 0; + d->m_stubSocket = nullptr; if (d->m_stubServer.isListening()) d->m_stubServer.close(); } @@ -224,7 +212,7 @@ void ConsoleProcess::readStubOutput() } else if (out.startsWith("pid ")) { // Will not need it any more delete d->m_tempFile; - d->m_tempFile = 0; + d->m_tempFile = nullptr; d->m_appPid = out.mid(4).toLongLong(); d->m_hInferior = OpenProcess( @@ -251,7 +239,7 @@ void ConsoleProcess::readStubOutput() void ConsoleProcess::cleanupInferior() { delete d->inferiorFinishedNotifier; - d->inferiorFinishedNotifier = 0; + d->inferiorFinishedNotifier = nullptr; CloseHandle(d->m_hInferior); d->m_hInferior = NULL; d->m_appPid = 0; @@ -274,13 +262,13 @@ void ConsoleProcess::cleanupStub() { stubServerShutdown(); delete d->processFinishedNotifier; - d->processFinishedNotifier = 0; + d->processFinishedNotifier = nullptr; CloseHandle(d->m_pid->hThread); CloseHandle(d->m_pid->hProcess); delete d->m_pid; - d->m_pid = 0; + d->m_pid = nullptr; delete d->m_tempFile; - d->m_tempFile = 0; + d->m_tempFile = nullptr; } void ConsoleProcess::stubExited() diff --git a/src/libs/utils/crumblepath.cpp b/src/libs/utils/crumblepath.cpp index e30332a907..ad8c81ef0a 100644 --- a/src/libs/utils/crumblepath.cpp +++ b/src/libs/utils/crumblepath.cpp @@ -96,7 +96,7 @@ static QPixmap segmentPixmap(CrumblePathButton::SegmentType type, QStyle::State if (!QPixmapCache::find(pixmapKey, pixmap)) { const QString maskFileName = QStringLiteral(":/utils/images/crumblepath-segment-%1%2.png") .arg(segmentName).arg(QLatin1String(hover ? "-hover" : "")); - pixmap = Utils::Icon({{maskFileName, Theme::IconsBaseColor}}).pixmap(iconMode); + pixmap = Icon({{maskFileName, Theme::IconsBaseColor}}).pixmap(iconMode); QPixmapCache::insert(pixmapKey, pixmap); } diff --git a/src/libs/utils/annotateditemdelegate.cpp b/src/libs/utils/delegates.cpp index 0756f000f7..6b6ab7279e 100644 --- a/src/libs/utils/annotateditemdelegate.cpp +++ b/src/libs/utils/delegates.cpp @@ -23,7 +23,7 @@ ** ****************************************************************************/ -#include "annotateditemdelegate.h" +#include "delegates.h" #include <QPainter> #include <QApplication> @@ -33,8 +33,7 @@ using namespace Utils; AnnotatedItemDelegate::AnnotatedItemDelegate(QObject *parent) : QStyledItemDelegate(parent) {} -AnnotatedItemDelegate::~AnnotatedItemDelegate() -{} +AnnotatedItemDelegate::~AnnotatedItemDelegate() = default; void AnnotatedItemDelegate::setAnnotationRole(int role) { @@ -110,5 +109,68 @@ QSize AnnotatedItemDelegate::sizeHint(const QStyleOptionViewItem &option, if (!annotation.isEmpty()) opt.text += m_delimiter + annotation; - return QApplication::style()->sizeFromContents(QStyle::CT_ItemViewItem, &opt, QSize(), 0); + return QApplication::style()->sizeFromContents(QStyle::CT_ItemViewItem, &opt, QSize(), nullptr); +} + +PathChooserDelegate::PathChooserDelegate(QObject *parent) + : QStyledItemDelegate(parent) +{ +} + +void PathChooserDelegate::setExpectedKind(Utils::PathChooser::Kind kind) +{ + m_kind = kind; +} + +void PathChooserDelegate::setPromptDialogFilter(const QString &filter) +{ + m_filter = filter; +} + +QWidget *PathChooserDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + Q_UNUSED(option); + Q_UNUSED(index); + + auto editor = new Utils::PathChooser(parent); + + editor->setHistoryCompleter(m_historyKey); + editor->setAutoFillBackground(true); // To hide the text beneath the editor widget + editor->lineEdit()->setMinimumWidth(0); + + connect(editor, &Utils::PathChooser::browsingFinished, this, [this, editor]() { + emit const_cast<PathChooserDelegate*>(this)->commitData(editor); + }); + + return editor; +} + +void PathChooserDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const +{ + if (auto *pathChooser = qobject_cast<Utils::PathChooser *>(editor)) { + pathChooser->setExpectedKind(m_kind); + pathChooser->setPromptDialogFilter(m_filter); + pathChooser->setPath(index.model()->data(index, Qt::EditRole).toString()); + } +} + +void PathChooserDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const +{ + auto pathChooser = qobject_cast<Utils::PathChooser *>(editor); + if (!pathChooser) + return; + + model->setData(index, pathChooser->path(), Qt::EditRole); +} + +void PathChooserDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + Q_UNUSED(index); + + editor->setGeometry(option.rect); +} + +void PathChooserDelegate::setHistoryCompleter(const QString &key) +{ + m_historyKey = key; } diff --git a/src/libs/utils/annotateditemdelegate.h b/src/libs/utils/delegates.h index ffbcfbd9f4..cb9809a36f 100644 --- a/src/libs/utils/annotateditemdelegate.h +++ b/src/libs/utils/delegates.h @@ -26,6 +26,7 @@ #pragma once #include "utils_global.h" +#include "pathchooser.h" #include <QStyledItemDelegate> @@ -54,4 +55,30 @@ private: QString m_delimiter; }; +class QTCREATOR_UTILS_EXPORT PathChooserDelegate : public QStyledItemDelegate +{ +public: + explicit PathChooserDelegate(QObject *parent = nullptr); + + void setExpectedKind(PathChooser::Kind kind); + void setPromptDialogFilter(const QString &filter); + + QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, + const QModelIndex &index) const override; + + void setEditorData(QWidget *editor, const QModelIndex &index) const override; + void setModelData(QWidget *editor, QAbstractItemModel *model, + const QModelIndex &index) const override; + + void updateEditorGeometry(QWidget *editor, + const QStyleOptionViewItem &option, const QModelIndex &index) const override; + + void setHistoryCompleter(const QString &key); + +private: + PathChooser::Kind m_kind = PathChooser::ExistingDirectory; + QString m_filter; + QString m_historyKey; +}; + } // Utils diff --git a/src/libs/utils/detailswidget.cpp b/src/libs/utils/detailswidget.cpp index e0e4139f1d..dd02d1a4a5 100644 --- a/src/libs/utils/detailswidget.cpp +++ b/src/libs/utils/detailswidget.cpp @@ -100,7 +100,7 @@ DetailsWidgetPrivate::DetailsWidgetPrivate(QWidget *parent) : m_hovered(false), m_useCheckBox(false) { - QHBoxLayout *summaryLayout = new QHBoxLayout; + auto summaryLayout = new QHBoxLayout; summaryLayout->setContentsMargins(MARGIN, MARGIN, MARGIN, MARGIN); summaryLayout->setSpacing(0); @@ -177,7 +177,7 @@ void DetailsWidgetPrivate::updateControls() for (QWidget *w = q; w; w = w->parentWidget()) { if (w->layout()) w->layout()->activate(); - if (QScrollArea *area = qobject_cast<QScrollArea*>(w)) { + if (auto area = qobject_cast<QScrollArea*>(w)) { QEvent e(QEvent::LayoutRequest); QCoreApplication::sendEvent(area, &e); } @@ -249,7 +249,7 @@ void DetailsWidget::setSummaryFontBold(bool b) void DetailsWidget::setIcon(const QIcon &icon) { - int iconSize = style()->pixelMetric(QStyle::PM_ButtonIconSize, 0, this); + int iconSize = style()->pixelMetric(QStyle::PM_ButtonIconSize, nullptr, this); d->m_summaryLabelIcon->setFixedWidth(icon.isNull() ? 0 : iconSize); d->m_summaryLabelIcon->setPixmap(icon.pixmap(iconSize, iconSize)); d->m_summaryCheckBox->setIcon(icon); @@ -347,10 +347,10 @@ QWidget *DetailsWidget::widget() const QWidget *DetailsWidget::takeWidget() { QWidget *widget = d->m_widget; - d->m_widget = 0; + d->m_widget = nullptr; d->m_grid->removeWidget(widget); if (widget) - widget->setParent(0); + widget->setParent(nullptr); return widget; } diff --git a/src/libs/utils/dropsupport.cpp b/src/libs/utils/dropsupport.cpp index fb78b12ef9..c202714bb2 100644 --- a/src/libs/utils/dropsupport.cpp +++ b/src/libs/utils/dropsupport.cpp @@ -39,10 +39,10 @@ namespace Utils { -static bool isFileDrop(const QMimeData *d, QList<DropSupport::FileSpec> *files = 0) +static bool isFileDrop(const QMimeData *d, QList<DropSupport::FileSpec> *files = nullptr) { // internal drop - if (const DropMimeData *internalData = qobject_cast<const DropMimeData *>(d)) { + if (const auto internalData = qobject_cast<const DropMimeData *>(d)) { if (files) *files = internalData->files(); return !internalData->files().isEmpty(); @@ -99,7 +99,7 @@ bool DropSupport::isFileDrop(QDropEvent *event) const bool DropSupport::isValueDrop(QDropEvent *event) const { - if (const DropMimeData *internalData = qobject_cast<const DropMimeData *>(event->mimeData())) { + if (const auto internalData = qobject_cast<const DropMimeData *>(event->mimeData())) { return !internalData->values().isEmpty(); } return false; @@ -123,7 +123,7 @@ bool DropSupport::eventFilter(QObject *obj, QEvent *event) bool accepted = false; auto de = static_cast<QDropEvent *>(event); if (!m_filterFunction || m_filterFunction(de, this)) { - const DropMimeData *fileDropMimeData = qobject_cast<const DropMimeData *>(de->mimeData()); + const auto fileDropMimeData = qobject_cast<const DropMimeData *>(de->mimeData()); QList<FileSpec> tempFiles; if (Utils::isFileDrop(de->mimeData(), &tempFiles)) { event->accept(); diff --git a/src/libs/utils/dropsupport.h b/src/libs/utils/dropsupport.h index 720612ada3..e12dcdad87 100644 --- a/src/libs/utils/dropsupport.h +++ b/src/libs/utils/dropsupport.h @@ -51,7 +51,7 @@ public: int column; }; // returns true if the event should be accepted - typedef std::function<bool(QDropEvent*,DropSupport*)> DropFilterFunction; + using DropFilterFunction = std::function<bool(QDropEvent*, DropSupport*)>; DropSupport(QWidget *parentWidget, const DropFilterFunction &filterFunction = DropFilterFunction()); diff --git a/src/libs/utils/elfreader.cpp b/src/libs/utils/elfreader.cpp index d26b7523a1..7f685e8552 100644 --- a/src/libs/utils/elfreader.cpp +++ b/src/libs/utils/elfreader.cpp @@ -108,7 +108,7 @@ bool ElfMapper::map() fdlen = file.size(); ustart = file.map(0, fdlen); - if (ustart == 0) { + if (ustart == nullptr) { // Try reading the data into memory instead. try { raw = file.readAll(); @@ -221,7 +221,7 @@ ElfReader::Result ElfReader::readIt() QTC_CHECK(data == mapper.ustart + (is64Bit ? 64 : 52)); if (quint64(e_shnum) * e_shentsize > fdlen) { - const QString reason = tr("announced %n sections, each %1 bytes, exceed file size", 0, e_shnum) + const QString reason = tr("announced %n sections, each %1 bytes, exceed file size", nullptr, e_shnum) .arg(e_shentsize); m_errorString = msgInvalidElfObject(m_binary, reason); return Corrupt; diff --git a/src/libs/utils/elfreader.h b/src/libs/utils/elfreader.h index d1c1dc2286..cc82e71d01 100644 --- a/src/libs/utils/elfreader.h +++ b/src/libs/utils/elfreader.h @@ -137,7 +137,7 @@ public: class QTCREATOR_UTILS_EXPORT ElfData { public: - ElfData() : symbolsType(UnknownSymbols) {} + ElfData() = default; int indexOf(const QByteArray &name) const; public: @@ -148,7 +148,7 @@ public: quint64 entryPoint; QByteArray debugLink; QByteArray buildId; - DebugSymbolsType symbolsType; + DebugSymbolsType symbolsType = UnknownSymbols; QVector<ElfSectionHeader> sectionHeaders; QVector<ElfProgramHeader> programHeaders; }; diff --git a/src/libs/utils/environment.cpp b/src/libs/utils/environment.cpp index 1efbc024dd..9b77a8b71e 100644 --- a/src/libs/utils/environment.cpp +++ b/src/libs/utils/environment.cpp @@ -183,16 +183,16 @@ QDebug operator<<(QDebug debug, const EnvironmentItem &i) debug.nospace(); debug << "EnvironmentItem("; switch (i.operation) { - case Utils::EnvironmentItem::Set: + case EnvironmentItem::Set: debug << "set \"" << i.name << "\" to \"" << i.value << '"'; break; - case Utils::EnvironmentItem::Unset: + case EnvironmentItem::Unset: debug << "unset \"" << i.name << '"'; break; - case Utils::EnvironmentItem::Prepend: + case EnvironmentItem::Prepend: debug << "prepend to \"" << i.name << "\":\"" << i.value << '"'; break; - case Utils::EnvironmentItem::Append: + case EnvironmentItem::Append: debug << "append to \"" << i.name << "\":\"" << i.value << '"'; break; } diff --git a/src/libs/utils/environment.h b/src/libs/utils/environment.h index ea2dab2420..4803dda2a5 100644 --- a/src/libs/utils/environment.h +++ b/src/libs/utils/environment.h @@ -82,7 +82,7 @@ QTCREATOR_UTILS_EXPORT QDebug operator<<(QDebug debug, const EnvironmentItem &i) class QTCREATOR_UTILS_EXPORT Environment { public: - typedef QMap<QString, QString>::const_iterator const_iterator; + using const_iterator = QMap<QString, QString>::const_iterator; explicit Environment(OsType osType = HostOsInfo::hostOs()) : m_osType(osType) {} explicit Environment(const QStringList &env, OsType osType = HostOsInfo::hostOs()); diff --git a/src/libs/utils/fadingindicator.cpp b/src/libs/utils/fadingindicator.cpp index a9718c9118..954d076e53 100644 --- a/src/libs/utils/fadingindicator.cpp +++ b/src/libs/utils/fadingindicator.cpp @@ -76,7 +76,7 @@ public: void setPixmap(const QString &uri) { m_label->hide(); - m_pixmap.load(Utils::StyleHelper::dpiSpecificImageFile(uri)); + m_pixmap.load(StyleHelper::dpiSpecificImageFile(uri)); layout()->setSizeConstraint(QLayout::SetNoConstraint); resize(m_pixmap.size() / m_pixmap.devicePixelRatio()); if (QWidget *parent = parentWidget()) @@ -91,7 +91,7 @@ public: } protected: - void paintEvent(QPaintEvent *) + void paintEvent(QPaintEvent *) override { QPainter p(this); p.setRenderHint(QPainter::Antialiasing); diff --git a/src/libs/utils/faketooltip.cpp b/src/libs/utils/faketooltip.cpp index 05a4760faf..8d111887ae 100644 --- a/src/libs/utils/faketooltip.cpp +++ b/src/libs/utils/faketooltip.cpp @@ -52,9 +52,9 @@ FakeToolTip::FakeToolTip(QWidget *parent) : p.setColor(QPalette::Inactive, QPalette::ButtonText, toolTipTextColor); setPalette(p); - const int margin = 1 + style()->pixelMetric(QStyle::PM_ToolTipLabelFrameWidth, 0, this); + const int margin = 1 + style()->pixelMetric(QStyle::PM_ToolTipLabelFrameWidth, nullptr, this); setContentsMargins(margin + 1, margin, margin, margin); - setWindowOpacity(style()->styleHint(QStyle::SH_ToolTipLabel_Opacity, 0, this) / 255.0); + setWindowOpacity(style()->styleHint(QStyle::SH_ToolTipLabel_Opacity, nullptr, this) / 255.0); } void FakeToolTip::paintEvent(QPaintEvent *) diff --git a/src/libs/utils/fancylineedit.cpp b/src/libs/utils/fancylineedit.cpp index 93d9830d15..9efe74687e 100644 --- a/src/libs/utils/fancylineedit.cpp +++ b/src/libs/utils/fancylineedit.cpp @@ -89,7 +89,7 @@ public: FancyLineEdit *m_lineEdit; IconButton *m_iconbutton[2]; - HistoryCompleter *m_historyCompleter = 0; + HistoryCompleter *m_historyCompleter = nullptr; FancyLineEdit::ValidationFunction m_validationFunction = &FancyLineEdit::validateWithValidator; QString m_oldText; QMenu *m_menu[2]; @@ -119,7 +119,7 @@ FancyLineEditPrivate::FancyLineEditPrivate(FancyLineEdit *parent) : m_iconbutton[i]->hide(); m_iconbutton[i]->setAutoHide(false); - m_menu[i] = 0; + m_menu[i] = nullptr; m_menuTabFocusTrigger[i] = false; m_iconEnabled[i] = false; @@ -194,7 +194,7 @@ QAbstractButton *FancyLineEdit::button(FancyLineEdit::Side side) const void FancyLineEdit::iconClicked() { - IconButton *button = qobject_cast<IconButton *>(sender()); + auto button = qobject_cast<IconButton *>(sender()); int index = -1; for (int i = 0; i < 2; ++i) if (d->m_iconbutton[i] == button) diff --git a/src/libs/utils/fancylineedit.h b/src/libs/utils/fancylineedit.h index 8cef228b0d..3f40d93df2 100644 --- a/src/libs/utils/fancylineedit.h +++ b/src/libs/utils/fancylineedit.h @@ -121,7 +121,7 @@ public: // Validation // line edit, (out)errorMessage -> valid? - typedef std::function<bool(FancyLineEdit *, QString *)> ValidationFunction; + using ValidationFunction = std::function<bool(FancyLineEdit *, QString *)>; enum State { Invalid, DisplayingPlaceholderText, Valid }; State state() const; diff --git a/src/libs/utils/fancymainwindow.cpp b/src/libs/utils/fancymainwindow.cpp index 5ce2c25b36..e3bec7be0b 100644 --- a/src/libs/utils/fancymainwindow.cpp +++ b/src/libs/utils/fancymainwindow.cpp @@ -73,9 +73,9 @@ class DockWidget : public QDockWidget public: DockWidget(QWidget *inner, FancyMainWindow *parent, bool immutable = false); - bool eventFilter(QObject *, QEvent *event); - void enterEvent(QEvent *event); - void leaveEvent(QEvent *event); + bool eventFilter(QObject *, QEvent *event) override; + void enterEvent(QEvent *event) override; + void leaveEvent(QEvent *event) override; void handleMouseTimeout(); void handleToplevelChanged(bool floating); @@ -98,13 +98,13 @@ public: setFocusPolicy(Qt::NoFocus); } - QSize sizeHint() const + QSize sizeHint() const override { ensurePolished(); - int size = 2*style()->pixelMetric(QStyle::PM_DockWidgetTitleBarButtonMargin, 0, this); + int size = 2*style()->pixelMetric(QStyle::PM_DockWidgetTitleBarButtonMargin, nullptr, this); if (!icon().isNull()) { - int iconSize = style()->pixelMetric(QStyle::PM_SmallIconSize, 0, this); + int iconSize = style()->pixelMetric(QStyle::PM_SmallIconSize, nullptr, this); QSize sz = icon().actualSize(QSize(iconSize, iconSize)); size += qMax(sz.width(), sz.height()); } @@ -112,23 +112,23 @@ public: return QSize(size, size); } - QSize minimumSizeHint() const { return sizeHint(); } + QSize minimumSizeHint() const override { return sizeHint(); } - void enterEvent(QEvent *event) + void enterEvent(QEvent *event) override { if (isEnabled()) update(); QAbstractButton::enterEvent(event); } - void leaveEvent(QEvent *event) + void leaveEvent(QEvent *event) override { if (isEnabled()) update(); QAbstractButton::leaveEvent(event); } - void paintEvent(QPaintEvent *event); + void paintEvent(QPaintEvent *event) override; }; void DockWidgetTitleButton::paintEvent(QPaintEvent *) @@ -139,11 +139,11 @@ void DockWidgetTitleButton::paintEvent(QPaintEvent *) opt.init(this); opt.state |= QStyle::State_AutoRaise; opt.icon = icon(); - opt.subControls = 0; - opt.activeSubControls = 0; + opt.subControls = nullptr; + opt.activeSubControls = nullptr; opt.features = QStyleOptionToolButton::None; opt.arrowType = Qt::NoArrow; - int size = style()->pixelMetric(QStyle::PM_SmallIconSize, 0, this); + int size = style()->pixelMetric(QStyle::PM_SmallIconSize, nullptr, this); opt.iconSize = QSize(size, size); style()->drawComplexControl(QStyle::CC_ToolButton, &opt, &p, this); } @@ -194,7 +194,7 @@ public: setProperty("managed_titlebar", 1); } - void enterEvent(QEvent *event) + void enterEvent(QEvent *event) override { setActive(true); QWidget::enterEvent(event); @@ -219,13 +219,13 @@ public: return m_active || !q->q->autoHideTitleBars(); } - QSize sizeHint() const + QSize sizeHint() const override { ensurePolished(); return isClickable() ? m_maximumActiveSize : m_maximumInactiveSize; } - QSize minimumSizeHint() const + QSize minimumSizeHint() const override { ensurePolished(); return isClickable() ? m_minimumActiveSize : m_minimumInactiveSize; @@ -292,7 +292,7 @@ DockWidget::DockWidget(QWidget *inner, FancyMainWindow *parent, bool immutable) bool DockWidget::eventFilter(QObject *, QEvent *event) { if (!m_immutable && event->type() == QEvent::MouseMove && q->autoHideTitleBars()) { - QMouseEvent *me = static_cast<QMouseEvent *>(event); + auto me = static_cast<QMouseEvent *>(event); int y = me->pos().y(); int x = me->pos().x(); int h = qMin(8, m_titleBar->m_floatButton->height()); @@ -350,11 +350,11 @@ void DockWidget::handleToplevelChanged(bool floating) FancyMainWindowPrivate::FancyMainWindowPrivate(FancyMainWindow *parent) : q(parent), m_handleDockVisibilityChanges(true), - m_showCentralWidget(FancyMainWindow::tr("Central Widget"), 0), - m_menuSeparator1(0), - m_menuSeparator2(0), - m_resetLayoutAction(FancyMainWindow::tr("Reset to Default Layout"), 0), - m_autoHideTitleBars(FancyMainWindow::tr("Automatically Hide View Title Bars"), 0) + m_showCentralWidget(FancyMainWindow::tr("Central Widget"), nullptr), + m_menuSeparator1(nullptr), + m_menuSeparator2(nullptr), + m_resetLayoutAction(FancyMainWindow::tr("Reset to Default Layout"), nullptr), + m_autoHideTitleBars(FancyMainWindow::tr("Automatically Hide View Title Bars"), nullptr) { m_showCentralWidget.setCheckable(true); m_showCentralWidget.setChecked(true); @@ -391,7 +391,7 @@ FancyMainWindow::~FancyMainWindow() QDockWidget *FancyMainWindow::addDockForWidget(QWidget *widget, bool immutable) { - QTC_ASSERT(widget, return 0); + QTC_ASSERT(widget, return nullptr); QTC_CHECK(widget->objectName().size()); QTC_CHECK(widget->windowTitle().size()); @@ -416,7 +416,7 @@ QDockWidget *FancyMainWindow::addDockForWidget(QWidget *widget, bool immutable) void FancyMainWindow::onDockActionTriggered() { - QDockWidget *dw = qobject_cast<QDockWidget *>(sender()->parent()); + auto dw = qobject_cast<QDockWidget *>(sender()->parent()); if (dw) { if (dw->isVisible()) dw->raise(); diff --git a/src/libs/utils/fileinprojectfinder.cpp b/src/libs/utils/fileinprojectfinder.cpp index 8758da6bcc..f732417679 100644 --- a/src/libs/utils/fileinprojectfinder.cpp +++ b/src/libs/utils/fileinprojectfinder.cpp @@ -63,9 +63,7 @@ static bool checkPath(const QString &candidate, FileInProjectFinder::FindMode fi \endlist */ -FileInProjectFinder::FileInProjectFinder() -{ -} +FileInProjectFinder::FileInProjectFinder() = default; static QString stripTrailingSlashes(const QString &path) { @@ -95,7 +93,7 @@ QString FileInProjectFinder::projectDirectory() const return m_projectDir; } -void FileInProjectFinder::setProjectFiles(const Utils::FileNameList &projectFiles) +void FileInProjectFinder::setProjectFiles(const FileNameList &projectFiles) { if (m_projectFiles == projectFiles) return; @@ -180,7 +178,7 @@ QString FileInProjectFinder::findFileOrDirectory(const QString &originalPath, Fi int prefixToIgnore = -1; const QChar separator = QLatin1Char('/'); if (originalPath.startsWith(m_projectDir + separator)) { - if (Utils::HostOsInfo::isMacHost()) { + if (HostOsInfo::isMacHost()) { // starting with the project path is not sufficient if the file was // copied in an insource build, e.g. into MyApp.app/Contents/Resources static const QString appResourcePath = QString::fromLatin1(".app/Contents/Resources"); diff --git a/src/libs/utils/fileinprojectfinder.h b/src/libs/utils/fileinprojectfinder.h index 546e36031e..56acd0d15a 100644 --- a/src/libs/utils/fileinprojectfinder.h +++ b/src/libs/utils/fileinprojectfinder.h @@ -49,7 +49,7 @@ public: void setProjectDirectory(const QString &absoluteProjectPath); QString projectDirectory() const; - void setProjectFiles(const Utils::FileNameList &projectFiles); + void setProjectFiles(const FileNameList &projectFiles); void setSysroot(const QString &sysroot); QString findFile(const QUrl &fileUrl, bool *success = nullptr) const; @@ -74,7 +74,7 @@ private: QString m_projectDir; QString m_sysroot; - Utils::FileNameList m_projectFiles; + FileNameList m_projectFiles; QStringList m_searchDirectories; mutable QHash<QString,QString> m_cache; }; diff --git a/src/libs/utils/filesearch.cpp b/src/libs/utils/filesearch.cpp index 348c59e012..c34532a1de 100644 --- a/src/libs/utils/filesearch.cpp +++ b/src/libs/utils/filesearch.cpp @@ -42,14 +42,14 @@ static inline QString msgCanceled(const QString &searchTerm, int numMatches, int { return QCoreApplication::translate("Utils::FileSearch", "%1: canceled. %n occurrences found in %2 files.", - 0, numMatches).arg(searchTerm).arg(numFilesSearched); + nullptr, numMatches).arg(searchTerm).arg(numFilesSearched); } static inline QString msgFound(const QString &searchTerm, int numMatches, int numFilesSearched) { return QCoreApplication::translate("Utils::FileSearch", "%1: %n occurrences found in %2 files.", - 0, numMatches).arg(searchTerm).arg(numFilesSearched); + nullptr, numMatches).arg(searchTerm).arg(numFilesSearched); } namespace { @@ -301,7 +301,7 @@ struct SearchState { SearchState(const QString &term, FileIterator *iterator) : searchTerm(term), files(iterator) {} QString searchTerm; - FileIterator *files = 0; + FileIterator *files = nullptr; FileSearchResultList cachedResults; int numFilesSearched = 0; int numMatches = 0; @@ -482,7 +482,7 @@ static bool matches(const QList<QRegExp> &exprList, const QString &filePath) { return Utils::anyOf(exprList, [&filePath](QRegExp reg) { return (reg.exactMatch(filePath) - || reg.exactMatch(Utils::FileName::fromString(filePath).fileName())); + || reg.exactMatch(FileName::fromString(filePath).fileName())); }); } @@ -649,7 +649,7 @@ SubDirFileIterator::SubDirFileIterator(const QStringList &directories, const QSt : m_filterFiles(filterFilesFunction(filters, exclusionFilters)), m_progress(0) { - m_encoding = (encoding == 0 ? QTextCodec::codecForLocale() : encoding); + m_encoding = (encoding == nullptr ? QTextCodec::codecForLocale() : encoding); qreal maxPer = qreal(MAX_PROGRESS) / directories.count(); foreach (const QString &directoryEntry, directories) { if (!directoryEntry.isEmpty()) { diff --git a/src/libs/utils/filesearch.h b/src/libs/utils/filesearch.h index a25949e220..cddb637184 100644 --- a/src/libs/utils/filesearch.h +++ b/src/libs/utils/filesearch.h @@ -65,26 +65,26 @@ public: class Item { public: - Item() : encoding(nullptr) { } + Item() = default; Item(const QString &path, QTextCodec *codec) : filePath(path), encoding(codec) {} QString filePath; - QTextCodec *encoding; + QTextCodec *encoding = nullptr; }; - typedef Item value_type; + using value_type = Item; class const_iterator { public: - typedef std::forward_iterator_tag iterator_category; - typedef Item value_type; - typedef std::ptrdiff_t difference_type; - typedef const value_type *pointer; - typedef const value_type &reference; + using iterator_category = std::forward_iterator_tag; + using value_type = Item; + using difference_type = std::ptrdiff_t; + using pointer = const value_type*; + using reference = const value_type&; - const_iterator() : m_parent(nullptr), m_index(-1) { } + const_iterator() = default; const_iterator(const FileIterator *parent, int id) : m_parent(parent), m_index(id) {} @@ -100,11 +100,11 @@ public: } bool operator!=(const const_iterator &other) const { return !operator==(other); } - const FileIterator *m_parent; - int m_index; // -1 == end + const FileIterator *m_parent = nullptr; + int m_index = -1; // -1 == end }; - virtual ~FileIterator() {} + virtual ~FileIterator() = default; const_iterator begin() const; const_iterator end() const; @@ -169,7 +169,7 @@ private: class QTCREATOR_UTILS_EXPORT FileSearchResult { public: - FileSearchResult() {} + FileSearchResult() = default; FileSearchResult(const QString &fileName, int lineNumber, const QString &matchingLine, int matchStart, int matchLength, const QStringList ®expCapturedTexts) @@ -189,7 +189,7 @@ public: QStringList regexpCapturedTexts; }; -typedef QList<FileSearchResult> FileSearchResultList; +using FileSearchResultList = QList<FileSearchResult>; QTCREATOR_UTILS_EXPORT QFuture<FileSearchResultList> findInFiles(const QString &searchTerm, FileIterator *files, QTextDocument::FindFlags flags, const QMap<QString, QString> &fileToContentsMap = QMap<QString, QString>()); diff --git a/src/libs/utils/filesystemwatcher.cpp b/src/libs/utils/filesystemwatcher.cpp index 96748779eb..4304441832 100644 --- a/src/libs/utils/filesystemwatcher.cpp +++ b/src/libs/utils/filesystemwatcher.cpp @@ -87,32 +87,32 @@ class FileSystemWatcherStaticData { public: FileSystemWatcherStaticData() : - maxFileOpen(getFileLimit()) , m_objectCount(0), m_watcher(0) {} + maxFileOpen(getFileLimit()) {} quint64 maxFileOpen; - int m_objectCount; + int m_objectCount = 0; QHash<QString, int> m_fileCount; QHash<QString, int> m_directoryCount; - QFileSystemWatcher *m_watcher; + QFileSystemWatcher *m_watcher = nullptr; }; -typedef QMap<int, FileSystemWatcherStaticData> FileSystemWatcherStaticDataMap; +using FileSystemWatcherStaticDataMap = QMap<int, FileSystemWatcherStaticData>; Q_GLOBAL_STATIC(FileSystemWatcherStaticDataMap, fileSystemWatcherStaticDataMap) class WatchEntry { public: - typedef FileSystemWatcher::WatchMode WatchMode; + using WatchMode = FileSystemWatcher::WatchMode; explicit WatchEntry(const QString &file, WatchMode wm) : watchMode(wm), modifiedTime(QFileInfo(file).lastModified()) {} - WatchEntry() : watchMode(FileSystemWatcher::WatchAllChanges) {} + WatchEntry() = default; bool trigger(const QString &fileName); - WatchMode watchMode; + WatchMode watchMode = FileSystemWatcher::WatchAllChanges; QDateTime modifiedTime; }; @@ -131,13 +131,13 @@ bool WatchEntry::trigger(const QString &fileName) return false; } -typedef QHash<QString, WatchEntry> WatchEntryMap; -typedef WatchEntryMap::iterator WatchEntryMapIterator; +using WatchEntryMap = QHash<QString, WatchEntry>; +using WatchEntryMapIterator = WatchEntryMap::iterator; class FileSystemWatcherPrivate { public: - explicit FileSystemWatcherPrivate(int id) : m_id(id), m_staticData(0) {} + explicit FileSystemWatcherPrivate(int id) : m_id(id), m_staticData(nullptr) {} WatchEntryMap m_files; WatchEntryMap m_directories; @@ -208,7 +208,7 @@ FileSystemWatcher::~FileSystemWatcher() if (--(d->m_staticData->m_objectCount) == 0) { delete d->m_staticData->m_watcher; - d->m_staticData->m_watcher = 0; + d->m_staticData->m_watcher = nullptr; d->m_staticData->m_fileCount.clear(); d->m_staticData->m_directoryCount.clear(); if (debug) diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index 001dd70a05..48d8787100 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -305,7 +305,7 @@ QString FileUtils::normalizePathName(const QString &name) { #ifdef Q_OS_WIN const QString nativeSeparatorName(QDir::toNativeSeparators(name)); - const LPCTSTR nameC = reinterpret_cast<LPCTSTR>(nativeSeparatorName.utf16()); // MinGW + const auto nameC = reinterpret_cast<LPCTSTR>(nativeSeparatorName.utf16()); // MinGW PIDLIST_ABSOLUTE file; HRESULT hr = SHParseDisplayName(nameC, NULL, &file, 0, NULL); if (FAILED(hr)) @@ -395,10 +395,7 @@ bool FileReader::fetch(const QString &fileName, QIODevice::OpenMode mode, QWidge } #endif // QT_GUI_LIB -FileSaverBase::FileSaverBase() - : m_hasError(false) -{ -} +FileSaverBase::FileSaverBase() = default; FileSaverBase::~FileSaverBase() = default; @@ -514,7 +511,7 @@ bool FileSaver::finalize() if (!m_isSafe) return FileSaverBase::finalize(); - SaveFile *sf = static_cast<SaveFile *>(m_file.get()); + auto sf = static_cast<SaveFile *>(m_file.get()); if (m_hasError) { if (sf->isOpen()) sf->rollback(); @@ -526,10 +523,9 @@ bool FileSaver::finalize() } TempFileSaver::TempFileSaver(const QString &templ) - : m_autoRemove(true) { m_file.reset(new QTemporaryFile{}); - QTemporaryFile *tempFile = static_cast<QTemporaryFile *>(m_file.get()); + auto tempFile = static_cast<QTemporaryFile *>(m_file.get()); if (!templ.isEmpty()) tempFile->setFileTemplate(templ); tempFile->setAutoRemove(false); diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index 011069e118..f6b0032f61 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -206,7 +206,7 @@ protected: std::unique_ptr<QFile> m_file; QString m_fileName; QString m_errorString; - bool m_hasError; + bool m_hasError = false; private: Q_DISABLE_COPY(FileSaverBase) @@ -236,7 +236,7 @@ public: void setAutoRemove(bool on) { m_autoRemove = on; } private: - bool m_autoRemove; + bool m_autoRemove = true; }; } // namespace Utils diff --git a/src/libs/utils/filewizardpage.cpp b/src/libs/utils/filewizardpage.cpp index 9b9ae54337..cd9f3b345b 100644 --- a/src/libs/utils/filewizardpage.cpp +++ b/src/libs/utils/filewizardpage.cpp @@ -44,16 +44,11 @@ namespace Utils { class FileWizardPagePrivate { public: - FileWizardPagePrivate(); + FileWizardPagePrivate() = default; Ui::WizardPage m_ui; - bool m_complete; + bool m_complete = false; }; -FileWizardPagePrivate::FileWizardPagePrivate() : - m_complete(false) -{ -} - FileWizardPage::FileWizardPage(QWidget *parent) : WizardPage(parent), d(new FileWizardPagePrivate) diff --git a/src/libs/utils/fixedsizeclicklabel.cpp b/src/libs/utils/fixedsizeclicklabel.cpp index a648fd66e3..2e1ab89ef6 100644 --- a/src/libs/utils/fixedsizeclicklabel.cpp +++ b/src/libs/utils/fixedsizeclicklabel.cpp @@ -58,7 +58,6 @@ namespace Utils { */ FixedSizeClickLabel::FixedSizeClickLabel(QWidget *parent) : QLabel(parent) - , m_pressed(false) { } diff --git a/src/libs/utils/fixedsizeclicklabel.h b/src/libs/utils/fixedsizeclicklabel.h index eb89de7ab9..93cf27cc9f 100644 --- a/src/libs/utils/fixedsizeclicklabel.h +++ b/src/libs/utils/fixedsizeclicklabel.h @@ -54,7 +54,7 @@ signals: private: QString m_maxText; - bool m_pressed; + bool m_pressed = false; }; } // namespace Utils diff --git a/src/libs/utils/flowlayout.cpp b/src/libs/utils/flowlayout.cpp index bfdad6bbe6..d138a15149 100644 --- a/src/libs/utils/flowlayout.cpp +++ b/src/libs/utils/flowlayout.cpp @@ -84,12 +84,12 @@ QLayoutItem *FlowLayout::takeAt(int index) if (index >= 0 && index < itemList.size()) return itemList.takeAt(index); else - return 0; + return nullptr; } Qt::Orientations FlowLayout::expandingDirections() const { - return 0; + return nullptr; } bool FlowLayout::hasHeightForWidth() const @@ -167,8 +167,8 @@ int FlowLayout::smartSpacing(QStyle::PixelMetric pm) const if (!parent) { return -1; } else if (parent->isWidgetType()) { - QWidget *pw = static_cast<QWidget *>(parent); - return pw->style()->pixelMetric(pm, 0, pw); + auto pw = static_cast<QWidget *>(parent); + return pw->style()->pixelMetric(pm, nullptr, pw); } else { return static_cast<QLayout *>(parent)->spacing(); } diff --git a/src/libs/utils/guard.cpp b/src/libs/utils/guard.cpp index 69f872db00..b1e220136e 100644 --- a/src/libs/utils/guard.cpp +++ b/src/libs/utils/guard.cpp @@ -85,9 +85,7 @@ namespace Utils { -Guard::Guard() -{ -} +Guard::Guard() = default; Guard::~Guard() { diff --git a/src/libs/utils/headerviewstretcher.cpp b/src/libs/utils/headerviewstretcher.cpp index 0728dedfa0..2c3ece302a 100644 --- a/src/libs/utils/headerviewstretcher.cpp +++ b/src/libs/utils/headerviewstretcher.cpp @@ -57,18 +57,18 @@ bool HeaderViewStretcher::eventFilter(QObject *obj, QEvent *ev) { if (obj == parent()) { if (ev->type() == QEvent::Show) { - QHeaderView *hv = qobject_cast<QHeaderView*>(obj); + auto hv = qobject_cast<QHeaderView*>(obj); for (int i = 0; i < hv->count(); ++i) hv->setSectionResizeMode(i, QHeaderView::Interactive); } else if (ev->type() == QEvent::Hide) { - QHeaderView *hv = qobject_cast<QHeaderView*>(obj); + auto hv = qobject_cast<QHeaderView*>(obj); for (int i = 0; i < hv->count(); ++i) hv->setSectionResizeMode(i, i == m_columnToStretch ? QHeaderView::Stretch : QHeaderView::ResizeToContents); } else if (ev->type() == QEvent::Resize) { - QHeaderView *hv = qobject_cast<QHeaderView*>(obj); + auto hv = qobject_cast<QHeaderView*>(obj); if (hv->sectionResizeMode(m_columnToStretch) == QHeaderView::Interactive) { - QResizeEvent *re = static_cast<QResizeEvent*>(ev); + auto re = static_cast<QResizeEvent*>(ev); int diff = re->size().width() - re->oldSize().width() ; hv->resizeSection(m_columnToStretch, qMax(32, hv->sectionSize(m_columnToStretch) + diff)); } diff --git a/src/libs/utils/highlightingitemdelegate.cpp b/src/libs/utils/highlightingitemdelegate.cpp index c9bb43eb94..e253689843 100644 --- a/src/libs/utils/highlightingitemdelegate.cpp +++ b/src/libs/utils/highlightingitemdelegate.cpp @@ -135,7 +135,7 @@ int HighlightingItemDelegate::drawLineNumber(QPainter *painter, const QStyleOpti opt.palette.setColor(cg, QPalette::Text, Qt::darkGray); const QStyle *style = QApplication::style(); - const int textMargin = style->pixelMetric(QStyle::PM_FocusFrameHMargin, 0, 0) + 1; + const int textMargin = style->pixelMetric(QStyle::PM_FocusFrameHMargin, nullptr, nullptr) + 1; const QRect rowRect = lineNumberAreaRect.adjusted(-textMargin, 0, @@ -263,7 +263,7 @@ void HighlightingItemDelegate::drawDisplay(QPainter *painter, const QWidget *widget = option.widget; QStyle *style = widget ? widget->style() : QApplication::style(); - const int textMargin = style->pixelMetric(QStyle::PM_FocusFrameHMargin, 0, widget) + 1; + const int textMargin = style->pixelMetric(QStyle::PM_FocusFrameHMargin, nullptr, widget) + 1; QRect textRect = rect.adjusted(textMargin, 0, -textMargin, 0); // remove width padding const bool wrapText = opt.features & QStyleOptionViewItem::WrapText; QTextOption textOption; diff --git a/src/libs/utils/historycompleter.cpp b/src/libs/utils/historycompleter.cpp index 6d0484b85a..4a04ac5b95 100644 --- a/src/libs/utils/historycompleter.cpp +++ b/src/libs/utils/historycompleter.cpp @@ -41,14 +41,14 @@ namespace Utils { namespace Internal { -static QSettings *theSettings = 0; +static QSettings *theSettings = nullptr; class HistoryCompleterPrivate : public QAbstractListModel { public: - int rowCount(const QModelIndex &parent = QModelIndex()) const; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; - bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()); + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override; void clearHistory(); void addEntry(const QString &str); @@ -69,7 +69,7 @@ public: , icon(Icons::EDIT_CLEAR.icon()) {} - void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const + void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override { // from QHistoryCompleter QStyleOptionViewItem optCopy = option; @@ -109,7 +109,7 @@ public: } private: - void mousePressEvent(QMouseEvent *event) + void mousePressEvent(QMouseEvent *event) override { const QSize clearButtonSize = delegate->clearIconSize; if (clearButtonSize.isValid()) { diff --git a/src/libs/utils/htmldocextractor.cpp b/src/libs/utils/htmldocextractor.cpp index e58accf8ef..ac3246d281 100644 --- a/src/libs/utils/htmldocextractor.cpp +++ b/src/libs/utils/htmldocextractor.cpp @@ -38,10 +38,7 @@ namespace { } } -HtmlDocExtractor::HtmlDocExtractor() : - m_formatContents(true), - m_mode(FirstParagraph) -{} +HtmlDocExtractor::HtmlDocExtractor() = default; void HtmlDocExtractor::setMode(Mode mode) { m_mode = mode; } diff --git a/src/libs/utils/htmldocextractor.h b/src/libs/utils/htmldocextractor.h index f7c82f54a1..d4ede7d4ee 100644 --- a/src/libs/utils/htmldocextractor.h +++ b/src/libs/utils/htmldocextractor.h @@ -81,8 +81,8 @@ private: static void replaceTablesForSimpleLines(QString *html); static void replaceListsForSimpleLines(QString *html); - bool m_formatContents; - Mode m_mode; + bool m_formatContents = true; + Mode m_mode = FirstParagraph; }; } // namespace Utils diff --git a/src/libs/utils/icon.cpp b/src/libs/utils/icon.cpp index 4a800bd40b..dc7625aae3 100644 --- a/src/libs/utils/icon.cpp +++ b/src/libs/utils/icon.cpp @@ -47,10 +47,10 @@ static QPixmap maskToColorAndAlpha(const QPixmap &mask, const QColor &color) { QImage result(mask.toImage().convertToFormat(QImage::Format_ARGB32)); result.setDevicePixelRatio(mask.devicePixelRatio()); - QRgb *bitsStart = reinterpret_cast<QRgb*>(result.bits()); + auto bitsStart = reinterpret_cast<QRgb*>(result.bits()); const QRgb *bitsEnd = bitsStart + result.width() * result.height(); const QRgb tint = color.rgb() & 0x00ffffff; - const QRgb alpha = QRgb(color.alpha()); + const auto alpha = QRgb(color.alpha()); for (QRgb *pixel = bitsStart; pixel < bitsEnd; ++pixel) { QRgb pixelAlpha = (((~*pixel) & 0xff) * alpha) >> 8; *pixel = (pixelAlpha << 24) | tint; @@ -58,8 +58,8 @@ static QPixmap maskToColorAndAlpha(const QPixmap &mask, const QColor &color) return QPixmap::fromImage(result); } -typedef QPair<QPixmap, QColor> MaskAndColor; -typedef QList<MaskAndColor> MasksAndColors; +using MaskAndColor = QPair<QPixmap, QColor>; +using MasksAndColors = QList<MaskAndColor>; static MasksAndColors masksAndColors(const Icon &icon, int dpr) { MasksAndColors result; @@ -154,9 +154,7 @@ static QPixmap masksToIcon(const MasksAndColors &masks, const QPixmap &combinedM return result; } -Icon::Icon() -{ -} +Icon::Icon() = default; Icon::Icon(std::initializer_list<IconMaskAndColor> args, Icon::IconStyleOptions style) : QVector<IconMaskAndColor>(args) diff --git a/src/libs/utils/icon.h b/src/libs/utils/icon.h index 5de0896653..67c39ac4ee 100644 --- a/src/libs/utils/icon.h +++ b/src/libs/utils/icon.h @@ -38,7 +38,7 @@ QT_FORWARD_DECLARE_CLASS(QString) namespace Utils { -typedef QPair<QString, Theme::Color> IconMaskAndColor; +using IconMaskAndColor = QPair<QString, Theme::Color>; // Returns a recolored icon with shadow and custom disabled state for a // series of grayscalemask|Theme::Color mask pairs diff --git a/src/libs/cplusplus/images/classmemberfunction.png b/src/libs/utils/images/classmemberfunction.png Binary files differindex f97d706e7f..f97d706e7f 100644 --- a/src/libs/cplusplus/images/classmemberfunction.png +++ b/src/libs/utils/images/classmemberfunction.png diff --git a/src/libs/cplusplus/images/classmemberfunction@2x.png b/src/libs/utils/images/classmemberfunction@2x.png Binary files differindex f30e61336b..f30e61336b 100644 --- a/src/libs/cplusplus/images/classmemberfunction@2x.png +++ b/src/libs/utils/images/classmemberfunction@2x.png diff --git a/src/libs/cplusplus/images/classmembervariable.png b/src/libs/utils/images/classmembervariable.png Binary files differindex 82f8024b2e..82f8024b2e 100644 --- a/src/libs/cplusplus/images/classmembervariable.png +++ b/src/libs/utils/images/classmembervariable.png diff --git a/src/libs/cplusplus/images/classmembervariable@2x.png b/src/libs/utils/images/classmembervariable@2x.png Binary files differindex 6f426c3a41..6f426c3a41 100644 --- a/src/libs/cplusplus/images/classmembervariable@2x.png +++ b/src/libs/utils/images/classmembervariable@2x.png diff --git a/src/libs/cplusplus/images/classparent.png b/src/libs/utils/images/classparent.png Binary files differindex 19bb952842..19bb952842 100644 --- a/src/libs/cplusplus/images/classparent.png +++ b/src/libs/utils/images/classparent.png diff --git a/src/libs/cplusplus/images/classparent@2x.png b/src/libs/utils/images/classparent@2x.png Binary files differindex 5ae4e36890..5ae4e36890 100644 --- a/src/libs/cplusplus/images/classparent@2x.png +++ b/src/libs/utils/images/classparent@2x.png diff --git a/src/libs/cplusplus/images/classrelation.png b/src/libs/utils/images/classrelation.png Binary files differindex acf3c8e269..acf3c8e269 100644 --- a/src/libs/cplusplus/images/classrelation.png +++ b/src/libs/utils/images/classrelation.png diff --git a/src/libs/cplusplus/images/classrelation@2x.png b/src/libs/utils/images/classrelation@2x.png Binary files differindex 6da54dd223..6da54dd223 100644 --- a/src/libs/cplusplus/images/classrelation@2x.png +++ b/src/libs/utils/images/classrelation@2x.png diff --git a/src/libs/cplusplus/images/classrelationbackground.png b/src/libs/utils/images/classrelationbackground.png Binary files differindex 601c8b3321..601c8b3321 100644 --- a/src/libs/cplusplus/images/classrelationbackground.png +++ b/src/libs/utils/images/classrelationbackground.png diff --git a/src/libs/cplusplus/images/classrelationbackground@2x.png b/src/libs/utils/images/classrelationbackground@2x.png Binary files differindex 530e3d4c1e..530e3d4c1e 100644 --- a/src/libs/cplusplus/images/classrelationbackground@2x.png +++ b/src/libs/utils/images/classrelationbackground@2x.png diff --git a/src/libs/cplusplus/images/enum.png b/src/libs/utils/images/enum.png Binary files differindex c769846370..c769846370 100644 --- a/src/libs/cplusplus/images/enum.png +++ b/src/libs/utils/images/enum.png diff --git a/src/libs/cplusplus/images/enum@2x.png b/src/libs/utils/images/enum@2x.png Binary files differindex 562ac461d3..562ac461d3 100644 --- a/src/libs/cplusplus/images/enum@2x.png +++ b/src/libs/utils/images/enum@2x.png diff --git a/src/libs/cplusplus/images/enumerator.png b/src/libs/utils/images/enumerator.png Binary files differindex 292f387ff5..292f387ff5 100644 --- a/src/libs/cplusplus/images/enumerator.png +++ b/src/libs/utils/images/enumerator.png diff --git a/src/libs/cplusplus/images/enumerator@2x.png b/src/libs/utils/images/enumerator@2x.png Binary files differindex 705e86be9e..705e86be9e 100644 --- a/src/libs/cplusplus/images/enumerator@2x.png +++ b/src/libs/utils/images/enumerator@2x.png diff --git a/src/libs/cplusplus/images/keyword.png b/src/libs/utils/images/keyword.png Binary files differindex 335e63eeaf..335e63eeaf 100644 --- a/src/libs/cplusplus/images/keyword.png +++ b/src/libs/utils/images/keyword.png diff --git a/src/libs/cplusplus/images/keyword@2x.png b/src/libs/utils/images/keyword@2x.png Binary files differindex bfbe3c49cb..bfbe3c49cb 100644 --- a/src/libs/cplusplus/images/keyword@2x.png +++ b/src/libs/utils/images/keyword@2x.png diff --git a/src/libs/cplusplus/images/macro.png b/src/libs/utils/images/macro.png Binary files differindex aa621fce04..aa621fce04 100644 --- a/src/libs/cplusplus/images/macro.png +++ b/src/libs/utils/images/macro.png diff --git a/src/libs/cplusplus/images/macro@2x.png b/src/libs/utils/images/macro@2x.png Binary files differindex 67b5938fc9..67b5938fc9 100644 --- a/src/libs/cplusplus/images/macro@2x.png +++ b/src/libs/utils/images/macro@2x.png diff --git a/src/libs/cplusplus/images/member.png b/src/libs/utils/images/member.png Binary files differindex e974865e93..e974865e93 100644 --- a/src/libs/cplusplus/images/member.png +++ b/src/libs/utils/images/member.png diff --git a/src/libs/cplusplus/images/member@2x.png b/src/libs/utils/images/member@2x.png Binary files differindex d0a22156c0..d0a22156c0 100644 --- a/src/libs/cplusplus/images/member@2x.png +++ b/src/libs/utils/images/member@2x.png diff --git a/src/libs/cplusplus/images/private.png b/src/libs/utils/images/private.png Binary files differindex 8e25668d80..8e25668d80 100644 --- a/src/libs/cplusplus/images/private.png +++ b/src/libs/utils/images/private.png diff --git a/src/libs/cplusplus/images/private@2x.png b/src/libs/utils/images/private@2x.png Binary files differindex 348785c1ba..348785c1ba 100644 --- a/src/libs/cplusplus/images/private@2x.png +++ b/src/libs/utils/images/private@2x.png diff --git a/src/libs/cplusplus/images/privatebackground.png b/src/libs/utils/images/privatebackground.png Binary files differindex 0c482e5e3b..0c482e5e3b 100644 --- a/src/libs/cplusplus/images/privatebackground.png +++ b/src/libs/utils/images/privatebackground.png diff --git a/src/libs/cplusplus/images/privatebackground@2x.png b/src/libs/utils/images/privatebackground@2x.png Binary files differindex e29934552e..e29934552e 100644 --- a/src/libs/cplusplus/images/privatebackground@2x.png +++ b/src/libs/utils/images/privatebackground@2x.png diff --git a/src/libs/cplusplus/images/property.png b/src/libs/utils/images/property.png Binary files differindex e3f2244ca5..e3f2244ca5 100644 --- a/src/libs/cplusplus/images/property.png +++ b/src/libs/utils/images/property.png diff --git a/src/libs/cplusplus/images/property@2x.png b/src/libs/utils/images/property@2x.png Binary files differindex 9e5b80909e..9e5b80909e 100644 --- a/src/libs/cplusplus/images/property@2x.png +++ b/src/libs/utils/images/property@2x.png diff --git a/src/libs/cplusplus/images/propertybackground.png b/src/libs/utils/images/propertybackground.png Binary files differindex 7766b9fe82..7766b9fe82 100644 --- a/src/libs/cplusplus/images/propertybackground.png +++ b/src/libs/utils/images/propertybackground.png diff --git a/src/libs/cplusplus/images/propertybackground@2x.png b/src/libs/utils/images/propertybackground@2x.png Binary files differindex 0557290218..0557290218 100644 --- a/src/libs/cplusplus/images/propertybackground@2x.png +++ b/src/libs/utils/images/propertybackground@2x.png diff --git a/src/libs/cplusplus/images/protected.png b/src/libs/utils/images/protected.png Binary files differindex 2c87cf2c09..2c87cf2c09 100644 --- a/src/libs/cplusplus/images/protected.png +++ b/src/libs/utils/images/protected.png diff --git a/src/libs/cplusplus/images/protected@2x.png b/src/libs/utils/images/protected@2x.png Binary files differindex ad1c62356c..ad1c62356c 100644 --- a/src/libs/cplusplus/images/protected@2x.png +++ b/src/libs/utils/images/protected@2x.png diff --git a/src/libs/cplusplus/images/protectedbackground.png b/src/libs/utils/images/protectedbackground.png Binary files differindex d3c1b51334..d3c1b51334 100644 --- a/src/libs/cplusplus/images/protectedbackground.png +++ b/src/libs/utils/images/protectedbackground.png diff --git a/src/libs/cplusplus/images/protectedbackground@2x.png b/src/libs/utils/images/protectedbackground@2x.png Binary files differindex 3f129b5ce0..3f129b5ce0 100644 --- a/src/libs/cplusplus/images/protectedbackground@2x.png +++ b/src/libs/utils/images/protectedbackground@2x.png diff --git a/src/libs/cplusplus/images/signal.png b/src/libs/utils/images/signal.png Binary files differindex ff712b8619..ff712b8619 100644 --- a/src/libs/cplusplus/images/signal.png +++ b/src/libs/utils/images/signal.png diff --git a/src/libs/cplusplus/images/signal@2x.png b/src/libs/utils/images/signal@2x.png Binary files differindex 241e3d7634..241e3d7634 100644 --- a/src/libs/cplusplus/images/signal@2x.png +++ b/src/libs/utils/images/signal@2x.png diff --git a/src/libs/cplusplus/images/slot.png b/src/libs/utils/images/slot.png Binary files differindex 1c06b59727..1c06b59727 100644 --- a/src/libs/cplusplus/images/slot.png +++ b/src/libs/utils/images/slot.png diff --git a/src/libs/cplusplus/images/slot@2x.png b/src/libs/utils/images/slot@2x.png Binary files differindex f1a96a773a..f1a96a773a 100644 --- a/src/libs/cplusplus/images/slot@2x.png +++ b/src/libs/utils/images/slot@2x.png diff --git a/src/libs/cplusplus/images/static.png b/src/libs/utils/images/static.png Binary files differindex 988d55d825..988d55d825 100644 --- a/src/libs/cplusplus/images/static.png +++ b/src/libs/utils/images/static.png diff --git a/src/libs/cplusplus/images/static@2x.png b/src/libs/utils/images/static@2x.png Binary files differindex 93b9d17751..93b9d17751 100644 --- a/src/libs/cplusplus/images/static@2x.png +++ b/src/libs/utils/images/static@2x.png diff --git a/src/libs/cplusplus/images/staticbackground.png b/src/libs/utils/images/staticbackground.png Binary files differindex 314bace86a..314bace86a 100644 --- a/src/libs/cplusplus/images/staticbackground.png +++ b/src/libs/utils/images/staticbackground.png diff --git a/src/libs/cplusplus/images/staticbackground@2x.png b/src/libs/utils/images/staticbackground@2x.png Binary files differindex 912032dcae..912032dcae 100644 --- a/src/libs/cplusplus/images/staticbackground@2x.png +++ b/src/libs/utils/images/staticbackground@2x.png diff --git a/src/libs/utils/json.cpp b/src/libs/utils/json.cpp index 6eb46b60dc..104cf571b9 100644 --- a/src/libs/utils/json.cpp +++ b/src/libs/utils/json.cpp @@ -46,14 +46,13 @@ JsonValue::JsonValue(Kind kind) : m_kind(kind) {} -JsonValue::~JsonValue() -{} +JsonValue::~JsonValue() = default; JsonValue *JsonValue::create(const QString &s, JsonMemoryPool *pool) { const QJsonDocument document = QJsonDocument::fromJson(s.toUtf8()); if (document.isNull()) - return 0; + return nullptr; return build(document.toVariant(), pool); } @@ -92,14 +91,14 @@ JsonValue *JsonValue::build(const QVariant &variant, JsonMemoryPool *pool) switch (variant.type()) { case QVariant::List: { - JsonArrayValue *newValue = new (pool) JsonArrayValue; + auto newValue = new (pool) JsonArrayValue; foreach (const QVariant &element, variant.toList()) newValue->addElement(build(element, pool)); return newValue; } case QVariant::Map: { - JsonObjectValue *newValue = new (pool) JsonObjectValue; + auto newValue = new (pool) JsonObjectValue; const QVariantMap variantMap = variant.toMap(); for (QVariantMap::const_iterator it = variantMap.begin(); it != variantMap.end(); ++it) newValue->addMember(it.key(), build(it.value(), pool)); @@ -125,7 +124,7 @@ JsonValue *JsonValue::build(const QVariant &variant, JsonMemoryPool *pool) break; } - return 0; + return nullptr; } @@ -295,7 +294,7 @@ JsonObjectValue *JsonSchema::propertySchema(const QString &property, if (JsonObjectValue *base = resolveBase(v)) return propertySchema(property, base); - return 0; + return nullptr; } bool JsonSchema::hasPropertySchema(const QString &property) const @@ -526,14 +525,14 @@ bool JsonSchema::maybeSchemaName(const QString &s) JsonObjectValue *JsonSchema::rootValue() const { - QTC_ASSERT(!m_schemas.isEmpty(), return 0); + QTC_ASSERT(!m_schemas.isEmpty(), return nullptr); return m_schemas.first().m_value; } JsonObjectValue *JsonSchema::currentValue() const { - QTC_ASSERT(!m_schemas.isEmpty(), return 0); + QTC_ASSERT(!m_schemas.isEmpty(), return nullptr); return m_schemas.last().m_value; } @@ -616,14 +615,14 @@ JsonObjectValue *JsonSchema::resolveBase(JsonObjectValue *ov) const } } - return 0; + return nullptr; } JsonStringValue *JsonSchema::getStringValue(const QString &name, JsonObjectValue *value) { JsonValue *v = value->member(name); if (!v) - return 0; + return nullptr; return v->toString(); } @@ -632,7 +631,7 @@ JsonObjectValue *JsonSchema::getObjectValue(const QString &name, JsonObjectValue { JsonValue *v = value->member(name); if (!v) - return 0; + return nullptr; return v->toObject(); } @@ -641,7 +640,7 @@ JsonBooleanValue *JsonSchema::getBooleanValue(const QString &name, JsonObjectVal { JsonValue *v = value->member(name); if (!v) - return 0; + return nullptr; return v->toBoolean(); } @@ -650,7 +649,7 @@ JsonArrayValue *JsonSchema::getArrayValue(const QString &name, JsonObjectValue * { JsonValue *v = value->member(name); if (!v) - return 0; + return nullptr; return v->toArray(); } @@ -659,7 +658,7 @@ JsonDoubleValue *JsonSchema::getDoubleValue(const QString &name, JsonObjectValue { JsonValue *v = value->member(name); if (!v) - return 0; + return nullptr; return v->toDouble(); } @@ -717,7 +716,7 @@ JsonSchema *JsonSchemaManager::schemaByName(const QString &baseName) const it = m_schemas.find(baseName); if (it == m_schemas.end()) - return 0; + return nullptr; JsonSchemaData *schemaData = &it.value(); if (!schemaData->m_schema) { @@ -743,5 +742,5 @@ JsonSchema *JsonSchemaManager::parseSchema(const QString &schemaFileName) const return new JsonSchema(json->toObject(), this); } - return 0; + return nullptr; } diff --git a/src/libs/utils/json.h b/src/libs/utils/json.h index df7881a55e..1179a0c967 100644 --- a/src/libs/utils/json.h +++ b/src/libs/utils/json.h @@ -51,7 +51,7 @@ public: inline void *allocate(size_t size) { - char *obj = new char[size]; + auto obj = new char[size]; _objs.append(obj); return obj; } diff --git a/src/libs/utils/link.h b/src/libs/utils/link.h index d6df02c076..caf58a0251 100644 --- a/src/libs/utils/link.h +++ b/src/libs/utils/link.h @@ -35,9 +35,7 @@ namespace Utils { struct Link { Link(const QString &fileName = QString(), int line = 0, int column = 0) - : linkTextStart(-1) - , linkTextEnd(-1) - , targetFileName(fileName) + : targetFileName(fileName) , targetLine(line) , targetColumn(column) {} @@ -51,8 +49,8 @@ struct Link bool operator==(const Link &other) const { return linkTextStart == other.linkTextStart && linkTextEnd == other.linkTextEnd; } - int linkTextStart; - int linkTextEnd; + int linkTextStart = -1; + int linkTextEnd = -1; QString targetFileName; int targetLine; diff --git a/src/libs/utils/macroexpander.cpp b/src/libs/utils/macroexpander.cpp index 755f2e0a89..eb3f05e175 100644 --- a/src/libs/utils/macroexpander.cpp +++ b/src/libs/utils/macroexpander.cpp @@ -49,11 +49,9 @@ const char kFileBaseNamePostfix[] = ":FileBaseName"; class MacroExpanderPrivate : public AbstractMacroExpander { public: - MacroExpanderPrivate() - : m_accumulating(false), m_aborted(false), m_lockDepth(0) - {} + MacroExpanderPrivate() = default; - bool resolveMacro(const QString &name, QString *ret, QSet<AbstractMacroExpander *> &seen) + bool resolveMacro(const QString &name, QString *ret, QSet<AbstractMacroExpander *> &seen) override { // Prevent loops: const int count = seen.count(); @@ -113,10 +111,10 @@ public: QMap<QByteArray, QString> m_descriptions; QString m_displayName; QVector<MacroExpanderProvider> m_subProviders; - bool m_accumulating; + bool m_accumulating = false; - bool m_aborted; - int m_lockDepth; + bool m_aborted = false; + int m_lockDepth = 0; }; } // Internal @@ -396,7 +394,7 @@ void MacroExpander::registerFileVariables(const QByteArray &prefix, registerVariable(prefix + kFileNamePostfix, tr("%1: File name without path.").arg(heading), - [base]() -> QString { QString tmp = base(); return tmp.isEmpty() ? QString() : Utils::FileName::fromString(tmp).fileName(); }, + [base]() -> QString { QString tmp = base(); return tmp.isEmpty() ? QString() : FileName::fromString(tmp).fileName(); }, visibleInChooser); registerVariable(prefix + kFileBaseNamePostfix, diff --git a/src/libs/utils/macroexpander.h b/src/libs/utils/macroexpander.h index ff96eb1089..f17ae86b8c 100644 --- a/src/libs/utils/macroexpander.h +++ b/src/libs/utils/macroexpander.h @@ -38,8 +38,8 @@ namespace Utils { namespace Internal { class MacroExpanderPrivate; } class MacroExpander; -typedef std::function<MacroExpander *()> MacroExpanderProvider; -typedef QVector<MacroExpanderProvider> MacroExpanderProviders; +using MacroExpanderProvider = std::function<MacroExpander *()>; +using MacroExpanderProviders = QVector<MacroExpanderProvider>; class QTCREATOR_UTILS_EXPORT MacroExpander { @@ -59,10 +59,10 @@ public: QString expandProcessArgs(const QString &argsWithVariables) const; - typedef std::function<QString(QString)> PrefixFunction; - typedef std::function<bool(QString, QString *)> ResolverFunction; - typedef std::function<QString()> StringFunction; - typedef std::function<int()> IntFunction; + using PrefixFunction = std::function<QString(QString)>; + using ResolverFunction = std::function<bool(QString, QString *)>; + using StringFunction = std::function<QString()>; + using IntFunction = std::function<int()>; void registerPrefix(const QByteArray &prefix, const QString &description, const PrefixFunction &value); diff --git a/src/libs/utils/mimetypes/mimedatabase.cpp b/src/libs/utils/mimetypes/mimedatabase.cpp index 9f3c1ac8f5..8a85a43876 100644 --- a/src/libs/utils/mimetypes/mimedatabase.cpp +++ b/src/libs/utils/mimetypes/mimedatabase.cpp @@ -328,7 +328,7 @@ MimeDatabase::MimeDatabase() : */ MimeDatabase::~MimeDatabase() { - d = 0; + d = nullptr; } void Utils::addMimeTypes(const QString &fileName, const QByteArray &data) diff --git a/src/libs/utils/mimetypes/mimemagicrule.cpp b/src/libs/utils/mimetypes/mimemagicrule.cpp index 5e3f912ff0..c425417426 100644 --- a/src/libs/utils/mimetypes/mimemagicrule.cpp +++ b/src/libs/utils/mimetypes/mimemagicrule.cpp @@ -98,7 +98,7 @@ public: quint32 number; quint32 numberMask; - typedef bool (*MatchFunction)(const MimeMagicRulePrivate *d, const QByteArray &data); + using MatchFunction = bool (*)(const MimeMagicRulePrivate*, const QByteArray&); MatchFunction matchFunction; }; @@ -263,7 +263,7 @@ MimeMagicRule::MimeMagicRule(MimeMagicRule::Type theType, d->startPos = theStartPos; d->endPos = theEndPos; d->mask = theMask; - d->matchFunction = 0; + d->matchFunction = nullptr; if (d->value.isEmpty()) { d->type = Invalid; @@ -365,9 +365,7 @@ MimeMagicRule::MimeMagicRule(const MimeMagicRule &other) : { } -MimeMagicRule::~MimeMagicRule() -{ -} +MimeMagicRule::~MimeMagicRule() = default; MimeMagicRule &MimeMagicRule::operator=(const MimeMagicRule &other) { diff --git a/src/libs/utils/mimetypes/mimeprovider.cpp b/src/libs/utils/mimetypes/mimeprovider.cpp index 151da05458..3d14b971ce 100644 --- a/src/libs/utils/mimetypes/mimeprovider.cpp +++ b/src/libs/utils/mimetypes/mimeprovider.cpp @@ -75,12 +75,12 @@ MimeProviderBase::MimeProviderBase(MimeDatabasePrivate *db) { } -int qmime_secondsBetweenChecks = 5; +static int mime_secondsBetweenChecks = 5; bool MimeProviderBase::shouldCheck() { const QDateTime now = QDateTime::currentDateTime(); - if (m_lastCheck.isValid() && m_lastCheck.secsTo(now) < qmime_secondsBetweenChecks) + if (m_lastCheck.isValid() && m_lastCheck.secsTo(now) < mime_secondsBetweenChecks) return false; m_lastCheck = now; return true; diff --git a/src/libs/utils/mimetypes/mimetype.cpp b/src/libs/utils/mimetypes/mimetype.cpp index 3ccca3671c..5f06576767 100644 --- a/src/libs/utils/mimetypes/mimetype.cpp +++ b/src/libs/utils/mimetypes/mimetype.cpp @@ -139,10 +139,7 @@ MimeType::MimeType() : \fn MimeType::MimeType(const MimeType &other); Constructs this MimeType object as a copy of \a other. */ -MimeType::MimeType(const MimeType &other) : - d(other.d) -{ -} +MimeType::MimeType(const MimeType &other) = default; /*! \fn MimeType &MimeType::operator=(const MimeType &other); @@ -181,9 +178,7 @@ MimeType::MimeType(const MimeTypePrivate &dd) : \fn MimeType::~MimeType(); Destroys the MimeType object, and releases the d pointer. */ -MimeType::~MimeType() -{ -} +MimeType::~MimeType() = default; /*! \fn bool MimeType::operator==(const MimeType &other) const; diff --git a/src/libs/utils/mimetypes/mimetype.h b/src/libs/utils/mimetypes/mimetype.h index 8b47696d7d..db17b43700 100644 --- a/src/libs/utils/mimetypes/mimetype.h +++ b/src/libs/utils/mimetypes/mimetype.h @@ -121,6 +121,8 @@ protected: QExplicitlySharedDataPointer<Internal::MimeTypePrivate> d; }; +inline uint QTCREATOR_UTILS_EXPORT qHash(const MimeType &mime) { return qHash(mime.name()); } + } // Utils //Q_DECLARE_SHARED(Utils::MimeType) @@ -131,3 +133,4 @@ class QDebug; QTCREATOR_UTILS_EXPORT QDebug operator<<(QDebug debug, const Utils::MimeType &mime); QT_END_NAMESPACE #endif + diff --git a/src/libs/utils/mimetypes/mimetypeparser.cpp b/src/libs/utils/mimetypes/mimetypeparser.cpp index 7099acd43a..9ce6cd0f09 100644 --- a/src/libs/utils/mimetypes/mimetypeparser.cpp +++ b/src/libs/utils/mimetypes/mimetypeparser.cpp @@ -295,7 +295,7 @@ bool MimeTypeParserBase::parse(const QByteArray &content, const QString &fileNam } break; case ParseMagicMatchRule: { - MimeMagicRule *rule = 0; + MimeMagicRule *rule = nullptr; if (!createMagicMatchRule(atts, errorMessage, rule)) return false; QList<MimeMagicRule> *ruleList; diff --git a/src/libs/utils/networkaccessmanager.cpp b/src/libs/utils/networkaccessmanager.cpp index 9cc475e87c..2409149525 100644 --- a/src/libs/utils/networkaccessmanager.cpp +++ b/src/libs/utils/networkaccessmanager.cpp @@ -47,12 +47,12 @@ namespace Utils { -static NetworkAccessManager *namInstance = 0; +static NetworkAccessManager *namInstance = nullptr; void cleanupNetworkAccessManager() { delete namInstance; - namInstance = 0; + namInstance = nullptr; } NetworkAccessManager *NetworkAccessManager::instance() diff --git a/src/libs/utils/newclasswidget.cpp b/src/libs/utils/newclasswidget.cpp index 9bfef0a66e..8700b8204c 100644 --- a/src/libs/utils/newclasswidget.cpp +++ b/src/libs/utils/newclasswidget.cpp @@ -51,34 +51,24 @@ struct NewClassWidgetPrivate { QString m_headerExtension; QString m_sourceExtension; QString m_formExtension; - bool m_valid; - bool m_classEdited; + bool m_valid = false; + bool m_classEdited = false; // Store the "visible" values to prevent the READ accessors from being // fooled by a temporarily hidden widget - bool m_baseClassInputVisible; - bool m_formInputVisible; - bool m_headerInputVisible; - bool m_sourceInputVisible; - bool m_pathInputVisible; - bool m_qobjectCheckBoxVisible; - bool m_formInputCheckable; + bool m_baseClassInputVisible = true; + bool m_formInputVisible = true; + bool m_headerInputVisible = true; + bool m_sourceInputVisible = true; + bool m_pathInputVisible = true; + bool m_qobjectCheckBoxVisible = false; + bool m_formInputCheckable = false; QRegExp m_classNameValidator; }; NewClassWidgetPrivate:: NewClassWidgetPrivate() : m_headerExtension(QLatin1Char('h')), m_sourceExtension(QLatin1String("cpp")), - m_formExtension(QLatin1String("ui")), - m_valid(false), - m_classEdited(false), - m_baseClassInputVisible(true), - m_formInputVisible(true), - m_headerInputVisible(true), - m_sourceInputVisible(true), - m_pathInputVisible(true), - m_qobjectCheckBoxVisible(false), - m_formInputCheckable(false) - + m_formExtension(QLatin1String("ui")) { } diff --git a/src/libs/utils/optional.h b/src/libs/utils/optional.h index e4f943259f..a9f58334b7 100644 --- a/src/libs/utils/optional.h +++ b/src/libs/utils/optional.h @@ -41,6 +41,7 @@ namespace Utils { using std::experimental::optional; // --> Utils::nullopt using std::experimental::nullopt; +using std::experimental::nullopt_t; // --> Utils::in_place using std::experimental::in_place; diff --git a/src/libs/utils/outputformatter.cpp b/src/libs/utils/outputformatter.cpp index aae6a28d16..de1e20d33f 100644 --- a/src/libs/utils/outputformatter.cpp +++ b/src/libs/utils/outputformatter.cpp @@ -38,7 +38,7 @@ class OutputFormatterPrivate { public: OutputFormatterPrivate() - : plainTextEdit(0), overwriteOutput(false) + : plainTextEdit(nullptr), overwriteOutput(false) {} QPlainTextEdit *plainTextEdit; diff --git a/src/libs/utils/outputformatter.h b/src/libs/utils/outputformatter.h index d30a640b7b..2091fb6d8c 100644 --- a/src/libs/utils/outputformatter.h +++ b/src/libs/utils/outputformatter.h @@ -66,7 +66,7 @@ protected: void initFormats(); virtual void clearLastLine(); QTextCharFormat charFormat(OutputFormat format) const; - QList<Utils::FormattedText> parseAnsi(const QString &text, const QTextCharFormat &format); + QList<FormattedText> parseAnsi(const QString &text, const QTextCharFormat &format); void append(QTextCursor &cursor, const QString &text, const QTextCharFormat &format); private: diff --git a/src/libs/utils/overridecursor.cpp b/src/libs/utils/overridecursor.cpp index 4c9093917f..7868289725 100644 --- a/src/libs/utils/overridecursor.cpp +++ b/src/libs/utils/overridecursor.cpp @@ -30,7 +30,7 @@ using namespace Utils; OverrideCursor::OverrideCursor(const QCursor &cursor) - : m_set(true), m_cursor(cursor) + : m_cursor(cursor) { QApplication::setOverrideCursor(cursor); } diff --git a/src/libs/utils/overridecursor.h b/src/libs/utils/overridecursor.h index 5ca2bb5800..00ce021fe2 100644 --- a/src/libs/utils/overridecursor.h +++ b/src/libs/utils/overridecursor.h @@ -39,7 +39,7 @@ public: void set(); void reset(); private: - bool m_set; + bool m_set = true; QCursor m_cursor; }; diff --git a/src/libs/utils/pathchooser.cpp b/src/libs/utils/pathchooser.cpp index 7fde56993e..e8a7e2d597 100644 --- a/src/libs/utils/pathchooser.cpp +++ b/src/libs/utils/pathchooser.cpp @@ -49,9 +49,11 @@ This class has some validation logic for embedding into QWizardPage. */ +namespace Utils { + static QString appBundleExpandedPath(const QString &path) { - if (Utils::HostOsInfo::hostOs() == Utils::OsTypeMac && path.endsWith(".app")) { + if (HostOsInfo::hostOs() == OsTypeMac && path.endsWith(".app")) { // possibly expand to Foo.app/Contents/MacOS/Foo QFileInfo info(path); if (info.isDir()) { @@ -63,9 +65,7 @@ static QString appBundleExpandedPath(const QString &path) return path; } -Utils::PathChooser::AboutToShowContextMenuHandler Utils::PathChooser::s_aboutToShowContextMenuHandler; - -namespace Utils { +PathChooser::AboutToShowContextMenuHandler PathChooser::s_aboutToShowContextMenuHandler; // ------------------ BinaryVersionToolTipEventFilter // Event filter to be installed on a lineedit used for entering @@ -78,7 +78,7 @@ class BinaryVersionToolTipEventFilter : public QObject public: explicit BinaryVersionToolTipEventFilter(QLineEdit *le); - virtual bool eventFilter(QObject *, QEvent *); + bool eventFilter(QObject *, QEvent *) override; QStringList arguments() const { return m_arguments; } void setArguments(const QStringList &arguments) { m_arguments = arguments; } @@ -102,7 +102,7 @@ bool BinaryVersionToolTipEventFilter::eventFilter(QObject *o, QEvent *e) { if (e->type() != QEvent::ToolTip) return false; - QLineEdit *le = qobject_cast<QLineEdit *>(o); + auto le = qobject_cast<QLineEdit *>(o); QTC_ASSERT(le, return false); const QString binary = le->text(); @@ -674,7 +674,7 @@ QString PathChooser::toolVersion(const QString &binary, const QStringList &argum void PathChooser::installLineEditVersionToolTip(QLineEdit *le, const QStringList &arguments) { - BinaryVersionToolTipEventFilter *ef = new BinaryVersionToolTipEventFilter(le); + auto ef = new BinaryVersionToolTipEventFilter(le); ef->setArguments(arguments); } diff --git a/src/libs/utils/pathchooser.h b/src/libs/utils/pathchooser.h index 3f91ebc7cb..deaaf4f05d 100644 --- a/src/libs/utils/pathchooser.h +++ b/src/libs/utils/pathchooser.h @@ -95,7 +95,7 @@ public: FileName rawFileName() const; // The raw unexpanded input. FileName fileName() const; - static QString expandedDirectory(const QString &input, const Utils::Environment &env, + static QString expandedDirectory(const QString &input, const Environment &env, const QString &baseDir); QString baseDirectory() const; @@ -142,7 +142,7 @@ public: // global handler for adding context menus to ALL pathchooser // used by the coreplugin to add "Open in Terminal" and "Open in Explorer" context menu actions - using AboutToShowContextMenuHandler = std::function<void (Utils::PathChooser *, QMenu *)>; + using AboutToShowContextMenuHandler = std::function<void (PathChooser *, QMenu *)>; static void setAboutToShowContextMenuHandler(AboutToShowContextMenuHandler handler); QColor errorColor() const; @@ -166,7 +166,7 @@ signals: public slots: void setPath(const QString &); - void setFileName(const Utils::FileName &); + void setFileName(const FileName &); void setErrorColor(const QColor &errorColor); void setOkColor(const QColor &okColor); diff --git a/src/libs/utils/pathlisteditor.cpp b/src/libs/utils/pathlisteditor.cpp index c4691d8585..70ec975db7 100644 --- a/src/libs/utils/pathlisteditor.cpp +++ b/src/libs/utils/pathlisteditor.cpp @@ -68,7 +68,7 @@ const int PathListEditor::lastInsertButtonIndex = 0; class PathListPlainTextEdit : public QPlainTextEdit { public: - explicit PathListPlainTextEdit(QWidget *parent = 0); + explicit PathListPlainTextEdit(QWidget *parent = nullptr); protected: void insertFromMimeData (const QMimeData *source) override; }; @@ -149,7 +149,7 @@ QPushButton *PathListEditor::addButton(const QString &text, QObject *parent, QPushButton *PathListEditor::insertButton(int index /* -1 */, const QString &text, QObject *parent, std::function<void()> slotFunc) { - QPushButton *rc = new QPushButton(text, this); + auto rc = new QPushButton(text, this); QObject::connect(rc, &QPushButton::pressed, parent, slotFunc); d->buttonLayout->insertWidget(index, rc); return rc; diff --git a/src/libs/utils/persistentsettings.cpp b/src/libs/utils/persistentsettings.cpp index 8a600f90f7..898ce27547 100644 --- a/src/libs/utils/persistentsettings.cpp +++ b/src/libs/utils/persistentsettings.cpp @@ -281,7 +281,7 @@ QString ParseContext::formatWarning(const QXmlStreamReader &r, const QString &me { QString result = QLatin1String("Warning reading "); if (const QIODevice *device = r.device()) - if (const QFile *file = qobject_cast<const QFile *>(device)) + if (const auto file = qobject_cast<const QFile *>(device)) result += QDir::toNativeSeparators(file->fileName()) + QLatin1Char(':'); result += QString::number(r.lineNumber()); result += QLatin1String(": "); @@ -327,9 +327,7 @@ QVariant ParseContext::readSimpleValue(QXmlStreamReader &r, const QXmlStreamAttr // =================================== PersistentSettingsReader -PersistentSettingsReader::PersistentSettingsReader() -{ -} +PersistentSettingsReader::PersistentSettingsReader() = default; QVariant PersistentSettingsReader::restoreValue(const QString &variable, const QVariant &defaultValue) const { @@ -417,7 +415,7 @@ PersistentSettingsWriter::PersistentSettingsWriter(const FileName &fileName, con PersistentSettingsWriter::~PersistentSettingsWriter() { - write(m_savedData, 0); + write(m_savedData, nullptr); } bool PersistentSettingsWriter::save(const QVariantMap &data, QString *errorString) const diff --git a/src/libs/utils/pointeralgorithm.h b/src/libs/utils/pointeralgorithm.h index 1ab336f510..bb65c346a1 100644 --- a/src/libs/utils/pointeralgorithm.h +++ b/src/libs/utils/pointeralgorithm.h @@ -275,13 +275,13 @@ auto toRawPointer(const SourceContainer &sources) // take: ///////////////// template<typename C> -Q_REQUIRED_RESULT Utils::optional<ValueType<C>> take(C &container, PointerType<C> p) +Q_REQUIRED_RESULT optional<ValueType<C>> take(C &container, PointerType<C> p) { return take(container, [p](const ValueType<C> &v) { return v.get() == p; }); } template <typename C> -Q_REQUIRED_RESULT Utils::optional<ValueType<C>> take(C &container, std::nullptr_t) +Q_REQUIRED_RESULT optional<ValueType<C>> take(C &container, std::nullptr_t) { return take(container, static_cast<PointerType<C>>(nullptr)); } diff --git a/src/libs/utils/port.h b/src/libs/utils/port.h index 0ed62d0a9b..56d0b646dc 100644 --- a/src/libs/utils/port.h +++ b/src/libs/utils/port.h @@ -38,7 +38,7 @@ namespace Utils { class QTCREATOR_UTILS_EXPORT Port { public: - Port() : m_port(-1) {} + Port() = default; explicit Port(quint16 port) : m_port(port) {} explicit Port(int port) : m_port((port < 0 || port > std::numeric_limits<quint16>::max()) ? -1 : port) @@ -56,7 +56,7 @@ public: QString toString() const { return QString::number(m_port); } private: - int m_port; + int m_port = -1; }; inline bool operator<(const Port &p1, const Port &p2) { return p1.number() < p2.number(); } diff --git a/src/libs/utils/portlist.cpp b/src/libs/utils/portlist.cpp index d78cd24b23..6fb9ecb89f 100644 --- a/src/libs/utils/portlist.cpp +++ b/src/libs/utils/portlist.cpp @@ -35,7 +35,7 @@ namespace Utils { namespace Internal { namespace { -typedef QPair<Port, Port> Range; +using Range = QPair<Port, Port>; class PortsSpecParser { diff --git a/src/libs/utils/process_ctrlc_stub.cpp b/src/libs/utils/process_ctrlc_stub.cpp index cd4b6ccb55..396ed3c153 100644 --- a/src/libs/utils/process_ctrlc_stub.cpp +++ b/src/libs/utils/process_ctrlc_stub.cpp @@ -47,7 +47,7 @@ const wchar_t szTitle[] = L"qtcctrlcstub"; const wchar_t szWindowClass[] = L"wcqtcctrlcstub"; UINT uiShutDownWindowMessage; UINT uiInterruptMessage; -HWND hwndMain = 0; +HWND hwndMain = nullptr; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); BOOL WINAPI shutdownHandler(DWORD dwCtrlType); @@ -68,7 +68,7 @@ int main(int argc, char **) WNDCLASSEX wcex = {0}; wcex.cbSize = sizeof(wcex); wcex.lpfnWndProc = WndProc; - wcex.hInstance = GetModuleHandle(0); + wcex.hInstance = GetModuleHandle(nullptr); wcex.lpszClassName = szWindowClass; if (!RegisterClassEx(&wcex)) return 1; @@ -156,7 +156,7 @@ BOOL WINAPI interruptHandler(DWORD /*dwCtrlType*/) DWORD WINAPI processWatcherThread(LPVOID lpParameter) { - HANDLE hProcess = reinterpret_cast<HANDLE>(lpParameter); + auto hProcess = reinterpret_cast<HANDLE>(lpParameter); WaitForSingleObject(hProcess, INFINITE); DWORD dwExitCode; if (!GetExitCodeProcess(hProcess, &dwExitCode)) diff --git a/src/libs/utils/progressindicator.cpp b/src/libs/utils/progressindicator.cpp index 407114282f..dc2d8bb626 100644 --- a/src/libs/utils/progressindicator.cpp +++ b/src/libs/utils/progressindicator.cpp @@ -205,7 +205,7 @@ void ProgressIndicatorPainter::stopAnimation() /*! \internal */ -void Utils::ProgressIndicatorPainter::nextAnimationStep() +void ProgressIndicatorPainter::nextAnimationStep() { m_rotation = (m_rotation + m_rotationStep + 360) % 360; } diff --git a/src/libs/utils/proxyaction.cpp b/src/libs/utils/proxyaction.cpp index 06e85d59ad..67917e71b1 100644 --- a/src/libs/utils/proxyaction.cpp +++ b/src/libs/utils/proxyaction.cpp @@ -28,11 +28,7 @@ using namespace Utils; ProxyAction::ProxyAction(QObject *parent) : - QAction(parent), - m_action(0), - m_attributes(0), - m_showShortcut(false), - m_block(false) + QAction(parent) { connect(this, &QAction::changed, this, &ProxyAction::updateToolTipWithKeySequence); updateState(); @@ -178,7 +174,7 @@ QString ProxyAction::stringWithAppendedShortcut(const QString &str, const QKeySe ProxyAction *ProxyAction::proxyActionWithIcon(QAction *original, const QIcon &newIcon) { - ProxyAction *proxyAction = new ProxyAction(original); + auto proxyAction = new ProxyAction(original); proxyAction->setAction(original); proxyAction->setIcon(newIcon); proxyAction->setAttribute(UpdateText); diff --git a/src/libs/utils/proxyaction.h b/src/libs/utils/proxyaction.h index 5058bb42f3..6f5671cea7 100644 --- a/src/libs/utils/proxyaction.h +++ b/src/libs/utils/proxyaction.h @@ -68,11 +68,11 @@ private: void connectAction(); void update(QAction *action, bool initialize); - QPointer<QAction> m_action; - Attributes m_attributes; - bool m_showShortcut; + QPointer<QAction> m_action = nullptr; + Attributes m_attributes = {}; + bool m_showShortcut = false; QString m_toolTip; - bool m_block; + bool m_block = false; }; } // namespace Utils diff --git a/src/libs/utils/qtcolorbutton.cpp b/src/libs/utils/qtcolorbutton.cpp index f5aec0a61e..5463f96dda 100644 --- a/src/libs/utils/qtcolorbutton.cpp +++ b/src/libs/utils/qtcolorbutton.cpp @@ -236,9 +236,9 @@ void QtColorButton::mouseMoveEvent(QMouseEvent *event) #ifndef QT_NO_DRAGANDDROP if (event->buttons() & Qt::LeftButton && (d_ptr->m_dragStart - event->pos()).manhattanLength() > QApplication::startDragDistance()) { - QMimeData *mime = new QMimeData; + auto mime = new QMimeData; mime->setColorData(color()); - QDrag *drg = new QDrag(this); + auto drg = new QDrag(this); drg->setMimeData(mime); drg->setPixmap(d_ptr->generatePixmap()); setDown(false); diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index eb9cf9f647..dd4fe16f49 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -668,9 +668,7 @@ bool QtcProcess::prepareCommand(const QString &command, const QString &arguments } QtcProcess::QtcProcess(QObject *parent) - : QProcess(parent), - m_haveEnv(false), - m_useCtrlCStub(false) + : QProcess(parent) { static int qProcessExitStatusMeta = qRegisterMetaType<QProcess::ExitStatus>(); static int qProcessProcessErrorMeta = qRegisterMetaType<QProcess::ProcessError>(); diff --git a/src/libs/utils/qtcprocess.h b/src/libs/utils/qtcprocess.h index 4ff75a7dae..44c5786661 100644 --- a/src/libs/utils/qtcprocess.h +++ b/src/libs/utils/qtcprocess.h @@ -106,7 +106,7 @@ public: class QTCREATOR_UTILS_EXPORT ArgIterator { public: ArgIterator(QString *str, OsType osType = HostOsInfo::hostOs()) - : m_str(str), m_pos(0), m_prev(-1), m_osType(osType) + : m_str(str), m_osType(osType) {} //! Get the next argument. Returns false on encountering end of first command. bool next(); @@ -121,7 +121,8 @@ public: void appendArg(const QString &str); private: QString *m_str, m_value; - int m_pos, m_prev; + int m_pos = 0; + int m_prev = -1; bool m_simple; OsType m_osType; }; @@ -143,8 +144,8 @@ private: QString m_command; QString m_arguments; Environment m_environment; - bool m_haveEnv; - bool m_useCtrlCStub; + bool m_haveEnv = false; + bool m_useCtrlCStub = false; }; } // namespace Utils diff --git a/src/libs/utils/runextensions.h b/src/libs/utils/runextensions.h index 14cf5e4922..6925504693 100644 --- a/src/libs/utils/runextensions.h +++ b/src/libs/utils/runextensions.h @@ -59,7 +59,7 @@ struct hasCallOperator namespace Utils { -using StackSizeInBytes = Utils::optional<uint>; +using StackSizeInBytes = optional<uint>; namespace Internal { diff --git a/src/libs/utils/savedaction.cpp b/src/libs/utils/savedaction.cpp index 8454488095..0000e54d31 100644 --- a/src/libs/utils/savedaction.cpp +++ b/src/libs/utils/savedaction.cpp @@ -56,7 +56,6 @@ namespace Utils { SavedAction::SavedAction(QObject *parent) : QAction(parent) { - m_widget = 0; connect(this, &QAction::triggered, this, &SavedAction::actionTriggered); } @@ -285,7 +284,7 @@ void SavedAction::connectWidget(QWidget *widget, ApplyMode applyMode) */ void SavedAction::disconnectWidget() { - m_widget = 0; + m_widget = nullptr; } void SavedAction::apply(QSettings *s) @@ -335,7 +334,7 @@ void SavedAction::actionTriggered(bool) if (actionGroup() && actionGroup()->isExclusive()) { // FIXME: should be taken care of more directly foreach (QAction *act, actionGroup()->actions()) - if (SavedAction *dact = qobject_cast<SavedAction *>(act)) + if (auto dact = qobject_cast<SavedAction *>(act)) dact->setValue(bool(act == this)); } } diff --git a/src/libs/utils/savedaction.h b/src/libs/utils/savedaction.h index 45454939f1..5f90de65ed 100644 --- a/src/libs/utils/savedaction.h +++ b/src/libs/utils/savedaction.h @@ -83,14 +83,14 @@ private: QString m_settingsKey; QString m_settingsGroup; QString m_dialogText; - QWidget *m_widget; + QWidget *m_widget = nullptr; }; class QTCREATOR_UTILS_EXPORT SavedActionSet { public: - SavedActionSet() {} - ~SavedActionSet() {} + SavedActionSet() = default; + ~SavedActionSet() = default; void insert(SavedAction *action, QWidget *widget); void apply(QSettings *settings); diff --git a/src/libs/utils/savefile.cpp b/src/libs/utils/savefile.cpp index 13b9db0d84..36b515568e 100644 --- a/src/libs/utils/savefile.cpp +++ b/src/libs/utils/savefile.cpp @@ -36,10 +36,10 @@ namespace Utils { -QFile::Permissions SaveFile::m_umask = 0; +QFile::Permissions SaveFile::m_umask = nullptr; SaveFile::SaveFile(const QString &filename) : - m_finalFileName(filename), m_finalized(true) + m_finalFileName(filename) { } diff --git a/src/libs/utils/savefile.h b/src/libs/utils/savefile.h index 56d60aacc9..799b30c9ca 100644 --- a/src/libs/utils/savefile.h +++ b/src/libs/utils/savefile.h @@ -51,7 +51,7 @@ public: private: const QString m_finalFileName; std::unique_ptr<QTemporaryFile> m_tempFile; - bool m_finalized; + bool m_finalized = true; static QFile::Permissions m_umask; }; diff --git a/src/libs/utils/scopedswap.h b/src/libs/utils/scopedswap.h index 4cc129bd21..46384448bc 100644 --- a/src/libs/utils/scopedswap.h +++ b/src/libs/utils/scopedswap.h @@ -49,6 +49,6 @@ public: } }; -typedef ScopedSwap<bool> ScopedBoolSwap; +using ScopedBoolSwap = ScopedSwap<bool>; } // Utils namespace diff --git a/src/libs/utils/settingsaccessor.cpp b/src/libs/utils/settingsaccessor.cpp index cab3a348a8..09210c3766 100644 --- a/src/libs/utils/settingsaccessor.cpp +++ b/src/libs/utils/settingsaccessor.cpp @@ -110,7 +110,7 @@ SettingsAccessor::RestoreData SettingsAccessor::readData(const FileName &path, Q /*! * Store the \a data in \a path on disk. Do all the necessary preprocessing of the data. */ -Utils::optional<SettingsAccessor::Issue> +optional<SettingsAccessor::Issue> SettingsAccessor::writeData(const FileName &path, const QVariantMap &data, QWidget *parent) const { Q_UNUSED(parent); @@ -155,7 +155,7 @@ SettingsAccessor::RestoreData SettingsAccessor::readFile(const FileName &path) c * * This method does not do *any* processing of the file contents. */ -Utils::optional<SettingsAccessor::Issue> +optional<SettingsAccessor::Issue> SettingsAccessor::writeFile(const FileName &path, const QVariantMap &data) const { if (data.isEmpty()) { @@ -239,11 +239,11 @@ int BackUpStrategy::compare(const SettingsAccessor::RestoreData &data1, return 0; } -Utils::optional<Utils::FileName> +optional<FileName> BackUpStrategy::backupName(const QVariantMap &oldData, const FileName &path, const QVariantMap &data) const { if (oldData == data) - return Utils::nullopt; + return nullopt; FileName backup = path; backup.appendString(".bak"); return backup; @@ -264,7 +264,7 @@ BackingUpSettingsAccessor::BackingUpSettingsAccessor(std::unique_ptr<BackUpStrat { } SettingsAccessor::RestoreData -BackingUpSettingsAccessor::readData(const Utils::FileName &path, QWidget *parent) const +BackingUpSettingsAccessor::readData(const FileName &path, QWidget *parent) const { const FileNameList fileList = readFileCandidates(path); if (fileList.isEmpty()) // No settings found at all. @@ -288,8 +288,8 @@ BackingUpSettingsAccessor::readData(const Utils::FileName &path, QWidget *parent return result; } -Utils::optional<SettingsAccessor::Issue> -BackingUpSettingsAccessor::writeData(const Utils::FileName &path, const QVariantMap &data, +optional<SettingsAccessor::Issue> +BackingUpSettingsAccessor::writeData(const FileName &path, const QVariantMap &data, QWidget *parent) const { if (data.isEmpty()) @@ -300,7 +300,7 @@ BackingUpSettingsAccessor::writeData(const Utils::FileName &path, const QVariant return SettingsAccessor::writeData(path, data, parent); } -FileNameList BackingUpSettingsAccessor::readFileCandidates(const Utils::FileName &path) const +FileNameList BackingUpSettingsAccessor::readFileCandidates(const FileName &path) const { FileNameList result = Utils::filteredUnique(m_strategy->readFileCandidates(path)); if (result.removeOne(baseFilePath())) @@ -631,7 +631,7 @@ SettingsAccessor::RestoreData MergingSettingsAccessor::readData(const FileName & secondaryData.issue = Issue(QApplication::translate("Utils::SettingsAccessor", "Unsupported Merge Settings File"), QApplication::translate("Utils::SettingsAccessor", - "\"%1\" is not supported by %1. " + "\"%1\" is not supported by %2. " "Do you want to try loading it anyway?") .arg(secondaryData.path.toUserOutput()) .arg(applicationDisplayName), Issue::Type::WARNING); @@ -752,7 +752,7 @@ static QVariant mergeQVariantMapsRecursion(const QVariantMap &mainTree, const QV global.key = keyPrefix + key; local.key = key; - Utils::optional<QPair<QString, QVariant>> mergeResult = merge(global, local); + optional<QPair<QString, QVariant>> mergeResult = merge(global, local); if (!mergeResult) continue; diff --git a/src/libs/utils/settingsaccessor.h b/src/libs/utils/settingsaccessor.h index d7859067ff..10675cbf4c 100644 --- a/src/libs/utils/settingsaccessor.h +++ b/src/libs/utils/settingsaccessor.h @@ -63,7 +63,7 @@ QTCREATOR_UTILS_EXPORT void setVersionInMap(QVariantMap &data, int version); QTCREATOR_UTILS_EXPORT void setOriginalVersionInMap(QVariantMap &data, int version); QTCREATOR_UTILS_EXPORT void setSettingsIdInMap(QVariantMap &data, const QByteArray &id); -using SettingsMergeResult = Utils::optional<QPair<QString, QVariant>>; +using SettingsMergeResult = optional<QPair<QString, QVariant>>; // -------------------------------------------------------------------- // SettingsAccessor: @@ -78,7 +78,7 @@ public: virtual ~SettingsAccessor() = default; enum ProceedInfo { Continue, DiscardAndContinue }; - typedef QHash<QMessageBox::StandardButton, ProceedInfo> ButtonMap; + using ButtonMap = QHash<QMessageBox::StandardButton, ProceedInfo>; class Issue { public: enum class Type { ERROR, WARNING }; @@ -99,7 +99,7 @@ public: class RestoreData { public: RestoreData() = default; - RestoreData(const Utils::FileName &path, const QVariantMap &data) : path{path}, data{data} { } + RestoreData(const FileName &path, const QVariantMap &data) : path{path}, data{data} { } RestoreData(const QString &title, const QString &message, const Issue::Type type) : RestoreData(Issue(title, message, type)) { } @@ -109,9 +109,9 @@ public: bool hasError() const { return hasIssue() && issue.value().type == Issue::Type::ERROR; } bool hasWarning() const { return hasIssue() && issue.value().type == Issue::Type::WARNING; } - Utils::FileName path; + FileName path; QVariantMap data; - Utils::optional<Issue> issue; + optional<Issue> issue; }; QVariantMap restoreSettings(QWidget *parent) const; @@ -121,26 +121,26 @@ public: const QString displayName; const QString applicationDisplayName; - void setBaseFilePath(const Utils::FileName &baseFilePath) { m_baseFilePath = baseFilePath; } + void setBaseFilePath(const FileName &baseFilePath) { m_baseFilePath = baseFilePath; } void setReadOnly() { m_readOnly = true; } - Utils::FileName baseFilePath() const { return m_baseFilePath; } + FileName baseFilePath() const { return m_baseFilePath; } - virtual RestoreData readData(const Utils::FileName &path, QWidget *parent) const; - virtual Utils::optional<Issue> writeData(const Utils::FileName &path, const QVariantMap &data, QWidget *parent) const; + virtual RestoreData readData(const FileName &path, QWidget *parent) const; + virtual optional<Issue> writeData(const FileName &path, const QVariantMap &data, QWidget *parent) const; protected: // Report errors: - QVariantMap restoreSettings(const Utils::FileName &settingsPath, QWidget *parent) const; + QVariantMap restoreSettings(const FileName &settingsPath, QWidget *parent) const; ProceedInfo reportIssues(const Issue &issue, const FileName &path, QWidget *parent) const; virtual QVariantMap preprocessReadSettings(const QVariantMap &data) const; virtual QVariantMap prepareToWriteSettings(const QVariantMap &data) const; - virtual RestoreData readFile(const Utils::FileName &path) const; - virtual Utils::optional<Issue> writeFile(const Utils::FileName &path, const QVariantMap &data) const; + virtual RestoreData readFile(const FileName &path) const; + virtual optional<Issue> writeFile(const FileName &path, const QVariantMap &data) const; private: - Utils::FileName m_baseFilePath; + FileName m_baseFilePath; mutable std::unique_ptr<PersistentSettingsWriter> m_writer; bool m_readOnly = false; }; @@ -154,7 +154,7 @@ class QTCREATOR_UTILS_EXPORT BackUpStrategy public: virtual ~BackUpStrategy() = default; - virtual FileNameList readFileCandidates(const Utils::FileName &baseFileName) const; + virtual FileNameList readFileCandidates(const FileName &baseFileName) const; // Return -1 if data1 is better that data2, 0 if both are equally worthwhile // and 1 if data2 is better than data1 virtual int compare(const SettingsAccessor::RestoreData &data1, @@ -172,14 +172,14 @@ public: BackingUpSettingsAccessor(std::unique_ptr<BackUpStrategy> &&strategy, const QString &docType, const QString &displayName, const QString &applicationDisplayName); - RestoreData readData(const Utils::FileName &path, QWidget *parent) const override; - Utils::optional<Issue> writeData(const Utils::FileName &path, const QVariantMap &data, - QWidget *parent) const override; + RestoreData readData(const FileName &path, QWidget *parent) const override; + optional<Issue> writeData(const FileName &path, const QVariantMap &data, + QWidget *parent) const override; BackUpStrategy *strategy() const { return m_strategy.get(); } private: - Utils::FileNameList readFileCandidates(const FileName &path) const; + FileNameList readFileCandidates(const FileName &path) const; RestoreData bestReadFileData(const FileNameList &candidates, QWidget *parent) const; void backupFile(const FileName &path, const QVariantMap &data, QWidget *parent) const; @@ -224,7 +224,7 @@ public: virtual QVariantMap upgrade(const QVariantMap &data) = 0; protected: - typedef QPair<QLatin1String,QLatin1String> Change; + using Change = QPair<QLatin1String,QLatin1String>; QVariantMap renameKeys(const QList<Change> &changes, QVariantMap map) const; private: @@ -251,7 +251,7 @@ public: bool isValidVersionAndId(const int version, const QByteArray &id) const; VersionUpgrader *upgrader(const int version) const; - RestoreData readData(const Utils::FileName &path, QWidget *parent) const override; + RestoreData readData(const FileName &path, QWidget *parent) const override; protected: QVariantMap prepareToWriteSettings(const QVariantMap &data) const override; @@ -284,7 +284,7 @@ public: const QString &docType, const QString &displayName, const QString &applicationDisplayName); - RestoreData readData(const Utils::FileName &path, QWidget *parent) const final; + RestoreData readData(const FileName &path, QWidget *parent) const final; void setSecondaryAccessor(std::unique_ptr<SettingsAccessor> &&secondary); diff --git a/src/libs/utils/settingsselector.cpp b/src/libs/utils/settingsselector.cpp index 1af35d92ab..ddfa7a137c 100644 --- a/src/libs/utils/settingsselector.cpp +++ b/src/libs/utils/settingsselector.cpp @@ -41,7 +41,7 @@ namespace Utils { SettingsSelector::SettingsSelector(QWidget *parent) : QWidget(parent) { - QHBoxLayout *layout = new QHBoxLayout(this); + auto layout = new QHBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(6); @@ -77,8 +77,7 @@ SettingsSelector::SettingsSelector(QWidget *parent) : this, &SettingsSelector::currentChanged); } -SettingsSelector::~SettingsSelector() -{ } +SettingsSelector::~SettingsSelector() = default; void SettingsSelector::setConfigurationModel(QAbstractItemModel *model) { diff --git a/src/libs/utils/settingsselector.h b/src/libs/utils/settingsselector.h index 7c5220afad..16d98e40c7 100644 --- a/src/libs/utils/settingsselector.h +++ b/src/libs/utils/settingsselector.h @@ -46,8 +46,8 @@ class QTCREATOR_UTILS_EXPORT SettingsSelector : public QWidget Q_OBJECT public: - explicit SettingsSelector(QWidget *parent = 0); - ~SettingsSelector(); + explicit SettingsSelector(QWidget *parent = nullptr); + ~SettingsSelector() override; void setConfigurationModel(QAbstractItemModel *model); QAbstractItemModel *configurationModel() const; diff --git a/src/libs/utils/shellcommand.cpp b/src/libs/utils/shellcommand.cpp index 05c515eabf..92d97dc65b 100644 --- a/src/libs/utils/shellcommand.cpp +++ b/src/libs/utils/shellcommand.cpp @@ -68,11 +68,11 @@ class ShellCommandPrivate { public: struct Job { - explicit Job(const QString &wd, const Utils::FileName &b, const QStringList &a, int t, + explicit Job(const QString &wd, const FileName &b, const QStringList &a, int t, const ExitCodeInterpreter &interpreter); QString workingDirectory; - Utils::FileName binary; + FileName binary; QStringList arguments; ExitCodeInterpreter exitCodeInterpreter; int timeoutS; @@ -113,7 +113,7 @@ ShellCommandPrivate::~ShellCommandPrivate() delete m_progressParser; } -ShellCommandPrivate::Job::Job(const QString &wd, const Utils::FileName &b, const QStringList &a, +ShellCommandPrivate::Job::Job(const QString &wd, const FileName &b, const QStringList &a, int t, const ExitCodeInterpreter &interpreter) : workingDirectory(wd), binary(b), @@ -195,13 +195,13 @@ void ShellCommand::addFlags(unsigned f) d->m_flags |= f; } -void ShellCommand::addJob(const Utils::FileName &binary, const QStringList &arguments, +void ShellCommand::addJob(const FileName &binary, const QStringList &arguments, const QString &workingDirectory, const ExitCodeInterpreter &interpreter) { addJob(binary, arguments, defaultTimeoutS(), workingDirectory, interpreter); } -void ShellCommand::addJob(const Utils::FileName &binary, const QStringList &arguments, int timeoutS, +void ShellCommand::addJob(const FileName &binary, const QStringList &arguments, int timeoutS, const QString &workingDirectory, const ExitCodeInterpreter &interpreter) { d->m_jobs.push_back(Internal::ShellCommandPrivate::Job(workDirectory(workingDirectory), binary, @@ -286,13 +286,13 @@ void ShellCommand::run(QFutureInterface<void> &future) d->m_lastExecSuccess = true; for (int j = 0; j < count; j++) { const Internal::ShellCommandPrivate::Job &job = d->m_jobs.at(j); - Utils::SynchronousProcessResponse resp + SynchronousProcessResponse resp = runCommand(job.binary, job.arguments, job.timeoutS, job.workingDirectory, job.exitCodeInterpreter); stdOut += resp.stdOut(); stdErr += resp.stdErr(); d->m_lastExecExitCode = resp.exitCode; - d->m_lastExecSuccess = resp.result == Utils::SynchronousProcessResponse::Finished; + d->m_lastExecSuccess = resp.result == SynchronousProcessResponse::Finished; if (!d->m_lastExecSuccess) break; } @@ -314,22 +314,22 @@ void ShellCommand::run(QFutureInterface<void> &future) } if (d->m_progressParser) - d->m_progressParser->setFuture(0); + d->m_progressParser->setFuture(nullptr); // As it is used asynchronously, we need to delete ourselves this->deleteLater(); } -Utils::SynchronousProcessResponse ShellCommand::runCommand(const Utils::FileName &binary, - const QStringList &arguments, int timeoutS, - const QString &workingDirectory, - const ExitCodeInterpreter &interpreter) +SynchronousProcessResponse ShellCommand::runCommand(const FileName &binary, + const QStringList &arguments, int timeoutS, + const QString &workingDirectory, + const ExitCodeInterpreter &interpreter) { - Utils::SynchronousProcessResponse response; + SynchronousProcessResponse response; const QString dir = workDirectory(workingDirectory); if (binary.isEmpty()) { - response.result = Utils::SynchronousProcessResponse::StartFailed; + response.result = SynchronousProcessResponse::StartFailed; return response; } @@ -345,7 +345,7 @@ Utils::SynchronousProcessResponse ShellCommand::runCommand(const Utils::FileName if (!d->m_aborted) { // Success/Fail message in appropriate window? - if (response.result == Utils::SynchronousProcessResponse::Finished) { + if (response.result == SynchronousProcessResponse::Finished) { if (d->m_flags & ShowSuccessMessage) proxy->appendMessage(response.exitMessage(binary.toUserOutput(), timeoutS)); } else if (!(d->m_flags & SuppressFailMessage)) { @@ -356,15 +356,15 @@ Utils::SynchronousProcessResponse ShellCommand::runCommand(const Utils::FileName return response; } -Utils::SynchronousProcessResponse ShellCommand::runFullySynchronous(const Utils::FileName &binary, - const QStringList &arguments, - QSharedPointer<OutputProxy> proxy, - int timeoutS, - const QString &workingDirectory, - const ExitCodeInterpreter &interpreter) +SynchronousProcessResponse ShellCommand::runFullySynchronous(const FileName &binary, + const QStringList &arguments, + QSharedPointer<OutputProxy> proxy, + int timeoutS, + const QString &workingDirectory, + const ExitCodeInterpreter &interpreter) { // Set up process - Utils::SynchronousProcess process; + SynchronousProcess process; process.setFlags(processFlags()); const QString dir = workDirectory(workingDirectory); if (!dir.isEmpty()) @@ -403,9 +403,9 @@ SynchronousProcessResponse ShellCommand::runSynchronous(const FileName &binary, const QString &workingDirectory, const ExitCodeInterpreter &interpreter) { - Utils::SynchronousProcess process; + SynchronousProcess process; process.setExitCodeInterpreter(interpreter); - connect(this, &ShellCommand::terminate, &process, &Utils::SynchronousProcess::terminate); + connect(this, &ShellCommand::terminate, &process, &SynchronousProcess::terminate); process.setProcessEnvironment(processEnvironment()); process.setTimeoutS(timeoutS); if (d->m_codec) @@ -421,7 +421,7 @@ SynchronousProcessResponse ShellCommand::runSynchronous(const FileName &binary, } else if (d->m_progressiveOutput || !(d->m_flags & SuppressStdErr)) { process.setStdErrBufferedSignalsEnabled(true); - connect(&process, &Utils::SynchronousProcess::stdErrBuffered, + connect(&process, &SynchronousProcess::stdErrBuffered, this, [this, proxy](const QString &text) { if (d->m_progressParser) @@ -436,7 +436,7 @@ SynchronousProcessResponse ShellCommand::runSynchronous(const FileName &binary, // connect stdout to the output window if desired if (d->m_progressParser || d->m_progressiveOutput || (d->m_flags & ShowStdOut)) { process.setStdOutBufferedSignalsEnabled(true); - connect(&process, &Utils::SynchronousProcess::stdOutBuffered, + connect(&process, &SynchronousProcess::stdOutBuffered, this, [this, proxy](const QString &text) { if (d->m_progressParser) @@ -503,7 +503,6 @@ void ShellCommand::setOutputProxyFactory(const std::function<OutputProxy *()> &f } ProgressParser::ProgressParser() : - m_future(0), m_futureMutex(new QMutex) { } diff --git a/src/libs/utils/shellcommand.h b/src/libs/utils/shellcommand.h index eb3161e3a1..c1bdb5a785 100644 --- a/src/libs/utils/shellcommand.h +++ b/src/libs/utils/shellcommand.h @@ -63,7 +63,7 @@ private: void setFuture(QFutureInterface<void> *future); QFutureInterface<void> *m_future; - QMutex *m_futureMutex; + QMutex *m_futureMutex = nullptr; friend class ShellCommand; }; diff --git a/src/libs/utils/shellcommandpage.cpp b/src/libs/utils/shellcommandpage.cpp index 6f4690ef65..423fe64623 100644 --- a/src/libs/utils/shellcommandpage.cpp +++ b/src/libs/utils/shellcommandpage.cpp @@ -53,7 +53,7 @@ ShellCommandPage::ShellCommandPage(QWidget *parent) : resize(264, 200); auto verticalLayout = new QVBoxLayout(this); m_logPlainTextEdit = new QPlainTextEdit; - m_formatter = new Utils::OutputFormatter; + m_formatter = new OutputFormatter; m_logPlainTextEdit->setReadOnly(true); m_formatter->setPlainTextEdit(m_logPlainTextEdit); @@ -86,10 +86,10 @@ void ShellCommandPage::start(ShellCommand *command) m_command = command; command->setProgressiveOutput(true); connect(command, &ShellCommand::stdOutText, this, [this](const QString &text) { - m_formatter->appendMessage(text, Utils::StdOutFormat); + m_formatter->appendMessage(text, StdOutFormat); }); connect(command, &ShellCommand::stdErrText, this, [this](const QString &text) { - m_formatter->appendMessage(text, Utils::StdErrFormat); + m_formatter->appendMessage(text, StdErrFormat); }); connect(command, &ShellCommand::finished, this, &ShellCommandPage::slotFinished); QApplication::setOverrideCursor(Qt::WaitCursor); diff --git a/src/libs/utils/sizedarray.h b/src/libs/utils/sizedarray.h index 4e85c93ca0..2aecaf21b7 100644 --- a/src/libs/utils/sizedarray.h +++ b/src/libs/utils/sizedarray.h @@ -54,7 +54,7 @@ public: using std::array<T, MaxSize>::rend; using std::array<T, MaxSize>::crend; - constexpr SizedArray() = default; + constexpr SizedArray() : std::array<T, MaxSize>() {} SizedArray(std::initializer_list<T> list) : m_size(std::uint8_t(list.size())) { diff --git a/src/libs/utils/smallstring.h b/src/libs/utils/smallstring.h index 59fc3d6699..dce302594b 100644 --- a/src/libs/utils/smallstring.h +++ b/src/libs/utils/smallstring.h @@ -146,7 +146,7 @@ public: { } - BasicSmallString(std::initializer_list<Utils::SmallStringView> list) + BasicSmallString(std::initializer_list<SmallStringView> list) : m_data(Internal::StringDataLayout<Size>()) { appendInitializerList(list, 0); @@ -695,7 +695,7 @@ private: void appendInitializerList(std::initializer_list<SmallStringView> list, std::size_t initialSize) { - auto addSize = [] (std::size_t size, Utils::SmallStringView string) { + auto addSize = [] (std::size_t size, SmallStringView string) { return size + string.size(); }; @@ -706,7 +706,7 @@ private: char *currentData = data() + initialSize; - for (Utils::SmallStringView string : list) { + for (SmallStringView string : list) { std::memcpy(currentData, string.data(), string.size()); currentData += string.size(); } diff --git a/src/libs/utils/statuslabel.cpp b/src/libs/utils/statuslabel.cpp index 70205172ce..ff4a63843d 100644 --- a/src/libs/utils/statuslabel.cpp +++ b/src/libs/utils/statuslabel.cpp @@ -35,7 +35,7 @@ namespace Utils { -StatusLabel::StatusLabel(QWidget *parent) : QLabel(parent), m_timer(0) +StatusLabel::StatusLabel(QWidget *parent) : QLabel(parent) { // A manual size let's us shrink below minimum text width which is what // we want in [fake] status bars. diff --git a/src/libs/utils/statuslabel.h b/src/libs/utils/statuslabel.h index 470040d572..054330b085 100644 --- a/src/libs/utils/statuslabel.h +++ b/src/libs/utils/statuslabel.h @@ -47,7 +47,7 @@ private: void slotTimeout(); void stopTimer(); - QTimer *m_timer; + QTimer *m_timer = nullptr; QString m_lastPermanentStatusMessage; }; diff --git a/src/libs/utils/stylehelper.cpp b/src/libs/utils/stylehelper.cpp index 468bccc348..628e062b3e 100644 --- a/src/libs/utils/stylehelper.cpp +++ b/src/libs/utils/stylehelper.cpp @@ -376,7 +376,7 @@ QPixmap StyleHelper::disabledSideBarIcon(const QPixmap &enabledicon) { QImage im = enabledicon.toImage().convertToFormat(QImage::Format_ARGB32); for (int y=0; y<im.height(); ++y) { - QRgb *scanLine = reinterpret_cast<QRgb*>(im.scanLine(y)); + auto scanLine = reinterpret_cast<QRgb*>(im.scanLine(y)); for (int x=0; x<im.width(); ++x) { QRgb pixel = *scanLine; char intensity = char(qGray(pixel)); diff --git a/src/libs/utils/synchronousprocess.cpp b/src/libs/utils/synchronousprocess.cpp index 732a8e2a30..0f8d4ea825 100644 --- a/src/libs/utils/synchronousprocess.cpp +++ b/src/libs/utils/synchronousprocess.cpp @@ -84,7 +84,7 @@ namespace Utils { // A special QProcess derivative allowing for terminal control. class TerminalControllingProcess : public QProcess { public: - TerminalControllingProcess() : m_flags(0) {} + TerminalControllingProcess() = default; unsigned flags() const { return m_flags; } void setFlags(unsigned tc) { m_flags = tc; } @@ -93,7 +93,7 @@ protected: void setupChildProcess() override; private: - unsigned m_flags; + unsigned m_flags = 0; }; void TerminalControllingProcess::setupChildProcess() @@ -317,8 +317,8 @@ SynchronousProcess::SynchronousProcess() : SynchronousProcess::~SynchronousProcess() { - disconnect(&d->m_timer, 0, this, 0); - disconnect(&d->m_process, 0, this, 0); + disconnect(&d->m_timer, nullptr, this, nullptr); + disconnect(&d->m_process, nullptr, this, nullptr); delete d; } @@ -488,7 +488,8 @@ SynchronousProcessResponse SynchronousProcess::runBlocking(const QString &binary // event loop in that case. d->m_binary = binary; d->m_process.start(binary, args, QIODevice::ReadOnly); - if (!d->m_process.waitForStarted(d->m_maxHangTimerCount * 1000)) { + if (!d->m_process.waitForStarted(d->m_maxHangTimerCount * 1000) + && d->m_process.state() == QProcess::NotRunning) { d->m_result.result = SynchronousProcessResponse::StartFailed; return d->m_result; } @@ -539,10 +540,10 @@ static inline bool askToKill(const QString &binary = QString()) msg += QLatin1Char(' '); msg += SynchronousProcess::tr("Would you like to terminate it?"); // Restore the cursor that is set to wait while running. - const bool hasOverrideCursor = QApplication::overrideCursor() != 0; + const bool hasOverrideCursor = QApplication::overrideCursor() != nullptr; if (hasOverrideCursor) QApplication::restoreOverrideCursor(); - QMessageBox::StandardButton answer = QMessageBox::question(0, title, msg, QMessageBox::Yes|QMessageBox::No); + QMessageBox::StandardButton answer = QMessageBox::question(nullptr, title, msg, QMessageBox::Yes|QMessageBox::No); if (hasOverrideCursor) QApplication::setOverrideCursor(Qt::WaitCursor); return answer == QMessageBox::Yes; @@ -615,7 +616,7 @@ void SynchronousProcess::processStdErr(bool emitSignals) QSharedPointer<QProcess> SynchronousProcess::createProcess(unsigned flags) { - TerminalControllingProcess *process = new TerminalControllingProcess; + auto process = new TerminalControllingProcess; process->setFlags(flags); return QSharedPointer<QProcess>(process); } diff --git a/src/libs/utils/textfileformat.cpp b/src/libs/utils/textfileformat.cpp index 2882286871..afd4e62e83 100644 --- a/src/libs/utils/textfileformat.cpp +++ b/src/libs/utils/textfileformat.cpp @@ -68,10 +68,7 @@ QDebug operator<<(QDebug d, const TextFileFormat &format) as strings or string lists and to write out files. */ -TextFileFormat::TextFileFormat() : - lineTerminationMode(NativeLineTerminator), hasUtf8Bom(false), codec(0) -{ -} +TextFileFormat::TextFileFormat() = default; /*! Detects the format of text data. @@ -83,7 +80,7 @@ TextFileFormat TextFileFormat::detect(const QByteArray &data) if (data.isEmpty()) return result; const int bytesRead = data.size(); - const unsigned char *buf = reinterpret_cast<const unsigned char *>(data.constData()); + const auto buf = reinterpret_cast<const unsigned char *>(data.constData()); // code taken from qtextstream if (bytesRead >= 4 && ((buf[0] == 0xff && buf[1] == 0xfe && buf[2] == 0 && buf[3] == 0) || (buf[0] == 0 && buf[1] == 0 && buf[2] == 0xfe && buf[3] == 0xff))) { @@ -202,7 +199,7 @@ bool TextFileFormat::decode(const QByteArray &data, QStringList *target) const template <class Target> TextFileFormat::ReadResult readTextFile(const QString &fileName, const QTextCodec *defaultCodec, Target *target, TextFileFormat *format, QString *errorString, - QByteArray *decodingErrorSampleIn = 0) + QByteArray *decodingErrorSampleIn = nullptr) { if (decodingErrorSampleIn) decodingErrorSampleIn->clear(); diff --git a/src/libs/utils/textfileformat.h b/src/libs/utils/textfileformat.h index ab432a53d6..9ac452a6e5 100644 --- a/src/libs/utils/textfileformat.h +++ b/src/libs/utils/textfileformat.h @@ -78,9 +78,9 @@ public: static QByteArray decodingErrorSample(const QByteArray &data); - LineTerminationMode lineTerminationMode; - bool hasUtf8Bom; - const QTextCodec *codec; + LineTerminationMode lineTerminationMode = NativeLineTerminator; + bool hasUtf8Bom = false; + const QTextCodec *codec = nullptr; }; } // namespace Utils diff --git a/src/libs/utils/textutils.cpp b/src/libs/utils/textutils.cpp index 0eb16d2dd1..b9fbeae907 100644 --- a/src/libs/utils/textutils.cpp +++ b/src/libs/utils/textutils.cpp @@ -27,7 +27,6 @@ #include <QTextDocument> #include <QTextBlock> -#include <QTextCursor> namespace Utils { namespace Text { @@ -46,9 +45,9 @@ bool convertPosition(const QTextDocument *document, int pos, int *line, int *col } } -Utils::OptionalLineColumn convertPosition(const QTextDocument *document, int pos) +OptionalLineColumn convertPosition(const QTextDocument *document, int pos) { - Utils::OptionalLineColumn optional; + OptionalLineColumn optional; QTextBlock block = document->findBlock(pos); diff --git a/src/libs/utils/textutils.h b/src/libs/utils/textutils.h index 7c87108832..c03e7ce2ce 100644 --- a/src/libs/utils/textutils.h +++ b/src/libs/utils/textutils.h @@ -29,6 +29,7 @@ #include "utils_global.h" #include <QString> +#include <QTextCursor> QT_FORWARD_DECLARE_CLASS(QTextDocument) QT_FORWARD_DECLARE_CLASS(QTextCursor) @@ -41,7 +42,7 @@ QTCREATOR_UTILS_EXPORT bool convertPosition(const QTextDocument *document, int pos, int *line, int *column); QTCREATOR_UTILS_EXPORT -Utils::OptionalLineColumn convertPosition(const QTextDocument *document, int pos); +OptionalLineColumn convertPosition(const QTextDocument *document, int pos); // line and column are 1-based QTCREATOR_UTILS_EXPORT int positionInText(QTextDocument *textDocument, int line, int column); @@ -54,5 +55,42 @@ QTCREATOR_UTILS_EXPORT QTextCursor flippedCursor(const QTextCursor &cursor); QTCREATOR_UTILS_EXPORT QTextCursor wordStartCursor(const QTextCursor &cursor); +template <class CharacterProvider> +void moveToPrevChar(CharacterProvider &provider, QTextCursor &cursor) +{ + cursor.movePosition(QTextCursor::PreviousCharacter); + while (provider.characterAt(cursor.position()).isSpace()) + cursor.movePosition(QTextCursor::PreviousCharacter); +} + +template <class CharacterProvider> +bool matchPreviousWord(CharacterProvider &provider, QTextCursor cursor, QString pattern) +{ + cursor.movePosition(QTextCursor::PreviousWord); + while (provider.characterAt(cursor.position()) == ':') + cursor.movePosition(QTextCursor::PreviousWord, QTextCursor::MoveAnchor, 2); + + int previousWordStart = cursor.position(); + cursor.movePosition(QTextCursor::NextWord); + moveToPrevChar(provider, cursor); + QString toMatch = provider.textAt(previousWordStart, cursor.position() - previousWordStart + 1); + + pattern = pattern.simplified(); + while (!pattern.isEmpty() && pattern.endsWith(toMatch)) { + pattern.chop(toMatch.length()); + if (pattern.endsWith(' ')) + pattern.chop(1); + if (!pattern.isEmpty()) { + cursor.movePosition(QTextCursor::StartOfWord); + cursor.movePosition(QTextCursor::PreviousWord); + previousWordStart = cursor.position(); + cursor.movePosition(QTextCursor::NextWord); + moveToPrevChar(provider, cursor); + toMatch = provider.textAt(previousWordStart, cursor.position() - previousWordStart + 1); + } + } + return pattern.isEmpty(); +} + } // Text } // Utils diff --git a/src/libs/utils/theme/theme.cpp b/src/libs/utils/theme/theme.cpp index e0ea6f2b5a..fc3018fc1d 100644 --- a/src/libs/utils/theme/theme.cpp +++ b/src/libs/utils/theme/theme.cpp @@ -36,7 +36,7 @@ namespace Utils { -static Theme *m_creatorTheme = 0; +static Theme *m_creatorTheme = nullptr; ThemePrivate::ThemePrivate() { diff --git a/src/libs/utils/tooltip/tips.cpp b/src/libs/utils/tooltip/tips.cpp index ec13013812..b0aee273f4 100644 --- a/src/libs/utils/tooltip/tips.cpp +++ b/src/libs/utils/tooltip/tips.cpp @@ -120,11 +120,11 @@ TextTip::TextTip(QWidget *parent) : QTipLabel(parent) setForegroundRole(QPalette::ToolTipText); setBackgroundRole(QPalette::ToolTipBase); ensurePolished(); - setMargin(1 + style()->pixelMetric(QStyle::PM_ToolTipLabelFrameWidth, 0, this)); + setMargin(1 + style()->pixelMetric(QStyle::PM_ToolTipLabelFrameWidth, nullptr, this)); setFrameStyle(QFrame::NoFrame); setAlignment(Qt::AlignLeft); setIndent(1); - setWindowOpacity(style()->styleHint(QStyle::SH_ToolTipLabel_Opacity, 0, this) / 255.0); + setWindowOpacity(style()->styleHint(QStyle::SH_ToolTipLabel_Opacity, nullptr, this) / 255.0); } static bool likelyContainsLink(const QString &s) diff --git a/src/libs/utils/tooltip/tooltip.cpp b/src/libs/utils/tooltip/tooltip.cpp index 857ec071a7..42ce6b5c56 100644 --- a/src/libs/utils/tooltip/tooltip.cpp +++ b/src/libs/utils/tooltip/tooltip.cpp @@ -45,7 +45,7 @@ using namespace Utils; using namespace Internal; -ToolTip::ToolTip() : m_tip(0), m_widget(0) +ToolTip::ToolTip() : m_tip(nullptr), m_widget(nullptr) { connect(&m_showTimer, &QTimer::timeout, this, &ToolTip::hideTipImmediately); connect(&m_hideDelayTimer, &QTimer::timeout, this, &ToolTip::hideTipImmediately); @@ -53,7 +53,7 @@ ToolTip::ToolTip() : m_tip(0), m_widget(0) ToolTip::~ToolTip() { - m_tip = 0; + m_tip = nullptr; } ToolTip *ToolTip::instance() @@ -109,7 +109,7 @@ bool ToolTip::pinToolTip(QWidget *w, QWidget *parent) // Find the parent WidgetTip, tell it to pin/release the // widget and close. for (QWidget *p = w->parentWidget(); p ; p = p->parentWidget()) { - if (WidgetTip *wt = qobject_cast<WidgetTip *>(p)) { + if (auto wt = qobject_cast<WidgetTip *>(p)) { wt->pinToolTipWidget(parent); ToolTip::hide(); return true; @@ -234,7 +234,7 @@ void ToolTip::hideTipImmediately() if (m_tip) { m_tip->close(); m_tip->deleteLater(); - m_tip = 0; + m_tip = nullptr; } m_showTimer.stop(); m_hideDelayTimer.stop(); @@ -246,7 +246,7 @@ void ToolTip::showInternal(const QPoint &pos, const QVariant &content, int typeId, QWidget *w, const QString &helpId, const QRect &rect) { if (acceptShow(content, typeId, pos, w, helpId, rect)) { - QWidget *target = 0; + QWidget *target = nullptr; if (HostOsInfo::isWindowsHost()) target = QApplication::desktop()->screen(Internal::screenNumber(pos, w)); else diff --git a/src/libs/utils/treemodel.cpp b/src/libs/utils/treemodel.cpp index d17174a024..0d587dddbc 100644 --- a/src/libs/utils/treemodel.cpp +++ b/src/libs/utils/treemodel.cpp @@ -605,21 +605,18 @@ namespace Utils { // // TreeItem // -TreeItem::TreeItem() - : m_parent(0), m_model(0) -{ -} +TreeItem::TreeItem() = default; TreeItem::~TreeItem() { - QTC_CHECK(m_parent == 0); - QTC_CHECK(m_model == 0); + QTC_CHECK(m_parent == nullptr); + QTC_CHECK(m_model == nullptr); removeChildren(); } TreeItem *TreeItem::childAt(int pos) const { - QTC_ASSERT(pos >= 0, return 0); + QTC_ASSERT(pos >= 0, return nullptr); return pos < childCount() ? *(begin() + pos) : nullptr; } @@ -837,7 +834,7 @@ void TreeItem::forChildrenAtLevel(int level, const std::function<void(TreeItem * TreeItem *TreeItem::findChildAtLevel(int level, const std::function<bool(TreeItem *)> &pred) const { - QTC_ASSERT(level > 0, return 0); + QTC_ASSERT(level > 0, return nullptr); if (level == 1) { for (TreeItem *item : *this) if (pred(item)) @@ -848,7 +845,7 @@ TreeItem *TreeItem::findChildAtLevel(int level, const std::function<bool(TreeIte return found; } } - return 0; + return nullptr; } TreeItem *TreeItem::findAnyChild(const std::function<bool(TreeItem *)> &pred) const @@ -859,7 +856,7 @@ TreeItem *TreeItem::findAnyChild(const std::function<bool(TreeItem *)> &pred) co if (TreeItem *found = item->findAnyChild(pred)) return found; } - return 0; + return nullptr; } TreeItem *TreeItem::reverseFindAnyChild(const std::function<bool (TreeItem *)> &pred) const @@ -878,8 +875,8 @@ void TreeItem::clear() { while (childCount() != 0) { TreeItem *item = m_children.takeLast(); - item->m_model = 0; - item->m_parent = 0; + item->m_model = nullptr; + item->m_parent = nullptr; delete item; } } @@ -908,7 +905,7 @@ void TreeItem::collapse() void TreeItem::propagateModel(BaseTreeModel *m) { QTC_ASSERT(m, return); - QTC_ASSERT(m_model == 0 || m_model == m, return); + QTC_ASSERT(m_model == nullptr || m_model == m, return); if (m && !m_model) { m_model = m; for (TreeItem *item : *this) @@ -945,9 +942,9 @@ BaseTreeModel::BaseTreeModel(TreeItem *root, QObject *parent) BaseTreeModel::~BaseTreeModel() { QTC_ASSERT(m_root, return); - QTC_ASSERT(m_root->m_parent == 0, return); + QTC_ASSERT(m_root->m_parent == nullptr, return); QTC_ASSERT(m_root->m_model == this, return); - m_root->m_model = 0; + m_root->m_model = nullptr; delete m_root; } @@ -1039,7 +1036,7 @@ bool BaseTreeModel::hasChildren(const QModelIndex &idx) const Qt::ItemFlags BaseTreeModel::flags(const QModelIndex &idx) const { if (!idx.isValid()) - return 0; + return nullptr; TreeItem *item = itemForIndex(idx); return item ? item->flags(idx.column()) : (Qt::ItemIsEnabled|Qt::ItemIsSelectable); @@ -1070,19 +1067,19 @@ TreeItem *BaseTreeModel::rootItem() const void BaseTreeModel::setRootItem(TreeItem *item) { QTC_ASSERT(item, return); - QTC_ASSERT(item->m_model == 0, return); - QTC_ASSERT(item->m_parent == 0, return); + QTC_ASSERT(item->m_model == nullptr, return); + QTC_ASSERT(item->m_parent == nullptr, return); QTC_ASSERT(item != m_root, return); QTC_CHECK(m_root); beginResetModel(); if (m_root) { - QTC_CHECK(m_root->m_parent == 0); + QTC_CHECK(m_root->m_parent == nullptr); QTC_CHECK(m_root->m_model == this); // needs to be done explicitly before setting the model to 0, otherwise it might lead to a // crash inside a view or proxy model, especially if there are selected items m_root->removeChildren(); - m_root->m_model = 0; + m_root->m_model = nullptr; delete m_root; } m_root = item; @@ -1118,8 +1115,8 @@ TreeItem *BaseTreeModel::itemForIndex(const QModelIndex &idx) const { CHECK_INDEX(idx); TreeItem *item = idx.isValid() ? static_cast<TreeItem*>(idx.internalPointer()) : m_root; - QTC_ASSERT(item, return 0); - QTC_ASSERT(item->m_model == static_cast<const BaseTreeModel *>(this), return 0); + QTC_ASSERT(item, return nullptr); + QTC_ASSERT(item->m_model == static_cast<const BaseTreeModel *>(this), return nullptr); return item; } @@ -1132,7 +1129,7 @@ QModelIndex BaseTreeModel::indexForItem(const TreeItem *item) const TreeItem *p = item->parent(); QTC_ASSERT(p, return QModelIndex()); - TreeItem *mitem = const_cast<TreeItem *>(item); + auto mitem = const_cast<TreeItem *>(item); int row = p->indexOf(mitem); return createIndex(row, 0, mitem); } @@ -1166,8 +1163,8 @@ TreeItem *BaseTreeModel::takeItem(TreeItem *item) QModelIndex idx = indexForItem(parent); beginRemoveRows(idx, pos, pos); - item->m_parent = 0; - item->m_model = 0; + item->m_parent = nullptr; + item->m_model = nullptr; parent->m_children.removeAt(pos); endRemoveRows(); return item; diff --git a/src/libs/utils/treemodel.h b/src/libs/utils/treemodel.h index bf20b75c8d..92f501ff4a 100644 --- a/src/libs/utils/treemodel.h +++ b/src/libs/utils/treemodel.h @@ -99,8 +99,8 @@ private: void removeItemAt(int pos); void propagateModel(BaseTreeModel *m); - TreeItem *m_parent; // Not owned. - BaseTreeModel *m_model; // Not owned. + TreeItem *m_parent = nullptr; // Not owned. + BaseTreeModel *m_model = nullptr; // Not owned. QVector<TreeItem *> m_children; // Owned. friend class BaseTreeModel; }; diff --git a/src/libs/utils/treeviewcombobox.cpp b/src/libs/utils/treeviewcombobox.cpp index 6e81d9377b..36a62d3694 100644 --- a/src/libs/utils/treeviewcombobox.cpp +++ b/src/libs/utils/treeviewcombobox.cpp @@ -44,7 +44,7 @@ void TreeViewComboBoxView::adjustWidth(int width) TreeViewComboBox::TreeViewComboBox(QWidget *parent) - : QComboBox(parent), m_skipNextHide(false) + : QComboBox(parent) { m_view = new TreeViewComboBoxView; m_view->setHeaderHidden(true); @@ -135,7 +135,7 @@ void TreeViewComboBox::setCurrentIndex(const QModelIndex &index) bool TreeViewComboBox::eventFilter(QObject *object, QEvent *event) { if (event->type() == QEvent::MouseButtonPress && object == view()->viewport()) { - QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event); + auto* mouseEvent = static_cast<QMouseEvent*>(event); QModelIndex index = view()->indexAt(mouseEvent->pos()); if (!view()->visualRect(index).contains(mouseEvent->pos())) m_skipNextHide = true; diff --git a/src/libs/utils/treeviewcombobox.h b/src/libs/utils/treeviewcombobox.h index 0bdfc73cbb..08ab5d7226 100644 --- a/src/libs/utils/treeviewcombobox.h +++ b/src/libs/utils/treeviewcombobox.h @@ -61,6 +61,6 @@ private: QModelIndex lastIndex(const QModelIndex &index); TreeViewComboBoxView *m_view; - bool m_skipNextHide; + bool m_skipNextHide = false; }; } diff --git a/src/libs/utils/uncommentselection.cpp b/src/libs/utils/uncommentselection.cpp index 852bea627a..6771f3f4ea 100644 --- a/src/libs/utils/uncommentselection.cpp +++ b/src/libs/utils/uncommentselection.cpp @@ -32,14 +32,11 @@ using namespace Utils; CommentDefinition CommentDefinition::CppStyle = CommentDefinition("//", "/*", "*/"); CommentDefinition CommentDefinition::HashStyle = CommentDefinition("#"); -CommentDefinition::CommentDefinition() : - isAfterWhiteSpaces(false) -{} +CommentDefinition::CommentDefinition() = default; CommentDefinition::CommentDefinition(const QString &single, const QString &multiStart, const QString &multiEnd) - : isAfterWhiteSpaces(false), - singleLine(single), + : singleLine(single), multiLineStart(multiStart), multiLineEnd(multiEnd) { diff --git a/src/libs/utils/uncommentselection.h b/src/libs/utils/uncommentselection.h index dbc47bbc64..b61fce48c9 100644 --- a/src/libs/utils/uncommentselection.h +++ b/src/libs/utils/uncommentselection.h @@ -50,7 +50,7 @@ public: bool hasMultiLineStyle() const; public: - bool isAfterWhiteSpaces; + bool isAfterWhiteSpaces = false; QString singleLine; QString multiLineStart; QString multiLineEnd; diff --git a/src/libs/utils/url.cpp b/src/libs/utils/url.cpp index 56b832eb5c..026af262fc 100644 --- a/src/libs/utils/url.cpp +++ b/src/libs/utils/url.cpp @@ -47,7 +47,7 @@ QUrl urlFromLocalSocket() { QUrl serverUrl; serverUrl.setScheme(urlSocketScheme()); - Utils::TemporaryFile file("qtcreator-freesocket"); + TemporaryFile file("qtcreator-freesocket"); if (file.open()) serverUrl.setPath(file.fileName()); return serverUrl; diff --git a/src/libs/utils/utils-lib.pri b/src/libs/utils/utils-lib.pri index 7de656218b..0cd5f68e12 100644 --- a/src/libs/utils/utils-lib.pri +++ b/src/libs/utils/utils-lib.pri @@ -74,7 +74,7 @@ SOURCES += \ $$PWD/crumblepath.cpp \ $$PWD/historycompleter.cpp \ $$PWD/buildablehelperlibrary.cpp \ - $$PWD/annotateditemdelegate.cpp \ + $$PWD/delegates.cpp \ $$PWD/fileinprojectfinder.cpp \ $$PWD/statuslabel.cpp \ $$PWD/outputformatter.cpp \ @@ -184,7 +184,7 @@ HEADERS += \ $$PWD/crumblepath.h \ $$PWD/historycompleter.h \ $$PWD/buildablehelperlibrary.h \ - $$PWD/annotateditemdelegate.h \ + $$PWD/delegates.h \ $$PWD/fileinprojectfinder.h \ $$PWD/statuslabel.h \ $$PWD/outputformatter.h \ diff --git a/src/libs/utils/utils.qbs b/src/libs/utils/utils.qbs index d6f02202e9..c277c21427 100644 --- a/src/libs/utils/utils.qbs +++ b/src/libs/utils/utils.qbs @@ -39,8 +39,6 @@ Project { files: [ "QtConcurrentTools", "algorithm.h", - "annotateditemdelegate.cpp", - "annotateditemdelegate.h", "ansiescapecodehandler.cpp", "ansiescapecodehandler.h", "appmainwindow.cpp", @@ -71,6 +69,8 @@ Project { "crumblepath.cpp", "crumblepath.h", "declarationmacros.h", + "delegates.cpp", + "delegates.h", "detailsbutton.cpp", "detailsbutton.h", "detailswidget.cpp", diff --git a/src/libs/utils/utils.qrc b/src/libs/utils/utils.qrc index 032ca917c0..a19903f09b 100644 --- a/src/libs/utils/utils.qrc +++ b/src/libs/utils/utils.qrc @@ -210,4 +210,46 @@ <file>images/toolbuttonexpandarrow.png</file> <file>images/toolbuttonexpandarrow@2x.png</file> </qresource> + <qresource prefix="/codemodel"> + <file>images/enum.png</file> + <file>images/enum@2x.png</file> + <file>images/enumerator.png</file> + <file>images/enumerator@2x.png</file> + <file>images/keyword.png</file> + <file>images/keyword@2x.png</file> + <file>images/macro.png</file> + <file>images/macro@2x.png</file> + <file>images/signal.png</file> + <file>images/signal@2x.png</file> + <file>images/slot.png</file> + <file>images/slot@2x.png</file> + <file>images/member.png</file> + <file>images/member@2x.png</file> + <file>images/private.png</file> + <file>images/private@2x.png</file> + <file>images/privatebackground.png</file> + <file>images/privatebackground@2x.png</file> + <file>images/property.png</file> + <file>images/property@2x.png</file> + <file>images/propertybackground.png</file> + <file>images/propertybackground@2x.png</file> + <file>images/protected.png</file> + <file>images/protected@2x.png</file> + <file>images/protectedbackground.png</file> + <file>images/protectedbackground@2x.png</file> + <file>images/static.png</file> + <file>images/static@2x.png</file> + <file>images/staticbackground.png</file> + <file>images/staticbackground@2x.png</file> + <file>images/classmemberfunction.png</file> + <file>images/classmemberfunction@2x.png</file> + <file>images/classmembervariable.png</file> + <file>images/classmembervariable@2x.png</file> + <file>images/classparent.png</file> + <file>images/classparent@2x.png</file> + <file>images/classrelation.png</file> + <file>images/classrelation@2x.png</file> + <file>images/classrelationbackground.png</file> + <file>images/classrelationbackground@2x.png</file> + </qresource> </RCC> diff --git a/src/libs/utils/utilsicons.cpp b/src/libs/utils/utilsicons.cpp index 62f8743706..a441ff3e81 100644 --- a/src/libs/utils/utilsicons.cpp +++ b/src/libs/utils/utilsicons.cpp @@ -30,9 +30,9 @@ namespace Icons { const Icon HOME({ - {QLatin1String(":/utils/images/home.png"), Utils::Theme::PanelTextColorDark}}, Icon::Tint); + {QLatin1String(":/utils/images/home.png"), Theme::PanelTextColorDark}}, Icon::Tint); const Icon HOME_TOOLBAR({ - {QLatin1String(":/utils/images/home.png"), Utils::Theme::IconsBaseColor}}); + {QLatin1String(":/utils/images/home.png"), Theme::IconsBaseColor}}); const Icon EDIT_CLEAR({ {QLatin1String(":/utils/images/editclear.png"), Theme::PanelTextColorMid}}, Icon::Tint); const Icon EDIT_CLEAR_TOOLBAR({ @@ -256,4 +256,194 @@ const Icon CODEMODEL_FIXIT({ {":/utils/images/lightbulb.png", Theme::IconsWarningColor}}, Icon::Tint); } // namespace Icons + +QIcon CodeModelIcon::iconForType(CodeModelIcon::Type type) +{ + static const IconMaskAndColor classRelationIcon { + QLatin1String(":/codemodel/images/classrelation.png"), Theme::IconsCodeModelOverlayForegroundColor}; + static const IconMaskAndColor classRelationBackgroundIcon { + QLatin1String(":/codemodel/images/classrelationbackground.png"), Theme::IconsCodeModelOverlayBackgroundColor}; + static const IconMaskAndColor classMemberFunctionIcon { + QLatin1String(":/codemodel/images/classmemberfunction.png"), Theme::IconsCodeModelFunctionColor}; + static const IconMaskAndColor classMemberVariableIcon { + QLatin1String(":/codemodel/images/classmembervariable.png"), Theme::IconsCodeModelVariableColor}; + static const IconMaskAndColor functionIcon { + QLatin1String(":/codemodel/images/member.png"), Theme::IconsCodeModelFunctionColor}; + static const IconMaskAndColor variableIcon { + QLatin1String(":/codemodel/images/member.png"), Theme::IconsCodeModelVariableColor}; + static const IconMaskAndColor signalIcon { + QLatin1String(":/codemodel/images/signal.png"), Theme::IconsCodeModelFunctionColor}; + static const IconMaskAndColor slotIcon { + QLatin1String(":/codemodel/images/slot.png"), Theme::IconsCodeModelFunctionColor}; + static const IconMaskAndColor propertyIcon { + QLatin1String(":/codemodel/images/property.png"), Theme::IconsCodeModelOverlayForegroundColor}; + static const IconMaskAndColor propertyBackgroundIcon { + QLatin1String(":/codemodel/images/propertybackground.png"), Theme::IconsCodeModelOverlayBackgroundColor}; + static const IconMaskAndColor protectedIcon { + QLatin1String(":/codemodel/images/protected.png"), Theme::IconsCodeModelOverlayForegroundColor}; + static const IconMaskAndColor protectedBackgroundIcon { + QLatin1String(":/codemodel/images/protectedbackground.png"), Theme::IconsCodeModelOverlayBackgroundColor}; + static const IconMaskAndColor privateIcon { + QLatin1String(":/codemodel/images/private.png"), Theme::IconsCodeModelOverlayForegroundColor}; + static const IconMaskAndColor privateBackgroundIcon { + QLatin1String(":/codemodel/images/privatebackground.png"), Theme::IconsCodeModelOverlayBackgroundColor}; + static const IconMaskAndColor staticIcon { + QLatin1String(":/codemodel/images/static.png"), Theme::IconsCodeModelOverlayForegroundColor}; + static const IconMaskAndColor staticBackgroundIcon { + QLatin1String(":/codemodel/images/staticbackground.png"), Theme::IconsCodeModelOverlayBackgroundColor}; + + switch (type) { + case Class: { + const static QIcon icon(Icon({ + classRelationBackgroundIcon, classRelationIcon, + {QLatin1String(":/codemodel/images/classparent.png"), Theme::IconsCodeModelClassColor}, + classMemberFunctionIcon, classMemberVariableIcon + }, Icon::Tint).icon()); + return icon; + } + case Struct: { + const static QIcon icon(Icon({ + classRelationBackgroundIcon, classRelationIcon, + {QLatin1String(":/codemodel/images/classparent.png"), Theme::IconsCodeModelStructColor}, + classMemberFunctionIcon, classMemberVariableIcon + }, Icon::Tint).icon()); + return icon; + } + case Enum: { + const static QIcon icon(Icon({ + {QLatin1String(":/codemodel/images/enum.png"), Theme::IconsCodeModelEnumColor} + }, Icon::Tint).icon()); + return icon; + } + case Enumerator: { + const static QIcon icon(Icon({ + {QLatin1String(":/codemodel/images/enumerator.png"), Theme::IconsCodeModelEnumColor} + }, Icon::Tint).icon()); + return icon; + } + case FuncPublic: { + const static QIcon icon(Icon({ + functionIcon}, Icon::Tint).icon()); + return icon; + } + case FuncProtected: { + const static QIcon icon(Icon({ + functionIcon, protectedBackgroundIcon, protectedIcon + }, Icon::Tint).icon()); + return icon; + } + case FuncPrivate: { + const static QIcon icon(Icon({ + functionIcon, privateBackgroundIcon, privateIcon + }, Icon::Tint).icon()); + return icon; + } + case FuncPublicStatic: { + const static QIcon icon(Icon({ + functionIcon, staticBackgroundIcon, staticIcon + }, Icon::Tint).icon()); + return icon; + } + case FuncProtectedStatic: { + const static QIcon icon(Icon({ + functionIcon, staticBackgroundIcon, staticIcon, protectedBackgroundIcon, protectedIcon + }, Icon::Tint).icon()); + return icon; + } + case FuncPrivateStatic: { + const static QIcon icon(Icon({ + functionIcon, staticBackgroundIcon, staticIcon, privateBackgroundIcon, privateIcon + }, Icon::Tint).icon()); + return icon; + } + case Namespace: { + const static QIcon icon(Icon({ + {QLatin1String(":/utils/images/namespace.png"), Theme::IconsCodeModelKeywordColor} + }, Icon::Tint).icon()); + return icon; + } + case VarPublic: { + const static QIcon icon(Icon({ + variableIcon + }, Icon::Tint).icon()); + return icon; + } + case VarProtected: { + const static QIcon icon(Icon({ + variableIcon, protectedBackgroundIcon, protectedIcon + }, Icon::Tint).icon()); + return icon; + } + case VarPrivate: { + const static QIcon icon(Icon({ + variableIcon, privateBackgroundIcon, privateIcon + }, Icon::Tint).icon()); + return icon; + } + case VarPublicStatic: { + const static QIcon icon(Icon({ + variableIcon, staticBackgroundIcon, staticIcon + }, Icon::Tint).icon()); + return icon; + } + case VarProtectedStatic: { + const static QIcon icon(Icon({ + variableIcon, staticBackgroundIcon, staticIcon, protectedBackgroundIcon, protectedIcon + }, Icon::Tint).icon()); + return icon; + } + case VarPrivateStatic: { + const static QIcon icon(Icon({ + variableIcon, staticBackgroundIcon, staticIcon, privateBackgroundIcon, privateIcon + }, Icon::Tint).icon()); + return icon; + } + case Signal: { + const static QIcon icon(Icon({ + signalIcon + }, Icon::Tint).icon()); + return icon; + } + case SlotPublic: { + const static QIcon icon(Icon({ + slotIcon + }, Icon::Tint).icon()); + return icon; + } + case SlotProtected: { + const static QIcon icon(Icon({ + slotIcon, protectedBackgroundIcon, protectedIcon + }, Icon::Tint).icon()); + return icon; + } + case SlotPrivate: { + const static QIcon icon(Icon({ + slotIcon, privateBackgroundIcon, privateIcon + }, Icon::Tint).icon()); + return icon; + } + case Keyword: { + const static QIcon icon(Icon({ + {QLatin1String(":/codemodel/images/keyword.png"), Theme::IconsCodeModelKeywordColor} + }, Icon::Tint).icon()); + return icon; + } + case Macro: { + const static QIcon icon(Icon({ + {QLatin1String(":/codemodel/images/macro.png"), Theme::IconsCodeModelMacroColor} + }, Icon::Tint).icon()); + return icon; + } + case Property: { + const static QIcon icon(Icon({ + variableIcon, propertyBackgroundIcon, propertyIcon + }, Icon::Tint).icon()); + return icon; + } + default: + break; + } + return QIcon(); +} + } // namespace Utils diff --git a/src/libs/utils/utilsicons.h b/src/libs/utils/utilsicons.h index acdc27ed9b..b5cf0801ef 100644 --- a/src/libs/utils/utilsicons.h +++ b/src/libs/utils/utilsicons.h @@ -145,4 +145,38 @@ QTCREATOR_UTILS_EXPORT extern const Icon CODEMODEL_DISABLED_WARNING; QTCREATOR_UTILS_EXPORT extern const Icon CODEMODEL_FIXIT; } // namespace Icons + +namespace CodeModelIcon { + +enum Type { + Class = 0, + Struct, + Enum, + Enumerator, + FuncPublic, + FuncProtected, + FuncPrivate, + FuncPublicStatic, + FuncProtectedStatic, + FuncPrivateStatic, + Namespace, + VarPublic, + VarProtected, + VarPrivate, + VarPublicStatic, + VarProtectedStatic, + VarPrivateStatic, + Signal, + SlotPublic, + SlotProtected, + SlotPrivate, + Keyword, + Macro, + Property, + Unknown +}; + +QTCREATOR_UTILS_EXPORT QIcon iconForType(Type type); + +} // namespace CodeModel } // namespace Utils diff --git a/src/libs/utils/winutils.cpp b/src/libs/utils/winutils.cpp index f9d04a5d77..5190e11fca 100644 --- a/src/libs/utils/winutils.cpp +++ b/src/libs/utils/winutils.cpp @@ -80,9 +80,9 @@ QTCREATOR_UTILS_EXPORT QString winGetDLLVersion(WinDLLVersionType t, { #ifdef Q_OS_WIN // Resolve required symbols from the version.dll - typedef DWORD (APIENTRY *GetFileVersionInfoSizeProtoType)(LPCTSTR, LPDWORD); - typedef BOOL (APIENTRY *GetFileVersionInfoWProtoType)(LPCWSTR, DWORD, DWORD, LPVOID); - typedef BOOL (APIENTRY *VerQueryValueWProtoType)(const LPVOID, LPWSTR lpSubBlock, LPVOID, PUINT); + using GetFileVersionInfoSizeProtoType = DWORD (APIENTRY*)(LPCTSTR, LPDWORD); + using GetFileVersionInfoWProtoType = BOOL (APIENTRY*)(LPCWSTR, DWORD, DWORD, LPVOID); + using VerQueryValueWProtoType = BOOL (APIENTRY*)(const LPVOID, LPWSTR lpSubBlock, LPVOID, PUINT); const char *versionDLLC = "version.dll"; QLibrary versionLib(QLatin1String(versionDLLC), 0); @@ -91,9 +91,9 @@ QTCREATOR_UTILS_EXPORT QString winGetDLLVersion(WinDLLVersionType t, return QString(); } // MinGW requires old-style casts - GetFileVersionInfoSizeProtoType getFileVersionInfoSizeW = (GetFileVersionInfoSizeProtoType)(versionLib.resolve("GetFileVersionInfoSizeW")); - GetFileVersionInfoWProtoType getFileVersionInfoW = (GetFileVersionInfoWProtoType)(versionLib.resolve("GetFileVersionInfoW")); - VerQueryValueWProtoType verQueryValueW = (VerQueryValueWProtoType)(versionLib.resolve("VerQueryValueW")); + auto getFileVersionInfoSizeW = (GetFileVersionInfoSizeProtoType)(versionLib.resolve("GetFileVersionInfoSizeW")); + auto getFileVersionInfoW = (GetFileVersionInfoWProtoType)(versionLib.resolve("GetFileVersionInfoW")); + auto verQueryValueW = (VerQueryValueWProtoType)(versionLib.resolve("VerQueryValueW")); if (!getFileVersionInfoSizeW || !getFileVersionInfoW || !verQueryValueW) { *errorMessage = msgCannotResolve(versionDLLC); return QString(); @@ -101,7 +101,7 @@ QTCREATOR_UTILS_EXPORT QString winGetDLLVersion(WinDLLVersionType t, // Now go ahead, read version info resource DWORD dummy = 0; - const LPCTSTR fileName = reinterpret_cast<LPCTSTR>(name.utf16()); // MinGWsy + const auto fileName = reinterpret_cast<LPCTSTR>(name.utf16()); // MinGWsy const DWORD infoSize = (*getFileVersionInfoSizeW)(fileName, &dummy); if (infoSize == 0) { *errorMessage = QString::fromLatin1("Unable to determine the size of the version information of %1: %2").arg(name, winErrorMessage(GetLastError())); diff --git a/src/libs/utils/wizard.cpp b/src/libs/utils/wizard.cpp index d00d0345d6..a1c0e2fb68 100644 --- a/src/libs/utils/wizard.cpp +++ b/src/libs/utils/wizard.cpp @@ -57,7 +57,7 @@ class ProgressItemWidget : public QWidget { Q_OBJECT public: - ProgressItemWidget(const QPixmap &indicatorPixmap, const QString &title, QWidget *parent = 0) + ProgressItemWidget(const QPixmap &indicatorPixmap, const QString &title, QWidget *parent = nullptr) : QWidget(parent), m_indicatorVisible(false), m_indicatorPixmap(indicatorPixmap) @@ -65,7 +65,7 @@ public: m_indicatorLabel = new QLabel(this); m_indicatorLabel->setFixedSize(m_indicatorPixmap.size()); m_titleLabel = new QLabel(title, this); - QHBoxLayout *l = new QHBoxLayout(this); + auto l = new QHBoxLayout(this); l->setMargin(0); l->addWidget(m_indicatorLabel); l->addWidget(m_titleLabel); @@ -97,7 +97,7 @@ class LinearProgressWidget : public QWidget { Q_OBJECT public: - LinearProgressWidget(WizardProgress *progress, QWidget *parent = 0); + LinearProgressWidget(WizardProgress *progress, QWidget *parent = nullptr); private: void slotItemAdded(WizardProgressItem *item); @@ -126,14 +126,14 @@ private: LinearProgressWidget::LinearProgressWidget(WizardProgress *progress, QWidget *parent) : QWidget(parent), - m_dotsItemWidget(0), + m_dotsItemWidget(nullptr), m_disableUpdatesCount(0) { m_indicatorPixmap = QIcon::fromTheme(QLatin1String("go-next"), QIcon(QLatin1String(":/utils/images/arrow.png"))).pixmap(16); m_wizardProgress = progress; m_mainLayout = new QVBoxLayout(this); m_itemWidgetLayout = new QVBoxLayout(); - QSpacerItem *spacer = new QSpacerItem(0, 0, QSizePolicy::Ignored, QSizePolicy::Expanding); + auto spacer = new QSpacerItem(0, 0, QSizePolicy::Ignored, QSizePolicy::Expanding); m_mainLayout->addLayout(m_itemWidgetLayout); m_mainLayout->addSpacerItem(spacer); @@ -477,7 +477,7 @@ void Wizard::_q_pageAdded(int pageId) Q_D(Wizard); QWizardPage *p = page(pageId); - WizardPage *wp = qobject_cast<WizardPage *>(p); + auto wp = qobject_cast<WizardPage *>(p); if (wp) wp->pageWasAdded(); @@ -501,8 +501,8 @@ void Wizard::_q_pageAdded(int pageId) if (index < pages.count() - 1) nextId = pages.at(index + 1); - WizardProgressItem *prevItem = 0; - WizardProgressItem *nextItem = 0; + WizardProgressItem *prevItem = nullptr; + WizardProgressItem *nextItem = nullptr; if (prevId >= 0) prevItem = d->m_wizardProgress->item(prevId); @@ -538,8 +538,8 @@ void Wizard::_q_pageRemoved(int pageId) if (index < pages.count() - 1) nextId = pages.at(index + 1); - WizardProgressItem *prevItem = 0; - WizardProgressItem *nextItem = 0; + WizardProgressItem *prevItem = nullptr; + WizardProgressItem *nextItem = nullptr; if (prevId >= 0) prevItem = d->m_wizardProgress->item(prevId); @@ -565,12 +565,7 @@ class WizardProgressPrivate Q_DECLARE_PUBLIC(WizardProgress) public: - WizardProgressPrivate() - : - m_currentItem(0), - m_startItem(0) - { - } + WizardProgressPrivate() = default; bool isNextItem(WizardProgressItem *item, WizardProgressItem *nextItem) const; // if multiple paths are possible the empty list is returned @@ -585,8 +580,8 @@ public: QList<WizardProgressItem *> m_visitedItems; QList<WizardProgressItem *> m_reachableItems; - WizardProgressItem *m_currentItem; - WizardProgressItem *m_startItem; + WizardProgressItem *m_currentItem = nullptr; + WizardProgressItem *m_startItem = nullptr; }; class WizardProgressItemPrivate @@ -673,7 +668,7 @@ QList<WizardProgressItem *> WizardProgressPrivate::singlePathBetween(WizardProgr void WizardProgressPrivate::updateReachableItems() { m_reachableItems = m_visitedItems; - WizardProgressItem *item = 0; + WizardProgressItem *item = nullptr; if (m_visitedItems.count() > 0) item = m_visitedItems.last(); if (!item) { @@ -712,7 +707,7 @@ WizardProgressItem *WizardProgress::addItem(const QString &title) { Q_D(WizardProgress); - WizardProgressItem *item = new WizardProgressItem(this, title); + auto item = new WizardProgressItem(this, title); d->m_itemToItem.insert(item, item); emit itemAdded(item); return item; @@ -835,7 +830,7 @@ void WizardProgress::setCurrentPage(int pageId) Q_D(WizardProgress); if (pageId < 0) { // reset history - d->m_currentItem = 0; + d->m_currentItem = nullptr; d->m_visitedItems.clear(); d->m_reachableItems.clear(); d->updateReachableItems(); @@ -903,7 +898,7 @@ WizardProgressItem::WizardProgressItem(WizardProgress *progress, const QString & d_ptr->m_title = title; d_ptr->m_titleWordWrap = false; d_ptr->m_wizardProgress = progress; - d_ptr->m_nextShownItem = 0; + d_ptr->m_nextShownItem = nullptr; } WizardProgressItem::~WizardProgressItem() @@ -947,7 +942,7 @@ void WizardProgressItem::setNextItems(const QList<WizardProgressItem *> &items) return; if (!items.contains(d->m_nextShownItem)) - setNextShownItem(0); + setNextShownItem(nullptr); // update prev items (remove this item from the old next items) for (int i = 0; i < d->m_nextItems.count(); i++) { diff --git a/src/libs/utils/wizardpage.cpp b/src/libs/utils/wizardpage.cpp index 42cb46ba4d..8afd6d0d34 100644 --- a/src/libs/utils/wizardpage.cpp +++ b/src/libs/utils/wizardpage.cpp @@ -43,7 +43,7 @@ WizardPage::WizardPage(QWidget *parent) : QWizardPage(parent) void WizardPage::pageWasAdded() { - Wizard *wiz = qobject_cast<Wizard *>(wizard()); + auto wiz = qobject_cast<Wizard *>(wizard()); if (!wiz) return; @@ -62,7 +62,7 @@ void WizardPage::registerFieldWithName(const QString &name, QWidget *widget, void WizardPage::registerFieldName(const QString &name) { - Wizard *wiz = qobject_cast<Wizard *>(wizard()); + auto wiz = qobject_cast<Wizard *>(wizard()); if (wiz) wiz->registerFieldName(name); else diff --git a/src/plugins/android/adbcommandswidget.cpp b/src/plugins/android/adbcommandswidget.cpp index a4d1623e0f..287652203b 100644 --- a/src/plugins/android/adbcommandswidget.cpp +++ b/src/plugins/android/adbcommandswidget.cpp @@ -77,9 +77,7 @@ AdbCommandsWidget::AdbCommandsWidget(QWidget *parent) : { } -AdbCommandsWidget::~AdbCommandsWidget() -{ -} +AdbCommandsWidget::~AdbCommandsWidget() = default; QStringList AdbCommandsWidget::commandsList() const { diff --git a/src/plugins/android/adbcommandswidget.h b/src/plugins/android/adbcommandswidget.h index 2334fc76de..6231d4e414 100644 --- a/src/plugins/android/adbcommandswidget.h +++ b/src/plugins/android/adbcommandswidget.h @@ -40,7 +40,7 @@ class AdbCommandsWidget : public QGroupBox Q_OBJECT public: explicit AdbCommandsWidget(QWidget *parent); - ~AdbCommandsWidget(); + ~AdbCommandsWidget() override; QStringList commandsList() const; void setCommandList(const QStringList &commands); diff --git a/src/plugins/android/android.pro b/src/plugins/android/android.pro index e17c7e284b..d6ee2f56fc 100644 --- a/src/plugins/android/android.pro +++ b/src/plugins/android/android.pro @@ -53,7 +53,10 @@ HEADERS += \ androidsdkpackage.h \ androidsdkmodel.h \ androidsdkmanagerwidget.h \ - androidpackageinstallationstep.h + androidpackageinstallationstep.h \ + androidextralibrarylistmodel.h \ + createandroidmanifestwizard.h \ + androidrunenvironmentaspect.h SOURCES += \ androidconfigurations.cpp \ @@ -92,7 +95,6 @@ SOURCES += \ avddialog.cpp \ androidbuildapkstep.cpp \ androidbuildapkwidget.cpp \ - androidqtsupport.cpp \ androidtoolmanager.cpp \ androidsdkmanager.cpp \ androidavdmanager.cpp \ @@ -100,7 +102,10 @@ SOURCES += \ androidsdkpackage.cpp \ androidsdkmodel.cpp \ androidsdkmanagerwidget.cpp \ - androidpackageinstallationstep.cpp + androidpackageinstallationstep.cpp \ + androidextralibrarylistmodel.cpp \ + createandroidmanifestwizard.cpp \ + androidrunenvironmentaspect.cpp FORMS += \ androidsettingswidget.ui \ diff --git a/src/plugins/android/android.qbs b/src/plugins/android/android.qbs index b573d3883b..cc5e62d97b 100644 --- a/src/plugins/android/android.qbs +++ b/src/plugins/android/android.qbs @@ -55,6 +55,8 @@ Project { "androiddevicefactory.h", "androiderrormessage.h", "androiderrormessage.cpp", + "androidextralibrarylistmodel.cpp", + "androidextralibrarylistmodel.h", "androidgdbserverkitinformation.cpp", "androidgdbserverkitinformation.h", "androidglobal.h", @@ -76,7 +78,6 @@ Project { "androidpotentialkit.h", "androidqmltoolingsupport.cpp", "androidqmltoolingsupport.h", - "androidqtsupport.cpp", "androidqtsupport.h", "androidqtversion.cpp", "androidqtversion.h", @@ -84,6 +85,8 @@ Project { "androidqtversionfactory.h", "androidrunconfiguration.cpp", "androidrunconfiguration.h", + "androidrunenvironmentaspect.h", + "androidrunenvironmentaspect.cpp", "androidruncontrol.cpp", "androidruncontrol.h", "androidrunner.cpp", @@ -114,6 +117,8 @@ Project { "avddialog.h", "certificatesmodel.cpp", "certificatesmodel.h", + "createandroidmanifestwizard.h", + "createandroidmanifestwizard.cpp", "javaeditor.cpp", "javaeditor.h", "javaindenter.cpp", diff --git a/src/plugins/android/androidavdmanager.cpp b/src/plugins/android/androidavdmanager.cpp index 44ed85b170..cbe5dba2eb 100644 --- a/src/plugins/android/androidavdmanager.cpp +++ b/src/plugins/android/androidavdmanager.cpp @@ -234,10 +234,7 @@ AndroidAvdManager::AndroidAvdManager(const AndroidConfig &config): } -AndroidAvdManager::~AndroidAvdManager() -{ - -} +AndroidAvdManager::~AndroidAvdManager() = default; void AndroidAvdManager::launchAvdManagerUiTool() const { @@ -296,7 +293,7 @@ bool AndroidAvdManager::startAvdAsync(const QString &avdName) const .arg(m_config.emulatorToolPath().toString())); return false; } - QProcess *avdProcess = new QProcess(); + auto avdProcess = new QProcess(); avdProcess->setReadChannelMode(QProcess::MergedChannels); QObject::connect(avdProcess, static_cast<void (QProcess::*)(int)>(&QProcess::finished), diff --git a/src/plugins/android/androidbuildapkstep.cpp b/src/plugins/android/androidbuildapkstep.cpp index 3ebbcb2dbc..d095a96061 100644 --- a/src/plugins/android/androidbuildapkstep.cpp +++ b/src/plugins/android/androidbuildapkstep.cpp @@ -25,6 +25,7 @@ ****************************************************************************/ #include "androidbuildapkstep.h" + #include "androidbuildapkwidget.h" #include "androidconfigurations.h" #include "androidconstants.h" @@ -40,6 +41,7 @@ #include <projectexplorer/buildconfiguration.h> #include <projectexplorer/project.h> +#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/target.h> #include <qtsupport/qtkitinformation.h> @@ -48,10 +50,13 @@ #include <utils/synchronousprocess.h> #include <utils/utilsicons.h> +#include <qmakeprojectmanager/qmakeprojectmanagerconstants.h> + #include <QDialogButtonBox> #include <QHBoxLayout> #include <QLabel> #include <QLineEdit> +#include <QLoggingCategory> #include <QMessageBox> #include <QProcess> #include <QPushButton> @@ -59,8 +64,16 @@ #include <memory> +using namespace ProjectExplorer; +using namespace Android::Internal; + +namespace { +Q_LOGGING_CATEGORY(buildapkstepLog, "qtc.android.build.androidbuildapkstep") +} + namespace Android { -using namespace Internal; + +const Core::Id ANDROID_BUILD_APK_ID("QmakeProjectManager.AndroidBuildApkStep"); const QVersionNumber gradleScriptRevokedSdkVersion(25, 3, 0); const char KeystoreLocationKey[] = "KeystoreLocation"; @@ -68,6 +81,20 @@ const char BuildTargetSdkKey[] = "BuildTargetSdk"; const char VerboseOutputKey[] = "VerboseOutput"; const char UseMinistroKey[] = "UseMinistro"; +static void setupProcessParameters(ProcessParameters *pp, + BuildConfiguration *bc, + const QStringList &arguments, + const QString &command) +{ + pp->setMacroExpander(bc->macroExpander()); + pp->setWorkingDirectory(bc->buildDirectory().toString()); + Utils::Environment env = bc->environment(); + pp->setEnvironment(env); + pp->setCommand(command); + pp->setArguments(Utils::QtcProcess::joinArgs(arguments)); + pp->resolveAll(); +} + class PasswordInputDialog : public QDialog { Q_OBJECT @@ -95,8 +122,8 @@ private: this); }; -AndroidBuildApkStep::AndroidBuildApkStep(ProjectExplorer::BuildStepList *parent, Core::Id id) - : ProjectExplorer::AbstractProcessStep(parent, id), +AndroidBuildApkStep::AndroidBuildApkStep(BuildStepList *parent) + : AbstractProcessStep(parent, ANDROID_BUILD_APK_ID), m_buildTargetSdk(AndroidConfig::apiLevelNameFor(AndroidConfigurations:: sdkManager()->latestAndroidSdkPlatform())) { @@ -109,9 +136,12 @@ bool AndroidBuildApkStep::init(QList<const BuildStep *> &earlierSteps) ProjectExplorer::BuildConfiguration *bc = buildConfiguration(); if (m_signPackage) { + qCDebug(buildapkstepLog) << "Signing enabled"; // check keystore and certificate passwords - if (!verifyKeystorePassword() || !verifyCertificatePassword()) + if (!verifyKeystorePassword() || !verifyCertificatePassword()) { + qCDebug(buildapkstepLog) << "Init failed. Keystore/Certificate password verification failed."; return false; + } if (bc->buildType() != ProjectExplorer::BuildConfiguration::Release) emit addOutput(tr("Warning: Signing a debug or profile package."), @@ -145,21 +175,91 @@ bool AndroidBuildApkStep::init(QList<const BuildStep *> &earlierSteps) return false; } - JavaParser *parser = new JavaParser; + auto parser = new JavaParser; parser->setProjectFileList(Utils::transform(target()->project()->files(ProjectExplorer::Project::AllFiles), &Utils::FileName::toString)); - parser->setSourceDirectory(AndroidManager::androidQtSupport(target())->packageSourceDir(target())); + AndroidQtSupport *qtSupport = AndroidManager::androidQtSupport(target()); + QFileInfo sourceDirInfo(qtSupport->targetData(Constants::AndroidPackageSourceDir, target()).toString()); + parser->setSourceDirectory(Utils::FileName::fromString(sourceDirInfo.canonicalFilePath())); parser->setBuildDirectory(Utils::FileName::fromString(bc->buildDirectory().appendPath(Constants::ANDROID_BUILDDIRECTORY).toString())); setOutputParser(parser); m_openPackageLocationForRun = m_openPackageLocation; - m_apkPath = AndroidManager::androidQtSupport(target())->apkPath(target()).toString(); + m_apkPath = AndroidManager::apkPath(target()).toString(); + qCDebug(buildapkstepLog) << "APK path:" << m_apkPath; - bool result = AbstractProcessStep::init(earlierSteps); - if (!result) + if (!AbstractProcessStep::init(earlierSteps)) return false; + QString command = version->qmakeProperty("QT_HOST_BINS"); + if (!command.endsWith('/')) + command += '/'; + command += "androiddeployqt"; + if (Utils::HostOsInfo::isWindowsHost()) + command += ".exe"; + + QString outputDir = bc->buildDirectory().appendPath(Constants::ANDROID_BUILDDIRECTORY).toString(); + + QString inputFile = AndroidManager::androidQtSupport(target()) + ->targetData(Constants::AndroidDeploySettingsFile, target()).toString(); + if (inputFile.isEmpty()) { + m_skipBuilding = true; + return true; + } + + QString buildTargetSdk = AndroidManager::buildTargetSDK(target()); + if (buildTargetSdk.isEmpty()) { + emit addOutput(tr("Android build SDK not defined. Check Android settings."), + OutputFormat::Stderr); + return false; + } + + QStringList arguments = {"--input", inputFile, + "--output", outputDir, + "--android-platform", AndroidManager::buildTargetSDK(target()), + "--jdk", AndroidConfigurations::currentConfig().openJDKLocation().toString()}; + + if (m_verbose) + arguments << "--verbose"; + + arguments << "--gradle"; + + if (m_useMinistro) + arguments << "--deployment" << "ministro"; + + QStringList argumentsPasswordConcealed = arguments; + + if (m_signPackage) { + arguments << "--sign" << m_keystorePath.toString() << m_certificateAlias + << "--storepass" << m_keystorePasswd; + argumentsPasswordConcealed << "--sign" << "******" + << "--storepass" << "******"; + if (!m_certificatePasswd.isEmpty()) { + arguments << "--keypass" << m_certificatePasswd; + argumentsPasswordConcealed << "--keypass" << "******"; + } + + } + + // Must be the last option, otherwise androiddeployqt might use the other + // params (e.g. --sign) to choose not to add gdbserver + if (version->qtVersion() >= QtSupport::QtVersionNumber(5, 6, 0)) { + if (m_addDebugger || bc->buildType() == ProjectExplorer::BuildConfiguration::Debug) + arguments << "--gdbserver"; + else + arguments << "--no-gdbserver"; + } + + ProjectExplorer::ProcessParameters *pp = processParameters(); + setupProcessParameters(pp, bc, arguments, command); + + // Generate arguments with keystore password concealed + ProjectExplorer::ProcessParameters pp2; + setupProcessParameters(&pp2, bc, argumentsPasswordConcealed, command); + m_command = pp2.effectiveCommand(); + m_argumentsPasswordConcealed = pp2.prettyArguments(); + return true; } @@ -224,6 +324,24 @@ bool AndroidBuildApkStep::verifyCertificatePassword() return success; } +void AndroidBuildApkStep::run(QFutureInterface<bool> &fi) +{ + if (m_skipBuilding) { + emit addOutput(tr("No application .pro file found, not building an APK."), BuildStep::OutputFormat::ErrorMessage); + reportRunResult(fi, true); + return; + } + AbstractProcessStep::run(fi); +} + +void AndroidBuildApkStep::processStarted() +{ + emit addOutput(tr("Starting: \"%1\" %2") + .arg(QDir::toNativeSeparators(m_command), + m_argumentsPasswordConcealed), + BuildStep::OutputFormat::NormalMessage); +} + bool AndroidBuildApkStep::fromMap(const QVariantMap &map) { m_keystorePath = Utils::FileName::fromString(map.value(KeystoreLocationKey).toString()); @@ -351,7 +469,7 @@ QAbstractItemModel *AndroidBuildApkStep::keystoreCertificates() const Utils::SynchronousProcessResponse response = keytoolProc.run(AndroidConfigurations::currentConfig().keytoolPath().toString(), params); if (response.result > Utils::SynchronousProcessResponse::FinishedError) - QMessageBox::critical(0, tr("Error"), tr("Failed to run keytool.")); + QMessageBox::critical(nullptr, tr("Error"), tr("Failed to run keytool.")); else model = new CertificatesModel(response.stdOut(), this); @@ -426,6 +544,22 @@ QString PasswordInputDialog::getPassword(Context context, std::function<bool (co return isAccepted ? dlg->inputEdit->text() : ""; } + +namespace Internal { + +// AndroidBuildApkStepFactory + +AndroidBuildApkStepFactory::AndroidBuildApkStepFactory() +{ + registerStep<AndroidBuildApkStep>(ANDROID_BUILD_APK_ID); + setSupportedProjectType(QmakeProjectManager::Constants::QMAKEPROJECT_ID); + setSupportedDeviceType(Constants::ANDROID_DEVICE_TYPE); + setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); + setDisplayName(AndroidBuildApkStep::tr("Build Android APK")); + setRepeatable(false); +} + +} // namespace Internal } // namespace Android #include "androidbuildapkstep.moc" diff --git a/src/plugins/android/androidbuildapkstep.h b/src/plugins/android/androidbuildapkstep.h index b7d5e5d179..665c28db4d 100644 --- a/src/plugins/android/androidbuildapkstep.h +++ b/src/plugins/android/androidbuildapkstep.h @@ -27,6 +27,7 @@ #pragma once #include "android_global.h" + #include <projectexplorer/abstractprocessstep.h> QT_BEGIN_NAMESPACE @@ -39,10 +40,9 @@ class ANDROID_EXPORT AndroidBuildApkStep : public ProjectExplorer::AbstractProce { Q_OBJECT -protected: - AndroidBuildApkStep(ProjectExplorer::BuildStepList *bc, Core::Id id); - public: + AndroidBuildApkStep(ProjectExplorer::BuildStepList *bc); + bool fromMap(const QVariantMap &map) override; QVariantMap toMap() const override; @@ -72,17 +72,19 @@ public: QString buildTargetSdk() const; void setBuildTargetSdk(const QString &sdk); -protected: +private: Q_INVOKABLE void showInGraphicalShell(); bool init(QList<const BuildStep *> &earlierSteps) override; ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override; bool immutable() const override { return true; } + void processStarted() override; void processFinished(int exitCode, QProcess::ExitStatus status) override; bool verifyKeystorePassword(); bool verifyCertificatePassword(); -protected: + void run(QFutureInterface<bool> &fi) override; + bool m_signPackage = false; bool m_verbose = false; bool m_useMinistro = false; @@ -96,6 +98,19 @@ protected: QString m_certificateAlias; QString m_certificatePasswd; QString m_apkPath; + + QString m_command; + QString m_argumentsPasswordConcealed; + bool m_skipBuilding = false; +}; + +namespace Internal { + +class AndroidBuildApkStepFactory : public ProjectExplorer::BuildStepFactory +{ +public: + AndroidBuildApkStepFactory(); }; +} // namespace Internal } // namespace Android diff --git a/src/plugins/android/androidbuildapkwidget.cpp b/src/plugins/android/androidbuildapkwidget.cpp index dceb496f5e..d436a38827 100644 --- a/src/plugins/android/androidbuildapkwidget.cpp +++ b/src/plugins/android/androidbuildapkwidget.cpp @@ -30,11 +30,13 @@ #include "androidcreatekeystorecertificate.h" #include "androidmanager.h" #include "androidsdkmanager.h" +#include "createandroidmanifestwizard.h" #include "ui_androidbuildapkwidget.h" #include <projectexplorer/buildconfiguration.h> #include <projectexplorer/project.h> #include <projectexplorer/target.h> + #include <qtsupport/qtkitinformation.h> #include <utils/fancylineedit.h> @@ -42,15 +44,19 @@ #include <utils/utilsicons.h> #include <QFileDialog> +#include <QGroupBox> +#include <QLabel> +#include <QListView> +#include <QPushButton> +#include <QToolButton> +#include <QVBoxLayout> #include <algorithm> -using namespace Android; -using namespace Internal; - -const int minApiSupported = 9; +namespace Android { +namespace Internal { -AndroidBuildApkWidget::AndroidBuildApkWidget(AndroidBuildApkStep *step) +AndroidBuildApkInnerWidget::AndroidBuildApkInnerWidget(AndroidBuildApkStep *step) : ProjectExplorer::BuildStepConfigWidget(), m_ui(new Ui::AndroidBuildApkWidget), m_step(step) @@ -58,6 +64,7 @@ AndroidBuildApkWidget::AndroidBuildApkWidget(AndroidBuildApkStep *step) m_ui->setupUi(this); // Target sdk combobox + const int minApiSupported = AndroidManager::apiLevelRange().first; QStringList targets = AndroidConfig::apiLevelNamesFor(AndroidConfigurations::sdkManager()-> filteredSdkPlatforms(minApiSupported)); targets.removeDuplicates(); @@ -88,60 +95,60 @@ AndroidBuildApkWidget::AndroidBuildApkWidget(AndroidBuildApkStep *step) // target sdk connect(m_ui->targetSDKComboBox, static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::activated), - this, &AndroidBuildApkWidget::setTargetSdk); + this, &AndroidBuildApkInnerWidget::setTargetSdk); // deployment options connect(m_ui->ministroOption, &QAbstractButton::clicked, m_step, &AndroidBuildApkStep::setUseMinistro); connect(m_ui->openPackageLocationCheckBox, &QAbstractButton::toggled, - this, &AndroidBuildApkWidget::openPackageLocationCheckBoxToggled); + this, &AndroidBuildApkInnerWidget::openPackageLocationCheckBoxToggled); connect(m_ui->verboseOutputCheckBox, &QAbstractButton::toggled, - this, &AndroidBuildApkWidget::verboseOutputCheckBoxToggled); + this, &AndroidBuildApkInnerWidget::verboseOutputCheckBoxToggled); connect(m_ui->addDebuggerCheckBox, &QAbstractButton::toggled, m_step, &AndroidBuildApkStep::setAddDebugger); //signing connect(m_ui->signPackageCheckBox, &QAbstractButton::toggled, - this, &AndroidBuildApkWidget::signPackageCheckBoxToggled); + this, &AndroidBuildApkInnerWidget::signPackageCheckBoxToggled); connect(m_ui->KeystoreCreatePushButton, &QAbstractButton::clicked, - this, &AndroidBuildApkWidget::createKeyStore); + this, &AndroidBuildApkInnerWidget::createKeyStore); connect(m_ui->KeystoreLocationPathChooser, &Utils::PathChooser::pathChanged, - this, &AndroidBuildApkWidget::updateKeyStorePath); + this, &AndroidBuildApkInnerWidget::updateKeyStorePath); connect(m_ui->certificatesAliasComboBox, static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::activated), - this, &AndroidBuildApkWidget::certificatesAliasComboBoxActivated); + this, &AndroidBuildApkInnerWidget::certificatesAliasComboBoxActivated); connect(m_ui->certificatesAliasComboBox, static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::currentIndexChanged), - this, &AndroidBuildApkWidget::certificatesAliasComboBoxCurrentIndexChanged); + this, &AndroidBuildApkInnerWidget::certificatesAliasComboBoxCurrentIndexChanged); connect(m_step->buildConfiguration(), &ProjectExplorer::BuildConfiguration::buildTypeChanged, - this, &AndroidBuildApkWidget::updateSigningWarning); + this, &AndroidBuildApkInnerWidget::updateSigningWarning); updateSigningWarning(); } -AndroidBuildApkWidget::~AndroidBuildApkWidget() +AndroidBuildApkInnerWidget::~AndroidBuildApkInnerWidget() { delete m_ui; } -QString AndroidBuildApkWidget::displayName() const +QString AndroidBuildApkInnerWidget::displayName() const { return tr("<b>Build Android APK</b>"); } -QString AndroidBuildApkWidget::summaryText() const +QString AndroidBuildApkInnerWidget::summaryText() const { return displayName(); } -void AndroidBuildApkWidget::setTargetSdk(const QString &sdk) +void AndroidBuildApkInnerWidget::setTargetSdk(const QString &sdk) { m_step->setBuildTargetSdk(sdk); } -void AndroidBuildApkWidget::signPackageCheckBoxToggled(bool checked) +void AndroidBuildApkInnerWidget::signPackageCheckBoxToggled(bool checked) { m_ui->certificatesAliasComboBox->setEnabled(checked); m_step->setSignPackage(checked); @@ -153,7 +160,7 @@ void AndroidBuildApkWidget::signPackageCheckBoxToggled(bool checked) setCertificates(); } -void AndroidBuildApkWidget::createKeyStore() +void AndroidBuildApkInnerWidget::createKeyStore() { AndroidCreateKeystoreCertificate d; if (d.exec() != QDialog::Accepted) @@ -166,7 +173,7 @@ void AndroidBuildApkWidget::createKeyStore() setCertificates(); } -void AndroidBuildApkWidget::setCertificates() +void AndroidBuildApkInnerWidget::setCertificates() { QAbstractItemModel *certificates = m_step->keystoreCertificates(); if (certificates) { @@ -175,7 +182,7 @@ void AndroidBuildApkWidget::setCertificates() } } -void AndroidBuildApkWidget::updateKeyStorePath(const QString &path) +void AndroidBuildApkInnerWidget::updateKeyStorePath(const QString &path) { Utils::FileName file = Utils::FileName::fromString(path); m_step->setKeystorePath(file); @@ -184,29 +191,29 @@ void AndroidBuildApkWidget::updateKeyStorePath(const QString &path) setCertificates(); } -void AndroidBuildApkWidget::certificatesAliasComboBoxActivated(const QString &alias) +void AndroidBuildApkInnerWidget::certificatesAliasComboBoxActivated(const QString &alias) { if (alias.length()) m_step->setCertificateAlias(alias); } -void AndroidBuildApkWidget::certificatesAliasComboBoxCurrentIndexChanged(const QString &alias) +void AndroidBuildApkInnerWidget::certificatesAliasComboBoxCurrentIndexChanged(const QString &alias) { if (alias.length()) m_step->setCertificateAlias(alias); } -void AndroidBuildApkWidget::openPackageLocationCheckBoxToggled(bool checked) +void AndroidBuildApkInnerWidget::openPackageLocationCheckBoxToggled(bool checked) { m_step->setOpenPackageLocation(checked); } -void AndroidBuildApkWidget::verboseOutputCheckBoxToggled(bool checked) +void AndroidBuildApkInnerWidget::verboseOutputCheckBoxToggled(bool checked) { m_step->setVerboseOutput(checked); } -void AndroidBuildApkWidget::updateSigningWarning() +void AndroidBuildApkInnerWidget::updateSigningWarning() { bool nonRelease = m_step->buildConfiguration()->buildType() != ProjectExplorer::BuildConfiguration::Release; @@ -218,3 +225,112 @@ void AndroidBuildApkWidget::updateSigningWarning() m_ui->signingDebugWarningLabel->setVisible(false); } } + + +// AndroidBuildApkWidget + +AndroidBuildApkWidget::AndroidBuildApkWidget(AndroidBuildApkStep *step) : + m_step(step) +{ + m_extraLibraryListModel = new AndroidExtraLibraryListModel(m_step->target(), this); + + auto base = new AndroidBuildApkInnerWidget(step); + base->layout()->setContentsMargins(0, 0, 0, 0); + + auto createTemplatesGroupBox = new QGroupBox(tr("Android")); + createTemplatesGroupBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + + auto createAndroidTemplatesButton = new QPushButton(tr("Create Templates")); + + auto horizontalLayout = new QHBoxLayout(createTemplatesGroupBox); + horizontalLayout->addWidget(createAndroidTemplatesButton); + horizontalLayout->addStretch(1); + + auto additionalLibrariesGroupBox = new QGroupBox(tr("Additional Libraries")); + additionalLibrariesGroupBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); + + m_androidExtraLibsListView = new QListView; + m_androidExtraLibsListView->setSelectionMode(QAbstractItemView::ExtendedSelection); + m_androidExtraLibsListView->setToolTip(tr("List of extra libraries to include in Android package and load on startup.")); + m_androidExtraLibsListView->setModel(m_extraLibraryListModel); + + auto addAndroidExtraLibButton = new QToolButton; + addAndroidExtraLibButton->setText(tr("Add...")); + addAndroidExtraLibButton->setToolTip(tr("Select library to include in package.")); + addAndroidExtraLibButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); + addAndroidExtraLibButton->setToolButtonStyle(Qt::ToolButtonTextOnly); + + m_removeAndroidExtraLibButton = new QToolButton; + m_removeAndroidExtraLibButton->setText(tr("Remove")); + m_removeAndroidExtraLibButton->setToolTip(tr("Remove currently selected library from list.")); + + auto androidExtraLibsButtonLayout = new QVBoxLayout(); + androidExtraLibsButtonLayout->addWidget(addAndroidExtraLibButton); + androidExtraLibsButtonLayout->addWidget(m_removeAndroidExtraLibButton); + androidExtraLibsButtonLayout->addStretch(1); + + auto androidExtraLibsLayout = new QHBoxLayout(additionalLibrariesGroupBox); + androidExtraLibsLayout->addWidget(m_androidExtraLibsListView); + androidExtraLibsLayout->addLayout(androidExtraLibsButtonLayout); + + auto topLayout = new QVBoxLayout(this); + topLayout->addWidget(base); + topLayout->addWidget(createTemplatesGroupBox); + topLayout->addWidget(additionalLibrariesGroupBox); + + connect(createAndroidTemplatesButton, &QAbstractButton::clicked, this, [this] { + CreateAndroidManifestWizard wizard(m_step->target()); + wizard.exec(); + }); + + connect(addAndroidExtraLibButton, &QAbstractButton::clicked, + this, &AndroidBuildApkWidget::addAndroidExtraLib); + + connect(m_removeAndroidExtraLibButton, &QAbstractButton::clicked, + this, &AndroidBuildApkWidget::removeAndroidExtraLib); + + connect(m_androidExtraLibsListView->selectionModel(), &QItemSelectionModel::selectionChanged, + this, &AndroidBuildApkWidget::checkEnableRemoveButton); + + connect(m_extraLibraryListModel, &AndroidExtraLibraryListModel::enabledChanged, + additionalLibrariesGroupBox, &QWidget::setEnabled); + + AndroidQtSupport *qtSupport = AndroidManager::androidQtSupport(m_step->target()); + QTC_ASSERT(qtSupport, return); + additionalLibrariesGroupBox->setEnabled(qtSupport->extraLibraryEnabled(m_step->target())); +} + +void AndroidBuildApkWidget::addAndroidExtraLib() +{ + QStringList fileNames = QFileDialog::getOpenFileNames(this, + tr("Select additional libraries"), + QDir::homePath(), + tr("Libraries (*.so)")); + + if (!fileNames.isEmpty()) + m_extraLibraryListModel->addEntries(fileNames); +} + +void AndroidBuildApkWidget::removeAndroidExtraLib() +{ + QModelIndexList removeList = m_androidExtraLibsListView->selectionModel()->selectedIndexes(); + m_extraLibraryListModel->removeEntries(removeList); +} + +void AndroidBuildApkWidget::checkEnableRemoveButton() +{ + m_removeAndroidExtraLibButton->setEnabled(m_androidExtraLibsListView->selectionModel()->hasSelection()); +} + +QString AndroidBuildApkWidget::summaryText() const +{ + return tr("<b>Build Android APK</b>"); +} + +QString AndroidBuildApkWidget::displayName() const +{ + return summaryText(); +} + +} // Internal +} // Android diff --git a/src/plugins/android/androidbuildapkwidget.h b/src/plugins/android/androidbuildapkwidget.h index dec3806986..47946298d2 100644 --- a/src/plugins/android/androidbuildapkwidget.h +++ b/src/plugins/android/androidbuildapkwidget.h @@ -28,26 +28,29 @@ #include "android_global.h" +#include "androidbuildapkstep.h" +#include "androidextralibrarylistmodel.h" +#include "androidqtsupport.h" + #include <projectexplorer/buildstep.h> -#include <QWidget> +#include <QListView> +#include <QToolButton> QT_BEGIN_NAMESPACE namespace Ui { class AndroidBuildApkWidget; } QT_END_NAMESPACE -namespace QmakeProjectManager { class QmakeBuildConfiguration; } - namespace Android { -class AndroidBuildApkStep; +namespace Internal { -class ANDROID_EXPORT AndroidBuildApkWidget : public ProjectExplorer::BuildStepConfigWidget +class AndroidBuildApkInnerWidget : public ProjectExplorer::BuildStepConfigWidget { Q_OBJECT public: - AndroidBuildApkWidget(AndroidBuildApkStep *step); - ~AndroidBuildApkWidget() override; + AndroidBuildApkInnerWidget(AndroidBuildApkStep *step); + ~AndroidBuildApkInnerWidget() override; private: void setTargetSdk(const QString &sdk); @@ -68,4 +71,32 @@ private: AndroidBuildApkStep *m_step; }; -} +class AndroidBuildApkWidget : public ProjectExplorer::BuildStepConfigWidget +{ + Q_OBJECT + +public: + explicit AndroidBuildApkWidget(AndroidBuildApkStep *step); + +signals: + void requestAndroidTemplates(); + +private: + void addAndroidExtraLib(); + void removeAndroidExtraLib(); + void checkEnableRemoveButton(); + + QString summaryText() const final; + QString displayName() const final; + +private: + QListView *m_androidExtraLibsListView = nullptr; + QToolButton *m_removeAndroidExtraLibButton = nullptr; + + AndroidBuildApkStep *m_step = nullptr; + Android::AndroidExtraLibraryListModel *m_extraLibraryListModel = nullptr; + bool m_ignoreChange = false; +}; + +} // namespace Internal +} // namespace Android diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 555b4622ab..0ceb88240f 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -93,7 +93,6 @@ namespace { const QLatin1String OpenJDKLocationKey("OpenJDKLocation"); const QLatin1String KeystoreLocationKey("KeystoreLocation"); const QLatin1String AutomaticKitCreationKey("AutomatiKitCreation"); - const QLatin1String DeviceQmlsceneCommandKey("DeviceQmlsceneCommand"); const QLatin1String MakeExtraSearchDirectory("MakeExtraSearchDirectory"); const QLatin1String PartitionSizeKey("PartitionSize"); const QLatin1String ToolchainHostKey("ToolchainHost"); @@ -126,8 +125,8 @@ namespace { const QLatin1String sdkToolsVersionKey("Pkg.Revision"); const QLatin1String ndkRevisionKey("Pkg.Revision"); - const QLatin1String defaultQmlScene("org.qtproject.example.qmlscene/" - "org.qtproject.qt5.android.bindings.QtActivity"); + const QString defaultQtLiveApk = Core::ICore::resourcePath() + + ("/qtlive/android/armv7/qt_live_viewer.apk"); static QString sdkSettingsFileName() { @@ -257,7 +256,6 @@ void AndroidConfig::load(const QSettings &settings) m_keystoreLocation = FileName::fromString(settings.value(KeystoreLocationKey).toString()); m_toolchainHost = settings.value(ToolchainHostKey).toString(); m_automaticKitCreation = settings.value(AutomaticKitCreationKey, true).toBool(); - m_deviceQmlsceneCommand = settings.value(DeviceQmlsceneCommandKey, defaultQmlScene).toString(); QString extraDirectory = settings.value(MakeExtraSearchDirectory).toString(); m_makeExtraSearchDirectories.clear(); if (!extraDirectory.isEmpty()) @@ -274,7 +272,6 @@ void AndroidConfig::load(const QSettings &settings) m_keystoreLocation = FileName::fromString(reader.restoreValue(KeystoreLocationKey, m_keystoreLocation.toString()).toString()); m_toolchainHost = reader.restoreValue(ToolchainHostKey, m_toolchainHost).toString(); m_automaticKitCreation = reader.restoreValue(AutomaticKitCreationKey, m_automaticKitCreation).toBool(); - m_deviceQmlsceneCommand = reader.restoreValue(DeviceQmlsceneCommandKey, m_deviceQmlsceneCommand).toString(); QString extraDirectory = reader.restoreValue(MakeExtraSearchDirectory).toString(); m_makeExtraSearchDirectories.clear(); if (!extraDirectory.isEmpty()) @@ -298,7 +295,6 @@ void AndroidConfig::save(QSettings &settings) const settings.setValue(KeystoreLocationKey, m_keystoreLocation.toString()); settings.setValue(PartitionSizeKey, m_partitionSize); settings.setValue(AutomaticKitCreationKey, m_automaticKitCreation); - settings.setValue(DeviceQmlsceneCommandKey, m_deviceQmlsceneCommand); settings.setValue(ToolchainHostKey, m_toolchainHost); settings.setValue(MakeExtraSearchDirectory, m_makeExtraSearchDirectories.isEmpty() ? QString() @@ -316,7 +312,7 @@ void AndroidConfig::updateNdkInformation() const const QString &fileName = it.next(); m_availableNdkPlatforms.push_back(fileName.midRef(fileName.lastIndexOf(QLatin1Char('-')) + 1).toInt()); } - Utils::sort(m_availableNdkPlatforms, std::greater<int>()); + Utils::sort(m_availableNdkPlatforms, std::greater<>()); // detect toolchain host QStringList hostPatterns; @@ -713,13 +709,13 @@ bool AndroidConfig::useNativeUiTools() const QString AndroidConfig::bestNdkPlatformMatch(int target) const { - target = std::max(9, target); + target = std::max(AndroidManager::apiLevelRange().first, target); updateNdkInformation(); foreach (int apiLevel, m_availableNdkPlatforms) { if (apiLevel <= target) return QString::fromLatin1("android-%1").arg(apiLevel); } - return QLatin1String("android-9"); + return QString("android-%1").arg(AndroidManager::apiLevelRange().first); } FileName AndroidConfig::sdkLocation() const @@ -876,14 +872,12 @@ void AndroidConfig::setAutomaticKitCreation(bool b) m_automaticKitCreation = b; } -QString AndroidConfig::deviceQmlsceneCommand() const +FileName AndroidConfig::qtLiveApkPath() const { - return m_deviceQmlsceneCommand; -} - -void AndroidConfig::setDeviceQmlsceneCommand(const QString &qmlsceneCommand) -{ - m_deviceQmlsceneCommand = qmlsceneCommand; + QString apkPathStr(defaultQtLiveApk); + if (qEnvironmentVariableIsSet("QTC_QT_LIVE_APK_PATH")) + apkPathStr = QString::fromLocal8Bit(qgetenv("QTC_QT_LIVE_APK_PATH")); + return Utils::FileName::fromString(apkPathStr); } /////////////////////////////////// @@ -1043,9 +1037,7 @@ void AndroidConfigurations::updateAutomaticKitList() && tc->typeId() == Constants::ANDROID_TOOLCHAIN_ID && !static_cast<const AndroidToolChain *>(tc)->isSecondaryToolChain(); }); - const QList<AndroidToolChain *> toolchains = Utils::transform(tmp, [](ToolChain *tc) { - return static_cast<AndroidToolChain *>(tc); - }); + const auto toolchains = Utils::static_container_cast<AndroidToolChain *>(tmp); for (AndroidToolChain *tc : toolchains) { if (tc->isSecondaryToolChain() || tc->language() != Core::Id(ProjectExplorer::Constants::CXX_LANGUAGE_ID)) continue; @@ -1065,17 +1057,18 @@ void AndroidConfigurations::updateAutomaticKitList() }; for (const QtSupport::BaseQtVersion *qt : qtVersionsForArch.value(tc->targetAbi())) { - Kit *newKit = new Kit; - initBasicKitData(newKit, qt); - Kit *existingKit = Utils::findOrDefault(existingKits, [newKit](const Kit *k) { - return matchKits(newKit, k); + auto newKit = std::make_unique<Kit>(); + Kit *toSetup = newKit.get(); + initBasicKitData(toSetup, qt); + Kit *existingKit = Utils::findOrDefault(existingKits, [toSetup](const Kit *k) { + return matchKits(toSetup, k); }); if (existingKit) { // Existing kit found. // Update the existing kit with new data. initBasicKitData(existingKit, qt); - KitManager::deleteKit(newKit); - newKit = existingKit; + newKit.reset(); + toSetup = existingKit; } Debugger::DebuggerItem debugger; @@ -1086,16 +1079,16 @@ void AndroidConfigurations::updateAutomaticKitList() debugger.setAbi(tc->targetAbi()); debugger.reinitializeFromFile(); QVariant id = Debugger::DebuggerItemManager::registerDebugger(debugger); - Debugger::DebuggerKitInformation::setDebugger(newKit, id); - - AndroidGdbServerKitInformation::setGdbSever(newKit, tc->suggestedGdbServer()); - newKit->makeSticky(); - newKit->setUnexpandedDisplayName(tr("Android for %1 (GCC %2, %3)") - .arg(static_cast<const AndroidQtVersion *>(qt)->targetArch()) - .arg(tc->ndkToolChainVersion()) - .arg(qt->displayName())); + Debugger::DebuggerKitInformation::setDebugger(toSetup, id); + + AndroidGdbServerKitInformation::setGdbSever(toSetup, tc->suggestedGdbServer()); + toSetup->makeSticky(); + toSetup->setUnexpandedDisplayName(tr("Android for %1 (GCC %2, %3)") + .arg(static_cast<const AndroidQtVersion *>(qt)->targetArch()) + .arg(tc->ndkToolChainVersion()) + .arg(qt->displayName())); if (!existingKit) - KitManager::registerKit(newKit); + KitManager::registerKit(std::move(newKit)); } } } @@ -1181,10 +1174,7 @@ AndroidConfigurations::AndroidConfigurations() m_instance = this; } -AndroidConfigurations::~AndroidConfigurations() -{ - -} +AndroidConfigurations::~AndroidConfigurations() = default; static FileName javaHomeForJavac(const FileName &location) { @@ -1293,6 +1283,15 @@ void AndroidConfigurations::updateAndroidDevice() devMgr->removeDevice(Core::Id(Constants::ANDROID_DEVICE_ID)); } -AndroidConfigurations *AndroidConfigurations::m_instance = 0; +AndroidConfigurations *AndroidConfigurations::m_instance = nullptr; + +QDebug &operator<<(QDebug &stream, const AndroidDeviceInfo &device) +{ + stream << "Type:"<< (device.type == AndroidDeviceInfo::Emulator ? "Emulator" : "Device") + << ", ABI:" << device.cpuAbi << ", Serial:" << device.serialNumber + << ", Name:" << device.avdname << ", API:" << device.sdk + << ", Authorised:" << !device.unauthorized; + return stream; +} } // namespace Android diff --git a/src/plugins/android/androidconfigurations.h b/src/plugins/android/androidconfigurations.h index 0a7fa4c3b7..941fab7fbd 100644 --- a/src/plugins/android/androidconfigurations.h +++ b/src/plugins/android/androidconfigurations.h @@ -124,8 +124,7 @@ public: bool automaticKitCreation() const; void setAutomaticKitCreation(bool b); - QString deviceQmlsceneCommand() const; - void setDeviceQmlsceneCommand(const QString &qmlsceneCommand); + Utils::FileName qtLiveApkPath() const; Utils::FileName adbToolPath() const; Utils::FileName androidToolPath() const; @@ -182,7 +181,6 @@ private: QStringList m_makeExtraSearchDirectories; unsigned m_partitionSize = 1024; bool m_automaticKitCreation = true; - QString m_deviceQmlsceneCommand; //caches mutable bool m_NdkInformationUpToDate = false; @@ -231,6 +229,8 @@ private: bool m_force32bit; }; +QDebug &operator<<(QDebug &stream, const AndroidDeviceInfo &device); + } // namespace Android Q_DECLARE_METATYPE(Android::AndroidDeviceInfo) diff --git a/src/plugins/android/androidcreatekeystorecertificate.h b/src/plugins/android/androidcreatekeystorecertificate.h index 86ee222a10..86c9f36fcf 100644 --- a/src/plugins/android/androidcreatekeystorecertificate.h +++ b/src/plugins/android/androidcreatekeystorecertificate.h @@ -47,8 +47,8 @@ class AndroidCreateKeystoreCertificate : public QDialog }; public: - explicit AndroidCreateKeystoreCertificate(QWidget *parent = 0); - ~AndroidCreateKeystoreCertificate(); + explicit AndroidCreateKeystoreCertificate(QWidget *parent = nullptr); + ~AndroidCreateKeystoreCertificate() override; Utils::FileName keystoreFilePath(); QString keystorePassword(); QString certificateAlias(); diff --git a/src/plugins/android/androiddebugsupport.cpp b/src/plugins/android/androiddebugsupport.cpp index 84ed1bf52d..0cb44f0a4b 100644 --- a/src/plugins/android/androiddebugsupport.cpp +++ b/src/plugins/android/androiddebugsupport.cpp @@ -44,8 +44,13 @@ #include <utils/hostosinfo.h> #include <QDirIterator> +#include <QLoggingCategory> #include <QHostAddress> +namespace { +Q_LOGGING_CATEGORY(androidDebugSupportLog, "qtc.android.run.androiddebugsupport") +} + using namespace Debugger; using namespace ProjectExplorer; @@ -94,13 +99,11 @@ static QString toNdkArch(const QString &arch) return QLatin1String("arch-") + arch; } -AndroidDebugSupport::AndroidDebugSupport(RunControl *runControl, const QString &intentName, - const QString &extraAppParams, - const Utils::Environment &extraEnvVars) +AndroidDebugSupport::AndroidDebugSupport(RunControl *runControl, const QString &intentName) : Debugger::DebuggerRunTool(runControl) { setDisplayName("AndroidDebugger"); - m_runner = new AndroidRunner(runControl, intentName, extraAppParams, extraEnvVars); + m_runner = new AndroidRunner(runControl, intentName); addStartDependency(m_runner); } @@ -111,23 +114,30 @@ void AndroidDebugSupport::start() Kit *kit = target->kit(); setStartMode(AttachToRemoteServer); - setRunControlName(AndroidManager::packageName(target)); + const QString packageName = AndroidManager::packageName(target); + setRunControlName(packageName); setUseContinueInsteadOfRun(true); setAttachPid(m_runner->pid()); + qCDebug(androidDebugSupportLog) << "Start. Package name: " << packageName + << "PID: " << m_runner->pid().pid(); if (!Utils::HostOsInfo::isWindowsHost() && AndroidConfigurations::currentConfig().ndkVersion() >= QVersionNumber(11, 0, 0)) { + qCDebug(androidDebugSupportLog) << "UseTargetAsync: " << true; setUseTargetAsync(true); } QtSupport::BaseQtVersion *qtVersion = QtSupport::QtKitInformation::qtVersion(kit); if (isCppDebugging()) { + qCDebug(androidDebugSupportLog) << "C++ debugging enabled"; AndroidQtSupport *qtSupport = AndroidManager::androidQtSupport(target); QStringList solibSearchPath = qtSupport->soLibSearchPath(target); + QStringList extraLibs = qtSupport->targetData(Android::Constants::AndroidExtraLibs, target).toStringList(); solibSearchPath.append(qtSoPaths(qtVersion)); - solibSearchPath.append(uniquePaths(qtSupport->androidExtraLibs(target))); + solibSearchPath.append(uniquePaths(extraLibs)); setSolibSearchPath(solibSearchPath); + qCDebug(androidDebugSupportLog) << "SoLibSearchPath: "<<solibSearchPath; setSymbolFile(target->activeBuildConfiguration()->buildDirectory().toString() + "/app_process"); setSkipExecutableValidation(true); @@ -136,11 +146,16 @@ void AndroidDebugSupport::start() gdbServer.setHost(QHostAddress(QHostAddress::LocalHost).toString()); gdbServer.setPort(m_runner->gdbServerPort().number()); setRemoteChannel(gdbServer); - setSysRoot(AndroidConfigurations::currentConfig().ndkLocation().appendPath("platforms") - .appendPath(QString("android-%1").arg(AndroidManager::minimumSDK(target))) - .appendPath(toNdkArch(AndroidManager::targetArch(target))).toString()); + + QString sysRoot = AndroidConfigurations::currentConfig().ndkLocation().appendPath("platforms") + .appendPath(QString("android-%1").arg(AndroidManager::minimumSDK(target))) + .appendPath(toNdkArch(AndroidManager::targetArch(target))).toString(); + setSysRoot(sysRoot); + qCDebug(androidDebugSupportLog) << "Sysroot: " << sysRoot; } if (isQmlDebugging()) { + qCDebug(androidDebugSupportLog) << "QML debugging enabled. QML server: " + << m_runner->qmlServer().toDisplayString(); setQmlServer(m_runner->qmlServer()); //TODO: Not sure if these are the right paths. if (qtVersion) @@ -152,6 +167,7 @@ void AndroidDebugSupport::start() void AndroidDebugSupport::stop() { + qCDebug(androidDebugSupportLog) << "Stop"; DebuggerRunTool::stop(); } diff --git a/src/plugins/android/androiddebugsupport.h b/src/plugins/android/androiddebugsupport.h index 81351836f7..43a5f1f724 100644 --- a/src/plugins/android/androiddebugsupport.h +++ b/src/plugins/android/androiddebugsupport.h @@ -37,9 +37,7 @@ class AndroidDebugSupport : public Debugger::DebuggerRunTool public: AndroidDebugSupport(ProjectExplorer::RunControl *runControl, - const QString &intentName = QString(), - const QString &extraAppParams = QString(), - const Utils::Environment &extraEnvVars = Utils::Environment()); + const QString &intentName = QString()); void start() override; void stop() override; diff --git a/src/plugins/android/androiddeployconfiguration.cpp b/src/plugins/android/androiddeployconfiguration.cpp index 5987db8496..bb0169db0e 100644 --- a/src/plugins/android/androiddeployconfiguration.cpp +++ b/src/plugins/android/androiddeployconfiguration.cpp @@ -63,10 +63,13 @@ AndroidDeployConfigurationFactory::AndroidDeployConfigurationFactory() QList<QString> AndroidDeployConfigurationFactory::availableBuildTargets(Target *parent) const { - ToolChain *tc = ToolChainKitInformation::toolChain(parent->kit(), ProjectExplorer::Constants::CXX_LANGUAGE_ID); - - if (!tc || tc->targetAbi().osFlavor() != Abi::AndroidLinuxFlavor) - return {}; + if (!parent->project()->id().name().startsWith("QmlProjectManager.QmlProject")) { + // Avoid tool chain check for QML Project + Core::Id cxxLangId(ProjectExplorer::Constants::CXX_LANGUAGE_ID); + ToolChain *tc = ToolChainKitInformation::toolChain(parent->kit(), cxxLangId); + if (!tc || tc->targetAbi().osFlavor() != Abi::AndroidLinuxFlavor) + return {}; + } QtSupport::BaseQtVersion *qt = QtSupport::QtKitInformation::qtVersion(parent->kit()); if (!qt || qt->type() != Constants::ANDROIDQT) diff --git a/src/plugins/android/androiddeployqtstep.cpp b/src/plugins/android/androiddeployqtstep.cpp index 1a110dbb2b..767ea101b2 100644 --- a/src/plugins/android/androiddeployqtstep.cpp +++ b/src/plugins/android/androiddeployqtstep.cpp @@ -43,6 +43,7 @@ #include <projectexplorer/buildsteplist.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/project.h> +#include <projectexplorer/runconfiguration.h> #include <projectexplorer/target.h> #include <projectexplorer/toolchain.h> @@ -55,18 +56,24 @@ #include <QInputDialog> #include <QMessageBox> +#include <QLoggingCategory> using namespace ProjectExplorer; using namespace Android; using namespace Android::Internal; +namespace { +Q_LOGGING_CATEGORY(deployStepLog, "qtc.android.build.androiddeployqtstep") +} + const QLatin1String UninstallPreviousPackageKey("UninstallPreviousPackage"); const QLatin1String InstallFailedInconsistentCertificatesString("INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES"); const QLatin1String InstallFailedUpdateIncompatible("INSTALL_FAILED_UPDATE_INCOMPATIBLE"); const QLatin1String InstallFailedPermissionModelDowngrade("INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE"); const QLatin1String InstallFailedVersionDowngrade("INSTALL_FAILED_VERSION_DOWNGRADE"); const Core::Id AndroidDeployQtStep::Id("Qt4ProjectManager.AndroidDeployQtStep"); +static const char *qmlProjectRunConfigIdName = "QmlProjectManager.QmlRunConfiguration"; // AndroidDeployQtStepFactory @@ -77,7 +84,7 @@ AndroidDeployQtStepFactory::AndroidDeployQtStepFactory() setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY); setSupportedDeviceType(Constants::ANDROID_DEVICE_TYPE); setRepeatable(false); - setDisplayName(tr("Deploy to Android device or emulator")); + setDisplayName(AndroidDeployQtStep::tr("Deploy to Android device or emulator")); } // AndroidDeployQtStep @@ -110,24 +117,32 @@ bool AndroidDeployQtStep::init(QList<const BuildStep *> &earlierSteps) Q_UNUSED(earlierSteps); m_androiddeployqtArgs.clear(); - if (AndroidManager::checkForQt51Files(project()->projectDirectory())) - emit addOutput(tr("Found old folder \"android\" in source directory. Qt 5.2 does not use that folder by default."), OutputFormat::Stderr); - m_targetArch = AndroidManager::targetArch(target()); if (m_targetArch.isEmpty()) { emit addOutput(tr("No Android arch set by the .pro file."), OutputFormat::Stderr); return false; } - AndroidBuildApkStep *androidBuildApkStep - = AndroidGlobal::buildStep<AndroidBuildApkStep>(target()->activeBuildConfiguration()); - if (!androidBuildApkStep) + emit addOutput(tr("initializing deployment to Android device/simulator"), OutputFormat::Stdout); + + RunConfiguration *rc = target()->activeRunConfiguration(); + QTC_ASSERT(rc, return false); + const bool deployQtLive = rc->id().name().startsWith(qmlProjectRunConfigIdName); + ProjectExplorer::BuildConfiguration *bc = buildConfiguration(); + QTC_ASSERT(deployQtLive || bc, return false); + + auto androidBuildApkStep = AndroidGlobal::buildStep<AndroidBuildApkStep>(bc); + if (!androidBuildApkStep && !deployQtLive) { emit addOutput(tr("Cannot find the android build step."), OutputFormat::Stderr); + return false; + } - int deviceAPILevel = AndroidManager::minimumSDK(target()); + int minTargetApi = AndroidManager::minimumSDK(target()); + qCDebug(deployStepLog) << "Target architecture:" << m_targetArch + << "Min target API" << minTargetApi; AndroidDeviceInfo info = earlierDeviceInfo(earlierSteps, Id); if (!info.isValid()) { - info = AndroidConfigurations::showDeviceDialog(project(), deviceAPILevel, m_targetArch); + info = AndroidConfigurations::showDeviceDialog(project(), minTargetApi, m_targetArch); m_deviceInfo = info; // Keep around for later steps } @@ -136,36 +151,15 @@ bool AndroidDeployQtStep::init(QList<const BuildStep *> &earlierSteps) m_avdName = info.avdname; m_serialNumber = info.serialNumber; + qCDebug(deployStepLog) << "Selected Device:" << info; - ProjectExplorer::BuildConfiguration *bc = target()->activeBuildConfiguration(); - m_filesToPull.clear(); - QString buildDir = bc ? bc->buildDirectory().toString() : QString(); - if (bc && !buildDir.endsWith("/")) { - buildDir += "/"; - } - QString linkerName("linker"); - QString libDirName("lib"); - if (info.cpuAbi.contains(QLatin1String("arm64-v8a")) || - info.cpuAbi.contains(QLatin1String("x86_64"))) { - ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainKitInformation::toolChain(target()->kit(), ProjectExplorer::Constants::CXX_LANGUAGE_ID); - if (tc && tc->targetAbi().wordWidth() == 64) { - m_filesToPull["/system/bin/app_process64"] = buildDir + "app_process"; - libDirName = "lib64"; - linkerName = "linker64"; - } else { - m_filesToPull["/system/bin/app_process32"] = buildDir + "app_process"; - } - } else { - m_filesToPull["/system/bin/app_process32"] = buildDir + "app_process"; - m_filesToPull["/system/bin/app_process"] = buildDir + "app_process"; - } - - m_filesToPull["/system/bin/" + linkerName] = buildDir + linkerName; - m_filesToPull["/system/" + libDirName + "/libc.so"] = buildDir + "libc.so"; + if (!deployQtLive) + gatherFilesToPull(); AndroidManager::setDeviceSerialNumber(target(), m_serialNumber); AndroidManager::setDeviceApiLevel(target(), info.sdk); + emit addOutput(tr("Deploying to %1").arg(m_serialNumber), OutputFormat::Stdout); QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(target()->kit()); if (!version) @@ -176,31 +170,35 @@ bool AndroidDeployQtStep::init(QList<const BuildStep *> &earlierSteps) m_manifestName = AndroidManager::manifestPath(target()); AndroidQtSupport *qtSupport = AndroidManager::androidQtSupport(target()); - m_useAndroiddeployqt = qtSupport && version->qtVersion() >= QtSupport::QtVersionNumber(5, 4, 0); + m_useAndroiddeployqt = !deployQtLive && qtSupport && + version->qtVersion() >= QtSupport::QtVersionNumber(5, 4, 0); if (m_useAndroiddeployqt) { - Utils::FileName tmp = qtSupport->androiddeployqtPath(target()); - if (tmp.isEmpty()) { + m_command = version->qmakeProperty("QT_HOST_BINS"); + if (m_command.isEmpty()) { emit addOutput(tr("Cannot find the androiddeployqt tool."), OutputFormat::Stderr); return false; } + qCDebug(deployStepLog) << "Using androiddeployqt"; + if (!m_command.endsWith(QLatin1Char('/'))) + m_command += QLatin1Char('/'); + m_command += Utils::HostOsInfo::withExecutableSuffix(QLatin1String("androiddeployqt")); - m_command = tmp.toString(); - m_workingDirectory = bc ? bc->buildDirectory().appendPath(QLatin1String(Constants::ANDROID_BUILDDIRECTORY)).toString() - : QString(); + m_workingDirectory = bc->buildDirectory().appendPath(QLatin1String(Constants::ANDROID_BUILDDIRECTORY)).toString(); Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--verbose")); Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--output")); Utils::QtcProcess::addArg(&m_androiddeployqtArgs, m_workingDirectory); Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--no-build")); Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--input")); - tmp = AndroidManager::androidQtSupport(target())->androiddeployJsonPath(target()); - if (tmp.isEmpty()) { + const QString jsonFile = qtSupport->targetData(Constants::AndroidDeploySettingsFile, target()).toString(); + if (jsonFile.isEmpty()) { emit addOutput(tr("Cannot find the androiddeploy Json file."), OutputFormat::Stderr); return false; } - Utils::QtcProcess::addArg(&m_androiddeployqtArgs, tmp.toString()); + Utils::QtcProcess::addArg(&m_androiddeployqtArgs, jsonFile); if (androidBuildApkStep && androidBuildApkStep->useMinistro()) { + qCDebug(deployStepLog) << "Using ministro"; Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--deployment")); Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("ministro")); } @@ -219,7 +217,8 @@ bool AndroidDeployQtStep::init(QList<const BuildStep *> &earlierSteps) } else { m_uninstallPreviousPackageRun = true; m_command = AndroidConfigurations::currentConfig().adbToolPath().toString(); - m_apkPath = qtSupport ? qtSupport->apkPath(target()).toString() : QString(); + const AndroidConfig &config = AndroidConfigurations::currentConfig(); + m_apkPath = deployQtLive ? config.qtLiveApkPath() : AndroidManager::apkPath(target()); m_workingDirectory = bc ? bc->buildDirectory().toString() : QString(); } m_environment = bc ? bc->environment() : Utils::Environment(); @@ -248,13 +247,24 @@ AndroidDeployQtStep::DeployErrorCode AndroidDeployQtStep::runDeploy(QFutureInter Utils::QtcProcess::addArg(&args, m_serialNumber); } } else { + RunConfiguration *rc = target()->activeRunConfiguration(); + QTC_ASSERT(rc, return DeployErrorCode::Failure); + const bool deployQtLive = rc->id().name().startsWith(qmlProjectRunConfigIdName); + QString packageName; + if (deployQtLive) { + AndroidManager::apkInfo(m_apkPath, &packageName); + if (AndroidManager::packageInstalled(m_serialNumber, packageName)) + return DeployErrorCode::NoError; + } + if (m_uninstallPreviousPackageRun) { - const QString packageName = AndroidManager::packageName(m_manifestName); + if (!deployQtLive) + packageName = AndroidManager::packageName(m_manifestName); if (packageName.isEmpty()) { emit addOutput(tr("Cannot find the package name."), OutputFormat::Stderr); return Failure; } - + qCDebug(deployStepLog) << "Uninstalling previous package"; emit addOutput(tr("Uninstall previous package %1.").arg(packageName), OutputFormat::NormalMessage); runCommand(m_adbPath, AndroidDeviceInfo::adbSelector(m_serialNumber) @@ -266,7 +276,7 @@ AndroidDeployQtStep::DeployErrorCode AndroidDeployQtStep::runDeploy(QFutureInter Utils::QtcProcess::addArg(&args, QLatin1String("install")); Utils::QtcProcess::addArg(&args, QLatin1String("-r")); - Utils::QtcProcess::addArg(&args, m_apkPath); + Utils::QtcProcess::addArg(&args, m_apkPath.toString()); } m_process = new Utils::QtcProcess; @@ -314,7 +324,7 @@ AndroidDeployQtStep::DeployErrorCode AndroidDeployQtStep::runDeploy(QFutureInter QProcess::ExitStatus exitStatus = m_process->exitStatus(); int exitCode = m_process->exitCode(); delete m_process; - m_process = 0; + m_process = nullptr; if (exitStatus == QProcess::NormalExit && exitCode == 0) { emit addOutput(tr("The process \"%1\" exited normally.").arg(m_command), @@ -368,13 +378,14 @@ void AndroidDeployQtStep::slotAskForUninstall(DeployErrorCode errorCode) } uninstallMsg.append(tr("\nUninstalling the installed package may solve the issue.\nDo you want to uninstall the existing package?")); - int button = QMessageBox::critical(0, tr("Install failed"), uninstallMsg, + int button = QMessageBox::critical(nullptr, tr("Install failed"), uninstallMsg, QMessageBox::Yes, QMessageBox::No); m_askForUninstall = button == QMessageBox::Yes; } void AndroidDeployQtStep::slotSetSerialNumber(const QString &serialNumber) { + qCDebug(deployStepLog) << "Target device serial number change:" << serialNumber; AndroidManager::setDeviceSerialNumber(target(), serialNumber); } @@ -382,6 +393,7 @@ void AndroidDeployQtStep::run(QFutureInterface<bool> &fi) { if (!m_avdName.isEmpty()) { QString serialNumber = AndroidAvdManager().waitForAvd(m_avdName, fi); + qCDebug(deployStepLog) << "Deploying to AVD:" << m_avdName << serialNumber; if (serialNumber.isEmpty()) { reportRunResult(fi, false); return; @@ -390,11 +402,6 @@ void AndroidDeployQtStep::run(QFutureInterface<bool> &fi) emit setSerialNumber(serialNumber); } - if (!target()->activeBuildConfiguration()) { // nothing to deploy - reportRunResult(fi, true); - return; - } - DeployErrorCode returnValue = runDeploy(fi); if (returnValue > DeployErrorCode::NoError && returnValue < DeployErrorCode::Failure) { emit askForUninstall(returnValue); @@ -404,7 +411,9 @@ void AndroidDeployQtStep::run(QFutureInterface<bool> &fi) } } - emit addOutput(tr("Pulling files necessary for debugging."), OutputFormat::NormalMessage); + if (!m_filesToPull.isEmpty()) + emit addOutput(tr("Pulling files necessary for debugging."), OutputFormat::NormalMessage); + for (auto itr = m_filesToPull.constBegin(); itr != m_filesToPull.constEnd(); ++itr) { QFile::remove(itr.value()); runCommand(m_adbPath, @@ -420,6 +429,44 @@ void AndroidDeployQtStep::run(QFutureInterface<bool> &fi) reportRunResult(fi, returnValue == NoError); } +void AndroidDeployQtStep::gatherFilesToPull() +{ + m_filesToPull.clear(); + ProjectExplorer::BuildConfiguration *bc = buildConfiguration(); + QString buildDir = bc ? bc->buildDirectory().toString() : QString(); + if (bc && !buildDir.endsWith("/")) { + buildDir += "/"; + } + + if (!m_deviceInfo.isValid()) + return; + + QString linkerName("linker"); + QString libDirName("lib"); + if (m_deviceInfo.cpuAbi.contains(QLatin1String("arm64-v8a")) || + m_deviceInfo.cpuAbi.contains(QLatin1String("x86_64"))) { + const Core::Id cxxLanguageId = ProjectExplorer::Constants::CXX_LANGUAGE_ID; + ToolChain *tc = ToolChainKitInformation::toolChain(target()->kit(), cxxLanguageId); + if (tc && tc->targetAbi().wordWidth() == 64) { + m_filesToPull["/system/bin/app_process64"] = buildDir + "app_process"; + libDirName = "lib64"; + linkerName = "linker64"; + } else { + m_filesToPull["/system/bin/app_process32"] = buildDir + "app_process"; + } + } else { + m_filesToPull["/system/bin/app_process32"] = buildDir + "app_process"; + m_filesToPull["/system/bin/app_process"] = buildDir + "app_process"; + } + + m_filesToPull["/system/bin/" + linkerName] = buildDir + linkerName; + m_filesToPull["/system/" + libDirName + "/libc.so"] = buildDir + "libc.so"; + + qCDebug(deployStepLog) << "Files to pull from device:"; + for (auto itr = m_filesToPull.constBegin(); itr != m_filesToPull.constEnd(); ++itr) + qCDebug(deployStepLog) << itr.key() << "to" << itr.value(); +} + void AndroidDeployQtStep::runCommand(const QString &program, const QStringList &arguments) { Utils::SynchronousProcess buildProc; diff --git a/src/plugins/android/androiddeployqtstep.h b/src/plugins/android/androiddeployqtstep.h index 4b5534fda5..a23f8f9ef6 100644 --- a/src/plugins/android/androiddeployqtstep.h +++ b/src/plugins/android/androiddeployqtstep.h @@ -43,7 +43,6 @@ namespace Internal { class AndroidDeployQtStepFactory : public ProjectExplorer::BuildStepFactory { - Q_OBJECT public: AndroidDeployQtStepFactory(); }; @@ -92,6 +91,7 @@ private: bool init(QList<const BuildStep *> &earlierSteps) override; void run(QFutureInterface<bool> &fi) override; + void gatherFilesToPull(); DeployErrorCode runDeploy(QFutureInterface<bool> &fi); void slotAskForUninstall(DeployErrorCode errorCode); void slotSetSerialNumber(const QString &serialNumber); @@ -114,7 +114,7 @@ private: Utils::FileName m_manifestName; QString m_serialNumber; QString m_avdName; - QString m_apkPath; + Utils::FileName m_apkPath; QMap<QString, QString> m_filesToPull; QString m_targetArch; diff --git a/src/plugins/android/androiddeployqtwidget.h b/src/plugins/android/androiddeployqtwidget.h index 9989bebe99..949aee637e 100644 --- a/src/plugins/android/androiddeployqtwidget.h +++ b/src/plugins/android/androiddeployqtwidget.h @@ -44,15 +44,15 @@ class AndroidDeployQtWidget : public ProjectExplorer::BuildStepConfigWidget public: AndroidDeployQtWidget(AndroidDeployQtStep *step); - ~AndroidDeployQtWidget(); + ~AndroidDeployQtWidget() override; private: void installMinistro(); void cleanLibsOnDevice(); void resetDefaultDevices(); - virtual QString summaryText() const; - virtual QString displayName() const; + QString summaryText() const override; + QString displayName() const override; Ui::AndroidDeployQtWidget *m_ui; AndroidDeployQtStep *m_step; diff --git a/src/plugins/android/androiddevice.cpp b/src/plugins/android/androiddevice.cpp index 48aaa35cca..cc108e6ca4 100644 --- a/src/plugins/android/androiddevice.cpp +++ b/src/plugins/android/androiddevice.cpp @@ -27,15 +27,21 @@ #include "androidconstants.h" #include "androidsignaloperation.h" #include "androidconfigurations.h" +#include "androidmanager.h" #include <projectexplorer/runconfiguration.h> #include <utils/url.h> #include <QCoreApplication> +#include <QLoggingCategory> using namespace ProjectExplorer; +namespace { +Q_LOGGING_CATEGORY(androidDeviceLog, "qtc.android.build.androiddevice") +} + namespace Android { namespace Internal { @@ -47,13 +53,15 @@ AndroidDevice::AndroidDevice() { setDisplayName(QCoreApplication::translate("Android::Internal::AndroidDevice", "Run on Android")); setDeviceState(DeviceReadyToUse); - setQmlsceneCommand(AndroidConfigurations::currentConfig().deviceQmlsceneCommand()); + QString activityPath; + const AndroidConfig &config = AndroidConfigurations::currentConfig(); + AndroidManager::apkInfo(config.qtLiveApkPath(), nullptr, nullptr, &activityPath); + qCDebug(androidDeviceLog) << "Using Qt live apk from: " << config.qtLiveApkPath() + << "Activity Path:" << activityPath; + setQmlsceneCommand(activityPath); } -AndroidDevice::AndroidDevice(const AndroidDevice &other) - : IDevice(other) -{ } - +AndroidDevice::AndroidDevice(const AndroidDevice &other) = default; IDevice::DeviceInfo AndroidDevice::deviceInformation() const { @@ -67,7 +75,7 @@ QString AndroidDevice::displayType() const IDeviceWidget *AndroidDevice::createWidget() { - return 0; + return nullptr; } QList<Core::Id> AndroidDevice::actionIds() const diff --git a/src/plugins/android/androiddevice.h b/src/plugins/android/androiddevice.h index fc710ef365..622e89d6f6 100644 --- a/src/plugins/android/androiddevice.h +++ b/src/plugins/android/androiddevice.h @@ -41,7 +41,7 @@ public: ProjectExplorer::IDeviceWidget *createWidget() override; QList<Core::Id> actionIds() const override; QString displayNameForActionId(Core::Id actionId) const override; - void executeAction(Core::Id actionId, QWidget *parent = 0) override; + void executeAction(Core::Id actionId, QWidget *parent = nullptr) override; bool canAutoDetectPorts() const override; ProjectExplorer::DeviceProcessSignalOperation::Ptr signalOperation() const override; Utils::OsType osType() const override; diff --git a/src/plugins/android/androiddevicedialog.cpp b/src/plugins/android/androiddevicedialog.cpp index 3d8559696a..db70967727 100644 --- a/src/plugins/android/androiddevicedialog.cpp +++ b/src/plugins/android/androiddevicedialog.cpp @@ -107,23 +107,21 @@ class AndroidDeviceModelDelegate : public QStyledItemDelegate { Q_OBJECT public: - AndroidDeviceModelDelegate(QObject * parent = 0) + AndroidDeviceModelDelegate(QObject * parent = nullptr) : QStyledItemDelegate(parent) { } - ~AndroidDeviceModelDelegate() - { - } + ~AndroidDeviceModelDelegate() override = default; - void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const + void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override { QStyleOptionViewItem opt = option; initStyleOption(&opt, index); painter->save(); - AndroidDeviceModelNode *node = static_cast<AndroidDeviceModelNode *>(index.internalPointer()); + auto node = static_cast<AndroidDeviceModelNode *>(index.internalPointer()); AndroidDeviceInfo device = node->deviceInfo(); painter->setPen(Qt::NoPen); @@ -221,7 +219,7 @@ public: painter->restore(); } - QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const + QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override { QStyleOptionViewItem opt = option; initStyleOption(&opt, index); @@ -240,12 +238,12 @@ class AndroidDeviceModel : public QAbstractItemModel public: AndroidDeviceModel(int apiLevel, const QString &abi); QModelIndex index(int row, int column, - const QModelIndex &parent = QModelIndex()) const; - QModelIndex parent(const QModelIndex &child) const; - int rowCount(const QModelIndex &parent = QModelIndex()) const; - int columnCount(const QModelIndex &parent = QModelIndex()) const; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; - Qt::ItemFlags flags(const QModelIndex &index) const; + const QModelIndex &parent = QModelIndex()) const override; + QModelIndex parent(const QModelIndex &child) const override; + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + int columnCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + Qt::ItemFlags flags(const QModelIndex &index) const override; AndroidDeviceInfo device(QModelIndex index); void setDevices(const QVector<AndroidDeviceInfo> &devices); @@ -263,7 +261,7 @@ private: // AndroidDeviceModel ///////////////// AndroidDeviceModel::AndroidDeviceModel(int apiLevel, const QString &abi) - : m_apiLevel(apiLevel), m_abi(abi), m_root(0) + : m_apiLevel(apiLevel), m_abi(abi), m_root(nullptr) { } @@ -281,7 +279,7 @@ QModelIndex AndroidDeviceModel::index(int row, int column, const QModelIndex &pa return createIndex(row, column, m_root->children().at(row)); } - AndroidDeviceModelNode *node = static_cast<AndroidDeviceModelNode *>(parent.internalPointer()); + auto node = static_cast<AndroidDeviceModelNode *>(parent.internalPointer()); if (row < node->children().count()) return createIndex(row, column, node->children().at(row)); @@ -294,7 +292,7 @@ QModelIndex AndroidDeviceModel::parent(const QModelIndex &child) const return QModelIndex(); if (!m_root) return QModelIndex(); - AndroidDeviceModelNode *node = static_cast<AndroidDeviceModelNode *>(child.internalPointer()); + auto node = static_cast<AndroidDeviceModelNode *>(child.internalPointer()); if (node == m_root) return QModelIndex(); AndroidDeviceModelNode *parent = node->parent(); @@ -312,7 +310,7 @@ int AndroidDeviceModel::rowCount(const QModelIndex &parent) const return 0; if (!parent.isValid()) return m_root->children().count(); - AndroidDeviceModelNode *node = static_cast<AndroidDeviceModelNode *>(parent.internalPointer()); + auto node = static_cast<AndroidDeviceModelNode *>(parent.internalPointer()); return node->children().count(); } @@ -326,7 +324,7 @@ QVariant AndroidDeviceModel::data(const QModelIndex &index, int role) const { if (role != Qt::DisplayRole) return QVariant(); - AndroidDeviceModelNode *node = static_cast<AndroidDeviceModelNode *>(index.internalPointer()); + auto node = static_cast<AndroidDeviceModelNode *>(index.internalPointer()); if (!node) return QVariant(); return node->deviceInfo().serialNumber; @@ -334,7 +332,7 @@ QVariant AndroidDeviceModel::data(const QModelIndex &index, int role) const Qt::ItemFlags AndroidDeviceModel::flags(const QModelIndex &index) const { - AndroidDeviceModelNode *node = static_cast<AndroidDeviceModelNode *>(index.internalPointer()); + auto node = static_cast<AndroidDeviceModelNode *>(index.internalPointer()); if (node) if (node->displayName().isEmpty() && node->incompatibleReason().isEmpty()) return Qt::ItemIsSelectable | Qt::ItemIsEnabled; @@ -344,7 +342,7 @@ Qt::ItemFlags AndroidDeviceModel::flags(const QModelIndex &index) const AndroidDeviceInfo AndroidDeviceModel::device(QModelIndex index) { - AndroidDeviceModelNode *node = static_cast<AndroidDeviceModelNode *>(index.internalPointer()); + auto node = static_cast<AndroidDeviceModelNode *>(index.internalPointer()); if (!node) return AndroidDeviceInfo(); return node->deviceInfo(); @@ -354,10 +352,10 @@ void AndroidDeviceModel::setDevices(const QVector<AndroidDeviceInfo> &devices) { beginResetModel(); delete m_root; - m_root = new AndroidDeviceModelNode(0, QString()); + m_root = new AndroidDeviceModelNode(nullptr, QString()); AndroidDeviceModelNode *compatibleDevices = new AndroidDeviceModelNode(m_root, AndroidDeviceDialog::tr("Compatible devices")); - AndroidDeviceModelNode *incompatibleDevices = 0; // created on demand + AndroidDeviceModelNode *incompatibleDevices = nullptr; // created on demand foreach (const AndroidDeviceInfo &device, devices) { QString error; if (device.state == AndroidDeviceInfo::UnAuthorizedState) { @@ -614,7 +612,7 @@ void AndroidDeviceDialog::enableOkayButton() void AndroidDeviceDialog::clickedOnView(const QModelIndex &idx) { if (idx.isValid()) { - AndroidDeviceModelNode *node = static_cast<AndroidDeviceModelNode *>(idx.internalPointer()); + auto node = static_cast<AndroidDeviceModelNode *>(idx.internalPointer()); if (!node->displayName().isEmpty()) { if (m_ui->deviceView->isExpanded(idx)) m_ui->deviceView->collapse(idx); diff --git a/src/plugins/android/androiddevicedialog.h b/src/plugins/android/androiddevicedialog.h index db379c068e..e366b18075 100644 --- a/src/plugins/android/androiddevicedialog.h +++ b/src/plugins/android/androiddevicedialog.h @@ -53,8 +53,8 @@ class AndroidDeviceDialog : public QDialog public: explicit AndroidDeviceDialog(int apiLevel, const QString &abi, - const QString &serialNumber, QWidget *parent = 0); - ~AndroidDeviceDialog(); + const QString &serialNumber, QWidget *parent = nullptr); + ~AndroidDeviceDialog() override; AndroidDeviceInfo device(); diff --git a/src/plugins/android/androiddevicefactory.h b/src/plugins/android/androiddevicefactory.h index 3954e42507..781c6ae1f5 100644 --- a/src/plugins/android/androiddevicefactory.h +++ b/src/plugins/android/androiddevicefactory.h @@ -36,14 +36,14 @@ class AndroidDeviceFactory : public ProjectExplorer::IDeviceFactory public: AndroidDeviceFactory(); - QString displayNameForId(Core::Id type) const; - QList<Core::Id> availableCreationIds() const; - QIcon iconForId(Core::Id type) const; + QString displayNameForId(Core::Id type) const override; + QList<Core::Id> availableCreationIds() const override; + QIcon iconForId(Core::Id type) const override; - bool canCreate() const; - ProjectExplorer::IDevice::Ptr create(Core::Id id) const; - bool canRestore(const QVariantMap &map) const; - ProjectExplorer::IDevice::Ptr restore(const QVariantMap &map) const; + bool canCreate() const override; + ProjectExplorer::IDevice::Ptr create(Core::Id id) const override; + bool canRestore(const QVariantMap &map) const override; + ProjectExplorer::IDevice::Ptr restore(const QVariantMap &map) const override; }; } // namespace Internal diff --git a/src/plugins/qmakeandroidsupport/androidextralibrarylistmodel.cpp b/src/plugins/android/androidextralibrarylistmodel.cpp index f2995d2371..60956c963a 100644 --- a/src/plugins/qmakeandroidsupport/androidextralibrarylistmodel.cpp +++ b/src/plugins/android/androidextralibrarylistmodel.cpp @@ -26,33 +26,28 @@ #include "androidextralibrarylistmodel.h" +#include <android/androidqtsupport.h> +#include <android/androidmanager.h> + +#include <projectexplorer/project.h> #include <projectexplorer/runconfiguration.h> #include <projectexplorer/target.h> -#include <qmakeprojectmanager/qmakeproject.h> -#include <qmakeprojectmanager/qmakenodes.h> - -#include <proparser/prowriter.h> - - -using namespace QmakeAndroidSupport; -using namespace Internal; -using QmakeProjectManager::QmakeProject; +namespace Android { AndroidExtraLibraryListModel::AndroidExtraLibraryListModel(ProjectExplorer::Target *target, QObject *parent) : QAbstractItemModel(parent), m_target(target) { + updateModel(); - activeRunConfigurationChanged(); - - auto project = static_cast<QmakeProject *>(target->project()); - connect(project, &QmakeProject::proFileUpdated, - this, &AndroidExtraLibraryListModel::proFileUpdated); - + connect(target->project(), &ProjectExplorer::Project::parsingStarted, + this, &AndroidExtraLibraryListModel::updateModel); + connect(target->project(), &ProjectExplorer::Project::parsingFinished, + this, &AndroidExtraLibraryListModel::updateModel); connect(target, &ProjectExplorer::Target::activeRunConfigurationChanged, - this, &AndroidExtraLibraryListModel::activeRunConfigurationChanged); + this, &AndroidExtraLibraryListModel::updateModel); } QModelIndex AndroidExtraLibraryListModel::index(int row, int column, const QModelIndex &) const @@ -85,22 +80,20 @@ QVariant AndroidExtraLibraryListModel::data(const QModelIndex &index, int role) }; } -void AndroidExtraLibraryListModel::activeRunConfigurationChanged() +void AndroidExtraLibraryListModel::updateModel() { - QmakeProjectManager::QmakeProFile *pro = activeProFile(); - if (!pro || pro->parseInProgress()) { + AndroidQtSupport *qtSupport = Android::AndroidManager::androidQtSupport(m_target); + QTC_ASSERT(qtSupport, return); + + if (qtSupport->parseInProgress(m_target)) { emit enabledChanged(false); return; } - m_scope = QLatin1String("contains(ANDROID_TARGET_ARCH,") - + pro->singleVariableValue(QmakeProjectManager::Variable::AndroidArch) - + QLatin1Char(')'); - bool enabled; beginResetModel(); - if (pro->validParse() && pro->projectType() == QmakeProjectManager::ProjectType::ApplicationTemplate) { - m_entries = pro->variableValue(QmakeProjectManager::Variable::AndroidExtraLibs); + if (qtSupport->validParse(m_target)) { + m_entries = qtSupport->targetData(Constants::AndroidExtraLibs, m_target).toStringList(); enabled = true; } else { // parsing error or not a application template @@ -112,44 +105,19 @@ void AndroidExtraLibraryListModel::activeRunConfigurationChanged() emit enabledChanged(enabled); } -QmakeProjectManager::QmakeProFile *AndroidExtraLibraryListModel::activeProFile() const -{ - ProjectExplorer::RunConfiguration *rc = m_target->activeRunConfiguration(); - if (!rc) - return nullptr; - auto project = static_cast<QmakeProject *>(m_target->project()); - return project->rootProFile()->findProFile(Utils::FileName::fromString(rc->buildKey())); -} - -void AndroidExtraLibraryListModel::proFileUpdated(QmakeProjectManager::QmakeProFile *pro) -{ - if (activeProFile() != pro) - return; - activeRunConfigurationChanged(); -} - -bool AndroidExtraLibraryListModel::isEnabled() const -{ - QmakeProjectManager::QmakeProFile *pro = activeProFile(); - return pro && !pro->parseInProgress() && pro->projectType() == QmakeProjectManager::ProjectType::ApplicationTemplate; -} - void AndroidExtraLibraryListModel::addEntries(const QStringList &list) { - QmakeProjectManager::QmakeProFile *pro = activeProFile(); - if (!pro || pro->projectType() != QmakeProjectManager::ProjectType::ApplicationTemplate) - return; + AndroidQtSupport *qtSupport = Android::AndroidManager::androidQtSupport(m_target); + QTC_ASSERT(qtSupport, return); + Utils::FileName projectFilePath = qtSupport->projectFilePath(m_target); beginInsertRows(QModelIndex(), m_entries.size(), m_entries.size() + list.size()); - foreach (const QString &path, list) - m_entries += QLatin1String("$$PWD/") - + pro->filePath().toFileInfo().absoluteDir().relativeFilePath(path); - - pro->setProVariable("ANDROID_EXTRA_LIBS", m_entries, m_scope, - QmakeProjectManager::Internal::ProWriter::ReplaceValues - | QmakeProjectManager::Internal::ProWriter::MultiLine); + const QDir dir = qtSupport->projectFilePath(m_target).toFileInfo().absoluteDir(); + for (const QString &path : list) + m_entries += "$$PWD/" + dir.relativeFilePath(path); + qtSupport->setTargetData(Constants::AndroidExtraLibs, m_entries, m_target); endInsertRows(); } @@ -160,10 +128,7 @@ bool greaterModelIndexByRow(const QModelIndex &a, const QModelIndex &b) void AndroidExtraLibraryListModel::removeEntries(QModelIndexList list) { - QmakeProjectManager::QmakeProFile *pro = activeProFile(); - if (!pro) - return; - if (list.isEmpty() || !pro || pro->projectType() != QmakeProjectManager::ProjectType::ApplicationTemplate) + if (list.isEmpty()) return; std::sort(list.begin(), list.end(), greaterModelIndexByRow); @@ -182,5 +147,9 @@ void AndroidExtraLibraryListModel::removeEntries(QModelIndexList list) endRemoveRows(); } - pro->setProVariable(QLatin1String("ANDROID_EXTRA_LIBS"), m_entries, m_scope); + AndroidQtSupport *qtSupport = AndroidManager::androidQtSupport(m_target); + QTC_ASSERT(qtSupport, return); + qtSupport->setTargetData(Constants::AndroidExtraLibs, m_entries, m_target); } + +} // Android diff --git a/src/plugins/qmakeandroidsupport/androidextralibrarylistmodel.h b/src/plugins/android/androidextralibrarylistmodel.h index e0b401d473..bbd21ce815 100644 --- a/src/plugins/qmakeandroidsupport/androidextralibrarylistmodel.h +++ b/src/plugins/android/androidextralibrarylistmodel.h @@ -26,6 +26,8 @@ #pragma once +#include "android_global.h" + #include <QAbstractItemModel> #include <QStringList> @@ -34,41 +36,32 @@ class RunConfiguration; class Target; } -namespace QmakeProjectManager { class QmakeProFile; } - -namespace QmakeAndroidSupport { +namespace Android { -namespace Internal { -class AndroidExtraLibraryListModel : public QAbstractItemModel +class ANDROID_EXPORT AndroidExtraLibraryListModel : public QAbstractItemModel { Q_OBJECT public: explicit AndroidExtraLibraryListModel(ProjectExplorer::Target *target, - QObject *parent = 0); + QObject *parent = nullptr); - QModelIndex index(int row, int column, const QModelIndex &parent) const; - QModelIndex parent(const QModelIndex &child) const; - int rowCount(const QModelIndex &parent) const; - int columnCount(const QModelIndex &parent) const; - QVariant data(const QModelIndex &index, int role) const; + QModelIndex index(int row, int column, const QModelIndex &parent) const override; + QModelIndex parent(const QModelIndex &child) const override; + int rowCount(const QModelIndex &parent) const override; + int columnCount(const QModelIndex &parent) const override; + QVariant data(const QModelIndex &index, int role) const override; void removeEntries(QModelIndexList list); void addEntries(const QStringList &list); - bool isEnabled() const; - signals: void enabledChanged(bool); private: - void proFileUpdated(QmakeProjectManager::QmakeProFile *pro); - void activeRunConfigurationChanged(); - QmakeProjectManager::QmakeProFile *activeProFile() const; + void updateModel(); ProjectExplorer::Target *m_target; QStringList m_entries; - QString m_scope; }; -} // namespace Internal -} // namespace QmakeAndroidSupport +} // namespace Android diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index c6f5a42e03..df678d1f74 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -48,7 +48,9 @@ #include <qtsupport/qtkitinformation.h> #include <qtsupport/qtsupportconstants.h> + #include <utils/algorithm.h> +#include <utils/qtcassert.h> #include <utils/synchronousprocess.h> #include <QDir> @@ -100,6 +102,9 @@ namespace { }; } // anonymous namespace + +using namespace Utils; + namespace Android { using namespace Internal; @@ -114,7 +119,7 @@ public: QString name; }; -typedef QMap<QString, Library> LibrariesMap; +using LibrariesMap = QMap<QString, Library>; static bool openXmlFile(QDomDocument &doc, const Utils::FileName &fileName); static bool openManifest(ProjectExplorer::Target *target, QDomDocument &doc); @@ -246,7 +251,7 @@ int AndroidManager::minimumSDK(const ProjectExplorer::Kit *kit) QString AndroidManager::buildTargetSDK(ProjectExplorer::Target *target) { - AndroidBuildApkStep *androidBuildApkStep + auto androidBuildApkStep = AndroidGlobal::buildStep<AndroidBuildApkStep>(target->activeBuildConfiguration()); if (androidBuildApkStep) return androidBuildApkStep->buildTargetSdk(); @@ -258,7 +263,7 @@ QString AndroidManager::buildTargetSDK(ProjectExplorer::Target *target) bool AndroidManager::signPackage(ProjectExplorer::Target *target) { - AndroidBuildApkStep *androidBuildApkStep + auto androidBuildApkStep = AndroidGlobal::buildStep<AndroidBuildApkStep>(target->activeBuildConfiguration()); if (androidBuildApkStep) return androidBuildApkStep->signPackage(); @@ -267,23 +272,46 @@ bool AndroidManager::signPackage(ProjectExplorer::Target *target) QString AndroidManager::targetArch(ProjectExplorer::Target *target) { - AndroidQtVersion *qt = static_cast<AndroidQtVersion *>(QtSupport::QtKitInformation::qtVersion(target->kit())); + auto qt = static_cast<AndroidQtVersion *>(QtSupport::QtKitInformation::qtVersion(target->kit())); return qt->targetArch(); } -Utils::FileName AndroidManager::dirPath(ProjectExplorer::Target *target) +Utils::FileName AndroidManager::dirPath(const ProjectExplorer::Target *target) { if (target->activeBuildConfiguration()) return target->activeBuildConfiguration()->buildDirectory().appendPath(QLatin1String(Constants::ANDROID_BUILDDIRECTORY)); return Utils::FileName(); } +Utils::FileName AndroidManager::apkPath(const ProjectExplorer::Target *target) +{ + QTC_ASSERT(target, return Utils::FileName()); + + auto buildApkStep + = Android::AndroidGlobal::buildStep<AndroidBuildApkStep>(target->activeBuildConfiguration()); + + if (!buildApkStep) + return Utils::FileName(); + + QString apkPath("build/outputs/apk/android-build-"); + if (buildApkStep->signPackage()) + apkPath += QLatin1String("release.apk"); + else + apkPath += QLatin1String("debug.apk"); + + return dirPath(target).appendPath(apkPath); +} + Utils::FileName AndroidManager::manifestSourcePath(ProjectExplorer::Target *target) { if (AndroidQtSupport *androidQtSupport = AndroidManager::androidQtSupport(target)) { - Utils::FileName source = androidQtSupport->manifestSourcePath(target); - if (!source.isEmpty()) - return source; + const QString packageSource + = androidQtSupport->targetData(Android::Constants::AndroidPackageSourceDir, target).toString(); + if (!packageSource.isEmpty()) { + const FileName manifest = FileName::fromUserInput(packageSource + "/AndroidManifest.xml"); + if (manifest.exists()) + return manifest; + } } return manifestPath(target); } @@ -300,7 +328,7 @@ Utils::FileName AndroidManager::defaultPropertiesPath(ProjectExplorer::Target *t bool AndroidManager::bundleQt(ProjectExplorer::Target *target) { - AndroidBuildApkStep *androidBuildApkStep + auto androidBuildApkStep = AndroidGlobal::buildStep<AndroidBuildApkStep>(target->activeBuildConfiguration()); if (androidBuildApkStep) return !androidBuildApkStep->useMinistro(); @@ -315,6 +343,8 @@ QString AndroidManager::deviceSerialNumber(ProjectExplorer::Target *target) void AndroidManager::setDeviceSerialNumber(ProjectExplorer::Target *target, const QString &deviceSerialNumber) { + qCDebug(androidManagerLog) << "Device serial for the target changed" + << target->displayName() << deviceSerialNumber; target->setNamedSettings(AndroidDeviceSn, deviceSerialNumber); } @@ -325,12 +355,14 @@ int AndroidManager::deviceApiLevel(ProjectExplorer::Target *target) void AndroidManager::setDeviceApiLevel(ProjectExplorer::Target *target, int level) { + qCDebug(androidManagerLog) << "Device API level for the target changed" + << target->displayName() << level; target->setNamedSettings(ApiLevelKey, level); } QPair<int, int> AndroidManager::apiLevelRange() { - return qMakePair(9, 26); + return qMakePair(16, 27); } QString AndroidManager::androidNameForApiLevel(int x) @@ -382,6 +414,8 @@ QString AndroidManager::androidNameForApiLevel(int x) return QLatin1String("Android 7.1"); case 26: return QLatin1String("Android 8.0"); + case 27: + return QLatin1String("Android 8.1"); default: return tr("Unknown Android version. API Level: %1").arg(QString::number(x)); } @@ -389,7 +423,7 @@ QString AndroidManager::androidNameForApiLevel(int x) static void raiseError(const QString &reason) { - QMessageBox::critical(0, AndroidManager::tr("Error creating Android templates."), reason); + QMessageBox::critical(nullptr, AndroidManager::tr("Error creating Android templates."), reason); } static bool openXmlFile(QDomDocument &doc, const Utils::FileName &fileName) @@ -516,27 +550,16 @@ bool AndroidManager::checkCertificateExists(const QString &keystorePath, return response.result == Utils::SynchronousProcessResponse::Finished && response.exitCode == 0; } -bool AndroidManager::checkForQt51Files(Utils::FileName fileName) -{ - fileName.appendPath(QLatin1String("android")).appendPath(QLatin1String("version.xml")); - if (!fileName.exists()) - return false; - QDomDocument dstVersionDoc; - if (!openXmlFile(dstVersionDoc, fileName)) - return false; - return dstVersionDoc.documentElement().attribute(QLatin1String("value")).toDouble() < 5.2; -} - AndroidQtSupport *AndroidManager::androidQtSupport(ProjectExplorer::Target *target) { for (AndroidQtSupport *provider : g_androidQtSupportProviders) { if (provider->canHandle(target)) return provider; } - return 0; + return nullptr; } -typedef QMap<QByteArray, QByteArray> GradleProperties; +using GradleProperties = QMap<QByteArray, QByteArray>; static GradleProperties readGradleProperties(const QString &path) { @@ -608,7 +631,8 @@ bool AndroidManager::updateGradleProperties(ProjectExplorer::Target *target) if (!qtSupport) return false; - Utils::FileName packageSourceDir = qtSupport->packageSourceDir(target); + QFileInfo sourceDirInfo(qtSupport->targetData(Constants::AndroidPackageSourceDir, target).toString()); + FileName packageSourceDir = FileName::fromString(sourceDirInfo.canonicalFilePath()); if (!packageSourceDir.appendPath("gradlew").exists()) return false; @@ -661,7 +685,7 @@ int AndroidManager::findApiLevel(const Utils::FileName &platformPath) void AndroidManager::runAdbCommandDetached(const QStringList &args) { - QProcess *process = new QProcess(); + auto process = new QProcess(); connect(process, static_cast<void (QProcess::*)(int)>(&QProcess::finished), process, &QObject::deleteLater); const QString adb = AndroidConfigurations::currentConfig().adbToolPath().toString(); diff --git a/src/plugins/android/androidmanager.h b/src/plugins/android/androidmanager.h index fcda5e46d4..444710ac91 100644 --- a/src/plugins/android/androidmanager.h +++ b/src/plugins/android/androidmanager.h @@ -74,10 +74,11 @@ public: static QString targetArch(ProjectExplorer::Target *target); - static Utils::FileName dirPath(ProjectExplorer::Target *target); + static Utils::FileName dirPath(const ProjectExplorer::Target *target); static Utils::FileName manifestPath(ProjectExplorer::Target *target); static Utils::FileName manifestSourcePath(ProjectExplorer::Target *target); static Utils::FileName defaultPropertiesPath(ProjectExplorer::Target *target); + static Utils::FileName apkPath(const ProjectExplorer::Target *target); static QPair<int, int> apiLevelRange(); static QString androidNameForApiLevel(int x); @@ -89,7 +90,6 @@ public: static bool checkCertificatePassword(const QString &keystorePath, const QString &keystorePasswd, const QString &alias, const QString &certificatePasswd); static bool checkCertificateExists(const QString &keystorePath, const QString &keystorePasswd, const QString &alias); - static bool checkForQt51Files(Utils::FileName fileName); static AndroidQtSupport *androidQtSupport(ProjectExplorer::Target *target); static bool updateGradleProperties(ProjectExplorer::Target *target); static int findApiLevel(const Utils::FileName &platformPath); diff --git a/src/plugins/android/androidmanifesteditor.cpp b/src/plugins/android/androidmanifesteditor.cpp index de0babde15..8e9ee762ff 100644 --- a/src/plugins/android/androidmanifesteditor.cpp +++ b/src/plugins/android/androidmanifesteditor.cpp @@ -38,7 +38,7 @@ using namespace Android; using namespace Internal; AndroidManifestEditor::AndroidManifestEditor(AndroidManifestEditorWidget *editorWidget) - : Core::IEditor(editorWidget), m_toolBar(0) + : Core::IEditor(editorWidget), m_toolBar(nullptr) { m_toolBar = new QToolBar(editorWidget); m_actionGroup = new QActionGroup(this); diff --git a/src/plugins/android/androidmanifesteditorfactory.cpp b/src/plugins/android/androidmanifesteditorfactory.cpp index 1d0bee2390..ce78388537 100644 --- a/src/plugins/android/androidmanifesteditorfactory.cpp +++ b/src/plugins/android/androidmanifesteditorfactory.cpp @@ -49,6 +49,6 @@ AndroidManifestEditorFactory::AndroidManifestEditorFactory() Core::IEditor *AndroidManifestEditorFactory::createEditor() { - AndroidManifestEditorWidget *androidManifestEditorWidget = new AndroidManifestEditorWidget(); + auto androidManifestEditorWidget = new AndroidManifestEditorWidget(); return androidManifestEditorWidget->editor(); } diff --git a/src/plugins/android/androidmanifesteditorfactory.h b/src/plugins/android/androidmanifesteditorfactory.h index c13d4e14b0..82d26b2f4a 100644 --- a/src/plugins/android/androidmanifesteditorfactory.h +++ b/src/plugins/android/androidmanifesteditorfactory.h @@ -37,7 +37,7 @@ class AndroidManifestEditorFactory : public Core::IEditorFactory public: AndroidManifestEditorFactory(); - Core::IEditor *createEditor(); + Core::IEditor *createEditor() override; }; } // namespace Internal diff --git a/src/plugins/android/androidmanifesteditorwidget.cpp b/src/plugins/android/androidmanifesteditorwidget.cpp index 91e8a43b64..6117e91774 100644 --- a/src/plugins/android/androidmanifesteditorwidget.cpp +++ b/src/plugins/android/androidmanifesteditorwidget.cpp @@ -25,6 +25,7 @@ #include "androidmanifesteditorwidget.h" #include "androidmanifesteditor.h" +#include "androidconfigurations.h" #include "androidconstants.h" #include "androidmanifestdocument.h" #include "androidmanager.h" @@ -34,6 +35,7 @@ #include <coreplugin/infobar.h> #include <coreplugin/editormanager/ieditor.h> +#include <projectexplorer/buildconfiguration.h> #include <projectexplorer/project.h> #include <projectexplorer/projectwindow.h> #include <projectexplorer/session.h> @@ -93,7 +95,7 @@ Project *androidProject(const Utils::FileName &fileName) && fileName.isChildOf(project->projectDirectory())) return project; } - return 0; + return nullptr; } } // anonymous namespace @@ -127,15 +129,15 @@ void AndroidManifestEditorWidget::initializePage() { QWidget *mainWidget = new QWidget; // different name - QVBoxLayout *topLayout = new QVBoxLayout(mainWidget); + auto topLayout = new QVBoxLayout(mainWidget); - QGroupBox *packageGroupBox = new QGroupBox(mainWidget); + auto packageGroupBox = new QGroupBox(mainWidget); topLayout->addWidget(packageGroupBox); auto setDirtyFunc = [this] { setDirty(); }; packageGroupBox->setTitle(tr("Package")); { - QFormLayout *formLayout = new QFormLayout(); + auto formLayout = new QFormLayout(); m_packageNameLineEdit = new QLineEdit(packageGroupBox); m_packageNameLineEdit->setToolTip(tr( @@ -161,7 +163,7 @@ void AndroidManifestEditorWidget::initializePage() m_packageNameWarningIcon->setVisible(false); m_packageNameWarningIcon->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - QHBoxLayout *warningRow = new QHBoxLayout; + auto warningRow = new QHBoxLayout; warningRow->setMargin(0); warningRow->addWidget(m_packageNameWarningIcon); warningRow->addWidget(m_packageNameWarning); @@ -213,12 +215,12 @@ void AndroidManifestEditorWidget::initializePage() } // Application - QGroupBox *applicationGroupBox = new QGroupBox(mainWidget); + auto applicationGroupBox = new QGroupBox(mainWidget); topLayout->addWidget(applicationGroupBox); applicationGroupBox->setTitle(tr("Application")); { - QFormLayout *formLayout = new QFormLayout(); + auto formLayout = new QFormLayout(); m_appNameLineEdit = new QLineEdit(applicationGroupBox); formLayout->addRow(tr("Application name:"), m_appNameLineEdit); @@ -232,7 +234,7 @@ void AndroidManifestEditorWidget::initializePage() m_targetLineEdit->installEventFilter(this); formLayout->addRow(tr("Run:"), m_targetLineEdit); - QHBoxLayout *iconLayout = new QHBoxLayout(); + auto iconLayout = new QHBoxLayout(); m_lIconButton = new QToolButton(applicationGroupBox); m_lIconButton->setMinimumSize(QSize(48, 48)); m_lIconButton->setMaximumSize(QSize(48, 48)); @@ -276,12 +278,12 @@ void AndroidManifestEditorWidget::initializePage() // Permissions - QGroupBox *permissionsGroupBox = new QGroupBox(mainWidget); + auto permissionsGroupBox = new QGroupBox(mainWidget); topLayout->addWidget(permissionsGroupBox); permissionsGroupBox->setTitle(tr("Permissions")); { - QGridLayout *layout = new QGridLayout(permissionsGroupBox); + auto layout = new QGridLayout(permissionsGroupBox); m_defaultPermissonsCheckBox = new QCheckBox(this); m_defaultPermissonsCheckBox->setText(tr("Include default permissions for Qt modules.")); @@ -459,7 +461,7 @@ void AndroidManifestEditorWidget::initializePage() topLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Fixed, QSizePolicy::MinimumExpanding)); - QScrollArea *mainWidgetScrollArea = new QScrollArea; + auto mainWidgetScrollArea = new QScrollArea; mainWidgetScrollArea->setWidgetResizable(true); mainWidgetScrollArea->setWidget(mainWidget); mainWidgetScrollArea->setFocusProxy(m_packageNameLineEdit); @@ -605,9 +607,15 @@ void AndroidManifestEditorWidget::postSave() ProjectExplorer::Project *project = androidProject(docPath); if (project) { if (Target *target = project->activeTarget()) { - AndroidQtSupport *androidQtSupport = AndroidManager::androidQtSupport(target); - if (androidQtSupport) - androidQtSupport->manifestSaved(target); + if (BuildConfiguration *bc = target->activeBuildConfiguration()) { + QString androidNdkPlatform = AndroidConfigurations::currentConfig() + .bestNdkPlatformMatch(AndroidManager::minimumSDK(target)); + if (m_androidNdkPlatform != androidNdkPlatform) { + m_androidNdkPlatform = androidNdkPlatform; + bc->updateCacheAndEmitEnvironmentChanged(); + bc->regenerateBuildFiles(nullptr); + } + } } } } diff --git a/src/plugins/android/androidmanifesteditorwidget.h b/src/plugins/android/androidmanifesteditorwidget.h index 59a879aa3c..a9d21e44a3 100644 --- a/src/plugins/android/androidmanifesteditorwidget.h +++ b/src/plugins/android/androidmanifesteditorwidget.h @@ -58,16 +58,16 @@ class PermissionsModel: public QAbstractListModel { Q_OBJECT public: - PermissionsModel(QObject *parent = 0 ); + PermissionsModel(QObject *parent = nullptr); void setPermissions(const QStringList &permissions); const QStringList &permissions(); QModelIndex addPermission(const QString &permission); bool updatePermission(const QModelIndex &index, const QString &permission); void removePermission(int index); - QVariant data(const QModelIndex &index, int role) const; + QVariant data(const QModelIndex &index, int role) const override; protected: - int rowCount(const QModelIndex &parent) const; + int rowCount(const QModelIndex &parent) const override; private: QStringList m_permissions; @@ -77,7 +77,7 @@ class AndroidManifestTextEditorWidget : public TextEditor::TextEditorWidget { public: explicit AndroidManifestTextEditorWidget(AndroidManifestEditorWidget *parent); - ~AndroidManifestTextEditorWidget(); + ~AndroidManifestTextEditorWidget() override; private: Core::IContext *m_context; @@ -111,8 +111,8 @@ signals: void guiChanged(); protected: - bool eventFilter(QObject *obj, QEvent *event); - void focusInEvent(QFocusEvent *event); + bool eventFilter(QObject *obj, QEvent *event) override; + void focusInEvent(QFocusEvent *event) override; private: void setLDPIIcon(); @@ -191,6 +191,7 @@ private: QTimer m_timerParseCheck; TextEditor::TextEditorWidget *m_textEditorWidget; AndroidManifestEditor *m_editor; + QString m_androidNdkPlatform; }; } // namespace Internal } // namespace Android diff --git a/src/plugins/android/androidpackageinstallationstep.cpp b/src/plugins/android/androidpackageinstallationstep.cpp index fa69951e82..3148fbc42d 100644 --- a/src/plugins/android/androidpackageinstallationstep.cpp +++ b/src/plugins/android/androidpackageinstallationstep.cpp @@ -155,7 +155,7 @@ AndroidPackageInstallationFactory::AndroidPackageInstallationFactory() setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); setSupportedDeviceType(Android::Constants::ANDROID_DEVICE_TYPE); setRepeatable(false); - setDisplayName(tr("Deploy to device")); + setDisplayName(AndroidPackageInstallationStep::tr("Deploy to device")); } } // namespace Internal diff --git a/src/plugins/android/androidpackageinstallationstep.h b/src/plugins/android/androidpackageinstallationstep.h index bf0a4653b8..40174ef1c6 100644 --- a/src/plugins/android/androidpackageinstallationstep.h +++ b/src/plugins/android/androidpackageinstallationstep.h @@ -68,8 +68,6 @@ private: class AndroidPackageInstallationFactory: public ProjectExplorer::BuildStepFactory { - Q_OBJECT - public: AndroidPackageInstallationFactory(); }; diff --git a/src/plugins/android/androidplugin.cpp b/src/plugins/android/androidplugin.cpp index 3e5ace89e8..70d247476d 100644 --- a/src/plugins/android/androidplugin.cpp +++ b/src/plugins/android/androidplugin.cpp @@ -70,6 +70,10 @@ public: registerRunConfiguration<Android::AndroidRunConfiguration> ("Qt4ProjectManager.AndroidRunConfiguration:"); addSupportedTargetDeviceType(Android::Constants::ANDROID_DEVICE_TYPE); + addRunWorkerFactory<AndroidRunSupport>(NORMAL_RUN_MODE); + addRunWorkerFactory<AndroidDebugSupport>(DEBUG_RUN_MODE); + addRunWorkerFactory<AndroidQmlToolingSupport>(QML_PROFILER_RUN_MODE); + addRunWorkerFactory<AndroidQmlToolingSupport>(QML_PREVIEW_RUN_MODE); } }; @@ -88,6 +92,7 @@ public: AndroidPackageInstallationFactory packackeInstallationFactory; AndroidManifestEditorFactory manifestEditorFactory; AndroidRunConfigurationFactory runConfigFactory; + AndroidBuildApkStepFactory buildApkStepFactory; }; AndroidPlugin::~AndroidPlugin() @@ -100,16 +105,9 @@ bool AndroidPlugin::initialize(const QStringList &arguments, QString *errorMessa Q_UNUSED(arguments); Q_UNUSED(errorMessage); - RunControl::registerWorker<AndroidRunConfiguration, AndroidRunSupport>(NORMAL_RUN_MODE); - RunControl::registerWorker<AndroidRunConfiguration, AndroidDebugSupport>(DEBUG_RUN_MODE); - RunControl::registerWorker<AndroidRunConfiguration, AndroidQmlToolingSupport>( - QML_PROFILER_RUN_MODE); - RunControl::registerWorker<AndroidRunConfiguration, AndroidQmlToolingSupport>( - QML_PREVIEW_RUN_MODE); - RunControl::registerWorker(QML_PREVIEW_RUN_MODE, [](RunControl *runControl) -> RunWorker* { const Runnable runnable = runControl->runConfiguration()->runnable(); - return new AndroidQmlToolingSupport(runControl, runnable.executable, runnable.commandLineArguments); + return new AndroidQmlToolingSupport(runControl, runnable.executable); }, [](RunConfiguration *runConfig) { return runConfig->isEnabled() && runConfig->id().name().startsWith("QmlProjectManager.QmlRunConfiguration") @@ -119,7 +117,7 @@ bool AndroidPlugin::initialize(const QStringList &arguments, QString *errorMessa d = new AndroidPluginPrivate; - KitManager::registerKitInformation(new Internal::AndroidGdbServerKitInformation); + KitManager::registerKitInformation<Internal::AndroidGdbServerKitInformation>(); connect(KitManager::instance(), &KitManager::kitsLoaded, this, &AndroidPlugin::kitsRestored); @@ -132,7 +130,7 @@ void AndroidPlugin::kitsRestored() AndroidConfigurations::updateAutomaticKitList(); connect(QtSupport::QtVersionManager::instance(), &QtSupport::QtVersionManager::qtVersionsChanged, AndroidConfigurations::instance(), &AndroidConfigurations::updateAutomaticKitList); - disconnect(KitManager::instance(), &KitManager::kitsChanged, + disconnect(KitManager::instance(), &KitManager::kitsLoaded, this, &AndroidPlugin::kitsRestored); } diff --git a/src/plugins/android/androidqmltoolingsupport.cpp b/src/plugins/android/androidqmltoolingsupport.cpp index d46311b2a4..001ad3d2d7 100644 --- a/src/plugins/android/androidqmltoolingsupport.cpp +++ b/src/plugins/android/androidqmltoolingsupport.cpp @@ -31,14 +31,13 @@ using namespace ProjectExplorer; namespace Android { namespace Internal { -AndroidQmlToolingSupport::AndroidQmlToolingSupport( - RunControl *runControl, const QString &intentName, const QString &extraAppParams, - const Utils::Environment &extraEnvVars) +AndroidQmlToolingSupport::AndroidQmlToolingSupport(RunControl *runControl, + const QString &intentName) : RunWorker(runControl) { setDisplayName("AndroidQmlToolingSupport"); - auto runner = new AndroidRunner(runControl, intentName, extraAppParams, extraEnvVars); + auto runner = new AndroidRunner(runControl, intentName); addStartDependency(runner); auto profiler = runControl->createWorker(runControl->runMode()); diff --git a/src/plugins/android/androidqmltoolingsupport.h b/src/plugins/android/androidqmltoolingsupport.h index 2d71ec48b3..5e1d00aa3b 100644 --- a/src/plugins/android/androidqmltoolingsupport.h +++ b/src/plugins/android/androidqmltoolingsupport.h @@ -36,10 +36,8 @@ class AndroidQmlToolingSupport : public ProjectExplorer::RunWorker Q_OBJECT public: - explicit AndroidQmlToolingSupport( - ProjectExplorer::RunControl *runControl, const QString &intentName = QString(), - const QString &extraAppParams = QString(), - const Utils::Environment &extraEnvVars = Utils::Environment()); + explicit AndroidQmlToolingSupport(ProjectExplorer::RunControl *runControl, + const QString &intentName = QString()); private: void start() override; diff --git a/src/plugins/android/androidqtsupport.cpp b/src/plugins/android/androidqtsupport.cpp deleted file mode 100644 index 012aa696e2..0000000000 --- a/src/plugins/android/androidqtsupport.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 BogDan Vatra <bog_dan_ro@yahoo.com> -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "androidbuildapkstep.h" -#include "androidconstants.h" -#include "androidglobal.h" -#include "androidqtsupport.h" - -#include <projectexplorer/target.h> - -Utils::FileName Android::AndroidQtSupport::apkPath(const ProjectExplorer::Target *target) const -{ - if (!target) - return Utils::FileName(); - - AndroidBuildApkStep *buildApkStep - = Android::AndroidGlobal::buildStep<AndroidBuildApkStep>(target->activeBuildConfiguration()); - - if (!buildApkStep) - return Utils::FileName(); - - QString apkPath("build/outputs/apk/android-build-"); - if (buildApkStep->signPackage()) - apkPath += QLatin1String("release.apk"); - else - apkPath += QLatin1String("debug.apk"); - - return target->activeBuildConfiguration()->buildDirectory() - .appendPath(QLatin1String(Android::Constants::ANDROID_BUILDDIRECTORY)) - .appendPath(apkPath); -} diff --git a/src/plugins/android/androidqtsupport.h b/src/plugins/android/androidqtsupport.h index ec5d569495..7b8c6bd2b8 100644 --- a/src/plugins/android/androidqtsupport.h +++ b/src/plugins/android/androidqtsupport.h @@ -27,19 +27,23 @@ #include "android_global.h" +#include <coreplugin/id.h> + #include <QObject> -#include <QList> -namespace ProjectExplorer { - class DeployConfiguration; - class ProcessParameters; - class Project; - class Target; -} +namespace ProjectExplorer { class Target; } namespace Utils { class FileName; } namespace Android { +namespace Constants { + +const char AndroidPackageSourceDir[] = "AndroidPackageSourceDir"; // QString +const char AndroidDeploySettingsFile[] = "AndroidDeploySettingsFile"; // QString +const char AndroidExtraLibs[] = "AndroidExtraLibs"; // QStringList +const char AndroidArch[] = "AndroidArch"; // QString + +} // namespace Constants class ANDROID_EXPORT AndroidQtSupport : public QObject { @@ -58,15 +62,19 @@ public: virtual bool canHandle(const ProjectExplorer::Target *target) const = 0; virtual QStringList soLibSearchPath(const ProjectExplorer::Target *target) const = 0; - virtual QStringList androidExtraLibs(const ProjectExplorer::Target *target) const = 0; virtual QStringList projectTargetApplications(const ProjectExplorer::Target *target) const = 0; - virtual Utils::FileName apkPath(const ProjectExplorer::Target *target) const; - virtual Utils::FileName androiddeployqtPath(const ProjectExplorer::Target *target) const = 0; - virtual Utils::FileName androiddeployJsonPath(const ProjectExplorer::Target *target) const = 0; - virtual void manifestSaved(const ProjectExplorer::Target *target) = 0; - virtual Utils::FileName manifestSourcePath(const ProjectExplorer::Target *target) = 0; - virtual QString deploySettingsFile(const ProjectExplorer::Target *target) const = 0; - virtual Utils::FileName packageSourceDir(const ProjectExplorer::Target *target) const = 0; + + virtual QVariant targetData(Core::Id role, const ProjectExplorer::Target *target) const = 0; + virtual bool setTargetData(Core::Id role, const QVariant &value, + const ProjectExplorer::Target *target) const = 0; + + virtual bool parseInProgress(const ProjectExplorer::Target *target) const = 0; + virtual bool validParse(const ProjectExplorer::Target *target) const = 0; + virtual bool extraLibraryEnabled(const ProjectExplorer::Target *target) const = 0; + virtual Utils::FileName projectFilePath(const ProjectExplorer::Target *target) const = 0; + + virtual void addFiles(const ProjectExplorer::Target *target, const QString &buildKey, + const QStringList &addedFiles) const = 0; }; } // namespace Android diff --git a/src/plugins/android/androidqtversion.h b/src/plugins/android/androidqtversion.h index 865c31e65c..62bbd930c6 100644 --- a/src/plugins/android/androidqtversion.h +++ b/src/plugins/android/androidqtversion.h @@ -40,23 +40,23 @@ public: AndroidQtVersion(); AndroidQtVersion(const Utils::FileName &path, bool isAutodetected = false, const QString &autodetectionSource = QString()); - AndroidQtVersion *clone() const; - QString type() const; - bool isValid() const; - QString invalidReason() const; + AndroidQtVersion *clone() const override; + QString type() const override; + bool isValid() const override; + QString invalidReason() const override; - QList<ProjectExplorer::Abi> detectQtAbis() const; + QList<ProjectExplorer::Abi> detectQtAbis() const override; - void addToEnvironment(const ProjectExplorer::Kit *k, Utils::Environment &env) const; - Utils::Environment qmakeRunEnvironment() const; + void addToEnvironment(const ProjectExplorer::Kit *k, Utils::Environment &env) const override; + Utils::Environment qmakeRunEnvironment() const override; - QSet<Core::Id> availableFeatures() const; - QSet<Core::Id> targetDeviceTypes() const; + QSet<Core::Id> availableFeatures() const override; + QSet<Core::Id> targetDeviceTypes() const override; - QString description() const; + QString description() const override; QString targetArch() const; protected: - virtual void parseMkSpec(ProFileEvaluator *) const; + void parseMkSpec(ProFileEvaluator *) const override; private: mutable QString m_targetArch; }; diff --git a/src/plugins/android/androidqtversionfactory.cpp b/src/plugins/android/androidqtversionfactory.cpp index 91ee664d95..00df010def 100644 --- a/src/plugins/android/androidqtversionfactory.cpp +++ b/src/plugins/android/androidqtversionfactory.cpp @@ -48,8 +48,8 @@ bool AndroidQtVersionFactory::canRestore(const QString &type) QtSupport::BaseQtVersion *AndroidQtVersionFactory::restore(const QString &type, const QVariantMap &data) { - QTC_ASSERT(canRestore(type), return 0); - AndroidQtVersion *v = new AndroidQtVersion; + QTC_ASSERT(canRestore(type), return nullptr); + auto v = new AndroidQtVersion; v->fromMap(data); return v; } @@ -63,12 +63,12 @@ QtSupport::BaseQtVersion *AndroidQtVersionFactory::create(const Utils::FileName { QFileInfo fi = qmakePath.toFileInfo(); if (!fi.exists() || !fi.isExecutable() || !fi.isFile()) - return 0; + return nullptr; if (!evaluator->values(QLatin1String("CONFIG")).contains(QLatin1String("android")) && evaluator->value(QLatin1String("QMAKE_PLATFORM")) != QLatin1String("android")) - return 0; + return nullptr; if (evaluator->values(QLatin1String("CONFIG")).contains(QLatin1String("android-no-sdk"))) - return 0; + return nullptr; return new AndroidQtVersion(qmakePath, isAutoDetected, autoDetectionSource); } diff --git a/src/plugins/android/androidqtversionfactory.h b/src/plugins/android/androidqtversionfactory.h index 8f551b9b86..92d2e44725 100644 --- a/src/plugins/android/androidqtversionfactory.h +++ b/src/plugins/android/androidqtversionfactory.h @@ -33,14 +33,14 @@ namespace Internal { class AndroidQtVersionFactory : public QtSupport::QtVersionFactory { public: - explicit AndroidQtVersionFactory(QObject *parent = 0); + explicit AndroidQtVersionFactory(QObject *parent = nullptr); - bool canRestore(const QString &type); - QtSupport::BaseQtVersion *restore(const QString &type, const QVariantMap &data); + bool canRestore(const QString &type) override; + QtSupport::BaseQtVersion *restore(const QString &type, const QVariantMap &data) override; - int priority() const; + int priority() const override; QtSupport::BaseQtVersion *create(const Utils::FileName &qmakePath, ProFileEvaluator *evaluator, - bool isAutoDetected = false, const QString &autoDetectionSource = QString()); + bool isAutoDetected = false, const QString &autoDetectionSource = QString()) override; }; } // namespace Internal diff --git a/src/plugins/android/androidrunconfiguration.cpp b/src/plugins/android/androidrunconfiguration.cpp index 65505992fa..9948f69b5d 100644 --- a/src/plugins/android/androidrunconfiguration.cpp +++ b/src/plugins/android/androidrunconfiguration.cpp @@ -30,6 +30,7 @@ #include "androidtoolchain.h" #include "androidmanager.h" #include "adbcommandswidget.h" +#include "androidrunenvironmentaspect.h" #include <projectexplorer/kitinformation.h> #include <projectexplorer/project.h> @@ -110,6 +111,9 @@ void BaseStringListAspect::setLabel(const QString &label) AndroidRunConfiguration::AndroidRunConfiguration(Target *target, Core::Id id) : RunConfiguration(target, id) { + addExtraAspect(new AndroidRunEnvironmentAspect(this)); + addExtraAspect(new ArgumentsAspect(this)); + auto amStartArgsAspect = new BaseStringAspect(this); amStartArgsAspect->setId(Constants::ANDROID_AMSTARTARGS); amStartArgsAspect->setSettingsKey("Android.AmStartArgsKey"); @@ -141,6 +145,7 @@ QWidget *AndroidRunConfiguration::createConfigurationWidget() auto widget = new QWidget; auto layout = new QFormLayout(widget); + extraAspect<ArgumentsAspect>()->addToConfigurationLayout(layout); extraAspect(Constants::ANDROID_AMSTARTARGS)->addToConfigurationLayout(layout); auto warningIconLabel = new QLabel; @@ -151,6 +156,7 @@ QWidget *AndroidRunConfiguration::createConfigurationWidget() extraAspect(Constants::ANDROID_PRESTARTSHELLCMDLIST)->addToConfigurationLayout(layout); extraAspect(Constants::ANDROID_POSTFINISHSHELLCMDLIST)->addToConfigurationLayout(layout); + extraAspect<AndroidRunEnvironmentAspect>()->addToConfigurationLayout(layout); auto wrapped = wrapWidget(widget); auto detailsWidget = qobject_cast<DetailsWidget *>(wrapped); diff --git a/src/plugins/android/androidruncontrol.cpp b/src/plugins/android/androidruncontrol.cpp index 5c5f0e6a5e..9f6db54043 100644 --- a/src/plugins/android/androidruncontrol.cpp +++ b/src/plugins/android/androidruncontrol.cpp @@ -38,10 +38,8 @@ using namespace ProjectExplorer; namespace Android { namespace Internal { -AndroidRunSupport::AndroidRunSupport(RunControl *runControl, const QString &intentName, - const QString &extraAppParams, - const Utils::Environment &extraEnvVars) - : AndroidRunner(runControl, intentName, extraAppParams, extraEnvVars) +AndroidRunSupport::AndroidRunSupport(RunControl *runControl, const QString &intentName) + : AndroidRunner(runControl, intentName) { runControl->setIcon(Utils::Icons::RUN_SMALL_TOOLBAR); } diff --git a/src/plugins/android/androidruncontrol.h b/src/plugins/android/androidruncontrol.h index 974367929b..3fa963812e 100644 --- a/src/plugins/android/androidruncontrol.h +++ b/src/plugins/android/androidruncontrol.h @@ -40,9 +40,7 @@ class AndroidRunSupport : public AndroidRunner public: explicit AndroidRunSupport(ProjectExplorer::RunControl *runControl, - const QString &intentName = QString(), - const QString &extraAppParams = QString(), - const Utils::Environment &extraEnvVars = Utils::Environment()); + const QString &intentName = QString()); ~AndroidRunSupport() override; void start() override; diff --git a/src/plugins/android/androidrunenvironmentaspect.cpp b/src/plugins/android/androidrunenvironmentaspect.cpp new file mode 100644 index 0000000000..d2949de6b9 --- /dev/null +++ b/src/plugins/android/androidrunenvironmentaspect.cpp @@ -0,0 +1,48 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ +#include "androidrunenvironmentaspect.h" + +namespace { +enum BaseEnvironmentBase { + CleanEnvironmentBase +}; +} + +namespace Android { + +AndroidRunEnvironmentAspect::AndroidRunEnvironmentAspect(ProjectExplorer::RunConfiguration *rc) : + ProjectExplorer::EnvironmentAspect (rc) +{ + addSupportedBaseEnvironment(CleanEnvironmentBase, tr("Clean Environment")); +} + +Utils::Environment AndroidRunEnvironmentAspect::baseEnvironment() const +{ + // Clean Environment + return Utils::Environment(); +} + +} // namespace Android + diff --git a/src/plugins/resourceeditor/qrceditor/test/mainwindow.h b/src/plugins/android/androidrunenvironmentaspect.h index d47b43e374..2b91bfafa1 100644 --- a/src/plugins/resourceeditor/qrceditor/test/mainwindow.h +++ b/src/plugins/android/androidrunenvironmentaspect.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2018 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt Creator. @@ -22,23 +22,21 @@ ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ****************************************************************************/ - #pragma once -#include <QMainWindow> +#include <projectexplorer/environmentaspect.h> -namespace SharedTools { class QrcEditor; } +namespace Android { -class MainWindow : public QMainWindow +class AndroidRunEnvironmentAspect : public ProjectExplorer::EnvironmentAspect { Q_OBJECT public: - MainWindow(); - -private: - void slotOpen(); - void slotSave(); + AndroidRunEnvironmentAspect(ProjectExplorer::RunConfiguration *rc); - SharedTools::QrcEditor *m_qrcEditor; + Utils::Environment baseEnvironment() const override; }; + +} // namespace Android + diff --git a/src/plugins/android/androidrunner.cpp b/src/plugins/android/androidrunner.cpp index 06475a3118..a70c9f04dc 100644 --- a/src/plugins/android/androidrunner.cpp +++ b/src/plugins/android/androidrunner.cpp @@ -42,6 +42,12 @@ #include <projectexplorer/target.h> #include <utils/url.h> +#include <QLoggingCategory> + +namespace { +Q_LOGGING_CATEGORY(androidRunnerLog, "qtc.android.run.androidrunner") +} + using namespace ProjectExplorer; using namespace Utils; @@ -112,10 +118,7 @@ using namespace Utils; namespace Android { namespace Internal { -AndroidRunner::AndroidRunner(RunControl *runControl, - const QString &intentName, - const QString &extraAppParams, - const Utils::Environment &extraEnvVars) +AndroidRunner::AndroidRunner(RunControl *runControl, const QString &intentName) : RunWorker(runControl), m_target(runControl->runConfiguration()->target()) { setDisplayName("AndroidRunner"); @@ -131,13 +134,14 @@ AndroidRunner::AndroidRunner(RunControl *runControl, QString intent = intentName.isEmpty() ? AndroidManager::intentName(m_target) : intentName; m_packageName = intent.left(intent.indexOf('/')); + qCDebug(androidRunnerLog) << "Intent name:" << intent << "Package name" << m_packageName; const int apiLevel = AndroidManager::deviceApiLevel(m_target); + qCDebug(androidRunnerLog) << "Device API:" << apiLevel; + m_worker.reset(new AndroidRunnerWorker(this, m_packageName)); m_worker->setIntentName(intent); m_worker->setIsPreNougat(apiLevel <= 23); - m_worker->setExtraAppParams(extraAppParams); - m_worker->setExtraEnvVars(extraEnvVars); m_worker->moveToThread(&m_thread); @@ -169,7 +173,7 @@ AndroidRunner::~AndroidRunner() void AndroidRunner::start() { if (!ProjectExplorerPlugin::projectExplorerSettings().deployBeforeRun) { - // User choose to run the app without deployment. Start the AVD if not running. + qCDebug(androidRunnerLog) << "Run without deployment"; launchAVD(); if (!m_launchedAVDName.isEmpty()) { m_checkAVDTimer.start(); @@ -201,6 +205,7 @@ void AndroidRunner::qmlServerPortReady(Port port) serverUrl.setHost(QHostAddress(QHostAddress::LocalHost).toString()); serverUrl.setPort(port.number()); serverUrl.setScheme(urlTcpScheme()); + qCDebug(androidRunnerLog) << "Qml Server port ready"<< serverUrl; emit qmlServerReady(serverUrl); } diff --git a/src/plugins/android/androidrunner.h b/src/plugins/android/androidrunner.h index c1cd170c68..d56b59c001 100644 --- a/src/plugins/android/androidrunner.h +++ b/src/plugins/android/androidrunner.h @@ -50,9 +50,7 @@ class AndroidRunner : public ProjectExplorer::RunWorker public: explicit AndroidRunner(ProjectExplorer::RunControl *runControl, - const QString &intentName = QString(), - const QString &extraAppParams = QString(), - const Utils::Environment &extraEnvVars = Utils::Environment()); + const QString &intentName = QString()); ~AndroidRunner() override; Utils::Port gdbServerPort() const { return m_gdbServerPort; } diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp index 39239bf642..3015f3f28d 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -31,6 +31,8 @@ #include "androidrunconfiguration.h" #include <debugger/debuggerrunconfigurationaspect.h> +#include <projectexplorer/environmentaspect.h> +#include <projectexplorer/runconfigurationaspects.h> #include <projectexplorer/target.h> #include <qtsupport/baseqtversion.h> #include <qtsupport/qtkitinformation.h> @@ -38,13 +40,19 @@ #include <utils/runextensions.h> #include <utils/synchronousprocess.h> #include <utils/temporaryfile.h> +#include <utils/qtcprocess.h> #include <utils/url.h> +#include <QLoggingCategory> #include <QTcpServer> #include <QThread> #include <chrono> +namespace { +Q_LOGGING_CATEGORY(androidRunWorkerLog, "qtc.android.run.androidrunnerworker") +} + using namespace std; using namespace std::placeholders; using namespace ProjectExplorer; @@ -105,6 +113,7 @@ static void findProcessPID(QFutureInterface<qint64> &fi, const QString &adbPath, QStringList selector, const QString &packageName, bool preNougat) { + qCDebug(androidRunWorkerLog) << "Finding PID. PreNougat:" << preNougat; if (packageName.isEmpty()) return; @@ -125,17 +134,20 @@ static void findProcessPID(QFutureInterface<qint64> &fi, const QString &adbPath, } } while (processPID == -1 && !isTimedOut(start) && !fi.isCanceled()); + qCDebug(androidRunWorkerLog) << "PID found:" << processPID; if (!fi.isCanceled()) fi.reportResult(processPID); } static void deleter(QProcess *p) { + qCDebug(androidRunWorkerLog) << "Killing process:" << p->objectName(); p->terminate(); if (!p->waitForFinished(1000)) { p->kill(); p->waitForFinished(); } + qCDebug(androidRunWorkerLog) << "Done killing process:" << p->objectName(); // Might get deleted from its own signal handler. p->deleteLater(); } @@ -165,12 +177,14 @@ AndroidRunnerWorker::AndroidRunnerWorker(RunWorker *runner, const QString &packa m_localGdbServerPort = Utils::Port(5039); QTC_CHECK(m_localGdbServerPort.isValid()); if (m_qmlDebugServices != QmlDebug::NoQmlDebugServices) { + qCDebug(androidRunWorkerLog) << "QML debugging enabled"; QTcpServer server; QTC_ASSERT(server.listen(QHostAddress::LocalHost), qDebug() << tr("No free ports available on host for QML debugging.")); m_qmlServer.setScheme(Utils::urlTcpScheme()); m_qmlServer.setHost(server.serverAddress().toString()); m_qmlServer.setPort(server.serverPort()); + qCDebug(androidRunWorkerLog) << "QML server:" << m_qmlServer.toDisplayString(); } m_adb = AndroidConfigurations::currentConfig().adbToolPath().toString(); m_localJdbServerPort = Utils::Port(5038); @@ -180,6 +194,12 @@ AndroidRunnerWorker::AndroidRunnerWorker(RunWorker *runner, const QString &packa m_deviceSerialNumber = AndroidManager::deviceSerialNumber(target); m_apiLevel = AndroidManager::deviceApiLevel(target); + m_extraEnvVars = runConfig->extraAspect<EnvironmentAspect>()->environment(); + qCDebug(androidRunWorkerLog) << "Environment variables for the app" + << m_extraEnvVars.toStringList(); + + m_extraAppParams = runConfig->runnable().commandLineArguments; + if (auto aspect = runConfig->extraAspect(Constants::ANDROID_AMSTARTARGS)) m_amStartExtraArgs = static_cast<BaseStringAspect *>(aspect)->value().split(' '); @@ -196,6 +216,12 @@ AndroidRunnerWorker::AndroidRunnerWorker(RunWorker *runner, const QString &packa } for (const QString &shellCmd : runner->recordedData(Constants::ANDROID_POSTFINISHSHELLCMDLIST).toStringList()) m_afterFinishAdbCommands.append(QString("shell %1").arg(shellCmd)); + + qCDebug(androidRunWorkerLog) << "Device Serial:" << m_deviceSerialNumber + << "API level:" << m_apiLevel + << "Extra Start Args:" << m_amStartExtraArgs + << "Before Start ADB cmds:" << m_beforeStartAdbCommands + << "After finish ADB cmds:" << m_afterFinishAdbCommands; } AndroidRunnerWorker::~AndroidRunnerWorker() @@ -231,12 +257,16 @@ bool AndroidRunnerWorker::adbShellAmNeedsQuotes() bool AndroidRunnerWorker::runAdb(const QStringList &args, int timeoutS) { + QStringList adbArgs = selector() + args; + qCDebug(androidRunWorkerLog) << "ADB command: " << m_adb << adbArgs.join(' '); Utils::SynchronousProcess adb; adb.setTimeoutS(timeoutS); - Utils::SynchronousProcessResponse response = adb.run(m_adb, selector() + args); + Utils::SynchronousProcessResponse response = adb.run(m_adb, adbArgs); m_lastRunAdbError = response.exitMessage(m_adb, timeoutS); m_lastRunAdbRawOutput = response.allRawOutput(); - return response.result == Utils::SynchronousProcessResponse::Finished; + bool success = response.result == Utils::SynchronousProcessResponse::Finished; + qCDebug(androidRunWorkerLog) << "ADB command result:" << success << response.allRawOutput(); + return success; } void AndroidRunnerWorker::adbKill(qint64 pid) @@ -342,6 +372,8 @@ void AndroidRunnerWorker::setAndroidDeviceInfo(const AndroidDeviceInfo &info) { m_deviceSerialNumber = info.serialNumber; m_apiLevel = info.sdk; + qCDebug(androidRunWorkerLog) << "Android Device Info changed" + << m_deviceSerialNumber << m_apiLevel; } void AndroidRunnerWorker::asyncStartHelper() @@ -358,7 +390,7 @@ void AndroidRunnerWorker::asyncStartHelper() logcatProcess->start(m_adb, selector() << "logcat"); QTC_ASSERT(!m_adbLogcatProcess, /**/); m_adbLogcatProcess = std::move(logcatProcess); - + m_adbLogcatProcess->setObjectName("AdbLogcatProcess"); for (const QString &entry : m_beforeStartAdbCommands) runAdb(entry.split(' ', QString::SkipEmptyParts)); @@ -367,13 +399,16 @@ void AndroidRunnerWorker::asyncStartHelper() args << "-n" << m_intentName; if (m_useCppDebugger) { args << "-D"; - QString gdbServerSocket; // run-as <package-name> pwd fails on API 22 so route the pwd through shell. if (!runAdb({"shell", "run-as", m_packageName, "/system/bin/sh", "-c", "pwd"})) { emit remoteProcessFinished(tr("Failed to get process path. Reason: %1.").arg(m_lastRunAdbError)); return; } - gdbServerSocket = QString::fromUtf8(m_lastRunAdbRawOutput.trimmed()) + "/debug-socket"; + + QString packageDir = QString::fromUtf8(m_lastRunAdbRawOutput.trimmed()); + // Add executable flag to package dir. Gdb can't connect to running server on device on + // e.g. on Android 8 with NDK 10e + runAdb({"shell", "run-as", m_packageName, "chmod", "a+x", packageDir}); QString gdbServerExecutable; if (!runAdb({"shell", "run-as", m_packageName, "ls", "lib/"})) { @@ -393,6 +428,7 @@ void AndroidRunnerWorker::asyncStartHelper() return; } + QString gdbServerSocket = packageDir + "/debug-socket"; runAdb({"shell", "run-as", m_packageName, "killall", gdbServerExecutable}); runAdb({"shell", "run-as", m_packageName, "rm", gdbServerSocket}); std::unique_ptr<QProcess, Deleter> gdbServerProcess(new QProcess, deleter); @@ -404,6 +440,7 @@ void AndroidRunnerWorker::asyncStartHelper() return; } m_gdbServerProcess = std::move(gdbServerProcess); + m_gdbServerProcess->setObjectName("GdbServerProcess"); QStringList removeForward{"forward", "--remove", "tcp:" + m_localGdbServerPort.toString()}; runAdb(removeForward); if (!runAdb({"forward", "tcp:" + m_localGdbServerPort.toString(), @@ -432,9 +469,13 @@ void AndroidRunnerWorker::asyncStartHelper() .arg(m_qmlServer.port()).arg(QmlDebug::qmlDebugServices(m_qmlDebugServices)); } + if (!m_extraAppParams.isEmpty()) { + QStringList appArgs = + Utils::QtcProcess::splitArgs(m_extraAppParams, Utils::OsType::OsTypeLinux); + qCDebug(androidRunWorkerLog) << "Using application arguments: " << appArgs; args << "-e" << "extraappparams" - << QString::fromLatin1(m_extraAppParams.toUtf8().toBase64()); + << QString::fromLatin1(appArgs.join(' ').toUtf8().toBase64()); } if (m_extraEnvVars.size() > 0) { @@ -488,20 +529,24 @@ void AndroidRunnerWorker::handleJdbWaiting() else jdbPath.appendPath("jdb"); + QStringList jdbArgs("-connect"); + jdbArgs << QString("com.sun.jdi.SocketAttach:hostname=localhost,port=%1") + .arg(m_localJdbServerPort.toString()); + qCDebug(androidRunWorkerLog) << "Starting JDB:" << jdbPath << jdbArgs.join(' '); std::unique_ptr<QProcess, Deleter> jdbProcess(new QProcess, &deleter); jdbProcess->setProcessChannelMode(QProcess::MergedChannels); - jdbProcess->start(jdbPath.toString(), QStringList() << "-connect" << - QString("com.sun.jdi.SocketAttach:hostname=localhost,port=%1") - .arg(m_localJdbServerPort.toString())); + jdbProcess->start(jdbPath.toString(), jdbArgs); if (!jdbProcess->waitForStarted()) { - emit remoteProcessFinished(tr("Failed to start jdb")); + emit remoteProcessFinished(tr("Failed to start jdb.")); return; } m_jdbProcess = std::move(jdbProcess); + m_jdbProcess->setObjectName("JdbProcess"); } void AndroidRunnerWorker::handleJdbSettled() { + qCDebug(androidRunWorkerLog) << "Handle JDB settled"; auto waitForCommand = [&]() { for (int i= 0; i < 5 && m_jdbProcess->state() == QProcess::Running; ++i) { m_jdbProcess->waitForReadyRead(500); @@ -522,21 +567,26 @@ void AndroidRunnerWorker::handleJdbSettled() if (!m_jdbProcess->waitForFinished(5000)) { m_jdbProcess->terminate(); if (!m_jdbProcess->waitForFinished(5000)) { + qCDebug(androidRunWorkerLog) << "Killing JDB process"; m_jdbProcess->kill(); m_jdbProcess->waitForFinished(); } } else if (m_jdbProcess->exitStatus() == QProcess::NormalExit && m_jdbProcess->exitCode() == 0) { + qCDebug(androidRunWorkerLog) << "JDB settled"; return; } } } - emit remoteProcessFinished(tr("Cannot attach jdb to the running application").arg(m_lastRunAdbError)); + emit remoteProcessFinished(tr("Cannot attach jdb to the running application. Reason: %1.") + .arg(m_lastRunAdbError)); } void AndroidRunnerWorker::onProcessIdChanged(qint64 pid) { // Don't write to m_psProc from a different thread QTC_ASSERT(QThread::currentThread() == thread(), return); + qCDebug(androidRunWorkerLog) << "Process ID changed from:" << m_processPID + << "to:" << pid; m_processPID = pid; if (pid == -1) { emit remoteProcessFinished(QLatin1String("\n\n") + tr("\"%1\" died.") @@ -557,6 +607,7 @@ void AndroidRunnerWorker::onProcessIdChanged(qint64 pid) logcatReadStandardOutput(); QTC_ASSERT(!m_psIsAlive, /**/); m_psIsAlive.reset(new QProcess); + m_psIsAlive->setObjectName("IsAliveProcess"); m_psIsAlive->setProcessChannelMode(QProcess::MergedChannels); connect(m_psIsAlive.get(), static_cast<void(QProcess::*)(int)>(&QProcess::finished), this, bind(&AndroidRunnerWorker::onProcessIdChanged, this, -1)); @@ -565,16 +616,5 @@ void AndroidRunnerWorker::onProcessIdChanged(qint64 pid) } } -void AndroidRunnerWorker::setExtraEnvVars(const Utils::Environment &extraEnvVars) -{ - m_extraEnvVars = extraEnvVars; -} - -void AndroidRunnerWorker::setExtraAppParams(const QString &extraAppParams) -{ - m_extraAppParams = extraAppParams; -} - - } // namespace Internal } // namespace Android diff --git a/src/plugins/android/androidrunnerworker.h b/src/plugins/android/androidrunnerworker.h index e34207bf03..c9714724cc 100644 --- a/src/plugins/android/androidrunnerworker.h +++ b/src/plugins/android/androidrunnerworker.h @@ -55,8 +55,6 @@ public: void logcatReadStandardOutput(); void logcatProcess(const QByteArray &text, QByteArray &buffer, bool onlyError); void setAndroidDeviceInfo(const AndroidDeviceInfo &info); - void setExtraEnvVars(const Utils::Environment &extraEnvVars); - void setExtraAppParams(const QString &extraAppParams); void setIsPreNougat(bool isPreNougat) { m_isPreNougat = isPreNougat; } void setIntentName(const QString &intentName) { m_intentName = intentName; } diff --git a/src/plugins/android/androidsdkmanager.cpp b/src/plugins/android/androidsdkmanager.cpp index 846fe9bdd9..5cd9ebdd85 100644 --- a/src/plugins/android/androidsdkmanager.cpp +++ b/src/plugins/android/androidsdkmanager.cpp @@ -313,7 +313,7 @@ SdkPlatformList AndroidSdkManager::installedSdkPlatforms() { AndroidSdkPackageList list = m_d->filteredPackages(AndroidSdkPackage::Installed, AndroidSdkPackage::SdkPlatformPackage); - return Utils::qobject_container_cast<SdkPlatform *>(list); + return Utils::static_container_cast<SdkPlatform *>(list); } const AndroidSdkPackageList &AndroidSdkManager::allSdkPackages() @@ -514,7 +514,7 @@ void SdkManagerOutputParser::compilePackageAssociations() return platform && platform->apiLevel() == imageApi; }); if (itr != m_packages.end()) { - SdkPlatform *platform = static_cast<SdkPlatform*>(*itr); + auto platform = static_cast<SdkPlatform*>(*itr); platform->addSystemImage(static_cast<SystemImage *>(image)); } } diff --git a/src/plugins/android/androidsdkmanager.h b/src/plugins/android/androidsdkmanager.h index fa15002cd2..4ef83e0a07 100644 --- a/src/plugins/android/androidsdkmanager.h +++ b/src/plugins/android/androidsdkmanager.h @@ -62,7 +62,7 @@ public: }; AndroidSdkManager(const AndroidConfig &config, QObject *parent = nullptr); - ~AndroidSdkManager(); + ~AndroidSdkManager() override; SdkPlatformList installedSdkPlatforms(); const AndroidSdkPackageList &allSdkPackages(); diff --git a/src/plugins/android/androidsdkmanagerwidget.h b/src/plugins/android/androidsdkmanagerwidget.h index 0d6a930ac1..7ef83d31f4 100644 --- a/src/plugins/android/androidsdkmanagerwidget.h +++ b/src/plugins/android/androidsdkmanagerwidget.h @@ -55,7 +55,7 @@ class OptionsDialog : public QDialog public: OptionsDialog(AndroidSdkManager *sdkManager, const QStringList &args, QWidget *parent = nullptr); - ~OptionsDialog(); + ~OptionsDialog() override; QStringList sdkManagerArguments() const; @@ -78,7 +78,7 @@ class AndroidSdkManagerWidget : public QWidget public: AndroidSdkManagerWidget(AndroidConfig &config, AndroidSdkManager *sdkManager, QWidget *parent = nullptr); - ~AndroidSdkManagerWidget(); + ~AndroidSdkManagerWidget() override; void setSdkManagerControlsEnabled(bool enable); void installEssentials(); diff --git a/src/plugins/android/androidsdkmodel.h b/src/plugins/android/androidsdkmodel.h index 8c36b442ef..b7f89f7997 100644 --- a/src/plugins/android/androidsdkmodel.h +++ b/src/plugins/android/androidsdkmodel.h @@ -52,7 +52,7 @@ public: }; explicit AndroidSdkModel(const AndroidConfig &config, AndroidSdkManager *sdkManager, - QObject *parent = 0); + QObject *parent = nullptr); // QAbstractItemModel overrides. QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; diff --git a/src/plugins/android/androidsdkpackage.cpp b/src/plugins/android/androidsdkpackage.cpp index 94b7a2b87b..7451fef7f0 100644 --- a/src/plugins/android/androidsdkpackage.cpp +++ b/src/plugins/android/androidsdkpackage.cpp @@ -164,7 +164,7 @@ bool SdkPlatform::operator <(const AndroidSdkPackage &other) const if (typeid(*this) != typeid(other)) return AndroidSdkPackage::operator <(other); - const SdkPlatform &platform = static_cast<const SdkPlatform &>(other); + const auto &platform = static_cast<const SdkPlatform &>(other); if (platform.m_apiLevel == m_apiLevel) return AndroidSdkPackage::operator <(other); diff --git a/src/plugins/android/androidsdkpackage.h b/src/plugins/android/androidsdkpackage.h index 014ba078ae..0a209c38bf 100644 --- a/src/plugins/android/androidsdkpackage.h +++ b/src/plugins/android/androidsdkpackage.h @@ -65,7 +65,7 @@ public: }; AndroidSdkPackage(QVersionNumber revision, QString sdkStylePathStr, QObject *parent = nullptr); - ~AndroidSdkPackage() override { } + ~AndroidSdkPackage() override = default; virtual bool isValid() const = 0; virtual PackageType type() const = 0; diff --git a/src/plugins/android/androidsettingspage.h b/src/plugins/android/androidsettingspage.h index 1330721dbf..274653f940 100644 --- a/src/plugins/android/androidsettingspage.h +++ b/src/plugins/android/androidsettingspage.h @@ -39,11 +39,11 @@ class AndroidSettingsPage : public Core::IOptionsPage Q_OBJECT public: - explicit AndroidSettingsPage(QObject *parent = 0); + explicit AndroidSettingsPage(QObject *parent = nullptr); - QWidget *widget(); - void apply(); - void finish(); + QWidget *widget() override; + void apply() override; + void finish() override; private: QPointer<AndroidSettingsWidget> m_widget; diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index a198cc3ceb..807cc3c732 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -564,7 +564,7 @@ void AndroidSettingsWidget::checkMissingQtVersion() m_ui->kitWarningDetails->setVisible(isArchMissing); if (isArchMissing) { m_ui->kitWarningDetails->setSummaryText(tr("Cannot create kits for all architectures.")); - QLabel *detailsLabel = static_cast<QLabel *>(m_ui->kitWarningDetails->widget()); + auto detailsLabel = static_cast<QLabel *>(m_ui->kitWarningDetails->widget()); QStringList archNames; for (auto abi : missingQtArchs) archNames << abi.toString(); diff --git a/src/plugins/android/androidsettingswidget.h b/src/plugins/android/androidsettingswidget.h index 8e22f511fa..d94086af97 100644 --- a/src/plugins/android/androidsettingswidget.h +++ b/src/plugins/android/androidsettingswidget.h @@ -55,10 +55,10 @@ public: QModelIndex indexForAvdName(const QString &avdName) const; protected: - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; - QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; - int rowCount(const QModelIndex &parent = QModelIndex()) const; - int columnCount(const QModelIndex &parent = QModelIndex()) const; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + int columnCount(const QModelIndex &parent = QModelIndex()) const override; private: AndroidDeviceInfoList m_list; @@ -69,8 +69,8 @@ class AndroidSettingsWidget : public QWidget Q_OBJECT public: // Todo: This would be so much simpler if it just used Utils::PathChooser!!! - AndroidSettingsWidget(QWidget *parent = 0); - ~AndroidSettingsWidget(); + AndroidSettingsWidget(QWidget *parent = nullptr); + ~AndroidSettingsWidget() override; void saveSettings(); diff --git a/src/plugins/android/androidsignaloperation.h b/src/plugins/android/androidsignaloperation.h index af82bdbd4b..f3d9145cce 100644 --- a/src/plugins/android/androidsignaloperation.h +++ b/src/plugins/android/androidsignaloperation.h @@ -38,11 +38,11 @@ class AndroidSignalOperation : public ProjectExplorer::DeviceProcessSignalOperat { Q_OBJECT public: - ~AndroidSignalOperation() {} - void killProcess(qint64 pid); - void killProcess(const QString &filePath); - void interruptProcess(qint64 pid); - void interruptProcess(const QString &filePath); + ~AndroidSignalOperation() override = default; + void killProcess(qint64 pid) override; + void killProcess(const QString &filePath) override; + void interruptProcess(qint64 pid) override; + void interruptProcess(const QString &filePath) override; protected: explicit AndroidSignalOperation(); diff --git a/src/plugins/android/androidtoolchain.cpp b/src/plugins/android/androidtoolchain.cpp index ffdef58e9d..f8d0535c7e 100644 --- a/src/plugins/android/androidtoolchain.cpp +++ b/src/plugins/android/androidtoolchain.cpp @@ -84,13 +84,9 @@ AndroidToolChain::AndroidToolChain() { } -AndroidToolChain::AndroidToolChain(const AndroidToolChain &tc) : - GccToolChain(tc), m_ndkToolChainVersion(tc.m_ndkToolChainVersion), - m_secondaryToolChain(tc.m_secondaryToolChain) -{ } +AndroidToolChain::AndroidToolChain(const AndroidToolChain &tc) = default; -AndroidToolChain::~AndroidToolChain() -{ } +AndroidToolChain::~AndroidToolChain() = default; static QString getArch(const QString &triple) { @@ -342,12 +338,12 @@ bool AndroidToolChainFactory::canRestore(const QVariantMap &data) ToolChain *AndroidToolChainFactory::restore(const QVariantMap &data) { - AndroidToolChain *tc = new AndroidToolChain(); + auto tc = new AndroidToolChain(); if (tc->fromMap(data)) return tc; delete tc; - return 0; + return nullptr; } QList<AndroidToolChainFactory::AndroidToolChainInformation> AndroidToolChainFactory::toolchainPathsForNdk(const FileName &ndkPath) @@ -490,7 +486,7 @@ AndroidToolChainFactory::autodetectToolChainsForNdk(const FileName &ndkPath, } foreach (ToolChain *tc, result) { - AndroidToolChain *atc = static_cast<AndroidToolChain *>(tc); + auto atc = static_cast<AndroidToolChain *>(tc); atc->setSecondaryToolChain(!newestToolChainForArch.value(atc->targetAbi()).contains(atc)); } diff --git a/src/plugins/android/androidtoolmanager.cpp b/src/plugins/android/androidtoolmanager.cpp index c50124ce2c..c36480a3c3 100644 --- a/src/plugins/android/androidtoolmanager.cpp +++ b/src/plugins/android/androidtoolmanager.cpp @@ -92,10 +92,7 @@ AndroidToolManager::AndroidToolManager(const AndroidConfig &config) : } -AndroidToolManager::~AndroidToolManager() -{ - -} +AndroidToolManager::~AndroidToolManager() = default; SdkPlatformList AndroidToolManager::availableSdkPlatforms(bool *ok) const { diff --git a/src/plugins/android/avddialog.cpp b/src/plugins/android/avddialog.cpp index 702b2120d7..7097f5c1c6 100644 --- a/src/plugins/android/avddialog.cpp +++ b/src/plugins/android/avddialog.cpp @@ -57,7 +57,7 @@ AvdDialog::AvdDialog(int minApiLevel, AndroidSdkManager *sdkManager, const QStri m_avdDialog.abiComboBox->addItems(QStringList(targetArch)); } - QRegExpValidator *v = new QRegExpValidator(m_allowedNameChars, this); + auto v = new QRegExpValidator(m_allowedNameChars, this); m_avdDialog.nameLineEdit->setValidator(v); m_avdDialog.nameLineEdit->installEventFilter(this); @@ -155,7 +155,7 @@ void AvdDialog::updateApiLevelComboBox() bool AvdDialog::eventFilter(QObject *obj, QEvent *event) { if (obj == m_avdDialog.nameLineEdit && event->type() == QEvent::KeyPress) { - QKeyEvent *ke = static_cast<QKeyEvent *>(event); + auto ke = static_cast<QKeyEvent *>(event); const QString key = ke->text(); if (!key.isEmpty() && !m_allowedNameChars.exactMatch(key)) { QPoint position = m_avdDialog.nameLineEdit->parentWidget()->mapToGlobal(m_avdDialog.nameLineEdit->geometry().bottomLeft()); diff --git a/src/plugins/android/avddialog.h b/src/plugins/android/avddialog.h index 8a30b613c6..d0e3fe0324 100644 --- a/src/plugins/android/avddialog.h +++ b/src/plugins/android/avddialog.h @@ -41,7 +41,7 @@ class AvdDialog : public QDialog Q_OBJECT public: explicit AvdDialog(int minApiLevel, AndroidSdkManager *sdkManager, const QString &targetArch, - QWidget *parent = 0); + QWidget *parent = nullptr); const SdkPlatform *sdkPlatform() const; QString name() const; @@ -53,7 +53,7 @@ public: private: void updateApiLevelComboBox(); - bool eventFilter(QObject *obj, QEvent *event); + bool eventFilter(QObject *obj, QEvent *event) override; Ui::AddNewAVDDialog m_avdDialog; AndroidSdkManager *m_sdkManager; diff --git a/src/plugins/android/certificatesmodel.h b/src/plugins/android/certificatesmodel.h index 57c0a6ab43..7463394e66 100644 --- a/src/plugins/android/certificatesmodel.h +++ b/src/plugins/android/certificatesmodel.h @@ -39,9 +39,9 @@ public: CertificatesModel(const QString &rowCertificates, QObject *parent); protected: - int rowCount(const QModelIndex &parent = QModelIndex()) const; + int rowCount(const QModelIndex &parent = QModelIndex()) const override; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; private: QVector<QPair<QString, QString> > m_certs; diff --git a/src/plugins/qmakeandroidsupport/createandroidmanifestwizard.cpp b/src/plugins/android/createandroidmanifestwizard.cpp index c49dd76f6c..01b167342b 100644 --- a/src/plugins/qmakeandroidsupport/createandroidmanifestwizard.cpp +++ b/src/plugins/android/createandroidmanifestwizard.cpp @@ -34,27 +34,23 @@ #include <projectexplorer/runconfiguration.h> #include <projectexplorer/target.h> -#include <qmakeprojectmanager/qmakeproject.h> - -#include <proparser/prowriter.h> - #include <qtsupport/qtkitinformation.h> #include <utils/utilsicons.h> #include <QCheckBox> #include <QComboBox> +#include <QDir> +#include <QFileInfo> #include <QFormLayout> #include <QLabel> #include <QMessageBox> #include <QVBoxLayout> -using namespace Android; -using namespace QmakeAndroidSupport::Internal; +using namespace ProjectExplorer; using namespace Utils; -using QmakeProjectManager::QmakeProject; -using QmakeProjectManager::QmakeProFile; +namespace Android { // // NoApplicationProFilePage @@ -62,7 +58,7 @@ using QmakeProjectManager::QmakeProFile; NoApplicationProFilePage::NoApplicationProFilePage(CreateAndroidManifestWizard *wizard) : m_wizard(wizard) { - QVBoxLayout *layout = new QVBoxLayout(this); + auto layout = new QVBoxLayout(this); QLabel *label = new QLabel(this); label->setWordWrap(true); label->setText(tr("No application .pro file found in this project.")); @@ -73,21 +69,26 @@ NoApplicationProFilePage::NoApplicationProFilePage(CreateAndroidManifestWizard * // // ChooseProFilePage // -ChooseProFilePage::ChooseProFilePage(CreateAndroidManifestWizard *wizard, - const QList<QmakeProFile *> &files, - const QmakeProFile *select) : - m_wizard(wizard) +ChooseProFilePage::ChooseProFilePage(CreateAndroidManifestWizard *wizard) + : m_wizard(wizard) { - QFormLayout *fl = new QFormLayout(this); + auto fl = new QFormLayout(this); QLabel *label = new QLabel(this); label->setWordWrap(true); label->setText(tr("Select the .pro file for which you want to create the Android template files.")); fl->addRow(label); + Target *target = wizard->target(); + QString currentBuildTarget; + if (RunConfiguration *rc = target->activeRunConfiguration()) + currentBuildTarget = rc->buildKey(); + m_comboBox = new QComboBox(this); - for (QmakeProFile *file : files) { - m_comboBox->addItem(file->displayName(), QVariant::fromValue(static_cast<void *>(file))); // TODO something more? - if (file == select) + const BuildTargetInfoList buildTargets = wizard->target()->applicationTargets(); + for (const BuildTargetInfo &bti : buildTargets.list) { + const QString displayName = bti.buildKey; + m_comboBox->addItem(displayName, QVariant(bti.buildKey)); // TODO something more? + if (bti.buildKey == currentBuildTarget) m_comboBox->setCurrentIndex(m_comboBox->count() - 1); } @@ -102,7 +103,7 @@ ChooseProFilePage::ChooseProFilePage(CreateAndroidManifestWizard *wizard, void ChooseProFilePage::nodeSelected(int index) { Q_UNUSED(index) - m_wizard->setProFile(static_cast<QmakeProFile *>(m_comboBox->itemData(m_comboBox->currentIndex()).value<void *>())); + m_wizard->setBuildKey(m_comboBox->itemData(m_comboBox->currentIndex()).toString()); } @@ -110,7 +111,7 @@ void ChooseProFilePage::nodeSelected(int index) // ChooseDirectoryPage // ChooseDirectoryPage::ChooseDirectoryPage(CreateAndroidManifestWizard *wizard) - : m_wizard(wizard), m_androidPackageSourceDir(0), m_complete(true) + : m_wizard(wizard), m_androidPackageSourceDir(nullptr), m_complete(true) { m_layout = new QFormLayout(this); m_label = new QLabel(this); @@ -131,7 +132,7 @@ ChooseDirectoryPage::ChooseDirectoryPage(CreateAndroidManifestWizard *wizard) m_warningIcon->setWordWrap(true); m_warningIcon->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - QHBoxLayout *hbox = new QHBoxLayout; + auto hbox = new QHBoxLayout; hbox->addWidget(m_warningIcon); hbox->addWidget(m_sourceDirectoryWarning); hbox->setAlignment(m_warningIcon, Qt::AlignTop); @@ -142,7 +143,7 @@ ChooseDirectoryPage::ChooseDirectoryPage(CreateAndroidManifestWizard *wizard) m_wizard, &CreateAndroidManifestWizard::setDirectory); if (wizard->copyGradle()) { - QCheckBox *checkBox = new QCheckBox(this); + auto checkBox = new QCheckBox(this); checkBox->setChecked(true); connect(checkBox, &QCheckBox::toggled, wizard, &CreateAndroidManifestWizard::setCopyGradle); checkBox->setText(tr("Copy the Gradle files to Android directory")); @@ -153,8 +154,11 @@ ChooseDirectoryPage::ChooseDirectoryPage(CreateAndroidManifestWizard *wizard) void ChooseDirectoryPage::checkPackageSourceDir() { - QString projectDir = m_wizard->proFile()->filePath().toFileInfo().absolutePath(); - QString newDir = m_androidPackageSourceDir->path(); + const QString buildKey = m_wizard->buildKey(); + const BuildTargetInfo bti = m_wizard->target()->applicationTargets().buildTargetInfo(buildKey); + const QString projectDir = bti.projectFilePath.toFileInfo().absolutePath(); + + const QString newDir = m_androidPackageSourceDir->path(); bool isComplete = QFileInfo(projectDir) != QFileInfo(newDir); m_sourceDirectoryWarning->setVisible(!isComplete); @@ -173,13 +177,20 @@ bool ChooseDirectoryPage::isComplete() const void ChooseDirectoryPage::initializePage() { - QString androidPackageDir = m_wizard->proFile()->singleVariableValue(QmakeProjectManager::Variable::AndroidPackageSourceDir); + const QString buildKey = m_wizard->buildKey(); + const BuildTargetInfo bti = m_wizard->target()->applicationTargets().buildTargetInfo(buildKey); + const QString projectDir = bti.projectFilePath.toFileInfo().absolutePath(); + + AndroidQtSupport *qtSupport = AndroidManager::androidQtSupport(m_wizard->target()); + const QString androidPackageDir + = qtSupport->targetData(Android::Constants::AndroidPackageSourceDir, m_wizard->target()).toString(); + if (androidPackageDir.isEmpty()) { m_label->setText(tr("Select the Android package source directory.\n\n" "The files in the Android package source directory are copied to the build directory's " "Android directory and the default files are overwritten.")); - m_androidPackageSourceDir->setPath(m_wizard->proFile()->filePath().toFileInfo().absolutePath().append(QLatin1String("/android"))); + m_androidPackageSourceDir->setPath(projectDir + "/android"); connect(m_androidPackageSourceDir, &PathChooser::rawPathChanged, this, &ChooseDirectoryPage::checkPackageSourceDir); } else { @@ -196,39 +207,34 @@ void ChooseDirectoryPage::initializePage() // CreateAndroidManifestWizard // CreateAndroidManifestWizard::CreateAndroidManifestWizard(ProjectExplorer::Target *target) - : m_target(target), m_proFile(0), m_copyState(Ask) + : m_target(target), m_copyState(Ask) { setWindowTitle(tr("Create Android Template Files Wizard")); - QmakeProject *project = static_cast<QmakeProject *>(target->project()); - QList<QmakeProFile *> files = project->applicationProFiles(); + const BuildTargetInfoList buildTargets = target->applicationTargets(); QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(target->kit()); m_copyGradle = version && version->qtVersion() >= QtSupport::QtVersionNumber(5, 4, 0); - const QmakeProFile *currentRunNode = nullptr; - if (ProjectExplorer::RunConfiguration *rc = target->activeRunConfiguration()) - currentRunNode = project->rootProFile()->findProFile(FileName::fromString(rc->buildKey())); - - if (files.isEmpty()) { + if (buildTargets.list.isEmpty()) { // oh uhm can't create anything addPage(new NoApplicationProFilePage(this)); - } else if (files.size() == 1) { - setProFile(files.first()); + } else if (buildTargets.list.size() == 1) { + setBuildKey(buildTargets.list.first().buildKey); addPage(new ChooseDirectoryPage(this)); } else { - addPage(new ChooseProFilePage(this, files, currentRunNode)); + addPage(new ChooseProFilePage(this)); addPage(new ChooseDirectoryPage(this)); } } -QmakeProjectManager::QmakeProFile *CreateAndroidManifestWizard::proFile() const +QString CreateAndroidManifestWizard::buildKey() const { - return m_proFile; + return m_buildKey; } -void CreateAndroidManifestWizard::setProFile(QmakeProjectManager::QmakeProFile *node) +void CreateAndroidManifestWizard::setBuildKey(const QString &buildKey) { - m_proFile = node; + m_buildKey = buildKey; } void CreateAndroidManifestWizard::setDirectory(const QString &directory) @@ -318,45 +324,56 @@ void CreateAndroidManifestWizard::createAndroidTemplateFiles() .append(QLatin1String("/src/android/java/AndroidManifest.xml"))); FileUtils::copyRecursively(FileName::fromString(src), FileName::fromString(m_directory + QLatin1String("/AndroidManifest.xml")), - 0, [this, &addedFiles](QFileInfo src, QFileInfo dst, QString *){return copy(src, dst, &addedFiles);}); + nullptr, [this, &addedFiles](QFileInfo src, QFileInfo dst, QString *){return copy(src, dst, &addedFiles);}); } else { const QString src(version->qmakeProperty("QT_INSTALL_PREFIX") .append(QLatin1String("/src/android/templates"))); FileUtils::copyRecursively(FileName::fromString(src), FileName::fromString(m_directory), - 0, [this, &addedFiles](QFileInfo src, QFileInfo dst, QString *){return copy(src, dst, &addedFiles);}); + nullptr, [this, &addedFiles](QFileInfo src, QFileInfo dst, QString *){return copy(src, dst, &addedFiles);}); if (m_copyGradle) { FileName gradlePath = FileName::fromString(version->qmakeProperty("QT_INSTALL_PREFIX").append(QLatin1String("/src/3rdparty/gradle"))); if (!gradlePath.exists()) gradlePath = AndroidConfigurations::currentConfig().sdkLocation().appendPath(QLatin1String("/tools/templates/gradle/wrapper")); FileUtils::copyRecursively(gradlePath, FileName::fromString(m_directory), - 0, [this, &addedFiles](QFileInfo src, QFileInfo dst, QString *){return copy(src, dst, &addedFiles);}); + nullptr, [this, &addedFiles](QFileInfo src, QFileInfo dst, QString *){return copy(src, dst, &addedFiles);}); } AndroidManager::updateGradleProperties(m_target); } - m_proFile->addFiles(addedFiles); - if (m_proFile->singleVariableValue(QmakeProjectManager::Variable::AndroidPackageSourceDir).isEmpty()) { + AndroidQtSupport *qtSupport = AndroidManager::androidQtSupport(m_target); + qtSupport->addFiles(m_target, m_buildKey, addedFiles); + + const QString androidPackageDir + = qtSupport->targetData(Android::Constants::AndroidPackageSourceDir, m_target).toString(); + + if (androidPackageDir.isEmpty()) { // and now time for some magic - QString value = QLatin1String("$$PWD/") - + m_proFile->filePath().toFileInfo().absoluteDir().relativeFilePath(m_directory); - bool result = - m_proFile->setProVariable(QLatin1String("ANDROID_PACKAGE_SOURCE_DIR"), QStringList(value)); + const BuildTargetInfo bti = m_target->applicationTargets().buildTargetInfo(m_buildKey); + const QString value = "$$PWD/" + bti.projectFilePath.toFileInfo().absoluteDir().relativeFilePath(m_directory); + bool result = qtSupport->setTargetData(Android::Constants::AndroidPackageSourceDir, value, m_target); if (!result) { QMessageBox::warning(this, tr("Project File not Updated"), - tr("Could not update the .pro file %1.") - .arg(m_proFile->filePath().toUserOutput())); + tr("Could not update the project file %1.") + .arg(bti.projectFilePath.toUserOutput())); } } Core::EditorManager::openEditor(m_directory + QLatin1String("/AndroidManifest.xml")); } +ProjectExplorer::Target *CreateAndroidManifestWizard::target() const +{ + return m_target; +} + void CreateAndroidManifestWizard::accept() { createAndroidTemplateFiles(); Wizard::accept(); } + +} // namespace Android diff --git a/src/plugins/qmakeandroidsupport/createandroidmanifestwizard.h b/src/plugins/android/createandroidmanifestwizard.h index cdd49b247f..4695f9a4d5 100644 --- a/src/plugins/qmakeandroidsupport/createandroidmanifestwizard.h +++ b/src/plugins/android/createandroidmanifestwizard.h @@ -25,6 +25,8 @@ #pragma once +#include "android_global.h" + #include <utils/fileutils.h> #include <utils/pathchooser.h> #include <utils/wizard.h> @@ -36,10 +38,8 @@ class QFormLayout; QT_END_NAMESPACE namespace ProjectExplorer { class Target; } -namespace QmakeProjectManager { class QmakeProFile; } -namespace QmakeAndroidSupport { -namespace Internal { +namespace Android { class CreateAndroidManifestWizard; @@ -56,9 +56,8 @@ class ChooseProFilePage : public QWizardPage { Q_OBJECT public: - ChooseProFilePage(CreateAndroidManifestWizard *wizard, - const QList<QmakeProjectManager::QmakeProFile *> &nodes, - const QmakeProjectManager::QmakeProFile *select); + explicit ChooseProFilePage(CreateAndroidManifestWizard *wizard); + private: void nodeSelected(int index); private: @@ -86,14 +85,14 @@ private: bool m_complete; }; -class CreateAndroidManifestWizard : public Utils::Wizard +class ANDROID_EXPORT CreateAndroidManifestWizard : public Utils::Wizard { Q_OBJECT public: CreateAndroidManifestWizard(ProjectExplorer::Target *target); - QmakeProjectManager::QmakeProFile *proFile() const; - void setProFile(QmakeProjectManager::QmakeProFile *proFile); + QString buildKey() const; + void setBuildKey(const QString &buildKey); void accept(); bool copyGradle(); @@ -101,6 +100,8 @@ public: void setDirectory(const QString &directory); void setCopyGradle(bool copy); + ProjectExplorer::Target *target() const; + private: enum CopyState { Ask, @@ -112,11 +113,10 @@ private: void createAndroidManifestFile(); void createAndroidTemplateFiles(); ProjectExplorer::Target *m_target; - QmakeProjectManager::QmakeProFile *m_proFile; + QString m_buildKey; QString m_directory; CopyState m_copyState; bool m_copyGradle; }; -} //namespace QmakeAndroidSupport -} //namespace Internal +} // namespace Android diff --git a/src/plugins/android/javaindenter.cpp b/src/plugins/android/javaindenter.cpp index 21c99609ad..6b6d45d7ce 100644 --- a/src/plugins/android/javaindenter.cpp +++ b/src/plugins/android/javaindenter.cpp @@ -31,12 +31,9 @@ using namespace Android; using namespace Android::Internal; -JavaIndenter::JavaIndenter() -{ -} +JavaIndenter::JavaIndenter() = default; -JavaIndenter::~JavaIndenter() -{} +JavaIndenter::~JavaIndenter() = default; bool JavaIndenter::isElectricCharacter(const QChar &ch) const { diff --git a/src/plugins/android/javaparser.h b/src/plugins/android/javaparser.h index f47075b4e2..5199f1057a 100644 --- a/src/plugins/android/javaparser.h +++ b/src/plugins/android/javaparser.h @@ -39,8 +39,8 @@ class JavaParser : public ProjectExplorer::IOutputParser public: JavaParser(); - void stdOutput(const QString &line); - void stdError(const QString &line); + void stdOutput(const QString &line) override; + void stdError(const QString &line) override; void setProjectFileList(const QStringList &fileList); void setBuildDirectory(const Utils::FileName &buildDirectory); diff --git a/src/plugins/autotest/autotestplugin.h b/src/plugins/autotest/autotestplugin.h index efd8d31e77..5d48d2b460 100644 --- a/src/plugins/autotest/autotestplugin.h +++ b/src/plugins/autotest/autotestplugin.h @@ -46,7 +46,7 @@ class AutotestPlugin : public ExtensionSystem::IPlugin public: AutotestPlugin(); - ~AutotestPlugin(); + ~AutotestPlugin() override; bool initialize(const QStringList &arguments, QString *errorString) override; void extensionsInitialized() override; diff --git a/src/plugins/autotest/autotestunittests.cpp b/src/plugins/autotest/autotestunittests.cpp index 0624f97eda..706824566c 100644 --- a/src/plugins/autotest/autotestunittests.cpp +++ b/src/plugins/autotest/autotestunittests.cpp @@ -54,7 +54,7 @@ namespace Internal { AutoTestUnitTests::AutoTestUnitTests(TestTreeModel *model, QObject *parent) : QObject(parent), m_model(model), - m_tmpDir(0), + m_tmpDir(nullptr), m_isQt4(false) { } diff --git a/src/plugins/autotest/autotestunittests.h b/src/plugins/autotest/autotestunittests.h index aa43ead11e..1d0e0b397b 100644 --- a/src/plugins/autotest/autotestunittests.h +++ b/src/plugins/autotest/autotestunittests.h @@ -38,7 +38,7 @@ class AutoTestUnitTests : public QObject { Q_OBJECT public: - explicit AutoTestUnitTests(TestTreeModel *model, QObject *parent = 0); + explicit AutoTestUnitTests(TestTreeModel *model, QObject *parent = nullptr); signals: diff --git a/src/plugins/autotest/gtest/gtestframework.cpp b/src/plugins/autotest/gtest/gtestframework.cpp index 67258c86ef..ceb0b12cb0 100644 --- a/src/plugins/autotest/gtest/gtestframework.cpp +++ b/src/plugins/autotest/gtest/gtestframework.cpp @@ -85,7 +85,7 @@ QString GTestFramework::groupingToolTip() const { return QCoreApplication::translate("GTestFramework", "Enable or disable grouping of test cases by folder or " - "gtest filter.\nSee also Google Test settings."); + "GTest filter.\nSee also Google Test settings."); } GTest::Constants::GroupMode GTestFramework::groupMode() diff --git a/src/plugins/autotest/gtest/gtestoutputreader.cpp b/src/plugins/autotest/gtest/gtestoutputreader.cpp index 29445f23c6..761cd6611f 100644 --- a/src/plugins/autotest/gtest/gtestoutputreader.cpp +++ b/src/plugins/autotest/gtest/gtestoutputreader.cpp @@ -96,7 +96,7 @@ void GTestOutputReader::processOutput(const QByteArray &outputLine) TestResultPtr testResult = TestResultPtr(new GTestResult(m_projectFile)); testResult->setResult(Result::MessageDisabledTests); int disabled = disabledTests.cap(1).toInt(); - testResult->setDescription(tr("You have %n disabled test(s).", 0, disabled)); + testResult->setDescription(tr("You have %n disabled test(s).", nullptr, disabled)); testResult->setLine(disabled); // misuse line property to hold number of disabled reportResult(testResult); m_description.clear(); diff --git a/src/plugins/autotest/gtest/gtestsettingspage.h b/src/plugins/autotest/gtest/gtestsettingspage.h index 4e5a056504..5bee96ec33 100644 --- a/src/plugins/autotest/gtest/gtestsettingspage.h +++ b/src/plugins/autotest/gtest/gtestsettingspage.h @@ -59,7 +59,6 @@ public: QWidget *widget() override; void apply() override; - void finish() override { } private: QSharedPointer<GTestSettings> m_settings; diff --git a/src/plugins/autotest/gtest/gtesttreeitem.cpp b/src/plugins/autotest/gtest/gtesttreeitem.cpp index 0d49dfc28e..335979131a 100644 --- a/src/plugins/autotest/gtest/gtesttreeitem.cpp +++ b/src/plugins/autotest/gtest/gtesttreeitem.cpp @@ -466,7 +466,7 @@ QSet<QString> GTestTreeItem::internalTargets() const const QVector<CppTools::ProjectPart::Ptr> projectParts = projectInfo.projectParts(); if (projectParts.isEmpty()) return TestTreeItem::dependingInternalTargets(cppMM, file); - for (const CppTools::ProjectPart::Ptr projectPart : projectParts) { + for (const CppTools::ProjectPart::Ptr &projectPart : projectParts) { if (projectPart->projectFile == proFile() && Utils::anyOf(projectPart->files, [&file] (const CppTools::ProjectFile &pf) { return pf.path == file; diff --git a/src/plugins/autotest/gtest/gtestvisitors.h b/src/plugins/autotest/gtest/gtestvisitors.h index cf850ffd51..94c684d322 100644 --- a/src/plugins/autotest/gtest/gtestvisitors.h +++ b/src/plugins/autotest/gtest/gtestvisitors.h @@ -58,7 +58,7 @@ class GTestVisitor : public CPlusPlus::ASTVisitor { public: explicit GTestVisitor(CPlusPlus::Document::Ptr doc); - bool visit(CPlusPlus::FunctionDefinitionAST *ast); + bool visit(CPlusPlus::FunctionDefinitionAST *ast) override; QMap<GTestCaseSpec, GTestCodeLocationList> gtestFunctions() const { return m_gtestFunctions; } diff --git a/src/plugins/autotest/itestsettingspage.h b/src/plugins/autotest/itestsettingspage.h index eecdec0040..be4f05f491 100644 --- a/src/plugins/autotest/itestsettingspage.h +++ b/src/plugins/autotest/itestsettingspage.h @@ -45,7 +45,7 @@ public: setCategory(Constants::AUTOTEST_SETTINGS_CATEGORY); } - virtual ~ITestSettingsPage() {} + void finish() override {} private: void setId(Core::Id id) diff --git a/src/plugins/autotest/qtest/qttestoutputreader.cpp b/src/plugins/autotest/qtest/qttestoutputreader.cpp index d56a1658ec..864d219097 100644 --- a/src/plugins/autotest/qtest/qttestoutputreader.cpp +++ b/src/plugins/autotest/qtest/qttestoutputreader.cpp @@ -47,9 +47,9 @@ static QString decode(const QString& original) while ((pos = regex.indexIn(original, pos)) != -1) { const QString value = regex.cap(1); if (value.startsWith('x')) - result.replace(regex.cap(0), QChar(value.midRef(1).toInt(0, 16))); + result.replace(regex.cap(0), QChar(value.midRef(1).toInt(nullptr, 16))); else - result.replace(regex.cap(0), QChar(value.toInt(0, 10))); + result.replace(regex.cap(0), QChar(value.toInt(nullptr, 10))); pos += regex.matchedLength(); } @@ -120,7 +120,7 @@ static QString constructBenchmarkInformation(const QString &metric, double value return QtTestOutputReader::tr("%1 %2 per iteration (total: %3, iterations: %4)") .arg(formatResult(value)) .arg(metricsText) - .arg(formatResult(value * (double)iterations)) + .arg(formatResult(value * double(iterations))) .arg(iterations); } diff --git a/src/plugins/autotest/qtest/qttestparser.cpp b/src/plugins/autotest/qtest/qttestparser.cpp index 1bfabb42db..b806e79f8d 100644 --- a/src/plugins/autotest/qtest/qttestparser.cpp +++ b/src/plugins/autotest/qtest/qttestparser.cpp @@ -109,8 +109,8 @@ static QString testClass(const CppTools::CppModelManager *modelManager, const QByteArray name = macro.macro().name(); if (QTestUtils::isQTestMacro(name)) { const CPlusPlus::Document::Block arg = macro.arguments().at(0); - return QLatin1String(fileContent.mid(arg.bytesBegin(), - arg.bytesEnd() - arg.bytesBegin())); + return QLatin1String(fileContent.mid(int(arg.bytesBegin()), + int(arg.bytesEnd() - arg.bytesBegin()))); } } // check if one has used a self-defined macro or QTest::qExec() directly @@ -126,7 +126,8 @@ static CPlusPlus::Document::Ptr declaringDocument(CPlusPlus::Document::Ptr doc, const CPlusPlus::Snapshot &snapshot, const QString &testCaseName, const QStringList &alternativeFiles = {}, - unsigned *line = 0, unsigned *column = 0) + unsigned *line = nullptr, + unsigned *column = nullptr) { CPlusPlus::Document::Ptr declaringDoc; CPlusPlus::TypeOfExpression typeOfExpr; @@ -152,7 +153,7 @@ static CPlusPlus::Document::Ptr declaringDocument(CPlusPlus::Document::Ptr doc, if (CPlusPlus::Symbol *symbol = item.declaration()) { if (CPlusPlus::Class *toeClass = symbol->asClass()) { const QString declFileName = QLatin1String(toeClass->fileId()->chars(), - toeClass->fileId()->size()); + int(toeClass->fileId()->size())); declaringDoc = snapshot.document(declFileName); if (line) *line = toeClass->line(); diff --git a/src/plugins/autotest/qtest/qttestsettings.cpp b/src/plugins/autotest/qtest/qttestsettings.cpp index dba1be98e2..e1473c7826 100644 --- a/src/plugins/autotest/qtest/qttestsettings.cpp +++ b/src/plugins/autotest/qtest/qttestsettings.cpp @@ -88,9 +88,8 @@ QString QtTestSettings::metricsTypeToOption(const MetricsType type) return QString("-callgrind"); case MetricsType::Perf: return QString("-perf"); - default: - return QString(); } + return QString(); } } // namespace Internal diff --git a/src/plugins/autotest/qtest/qttestsettingspage.cpp b/src/plugins/autotest/qtest/qttestsettingspage.cpp index 4ea1fe1319..8652738425 100644 --- a/src/plugins/autotest/qtest/qttestsettingspage.cpp +++ b/src/plugins/autotest/qtest/qttestsettingspage.cpp @@ -65,8 +65,6 @@ void QtTestSettingsWidget::setSettings(const QtTestSettings &settings) case MetricsType::Perf: m_ui.perfRB->setChecked(true); break; - default: - m_ui.walltimeRB->setChecked(true); } } diff --git a/src/plugins/autotest/qtest/qttestsettingspage.h b/src/plugins/autotest/qtest/qttestsettingspage.h index abfca142c9..cb4e5850dc 100644 --- a/src/plugins/autotest/qtest/qttestsettingspage.h +++ b/src/plugins/autotest/qtest/qttestsettingspage.h @@ -41,7 +41,7 @@ class QtTestSettingsWidget : public QWidget { Q_OBJECT public: - explicit QtTestSettingsWidget(QWidget *parent = 0); + explicit QtTestSettingsWidget(QWidget *parent = nullptr); void setSettings(const QtTestSettings &settings); QtTestSettings settings() const; @@ -58,7 +58,6 @@ public: QWidget *widget() override; void apply() override; - void finish() override { } private: QSharedPointer<QtTestSettings> m_settings; diff --git a/src/plugins/autotest/qtest/qttesttreeitem.cpp b/src/plugins/autotest/qtest/qttesttreeitem.cpp index c9917d41bc..3fe96b6f39 100644 --- a/src/plugins/autotest/qtest/qttesttreeitem.cpp +++ b/src/plugins/autotest/qtest/qttesttreeitem.cpp @@ -167,7 +167,6 @@ static void fillTestConfigurationsFromCheckState(const TestTreeItem *item, testConfigurations << testConfig; return; case Qt::PartiallyChecked: - default: QStringList testCases; item->forFirstLevelChildren([&testCases](TestTreeItem *grandChild) { if (grandChild->checked() == Qt::Checked) { diff --git a/src/plugins/autotest/qtest/qttestvisitors.h b/src/plugins/autotest/qtest/qttestvisitors.h index 6c008617cb..8209119249 100644 --- a/src/plugins/autotest/qtest/qttestvisitors.h +++ b/src/plugins/autotest/qtest/qttestvisitors.h @@ -50,7 +50,7 @@ public: QSet<QString> baseClasses() const { return m_baseClasses; } bool resultValid() const { return m_valid; } - bool visit(CPlusPlus::Class *symbol); + bool visit(CPlusPlus::Class *symbol) override; private: CppTools::SymbolFinder m_symbolFinder; @@ -67,8 +67,8 @@ class TestAstVisitor : public CPlusPlus::ASTVisitor public: explicit TestAstVisitor(CPlusPlus::Document::Ptr doc, const CPlusPlus::Snapshot &snapshot); - bool visit(CPlusPlus::CallAST *ast); - bool visit(CPlusPlus::CompoundStatementAST *ast); + bool visit(CPlusPlus::CallAST *ast) override; + bool visit(CPlusPlus::CompoundStatementAST *ast) override; QString className() const { return m_className; } @@ -84,11 +84,11 @@ class TestDataFunctionVisitor : public CPlusPlus::ASTVisitor public: explicit TestDataFunctionVisitor(CPlusPlus::Document::Ptr doc); - bool visit(CPlusPlus::UsingDirectiveAST *ast); - bool visit(CPlusPlus::FunctionDefinitionAST *ast); - bool visit(CPlusPlus::CallAST *ast); - bool preVisit(CPlusPlus::AST *ast); - void postVisit(CPlusPlus::AST *ast); + bool visit(CPlusPlus::UsingDirectiveAST *ast) override; + bool visit(CPlusPlus::FunctionDefinitionAST *ast) override; + bool visit(CPlusPlus::CallAST *ast) override; + bool preVisit(CPlusPlus::AST *ast) override; + void postVisit(CPlusPlus::AST *ast) override; QMap<QString, QtTestCodeLocationList> dataTags() const { return m_dataTags; } private: diff --git a/src/plugins/autotest/quick/quicktestparser.cpp b/src/plugins/autotest/quick/quicktestparser.cpp index 6e9b4ae82e..c4f7e7963a 100644 --- a/src/plugins/autotest/quick/quicktestparser.cpp +++ b/src/plugins/autotest/quick/quicktestparser.cpp @@ -120,7 +120,7 @@ static QString quickTestName(const CPlusPlus::Document::Ptr &doc, if (QuickTestUtils::isQuickTestMacro(name)) { CPlusPlus::Document::Block arg = macro.arguments().at(0); return QLatin1String(CppParser::getFileContent(doc->fileName()) - .mid(arg.bytesBegin(), arg.bytesEnd() - arg.bytesBegin())); + .mid(int(arg.bytesBegin()), int(arg.bytesEnd() - arg.bytesBegin()))); } } @@ -311,10 +311,6 @@ QuickTestParser::QuickTestParser() this, &QuickTestParser::doUpdateWatchPaths, Qt::QueuedConnection); } -QuickTestParser::~QuickTestParser() -{ -} - void QuickTestParser::init(const QStringList &filesToParse, bool fullParse) { m_qmlSnapshot = QmlJSTools::Internal::ModelManager::instance()->snapshot(); diff --git a/src/plugins/autotest/quick/quicktestparser.h b/src/plugins/autotest/quick/quicktestparser.h index 6d005bec4e..c05fa607dd 100644 --- a/src/plugins/autotest/quick/quicktestparser.h +++ b/src/plugins/autotest/quick/quicktestparser.h @@ -46,7 +46,6 @@ class QuickTestParser : public QObject, public CppParser Q_OBJECT public: QuickTestParser(); - virtual ~QuickTestParser(); void init(const QStringList &filesToParse, bool fullParse) override; void release() override; bool processDocument(QFutureInterface<TestParseResultPtr> futureInterface, diff --git a/src/plugins/autotest/quick/quicktesttreeitem.cpp b/src/plugins/autotest/quick/quicktesttreeitem.cpp index 94672bcc23..6bc57a0e38 100644 --- a/src/plugins/autotest/quick/quicktesttreeitem.cpp +++ b/src/plugins/autotest/quick/quicktesttreeitem.cpp @@ -416,7 +416,7 @@ QSet<QString> QuickTestTreeItem::internalTargets() const QSet<QString> result; const auto cppMM = CppTools::CppModelManager::instance(); const auto projectInfo = cppMM->projectInfo(ProjectExplorer::SessionManager::startupProject()); - for (const CppTools::ProjectPart::Ptr projectPart : projectInfo.projectParts()) { + for (const CppTools::ProjectPart::Ptr &projectPart : projectInfo.projectParts()) { if (projectPart->buildTargetType != CppTools::ProjectPart::Executable) continue; if (projectPart->projectFile == proFile()) { diff --git a/src/plugins/autotest/testconfiguration.cpp b/src/plugins/autotest/testconfiguration.cpp index c4c020349f..1cd550c807 100644 --- a/src/plugins/autotest/testconfiguration.cpp +++ b/src/plugins/autotest/testconfiguration.cpp @@ -48,10 +48,6 @@ using namespace ProjectExplorer; namespace Autotest { namespace Internal { -TestConfiguration::TestConfiguration() -{ -} - TestConfiguration::~TestConfiguration() { m_testCases.clear(); diff --git a/src/plugins/autotest/testconfiguration.h b/src/plugins/autotest/testconfiguration.h index 4e98c9ee9c..a2a06d95c3 100644 --- a/src/plugins/autotest/testconfiguration.h +++ b/src/plugins/autotest/testconfiguration.h @@ -52,7 +52,7 @@ using TestResultPtr = QSharedPointer<TestResult>; class TestConfiguration { public: - explicit TestConfiguration(); + explicit TestConfiguration() = default; virtual ~TestConfiguration(); void completeTestInformation(TestRunMode runMode); @@ -113,7 +113,6 @@ class DebuggableTestConfiguration : public TestConfiguration public: explicit DebuggableTestConfiguration(TestRunMode runMode = TestRunMode::Run) : m_runMode(runMode) {} - ~DebuggableTestConfiguration() {} void setRunMode(TestRunMode mode) { m_runMode = mode; } TestRunMode runMode() const { return m_runMode; } diff --git a/src/plugins/autotest/testnavigationwidget.cpp b/src/plugins/autotest/testnavigationwidget.cpp index 948af3af72..363fd1a3b4 100644 --- a/src/plugins/autotest/testnavigationwidget.cpp +++ b/src/plugins/autotest/testnavigationwidget.cpp @@ -108,10 +108,6 @@ TestNavigationWidget::TestNavigationWidget(QWidget *parent) : m_progressIndicator, &Utils::ProgressIndicator::show); } -TestNavigationWidget::~TestNavigationWidget() -{ -} - void TestNavigationWidget::contextMenuEvent(QContextMenuEvent *event) { const bool enabled = !ProjectExplorer::BuildManager::isBuilding() diff --git a/src/plugins/autotest/testnavigationwidget.h b/src/plugins/autotest/testnavigationwidget.h index 163547c9c1..422ade8c58 100644 --- a/src/plugins/autotest/testnavigationwidget.h +++ b/src/plugins/autotest/testnavigationwidget.h @@ -58,8 +58,7 @@ class TestNavigationWidget : public QWidget Q_OBJECT public: - explicit TestNavigationWidget(QWidget *parent = 0); - ~TestNavigationWidget(); + explicit TestNavigationWidget(QWidget *parent = nullptr); void contextMenuEvent(QContextMenuEvent *event) override; QList<QToolButton *> createToolButtons(); diff --git a/src/plugins/autotest/testresult.cpp b/src/plugins/autotest/testresult.cpp index 47c4b3dba6..c2fcd97fa6 100644 --- a/src/plugins/autotest/testresult.cpp +++ b/src/plugins/autotest/testresult.cpp @@ -100,7 +100,7 @@ Result::Type TestResult::toResultType(int rt) if (rt < Result::FIRST_TYPE || rt > Result::LAST_TYPE) return Result::Invalid; - return (Result::Type)rt; + return Result::Type(rt); } QString TestResult::resultToString(const Result::Type type) diff --git a/src/plugins/autotest/testresultdelegate.cpp b/src/plugins/autotest/testresultdelegate.cpp index a8e0b4fbe8..d70b6fa39e 100644 --- a/src/plugins/autotest/testresultdelegate.cpp +++ b/src/plugins/autotest/testresultdelegate.cpp @@ -38,7 +38,7 @@ namespace Autotest { namespace Internal { -const static int outputLimit = 100000; +constexpr int outputLimit = 100000; static bool isSummaryItem(Result::Type type) { diff --git a/src/plugins/autotest/testresultmodel.cpp b/src/plugins/autotest/testresultmodel.cpp index 240b61cfc4..cbcbf73be8 100644 --- a/src/plugins/autotest/testresultmodel.cpp +++ b/src/plugins/autotest/testresultmodel.cpp @@ -42,10 +42,6 @@ TestResultItem::TestResultItem(const TestResultPtr &testResult) { } -TestResultItem::~TestResultItem() -{ -} - static QIcon testResultIcon(Result::Type result) { const static QIcon icons[] = { Icons::RESULT_PASS.icon(), diff --git a/src/plugins/autotest/testresultmodel.h b/src/plugins/autotest/testresultmodel.h index b6d38ffedd..de48db5a0d 100644 --- a/src/plugins/autotest/testresultmodel.h +++ b/src/plugins/autotest/testresultmodel.h @@ -41,7 +41,6 @@ class TestResultItem : public Utils::TreeItem { public: explicit TestResultItem(const TestResultPtr &testResult); - ~TestResultItem(); QVariant data(int column, int role) const override; const TestResult *testResult() const { return m_testResult.data(); } void updateDescription(const QString &description); diff --git a/src/plugins/autotest/testresultspane.h b/src/plugins/autotest/testresultspane.h index 9cedf7e7c6..7dcd1f94be 100644 --- a/src/plugins/autotest/testresultspane.h +++ b/src/plugins/autotest/testresultspane.h @@ -72,7 +72,7 @@ class TestResultsPane : public Core::IOutputPane { Q_OBJECT public: - virtual ~TestResultsPane(); + ~TestResultsPane() override; static TestResultsPane *instance(); // IOutputPane interface @@ -119,7 +119,7 @@ private: void toggleOutputStyle(); QString getWholeOutput(const QModelIndex &parent = QModelIndex()); - void createMarks(const QModelIndex& parent = QModelIndex()); + void createMarks(const QModelIndex &parent = QModelIndex()); void clearMarks(); QStackedWidget *m_outputWidget; diff --git a/src/plugins/autotest/testrunconfiguration.h b/src/plugins/autotest/testrunconfiguration.h index b4159c05e7..17e9c721d3 100644 --- a/src/plugins/autotest/testrunconfiguration.h +++ b/src/plugins/autotest/testrunconfiguration.h @@ -28,12 +28,12 @@ #include "autotestplugin.h" #include "testconfiguration.h" +#include <debugger/debuggerrunconfigurationaspect.h> #include <projectexplorer/applicationlauncher.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/devicesupport/devicemanager.h> #include <projectexplorer/runconfiguration.h> #include <utils/qtcassert.h> -#include <debugger/debuggerrunconfigurationaspect.h> #include <QCoreApplication> @@ -67,7 +67,6 @@ public: r.commandLineArguments = m_testConfig->argumentsForTestRunner().join(' '); r.workingDirectory = m_testConfig->workingDirectory(); r.environment = m_testConfig->environment(); - r.runMode = ProjectExplorer::ApplicationLauncher::Gui; r.device = ProjectExplorer::DeviceManager::instance()->defaultDevice( ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE); return r; diff --git a/src/plugins/autotest/testrunner.cpp b/src/plugins/autotest/testrunner.cpp index 0b774c6c7a..57574012ec 100644 --- a/src/plugins/autotest/testrunner.cpp +++ b/src/plugins/autotest/testrunner.cpp @@ -77,8 +77,7 @@ TestRunner *TestRunner::instance() } TestRunner::TestRunner(QObject *parent) : - QObject(parent), - m_executingTests(false) + QObject(parent) { connect(&m_futureWatcher, &QFutureWatcher<TestResultPtr>::resultReadyAt, this, [this](int index) { emit testResultReady(m_futureWatcher.resultAt(index)); }); @@ -329,17 +328,14 @@ void TestRunner::prepareToRunTests(TestRunMode mode) } } -static QString firstTestCaseTarget(const TestConfiguration *config) +static QString firstNonEmptyTestCaseTarget(const TestConfiguration *config) { - for (const QString &internalTarget : config->internalTargets()) { - const QString buildTarget = internalTarget.split('|').first(); - if (!buildTarget.isEmpty()) - return buildTarget; - } - return QString(); + return Utils::findOrDefault(config->internalTargets(), [](const QString &internalTarget) { + return !internalTarget.isEmpty(); + }); } -static ProjectExplorer::RunConfiguration *getRunConfiguration(const QString &dialogDetail) +static ProjectExplorer::RunConfiguration *getRunConfiguration(const QString &buildTargetKey) { using namespace ProjectExplorer; const Project *project = SessionManager::startupProject(); @@ -357,7 +353,7 @@ static ProjectExplorer::RunConfiguration *getRunConfiguration(const QString &dia if (runConfigurations.size() == 1) return runConfigurations.first(); - RunConfigurationSelectionDialog dialog(dialogDetail, Core::ICore::dialogParent()); + RunConfigurationSelectionDialog dialog(buildTargetKey, Core::ICore::dialogParent()); if (dialog.exec() == QDialog::Accepted) { const QString dName = dialog.displayName(); if (dName.isEmpty()) @@ -409,7 +405,7 @@ void TestRunner::runTests() projectChanged = true; toBeRemoved.append(config); } else if (!config->hasExecutable()) { - if (auto rc = getRunConfiguration(firstTestCaseTarget(config))) + if (auto rc = getRunConfiguration(firstNonEmptyTestCaseTarget(config))) config->setOriginalRunConfiguration(rc); else toBeRemoved.append(config); @@ -483,7 +479,7 @@ void TestRunner::debugTests() return; } if (!config->hasExecutable()) { - if (auto *rc = getRunConfiguration(firstTestCaseTarget(config))) + if (auto *rc = getRunConfiguration(firstNonEmptyTestCaseTarget(config))) config->completeTestInformation(rc, TestRunMode::Debug); } @@ -571,15 +567,14 @@ void TestRunner::runOrDebugTests() case TestRunMode::Run: case TestRunMode::RunWithoutDeploy: runTests(); - break; + return; case TestRunMode::Debug: case TestRunMode::DebugWithoutDeploy: debugTests(); - break; - default: - onFinished(); - QTC_ASSERT(false, return); // unexpected run mode + return; } + onFinished(); + QTC_ASSERT(false, return); // unexpected run mode } void TestRunner::buildProject(ProjectExplorer::Project *project) @@ -628,7 +623,15 @@ void TestRunner::onFinished() /*************************************************************************************************/ -RunConfigurationSelectionDialog::RunConfigurationSelectionDialog(const QString &testsInfo, +static QFrame *createLine(QWidget *parent) +{ + QFrame *line = new QFrame(parent); + line->setFrameShape(QFrame::HLine); + line->setFrameShadow(QFrame::Sunken); + return line; +} + +RunConfigurationSelectionDialog::RunConfigurationSelectionDialog(const QString &buildTargetKey, QWidget *parent) : QDialog(parent) { @@ -636,8 +639,8 @@ RunConfigurationSelectionDialog::RunConfigurationSelectionDialog(const QString & setWindowTitle(tr("Select Run Configuration")); QString details = tr("Could not determine which run configuration to choose for running tests"); - if (!testsInfo.isEmpty()) - details.append(QString(" (%1)").arg(testsInfo)); + if (!buildTargetKey.isEmpty()) + details.append(QString(" (%1)").arg(buildTargetKey)); m_details = new QLabel(details, this); m_rcCombo = new QComboBox(this); m_executable = new QLabel(this); @@ -647,15 +650,11 @@ RunConfigurationSelectionDialog::RunConfigurationSelectionDialog(const QString & m_buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok); m_buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); - auto line = new QFrame(this); - line->setFrameShape(QFrame::HLine); - line->setFrameShadow(QFrame::Sunken); - auto formLayout = new QFormLayout; formLayout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow); formLayout->addRow(m_details); formLayout->addRow(tr("Run Configuration:"), m_rcCombo); - formLayout->addRow(line); + formLayout->addRow(createLine(this)); formLayout->addRow(tr("Executable:"), m_executable); formLayout->addRow(tr("Arguments:"), m_arguments); formLayout->addRow(tr("Working Directory:"), m_workingDir); @@ -663,7 +662,7 @@ RunConfigurationSelectionDialog::RunConfigurationSelectionDialog(const QString & auto vboxLayout = new QVBoxLayout(this); vboxLayout->addLayout(formLayout); vboxLayout->addStretch(); - vboxLayout->addWidget(line); + vboxLayout->addWidget(createLine(this)); vboxLayout->addWidget(m_buttonBox); connect(m_rcCombo, &QComboBox::currentTextChanged, diff --git a/src/plugins/autotest/testrunner.h b/src/plugins/autotest/testrunner.h index ae4fc7c0d5..c5bc3dfe4d 100644 --- a/src/plugins/autotest/testrunner.h +++ b/src/plugins/autotest/testrunner.h @@ -52,12 +52,11 @@ namespace Internal { class AUTOTESTSHARED_EXPORT TestRunner : public QObject { Q_OBJECT - public: enum CancelReason { UserCanceled, Timeout, KitChanged }; static TestRunner* instance(); - ~TestRunner(); + ~TestRunner() override; void setSelectedTests(const QList<TestConfiguration *> &selected); void runTest(TestRunMode mode, const TestTreeItem *item); @@ -109,7 +108,7 @@ class RunConfigurationSelectionDialog : public QDialog { Q_OBJECT public: - explicit RunConfigurationSelectionDialog(const QString &testsInfo, QWidget *parent = nullptr); + explicit RunConfigurationSelectionDialog(const QString &buildTargetKey, QWidget *parent = nullptr); QString displayName() const; QString executable() const; private: diff --git a/src/plugins/autotest/testsettings.cpp b/src/plugins/autotest/testsettings.cpp index 55cbe31114..c19ed8ecf4 100644 --- a/src/plugins/autotest/testsettings.cpp +++ b/src/plugins/autotest/testsettings.cpp @@ -44,7 +44,7 @@ static const char filtersKey[] = "WhiteListFilters"; static const char processArgsKey[] = "ProcessArgs"; static const char groupSuffix[] = ".group"; -static const int defaultTimeout = 60000; +constexpr int defaultTimeout = 60000; TestSettings::TestSettings() : timeout(defaultTimeout) diff --git a/src/plugins/autotest/testsettingspage.cpp b/src/plugins/autotest/testsettingspage.cpp index 738e37ec33..97946d8226 100644 --- a/src/plugins/autotest/testsettingspage.cpp +++ b/src/plugins/autotest/testsettingspage.cpp @@ -45,7 +45,7 @@ namespace Internal { class TestFilterDialog : public QDialog { public: - explicit TestFilterDialog(QWidget *parent = nullptr, Qt::WindowFlags f = 0); + explicit TestFilterDialog(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); QString filterPath() const; void setDetailsText(const QString &details) { m_details->setText(details); } void setDefaultFilterPath(const QString &defaultPath); @@ -286,10 +286,6 @@ TestSettingsPage::TestSettingsPage(const QSharedPointer<TestSettings> &settings) Utils::Theme::PanelTextColorDark}}, Utils::Icon::Tint)); } -TestSettingsPage::~TestSettingsPage() -{ -} - QWidget *TestSettingsPage::widget() { if (!m_widget) { diff --git a/src/plugins/autotest/testsettingspage.h b/src/plugins/autotest/testsettingspage.h index 66077e20ae..2b1216c9eb 100644 --- a/src/plugins/autotest/testsettingspage.h +++ b/src/plugins/autotest/testsettingspage.h @@ -63,7 +63,6 @@ class TestSettingsPage : public Core::IOptionsPage Q_OBJECT public: explicit TestSettingsPage(const QSharedPointer<TestSettings> &settings); - ~TestSettingsPage(); QWidget *widget() override; void apply() override; diff --git a/src/plugins/autotest/testtreeitem.cpp b/src/plugins/autotest/testtreeitem.cpp index c6b5101557..e1c1debe9c 100644 --- a/src/plugins/autotest/testtreeitem.cpp +++ b/src/plugins/autotest/testtreeitem.cpp @@ -62,8 +62,8 @@ static QIcon testTreeIcon(TestTreeItem::Type type) static QIcon icons[] = { QIcon(), Utils::Icons::OPENFILE.icon(), - CPlusPlus::Icons::iconForType(CPlusPlus::Icons::ClassIconType), - CPlusPlus::Icons::iconForType(CPlusPlus::Icons::SlotPrivateIconType), + Utils::CodeModelIcon::iconForType(Utils::CodeModelIcon::Class), + Utils::CodeModelIcon::iconForType(Utils::CodeModelIcon::SlotPrivate), QIcon(":/autotest/images/data.png") }; @@ -90,7 +90,7 @@ QVariant TestTreeItem::data(int /*column*/, int role) const if (m_type == GroupNode) return QVariant(); QVariant itemLink; - itemLink.setValue(Utils::Link(m_filePath, m_line, m_column)); + itemLink.setValue(Utils::Link(m_filePath, int(m_line), int(m_column))); return itemLink; } case ItalicRole: @@ -107,7 +107,7 @@ bool TestTreeItem::setData(int /*column*/, const QVariant &data, int role) { if (role == Qt::CheckStateRole) { Qt::CheckState old = m_checked; - m_checked = (Qt::CheckState)data.toInt(); + m_checked = Qt::CheckState(data.toInt()); return m_checked != old; } return false; @@ -124,9 +124,6 @@ Qt::ItemFlags TestTreeItem::flags(int /*column*/) const return defaultFlags | Qt::ItemIsAutoTristate | Qt::ItemIsUserCheckable; case TestFunctionOrSet: return defaultFlags | Qt::ItemIsUserCheckable; - case TestDataFunction: - case TestSpecialFunction: - case TestDataTag: default: return defaultFlags; } @@ -244,9 +241,8 @@ TestConfiguration *TestTreeItem::asConfiguration(TestRunMode mode) const case TestRunMode::Debug: case TestRunMode::DebugWithoutDeploy: return debugConfiguration(); - default: - return nullptr; } + return nullptr; } QList<TestConfiguration *> TestTreeItem::getAllTestConfigurations() const @@ -287,9 +283,8 @@ bool TestTreeItem::lessThan(const TestTreeItem *other, SortMode mode) const } return leftLink.targetFileName > rightLink.targetFileName; } - default: - return true; } + return true; } bool TestTreeItem::isGroupNodeFor(const TestTreeItem *other) const @@ -315,7 +310,7 @@ QSet<QString> TestTreeItem::internalTargets() const if (projectParts.isEmpty()) return TestTreeItem::dependingInternalTargets(cppMM, m_filePath); QSet<QString> targets; - for (const CppTools::ProjectPart::Ptr part : projectParts) { + for (const CppTools::ProjectPart::Ptr &part : projectParts) { targets.insert(part->buildSystemTarget); if (part->buildTargetType != CppTools::ProjectPart::Executable) targets.unite(TestTreeItem::dependingInternalTargets(cppMM, m_filePath)); @@ -372,7 +367,7 @@ QSet<QString> TestTreeItem::dependingInternalTargets(CppTools::CppModelManager * const Utils::FileNameList dependingFiles = snapshot.filesDependingOn( wasHeader ? file : correspondingFile); for (const Utils::FileName &fn : dependingFiles) { - for (const CppTools::ProjectPart::Ptr part : cppMM->projectPart(fn)) + for (const CppTools::ProjectPart::Ptr &part : cppMM->projectPart(fn)) result.insert(part->buildSystemTarget); } return result; diff --git a/src/plugins/autotest/testtreeitem.h b/src/plugins/autotest/testtreeitem.h index de9e824eda..74e6c98d8f 100644 --- a/src/plugins/autotest/testtreeitem.h +++ b/src/plugins/autotest/testtreeitem.h @@ -50,6 +50,7 @@ namespace Internal { class TestParseResult; class TestConfiguration; enum class TestRunMode; + class TestTreeItem : public Utils::TypedTreeItem<TestTreeItem> { public: @@ -158,7 +159,7 @@ private: class TestCodeLocationAndType { public: - QString m_name; // tag name for m_type == TEST_DATATAG, file name for other values + QString m_name; // tag name for m_type == TestDataTag, file name for other values unsigned m_line = 0; unsigned m_column = 0; TestTreeItem::Type m_type = TestTreeItem::Root; diff --git a/src/plugins/autotest/testtreeitemdelegate.cpp b/src/plugins/autotest/testtreeitemdelegate.cpp index e7151632e1..2a1aeea0f4 100644 --- a/src/plugins/autotest/testtreeitemdelegate.cpp +++ b/src/plugins/autotest/testtreeitemdelegate.cpp @@ -36,10 +36,6 @@ TestTreeItemDelegate::TestTreeItemDelegate(QObject *parent) { } -TestTreeItemDelegate::~TestTreeItemDelegate() -{ -} - void TestTreeItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyleOptionViewItem opt = option; diff --git a/src/plugins/autotest/testtreeitemdelegate.h b/src/plugins/autotest/testtreeitemdelegate.h index 02c87b3627..51e1a8b27f 100644 --- a/src/plugins/autotest/testtreeitemdelegate.h +++ b/src/plugins/autotest/testtreeitemdelegate.h @@ -35,7 +35,6 @@ class TestTreeItemDelegate : public QStyledItemDelegate Q_OBJECT public: explicit TestTreeItemDelegate(QObject *parent = nullptr); - ~TestTreeItemDelegate(); public: void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; diff --git a/src/plugins/autotest/testtreemodel.cpp b/src/plugins/autotest/testtreemodel.cpp index 0b9eaaa426..7e4e577812 100644 --- a/src/plugins/autotest/testtreemodel.cpp +++ b/src/plugins/autotest/testtreemodel.cpp @@ -383,7 +383,7 @@ void TestTreeModel::revalidateCheckState(TestTreeItem *item) || type == TestTreeItem::TestDataTag) { return; } - const Qt::CheckState oldState = (Qt::CheckState)item->data(0, Qt::CheckStateRole).toInt(); + const Qt::CheckState oldState = Qt::CheckState(item->data(0, Qt::CheckStateRole).toInt()); Qt::CheckState newState = Qt::Checked; bool foundChecked = false; bool foundUnchecked = false; diff --git a/src/plugins/autotest/testtreemodel.h b/src/plugins/autotest/testtreemodel.h index 561e76302a..2945765d47 100644 --- a/src/plugins/autotest/testtreemodel.h +++ b/src/plugins/autotest/testtreemodel.h @@ -47,7 +47,7 @@ class AUTOTESTSHARED_EXPORT TestTreeModel : public Utils::TreeModel<> Q_OBJECT public: static TestTreeModel* instance(); - ~TestTreeModel(); + ~TestTreeModel() override; bool setData(const QModelIndex &index, const QVariant &value, int role) override; Qt::ItemFlags flags(const QModelIndex &index) const override; diff --git a/src/plugins/autotoolsprojectmanager/autogenstep.cpp b/src/plugins/autotoolsprojectmanager/autogenstep.cpp index 0106a435b8..3bcb90d052 100644 --- a/src/plugins/autotoolsprojectmanager/autogenstep.cpp +++ b/src/plugins/autotoolsprojectmanager/autogenstep.cpp @@ -56,7 +56,7 @@ const char AUTOGEN_STEP_ID[] = "AutotoolsProjectManager.AutogenStep"; AutogenStepFactory::AutogenStepFactory() { registerStep<AutogenStep>(AUTOGEN_STEP_ID); - setDisplayName(tr("Autogen", "Display name for AutotoolsProjectManager::AutogenStep id.")); + setDisplayName(AutogenStep::tr("Autogen", "Display name for AutotoolsProjectManager::AutogenStep id.")); setSupportedProjectType(Constants::AUTOTOOLS_PROJECT_ID); setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); } diff --git a/src/plugins/autotoolsprojectmanager/autogenstep.h b/src/plugins/autotoolsprojectmanager/autogenstep.h index 320c0bacaf..a4659ebcbc 100644 --- a/src/plugins/autotoolsprojectmanager/autogenstep.h +++ b/src/plugins/autotoolsprojectmanager/autogenstep.h @@ -50,8 +50,6 @@ class AutogenStepConfigWidget; */ class AutogenStepFactory : public ProjectExplorer::BuildStepFactory { - Q_OBJECT - public: AutogenStepFactory(); }; diff --git a/src/plugins/autotoolsprojectmanager/autoreconfstep.cpp b/src/plugins/autotoolsprojectmanager/autoreconfstep.cpp index 473e587d78..51e2e34751 100644 --- a/src/plugins/autotoolsprojectmanager/autoreconfstep.cpp +++ b/src/plugins/autotoolsprojectmanager/autoreconfstep.cpp @@ -55,7 +55,7 @@ const char AUTORECONF_ADDITIONAL_ARGUMENTS_KEY[] = "AutotoolsProjectManager.Auto AutoreconfStepFactory::AutoreconfStepFactory() { registerStep<AutoreconfStep>(AUTORECONF_STEP_ID); - setDisplayName(tr("Autoreconf", "Display name for AutotoolsProjectManager::AutoreconfStep id.")); + setDisplayName(AutoreconfStep::tr("Autoreconf", "Display name for AutotoolsProjectManager::AutoreconfStep id.")); setSupportedProjectType(Constants::AUTOTOOLS_PROJECT_ID); setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); } diff --git a/src/plugins/autotoolsprojectmanager/autoreconfstep.h b/src/plugins/autotoolsprojectmanager/autoreconfstep.h index 160f6fc5c1..7aa345c148 100644 --- a/src/plugins/autotoolsprojectmanager/autoreconfstep.h +++ b/src/plugins/autotoolsprojectmanager/autoreconfstep.h @@ -49,8 +49,6 @@ class AutoreconfStep; */ class AutoreconfStepFactory : public ProjectExplorer::BuildStepFactory { - Q_OBJECT - public: AutoreconfStepFactory(); }; diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp index d930c380d7..c4f90b83c1 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp +++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp @@ -89,14 +89,12 @@ void AutotoolsBuildConfiguration::initialize(const BuildInfo *info) configureStep, &ConfigureStep::notifyBuildDirectoryChanged); // make - MakeStep *makeStep = new MakeStep(buildSteps); + MakeStep *makeStep = new MakeStep(buildSteps, "all"); buildSteps->insertStep(2, makeStep); - makeStep->setBuildTarget(QLatin1String("all"), /*on =*/ true); // ### Build Steps Clean ### BuildStepList *cleanSteps = stepList(BUILDSTEPS_CLEAN); - MakeStep *cleanMakeStep = new MakeStep(cleanSteps); - cleanMakeStep->setAdditionalArguments("clean"); + MakeStep *cleanMakeStep = new MakeStep(cleanSteps, "clean"); cleanMakeStep->setClean(true); cleanSteps->insertStep(0, cleanMakeStep); } diff --git a/src/plugins/autotoolsprojectmanager/configurestep.cpp b/src/plugins/autotoolsprojectmanager/configurestep.cpp index 7d370e2ded..5ae119553d 100644 --- a/src/plugins/autotoolsprojectmanager/configurestep.cpp +++ b/src/plugins/autotoolsprojectmanager/configurestep.cpp @@ -70,7 +70,7 @@ static QString projectDirRelativeToBuildDir(BuildConfiguration *bc) { ConfigureStepFactory::ConfigureStepFactory() { registerStep<ConfigureStep>(CONFIGURE_STEP_ID); - setDisplayName(tr("Configure", "Display name for AutotoolsProjectManager::ConfigureStep id.")); + setDisplayName(ConfigureStep::tr("Configure", "Display name for AutotoolsProjectManager::ConfigureStep id.")); setSupportedProjectType(Constants::AUTOTOOLS_PROJECT_ID); setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); } diff --git a/src/plugins/autotoolsprojectmanager/configurestep.h b/src/plugins/autotoolsprojectmanager/configurestep.h index 2f5ce3e65e..0ab97fbae3 100644 --- a/src/plugins/autotoolsprojectmanager/configurestep.h +++ b/src/plugins/autotoolsprojectmanager/configurestep.h @@ -49,8 +49,6 @@ class ConfigureStepConfigWidget; */ class ConfigureStepFactory : public ProjectExplorer::BuildStepFactory { - Q_OBJECT - public: ConfigureStepFactory(); }; diff --git a/src/plugins/autotoolsprojectmanager/makestep.cpp b/src/plugins/autotoolsprojectmanager/makestep.cpp index 222978d44a..315d235c9b 100644 --- a/src/plugins/autotoolsprojectmanager/makestep.cpp +++ b/src/plugins/autotoolsprojectmanager/makestep.cpp @@ -31,220 +31,39 @@ #include "autotoolsbuildconfiguration.h" #include <projectexplorer/buildsteplist.h> -#include <projectexplorer/target.h> -#include <projectexplorer/toolchain.h> -#include <projectexplorer/gnumakeparser.h> -#include <projectexplorer/kitinformation.h> -#include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorerconstants.h> -#include <qtsupport/qtkitinformation.h> -#include <qtsupport/qtparser.h> -#include <utils/qtcprocess.h> - -#include <QVariantMap> -#include <QLineEdit> -#include <QFormLayout> using namespace AutotoolsProjectManager; using namespace AutotoolsProjectManager::Internal; using namespace AutotoolsProjectManager::Constants; -using namespace ProjectExplorer; -using namespace ProjectExplorer::Constants; const char MAKE_STEP_ID[] = "AutotoolsProjectManager.MakeStep"; -const char CLEAN_KEY[] = "AutotoolsProjectManager.MakeStep.Clean"; -const char BUILD_TARGETS_KEY[] = "AutotoolsProjectManager.MakeStep.BuildTargets"; -const char MAKE_STEP_ADDITIONAL_ARGUMENTS_KEY[] = "AutotoolsProjectManager.MakeStep.AdditionalArguments"; - // MakeStepFactory MakeStepFactory::MakeStepFactory() { - setObjectName("Autotools::MakeStepFactory"); - registerStep<MakeStep>(MAKE_STEP_ID); - setDisplayName(tr("Make", "Display name for AutotoolsProjectManager::MakeStep id.")); + struct Step : public MakeStep + { + Step(ProjectExplorer::BuildStepList *bsl) : MakeStep(bsl) + { + if (bsl->id() == ProjectExplorer::Constants::BUILDSTEPS_CLEAN) { + setBuildTarget("clean", true); + setClean(true); + } else { + setBuildTarget("all", true); + } + } + }; + + registerStep<Step>(MAKE_STEP_ID); + setDisplayName(ProjectExplorer::MakeStep::defaultDisplayName()); setSupportedProjectType(AUTOTOOLS_PROJECT_ID); } // MakeStep -MakeStep::MakeStep(BuildStepList *bsl) : AbstractProcessStep(bsl, MAKE_STEP_ID) -{ - setDefaultDisplayName(tr("Make")); -} - -void MakeStep::setClean(bool clean) -{ - m_clean = clean; -} - -bool MakeStep::init(QList<const BuildStep *> &earlierSteps) -{ - BuildConfiguration *bc = buildConfiguration(); - if (!bc) - bc = target()->activeBuildConfiguration(); - if (!bc) - emit addTask(Task::buildConfigurationMissingTask()); - - QList<ToolChain *> tcList = ToolChainKitInformation::toolChains(target()->kit()); - if (tcList.isEmpty()) - emit addTask(Task::compilerMissingTask()); - - if (tcList.isEmpty() || !bc) { - emitFaultyConfigurationMessage(); - return false; - } - - QString arguments = Utils::QtcProcess::joinArgs(m_buildTargets); - Utils::QtcProcess::addArgs(&arguments, additionalArguments()); - - setIgnoreReturnValue(m_clean); - - ProcessParameters *pp = processParameters(); - pp->setMacroExpander(bc->macroExpander()); - Utils::Environment env = bc->environment(); - Utils::Environment::setupEnglishOutput(&env); - pp->setEnvironment(env); - pp->setWorkingDirectory(bc->buildDirectory().toString()); - pp->setCommand(tcList.at(0)->makeCommand(bc->environment())); - pp->setArguments(arguments); - pp->resolveAll(); - - setOutputParser(new GnuMakeParser()); - IOutputParser *parser = target()->kit()->createOutputParser(); - if (parser) - appendOutputParser(parser); - outputParser()->setWorkingDirectory(pp->effectiveWorkingDirectory()); - - return AbstractProcessStep::init(earlierSteps); -} - -void MakeStep::run(QFutureInterface<bool> &interface) -{ - AbstractProcessStep::run(interface); -} - -BuildStepConfigWidget *MakeStep::createConfigWidget() -{ - return new MakeStepConfigWidget(this); -} - -bool MakeStep::immutable() const -{ - return false; -} - -void MakeStep::setBuildTarget(const QString &target, bool on) -{ - QStringList old = m_buildTargets; - if (on && !old.contains(target)) - old << target; - else if (!on && old.contains(target)) - old.removeOne(target); - - m_buildTargets = old; -} - -void MakeStep::setAdditionalArguments(const QString &list) +MakeStep::MakeStep(ProjectExplorer::BuildStepList *bsl, const QString &buildTarget) + : ProjectExplorer::MakeStep(bsl, MAKE_STEP_ID, buildTarget, {"all", "clean"}) { - if (list == m_additionalArguments) - return; - - m_additionalArguments = list; - - emit additionalArgumentsChanged(list); -} - -QString MakeStep::additionalArguments() const -{ - return m_additionalArguments; -} - -QVariantMap MakeStep::toMap() const -{ - QVariantMap map = AbstractProcessStep::toMap(); - - map.insert(BUILD_TARGETS_KEY, m_buildTargets); - map.insert(MAKE_STEP_ADDITIONAL_ARGUMENTS_KEY, m_additionalArguments); - map.insert(CLEAN_KEY, m_clean); - return map; -} - -bool MakeStep::fromMap(const QVariantMap &map) -{ - m_buildTargets = map.value(BUILD_TARGETS_KEY).toStringList(); - m_additionalArguments = map.value(MAKE_STEP_ADDITIONAL_ARGUMENTS_KEY).toString(); - m_clean = map.value(CLEAN_KEY).toBool(); - - return BuildStep::fromMap(map); -} - -/////////////////////////////// -// MakeStepConfigWidget class -/////////////////////////////// -MakeStepConfigWidget::MakeStepConfigWidget(MakeStep *makeStep) : - m_makeStep(makeStep), - m_summaryText(), - m_additionalArguments(0) -{ - QFormLayout *fl = new QFormLayout(this); - fl->setMargin(0); - fl->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); - setLayout(fl); - - m_additionalArguments = new QLineEdit(this); - fl->addRow(tr("Arguments:"), m_additionalArguments); - m_additionalArguments->setText(m_makeStep->additionalArguments()); - - updateDetails(); - - connect(m_additionalArguments, &QLineEdit::textChanged, - makeStep, &MakeStep::setAdditionalArguments); - connect(makeStep, &MakeStep::additionalArgumentsChanged, - this, &MakeStepConfigWidget::updateDetails); - m_makeStep->project()->subscribeSignal(&BuildConfiguration::environmentChanged, this, [this]() { - if (static_cast<BuildConfiguration *>(sender())->isActive()) - updateDetails(); - }); - connect(makeStep->project(), &Project::activeProjectConfigurationChanged, - this, [this](ProjectConfiguration *pc) { - if (pc && pc->isActive()) - updateDetails(); - }); -} - -QString MakeStepConfigWidget::displayName() const -{ - return tr("Make", "AutotoolsProjectManager::MakeStepConfigWidget display name."); -} - -QString MakeStepConfigWidget::summaryText() const -{ - return m_summaryText; -} - -void MakeStepConfigWidget::updateDetails() -{ - BuildConfiguration *bc = m_makeStep->buildConfiguration(); - if (!bc) - bc = m_makeStep->target()->activeBuildConfiguration(); - QList<ToolChain *> tcList = ToolChainKitInformation::toolChains(m_makeStep->target()->kit()); - - if (!tcList.isEmpty()) { - QString arguments = Utils::QtcProcess::joinArgs(m_makeStep->m_buildTargets); - Utils::QtcProcess::addArgs(&arguments, m_makeStep->additionalArguments()); - - ProcessParameters param; - param.setMacroExpander(m_makeStep->macroExpander()); - param.setEnvironment(bc->environment()); - param.setWorkingDirectory(bc->buildDirectory().toString()); - param.setCommand(tcList.at(0)->makeCommand(bc->environment())); - param.setArguments(arguments); - m_summaryText = param.summary(displayName()); - } else { - m_summaryText = "<b>" + ToolChainKitInformation::msgNoToolChainInTarget() + "</b>"; - } - - emit updateSummary(); } diff --git a/src/plugins/autotoolsprojectmanager/makestep.h b/src/plugins/autotoolsprojectmanager/makestep.h index 1ded149366..f738fd1057 100644 --- a/src/plugins/autotoolsprojectmanager/makestep.h +++ b/src/plugins/autotoolsprojectmanager/makestep.h @@ -27,31 +27,16 @@ #pragma once -#include <projectexplorer/abstractprocessstep.h> -#include <projectexplorer/task.h> - -QT_BEGIN_NAMESPACE -class QLineEdit; -QT_END_NAMESPACE +#include <projectexplorer/makestep.h> namespace AutotoolsProjectManager { namespace Internal { -class AutotoolsProject; -class MakeStep; - /////////////////////////// // MakeStepFactory class /////////////////////////// -/** - * @brief Implementation of the ProjectExplorer::IBuildStepFactory interface. - * - * The factory is used to create instances of MakeStep. - */ class MakeStepFactory : public ProjectExplorer::BuildStepFactory { - Q_OBJECT - public: MakeStepFactory(); }; @@ -59,71 +44,12 @@ public: ///////////////////// // MakeStep class ///////////////////// -/** - * @brief Implementation of the ProjectExplorer::AbstractProcessStep interface. - * - * A make step can be configured by selecting the "Projects" button of Qt Creator - * (in the left hand side menu) and under "Build Settings". - * - * It is possible for the user to specify custom arguments. The corresponding - * configuration widget is created by MakeStep::createConfigWidget and is - * represented by an instance of the class MakeStepConfigWidget. - */ -class MakeStep : public ProjectExplorer::AbstractProcessStep -{ - Q_OBJECT - friend class MakeStepFactory; - friend class MakeStepConfigWidget; - -public: - explicit MakeStep(ProjectExplorer::BuildStepList *bsl); - - bool init(QList<const BuildStep *> &earlierSteps) override; - void run(QFutureInterface<bool> &interface) override; - ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override; - void setClean(bool clean); - bool immutable() const override; - void setBuildTarget(const QString &target, bool on); - QString additionalArguments() const; - QVariantMap toMap() const override; - - void setAdditionalArguments(const QString &list); - -signals: - void additionalArgumentsChanged(const QString &); - -private: - bool fromMap(const QVariantMap &map) override; - - QStringList m_buildTargets; - QString m_additionalArguments; - bool m_clean = false; -}; - -/////////////////////////////// -// MakeStepConfigWidget class -/////////////////////////////// -/** - * @brief Implementation of the ProjectExplorer::BuildStepConfigWidget interface. - * - * Allows to configure a make step in the GUI. - */ -class MakeStepConfigWidget : public ProjectExplorer::BuildStepConfigWidget +class MakeStep : public ProjectExplorer::MakeStep { Q_OBJECT public: - MakeStepConfigWidget(MakeStep *makeStep); - - QString displayName() const override; - QString summaryText() const override; - -private: - void updateDetails(); - - MakeStep *m_makeStep; - QString m_summaryText; - QLineEdit *m_additionalArguments; + explicit MakeStep(ProjectExplorer::BuildStepList *bsl, const QString &buildTarget = QString()); }; } // namespace Internal diff --git a/src/plugins/baremetal/baremetalcustomrunconfiguration.cpp b/src/plugins/baremetal/baremetalcustomrunconfiguration.cpp index 667c278e85..363d7a21d9 100644 --- a/src/plugins/baremetal/baremetalcustomrunconfiguration.cpp +++ b/src/plugins/baremetal/baremetalcustomrunconfiguration.cpp @@ -52,7 +52,7 @@ BareMetalCustomRunConfiguration::BareMetalCustomRunConfiguration(Target *target, addExtraAspect(new ArgumentsAspect(this, "Qt4ProjectManager.MaemoRunConfiguration.Arguments")); addExtraAspect(new WorkingDirectoryAspect(this, "BareMetal.RunConfig.WorkingDirectory")); - setDefaultDisplayName(RunConfigurationFactory::decoratedTargetName(tr("Custom Executable)"), target)); + setDefaultDisplayName(RunConfigurationFactory::decoratedTargetName(tr("Custom Executable"), target)); } const char *BareMetalCustomRunConfiguration::Id = "BareMetal"; diff --git a/src/plugins/baremetal/defaultgdbserverprovider.h b/src/plugins/baremetal/defaultgdbserverprovider.h index 28dd296560..f5cb1dd3db 100644 --- a/src/plugins/baremetal/defaultgdbserverprovider.h +++ b/src/plugins/baremetal/defaultgdbserverprovider.h @@ -79,8 +79,6 @@ public: bool canRestore(const QVariantMap &data) const final; GdbServerProvider *restore(const QVariantMap &data) final; - - GdbServerProviderConfigWidget *configurationWidget(GdbServerProvider *); }; class DefaultGdbServerProviderConfigWidget : public GdbServerProviderConfigWidget diff --git a/src/plugins/baremetal/gdbserverproviderssettingspage.cpp b/src/plugins/baremetal/gdbserverproviderssettingspage.cpp index c34a38f29a..3eb43c8911 100644 --- a/src/plugins/baremetal/gdbserverproviderssettingspage.cpp +++ b/src/plugins/baremetal/gdbserverproviderssettingspage.cpp @@ -61,19 +61,10 @@ public: GdbServerProviderNode(GdbServerProvider *provider, bool changed = false) : provider(provider), changed(changed) { - widget = provider ? provider->configurationWidget() : 0; - } - - Qt::ItemFlags flags(int) const override - { - return provider ? Qt::ItemIsEnabled|Qt::ItemIsSelectable : Qt::ItemIsEnabled; } QVariant data(int column, int role) const override { - if (!provider) - return QVariant(); - if (role == Qt::FontRole) { QFont f = QApplication::font(); if (changed) @@ -89,14 +80,12 @@ public: return QVariant(); } - GdbServerProvider *provider; - GdbServerProviderConfigWidget *widget; - bool changed; + GdbServerProvider *provider = nullptr; + GdbServerProviderConfigWidget *widget = nullptr; + bool changed = false; }; - -GdbServerProviderModel::GdbServerProviderModel(QObject *parent) - : TreeModel<>(parent) +GdbServerProviderModel::GdbServerProviderModel() { setHeader({tr("Name"), tr("Type")}); @@ -206,19 +195,13 @@ void GdbServerProviderModel::markForAddition(GdbServerProvider *provider) GdbServerProviderNode *GdbServerProviderModel::createNode( GdbServerProvider *provider, bool changed) { - auto n = new GdbServerProviderNode(provider, changed); - if (n->widget) { - connect(n->widget, &GdbServerProviderConfigWidget::dirty, this, [this, n] { - for (TreeItem *item : *rootItem()) { - auto nn = static_cast<GdbServerProviderNode *>(item); - if (nn->widget == n->widget) { - nn->changed = true; - nn->update(); - } - } - }); - } - return n; + auto node = new GdbServerProviderNode(provider, changed); + node->widget = provider->configurationWidget(); + connect(node->widget, &GdbServerProviderConfigWidget::dirty, this, [node] { + node->changed = true; + node->update(); + }); + return node; } void GdbServerProviderModel::addProvider(GdbServerProvider *provider) diff --git a/src/plugins/baremetal/gdbserverproviderssettingspage.h b/src/plugins/baremetal/gdbserverproviderssettingspage.h index b8fa04cc4b..28c5bc3b4c 100644 --- a/src/plugins/baremetal/gdbserverproviderssettingspage.h +++ b/src/plugins/baremetal/gdbserverproviderssettingspage.h @@ -46,12 +46,13 @@ class GdbServerProviderFactory; class GdbServerProviderNode; class GdbServerProvidersSettingsWidget; -class GdbServerProviderModel : public Utils::TreeModel<> +class GdbServerProviderModel + : public Utils::TreeModel<Utils::TypedTreeItem<GdbServerProviderNode>, GdbServerProviderNode> { Q_OBJECT public: - explicit GdbServerProviderModel(QObject *parent = 0); + GdbServerProviderModel(); GdbServerProvider *provider(const QModelIndex &) const; GdbServerProviderConfigWidget *widget(const QModelIndex &) const; @@ -82,14 +83,14 @@ class GdbServerProvidersSettingsPage : public Core::IOptionsPage Q_OBJECT public: - explicit GdbServerProvidersSettingsPage(QObject *parent = 0); + explicit GdbServerProvidersSettingsPage(QObject *parent = nullptr); private: QWidget *widget(); void apply(); void finish(); - GdbServerProvidersSettingsWidget *m_configWidget = 0; + GdbServerProvidersSettingsWidget *m_configWidget = nullptr; }; } // namespace Internal diff --git a/src/plugins/clangcodemodel/clangassistproposal.cpp b/src/plugins/clangcodemodel/clangassistproposal.cpp deleted file mode 100644 index 16b9937908..0000000000 --- a/src/plugins/clangcodemodel/clangassistproposal.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "clangassistproposal.h" - -#include <texteditor/texteditor.h> - -namespace ClangCodeModel { -namespace Internal { - -ClangAssistProposal::ClangAssistProposal(int cursorPos, TextEditor::GenericProposalModelPtr model) - : GenericProposal(cursorPos, model) -{ -} - -bool ClangAssistProposal::isCorrective(TextEditor::TextEditorWidget *editorWidget) const -{ - auto clangAssistProposalModel = model().staticCast<ClangAssistProposalModel>(); - - return clangAssistProposalModel->neededCorrection() - == ClangBackEnd::CompletionCorrection::DotToArrowCorrection - && editorWidget->textAt(basePosition() - 1, 1) == "."; -} - -void ClangAssistProposal::makeCorrection(TextEditor::TextEditorWidget *editorWidget) -{ - const int oldPosition = editorWidget->position(); - editorWidget->setCursorPosition(basePosition() - 1); - editorWidget->replace(1, QLatin1String("->")); - editorWidget->setCursorPosition(oldPosition + 1); - moveBasePosition(1); -} - -} // namespace Internal -} // namespace ClangCodeModel - diff --git a/src/plugins/clangcodemodel/clangassistproposalitem.cpp b/src/plugins/clangcodemodel/clangassistproposalitem.cpp index ef3b394f99..28e8401d8f 100644 --- a/src/plugins/clangcodemodel/clangassistproposalitem.cpp +++ b/src/plugins/clangcodemodel/clangassistproposalitem.cpp @@ -26,6 +26,7 @@ #include "clangassistproposalitem.h" #include "clangcompletionchunkstotextconverter.h" +#include "clangfixitoperation.h" #include <cplusplus/Icons.h> #include <cplusplus/MatchingText.h> @@ -35,9 +36,12 @@ #include <texteditor/completionsettings.h> #include <texteditor/texteditorsettings.h> +#include <QCoreApplication> #include <QTextCursor> #include <utils/algorithm.h> +#include <utils/textutils.h> +#include <utils/qtcassert.h> using namespace CPlusPlus; using namespace ClangBackEnd; @@ -53,7 +57,7 @@ bool ClangAssistProposalItem::prematurelyApplies(const QChar &typedCharacter) co applies = QString::fromLatin1("(,").contains(typedCharacter); else if (m_completionOperator == T_STRING_LITERAL || m_completionOperator == T_ANGLE_STRING_LITERAL) applies = (typedCharacter == QLatin1Char('/')) && text().endsWith(QLatin1Char('/')); - else if (codeCompletion().completionKind == CodeCompletion::ObjCMessageCompletionKind) + else if (firstCodeCompletion().completionKind == CodeCompletion::ObjCMessageCompletionKind) applies = QString::fromLatin1(";.,").contains(typedCharacter); else applies = QString::fromLatin1(";.,:(").contains(typedCharacter); @@ -69,14 +73,6 @@ bool ClangAssistProposalItem::implicitlyApplies() const return true; } -static void moveToPrevChar(TextEditor::TextDocumentManipulatorInterface &manipulator, - QTextCursor &cursor) -{ - cursor.movePosition(QTextCursor::PreviousCharacter); - while (manipulator.characterAt(cursor.position()).isSpace()) - cursor.movePosition(QTextCursor::PreviousCharacter); -} - static QString textUntilPreviousStatement(TextEditor::TextDocumentManipulatorInterface &manipulator, int startPosition) { @@ -114,12 +110,45 @@ static bool isAtUsingDeclaration(TextEditor::TextDocumentManipulatorInterface &m }); } +static QString methodDefinitionParameters(const CodeCompletionChunks &chunks) +{ + QString result; + + auto typedTextChunkIt = std::find_if(chunks.begin(), chunks.end(), + [](const CodeCompletionChunk &chunk) { + return chunk.kind == CodeCompletionChunk::TypedText; + }); + if (typedTextChunkIt == chunks.end()) + return result; + + std::for_each(++typedTextChunkIt, chunks.end(), [&result](const CodeCompletionChunk &chunk) { + if (chunk.kind == CodeCompletionChunk::Placeholder && chunk.text.contains('=')) { + Utf8String text = chunk.text.mid(0, chunk.text.indexOf('=')); + if (text.endsWith(' ')) + text.chop(1); + result += text; + } else { + result += chunk.text; + } + }); + + return result; +} + void ClangAssistProposalItem::apply(TextEditor::TextDocumentManipulatorInterface &manipulator, int basePosition) const { - const CodeCompletion ccr = codeCompletion(); + const CodeCompletion ccr = firstCodeCompletion(); + + if (!ccr.requiredFixIts.empty()) { + ClangFixItOperation fixItOperation(Utf8String(), ccr.requiredFixIts); + fixItOperation.perform(); + + const int shift = fixItsShift(manipulator); + basePosition += shift; + } - QString textToBeInserted = text(); + QString textToBeInserted = m_text; QString extraCharacters; int extraLength = 0; int cursorOffset = 0; @@ -152,7 +181,9 @@ void ClangAssistProposalItem::apply(TextEditor::TextDocumentManipulatorInterface if (autoInsertBrackets && (ccr.completionKind == CodeCompletion::FunctionCompletionKind + || ccr.completionKind == CodeCompletion::FunctionDefinitionCompletionKind || ccr.completionKind == CodeCompletion::DestructorCompletionKind + || ccr.completionKind == CodeCompletion::ConstructorCompletionKind || ccr.completionKind == CodeCompletion::SignalCompletionKind || ccr.completionKind == CodeCompletion::SlotCompletionKind)) { // When the user typed the opening parenthesis, he'll likely also type the closing one, @@ -160,21 +191,27 @@ void ClangAssistProposalItem::apply(TextEditor::TextDocumentManipulatorInterface // inserted closing parenthesis. const bool skipClosingParenthesis = m_typedCharacter != QLatin1Char('('); QTextCursor cursor = manipulator.textCursorAt(basePosition); - cursor.movePosition(QTextCursor::PreviousWord); - while (manipulator.characterAt(cursor.position()) == ':') - cursor.movePosition(QTextCursor::PreviousWord, QTextCursor::MoveAnchor, 2); - // Move to the last character in the previous word - cursor.movePosition(QTextCursor::NextWord); - moveToPrevChar(manipulator, cursor); bool abandonParen = false; - if (manipulator.characterAt(cursor.position()) == '&') { - moveToPrevChar(manipulator, cursor); + if (Utils::Text::matchPreviousWord(manipulator, cursor, "&")) { + Utils::Text::moveToPrevChar(manipulator, cursor); + Utils::Text::moveToPrevChar(manipulator, cursor); const QChar prevChar = manipulator.characterAt(cursor.position()); + cursor.setPosition(basePosition); abandonParen = QString("(;,{}").contains(prevChar); } if (!abandonParen) abandonParen = isAtUsingDeclaration(manipulator, basePosition); + + if (!abandonParen && ccr.completionKind == CodeCompletion::FunctionDefinitionCompletionKind) { + const CodeCompletionChunk resultType = ccr.chunks.first(); + QTC_ASSERT(resultType.kind == CodeCompletionChunk::ResultType, return;); + if (Utils::Text::matchPreviousWord(manipulator, cursor, resultType.text.toString())) { + extraCharacters += methodDefinitionParameters(ccr.chunks); + // To skip the next block. + abandonParen = true; + } + } if (!abandonParen) { if (completionSettings.m_spaceAfterFunctionName) extraCharacters += QLatin1Char(' '); @@ -269,7 +306,49 @@ void ClangAssistProposalItem::setText(const QString &text) QString ClangAssistProposalItem::text() const { - return m_text; + return m_text + (requiresFixIts() ? fixItText() : QString()); +} + +const QVector<ClangBackEnd::FixItContainer> &ClangAssistProposalItem::firstCompletionFixIts() const +{ + return firstCodeCompletion().requiredFixIts; +} + +// FIXME: Indicate required fix-it without adding extra text. +QString ClangAssistProposalItem::fixItText() const +{ + const FixItContainer &fixIt = firstCompletionFixIts().first(); + const SourceRangeContainer &range = fixIt.range; + return QCoreApplication::translate("ClangCodeModel::ClangAssistProposalItem", + " (requires to correct [%1:%2-%3:%4] to \"%5\")") + .arg(range.start.line) + .arg(range.start.column) + .arg(range.end.line) + .arg(range.end.column) + .arg(fixIt.text.toString()); +} + +int ClangAssistProposalItem::fixItsShift( + const TextEditor::TextDocumentManipulatorInterface &manipulator) const +{ + const QVector<ClangBackEnd::FixItContainer> &requiredFixIts = firstCompletionFixIts(); + if (requiredFixIts.empty()) + return 0; + + int shift = 0; + QTextCursor cursor = manipulator.textCursorAt(0); + for (const FixItContainer &fixIt : requiredFixIts) { + const int fixItStartPos = Utils::Text::positionInText( + cursor.document(), + static_cast<int>(fixIt.range.start.line), + static_cast<int>(fixIt.range.start.column)); + const int fixItEndPos = Utils::Text::positionInText( + cursor.document(), + static_cast<int>(fixIt.range.end.line), + static_cast<int>(fixIt.range.end.column)); + shift += fixIt.text.toString().length() - (fixItEndPos - fixItStartPos); + } + return shift; } QIcon ClangAssistProposalItem::icon() const @@ -278,57 +357,59 @@ QIcon ClangAssistProposalItem::icon() const static const char SNIPPET_ICON_PATH[] = ":/texteditor/images/snippet.png"; static const QIcon snippetIcon = QIcon(QLatin1String(SNIPPET_ICON_PATH)); - switch (m_codeCompletion.completionKind) { + const ClangBackEnd::CodeCompletion &completion = firstCodeCompletion(); + switch (completion.completionKind) { case CodeCompletion::ClassCompletionKind: case CodeCompletion::TemplateClassCompletionKind: case CodeCompletion::TypeAliasCompletionKind: - return Icons::iconForType(Icons::ClassIconType); + return ::Utils::CodeModelIcon::iconForType(::Utils::CodeModelIcon::Class); case CodeCompletion::EnumerationCompletionKind: - return Icons::iconForType(Icons::EnumIconType); + return ::Utils::CodeModelIcon::iconForType(::Utils::CodeModelIcon::Enum); case CodeCompletion::EnumeratorCompletionKind: - return Icons::iconForType(Icons::EnumeratorIconType); + return ::Utils::CodeModelIcon::iconForType(::Utils::CodeModelIcon::Enumerator); case CodeCompletion::ConstructorCompletionKind: case CodeCompletion::DestructorCompletionKind: case CodeCompletion::FunctionCompletionKind: + case CodeCompletion::FunctionDefinitionCompletionKind: case CodeCompletion::TemplateFunctionCompletionKind: case CodeCompletion::ObjCMessageCompletionKind: - switch (m_codeCompletion.availability) { + switch (completion.availability) { case CodeCompletion::Available: case CodeCompletion::Deprecated: - return Icons::iconForType(Icons::FuncPublicIconType); + return ::Utils::CodeModelIcon::iconForType(::Utils::CodeModelIcon::FuncPublic); default: - return Icons::iconForType(Icons::FuncPrivateIconType); + return ::Utils::CodeModelIcon::iconForType(::Utils::CodeModelIcon::FuncPrivate); } case CodeCompletion::SignalCompletionKind: - return Icons::iconForType(Icons::SignalIconType); + return ::Utils::CodeModelIcon::iconForType(::Utils::CodeModelIcon::Signal); case CodeCompletion::SlotCompletionKind: - switch (m_codeCompletion.availability) { + switch (completion.availability) { case CodeCompletion::Available: case CodeCompletion::Deprecated: - return Icons::iconForType(Icons::SlotPublicIconType); + return ::Utils::CodeModelIcon::iconForType(::Utils::CodeModelIcon::SlotPublic); case CodeCompletion::NotAccessible: case CodeCompletion::NotAvailable: - return Icons::iconForType(Icons::SlotPrivateIconType); + return ::Utils::CodeModelIcon::iconForType(::Utils::CodeModelIcon::SlotPrivate); } break; case CodeCompletion::NamespaceCompletionKind: - return Icons::iconForType(Icons::NamespaceIconType); + return ::Utils::CodeModelIcon::iconForType(::Utils::CodeModelIcon::Namespace); case CodeCompletion::PreProcessorCompletionKind: - return Icons::iconForType(Icons::MacroIconType); + return ::Utils::CodeModelIcon::iconForType(::Utils::CodeModelIcon::Macro); case CodeCompletion::VariableCompletionKind: - switch (m_codeCompletion.availability) { + switch (completion.availability) { case CodeCompletion::Available: case CodeCompletion::Deprecated: - return Icons::iconForType(Icons::VarPublicIconType); + return ::Utils::CodeModelIcon::iconForType(::Utils::CodeModelIcon::VarPublic); default: - return Icons::iconForType(Icons::VarPrivateIconType); + return ::Utils::CodeModelIcon::iconForType(::Utils::CodeModelIcon::VarPrivate); } case CodeCompletion::KeywordCompletionKind: - return Icons::iconForType(Icons::KeywordIconType); + return ::Utils::CodeModelIcon::iconForType(::Utils::CodeModelIcon::Keyword); case CodeCompletion::ClangSnippetKind: return snippetIcon; case CodeCompletion::Other: - return Icons::iconForType(Icons::UnknownIconType); + return ::Utils::CodeModelIcon::iconForType(::Utils::CodeModelIcon::Unknown); default: break; } @@ -338,11 +419,15 @@ QIcon ClangAssistProposalItem::icon() const QString ClangAssistProposalItem::detail() const { - QString detail = CompletionChunksToTextConverter::convertToToolTipWithHtml( - m_codeCompletion.chunks, m_codeCompletion.completionKind); - - if (!m_codeCompletion.briefComment.isEmpty()) - detail += QStringLiteral("\n\n") + m_codeCompletion.briefComment.toString(); + QString detail; + for (const ClangBackEnd::CodeCompletion &codeCompletion : m_codeCompletions) { + if (!detail.isEmpty()) + detail += "<br>"; + detail += CompletionChunksToTextConverter::convertToToolTipWithHtml( + codeCompletion.chunks, codeCompletion.completionKind); + if (!codeCompletion.briefComment.isEmpty()) + detail += "<br>" + codeCompletion.briefComment.toString(); + } return detail; } @@ -362,6 +447,11 @@ quint64 ClangAssistProposalItem::hash() const return 0; } +bool ClangAssistProposalItem::requiresFixIts() const +{ + return !firstCompletionFixIts().empty(); +} + bool ClangAssistProposalItem::hasOverloadsWithParameters() const { return m_hasOverloadsWithParameters; @@ -377,14 +467,20 @@ void ClangAssistProposalItem::keepCompletionOperator(unsigned compOp) m_completionOperator = compOp; } -void ClangAssistProposalItem::setCodeCompletion(const CodeCompletion &codeCompletion) +void ClangAssistProposalItem::appendCodeCompletion(const CodeCompletion &codeCompletion) +{ + m_codeCompletions.push_back(codeCompletion); +} + +const ClangBackEnd::CodeCompletion &ClangAssistProposalItem::firstCodeCompletion() const { - m_codeCompletion = codeCompletion; + return m_codeCompletions.at(0); } -const ClangBackEnd::CodeCompletion &ClangAssistProposalItem::codeCompletion() const +void ClangAssistProposalItem::removeFirstCodeCompletion() { - return m_codeCompletion; + QTC_ASSERT(!m_codeCompletions.empty(), return;); + m_codeCompletions.erase(m_codeCompletions.begin()); } } // namespace Internal diff --git a/src/plugins/clangcodemodel/clangassistproposalitem.h b/src/plugins/clangcodemodel/clangassistproposalitem.h index 90dcff35c8..c524c9b21d 100644 --- a/src/plugins/clangcodemodel/clangassistproposalitem.h +++ b/src/plugins/clangcodemodel/clangassistproposalitem.h @@ -50,17 +50,23 @@ public: bool isSnippet() const final; bool isValid() const final; quint64 hash() const final; + bool requiresFixIts() const final; void keepCompletionOperator(unsigned compOp); bool hasOverloadsWithParameters() const; void setHasOverloadsWithParameters(bool hasOverloadsWithParameters); - void setCodeCompletion(const ClangBackEnd::CodeCompletion &codeCompletion); - const ClangBackEnd::CodeCompletion &codeCompletion() const; + void appendCodeCompletion(const ClangBackEnd::CodeCompletion &firstCodeCompletion); + const ClangBackEnd::CodeCompletion &firstCodeCompletion() const; + void removeFirstCodeCompletion(); private: - ClangBackEnd::CodeCompletion m_codeCompletion; + const QVector<ClangBackEnd::FixItContainer> &firstCompletionFixIts() const; + QString fixItText() const; + int fixItsShift(const TextEditor::TextDocumentManipulatorInterface &manipulator) const; + + std::vector<ClangBackEnd::CodeCompletion> m_codeCompletions; QList<ClangBackEnd::CodeCompletion> m_overloads; bool m_hasOverloadsWithParameters = false; QString m_text; diff --git a/src/plugins/clangcodemodel/clangassistproposalmodel.cpp b/src/plugins/clangcodemodel/clangassistproposalmodel.cpp index 9806fd929f..7fb13327f7 100644 --- a/src/plugins/clangcodemodel/clangassistproposalmodel.cpp +++ b/src/plugins/clangcodemodel/clangassistproposalmodel.cpp @@ -36,12 +36,6 @@ namespace Internal { constexpr int SORT_LIMIT = 30000; -ClangAssistProposalModel::ClangAssistProposalModel( - ClangBackEnd::CompletionCorrection neededCorrection) - : m_neededCorrection(neededCorrection) -{ -} - bool ClangAssistProposalModel::containsDuplicates() const { return false; @@ -62,6 +56,8 @@ void ClangAssistProposalModel::sort(const QString &/*prefix*/) return static_cast<int>(first->prefixMatch()) < static_cast<int>(second->prefixMatch()); } + if (first->requiresFixIts() != second->requiresFixIts()) + return first->requiresFixIts() < second->requiresFixIts(); return (first->order() > 0 && (first->order() < second->order() || (first->order() == second->order() && first->text() < second->text()))); @@ -70,11 +66,6 @@ void ClangAssistProposalModel::sort(const QString &/*prefix*/) std::sort(m_currentItems.begin(), m_currentItems.end(), currentItemsCompare); } -ClangBackEnd::CompletionCorrection ClangAssistProposalModel::neededCorrection() const -{ - return m_neededCorrection; -} - } // namespace Internal } // namespace ClangCodeModel diff --git a/src/plugins/clangcodemodel/clangassistproposalmodel.h b/src/plugins/clangcodemodel/clangassistproposalmodel.h index b71d256856..cb2cb7edd3 100644 --- a/src/plugins/clangcodemodel/clangassistproposalmodel.h +++ b/src/plugins/clangcodemodel/clangassistproposalmodel.h @@ -37,17 +37,12 @@ namespace Internal { class ClangAssistProposalModel : public TextEditor::GenericProposalModel { public: - ClangAssistProposalModel(ClangBackEnd::CompletionCorrection neededCorrection); + ClangAssistProposalModel() = default; bool containsDuplicates() const override; bool isSortable(const QString &prefix) const override; void sort(const QString &prefix) override; - - ClangBackEnd::CompletionCorrection neededCorrection() const; - -private: - ClangBackEnd::CompletionCorrection m_neededCorrection; }; } // namespace Internal diff --git a/src/plugins/clangcodemodel/clangbackendreceiver.cpp b/src/plugins/clangcodemodel/clangbackendreceiver.cpp index d340a990d3..7218695d61 100644 --- a/src/plugins/clangcodemodel/clangbackendreceiver.cpp +++ b/src/plugins/clangcodemodel/clangbackendreceiver.cpp @@ -187,10 +187,8 @@ void BackendReceiver::completions(const CompletionsMessage &message) const quint64 ticket = message.ticketNumber; QScopedPointer<ClangCompletionAssistProcessor> processor(m_assistProcessorsTable.take(ticket)); - if (processor) { - processor->handleAvailableCompletions(message.codeCompletions, - message.neededCorrection); - } + if (processor) + processor->handleAvailableCompletions(message.codeCompletions); } void BackendReceiver::annotations(const AnnotationsMessage &message) diff --git a/src/plugins/clangcodemodel/clangcodemodel.pro b/src/plugins/clangcodemodel/clangcodemodel.pro index decfacf8bd..fd64057eff 100644 --- a/src/plugins/clangcodemodel/clangcodemodel.pro +++ b/src/plugins/clangcodemodel/clangcodemodel.pro @@ -8,7 +8,6 @@ requires(!isEmpty(LLVM_VERSION)) SOURCES += \ clangactivationsequencecontextprocessor.cpp \ clangactivationsequenceprocessor.cpp \ - clangassistproposal.cpp \ clangassistproposalitem.cpp \ clangassistproposalmodel.cpp \ clangbackendcommunicator.cpp \ @@ -46,7 +45,6 @@ SOURCES += \ HEADERS += \ clangactivationsequencecontextprocessor.h \ clangactivationsequenceprocessor.h \ - clangassistproposal.h \ clangassistproposalitem.h \ clangassistproposalmodel.h \ clangbackendcommunicator.h \ diff --git a/src/plugins/clangcodemodel/clangcodemodel.qbs b/src/plugins/clangcodemodel/clangcodemodel.qbs index ce1cba0e1f..20e0cb269d 100644 --- a/src/plugins/clangcodemodel/clangcodemodel.qbs +++ b/src/plugins/clangcodemodel/clangcodemodel.qbs @@ -11,7 +11,9 @@ QtcPlugin { Depends { name: "TextEditor" } Depends { name: "Utils" } Depends { name: "ClangSupport" } + Depends { name: "libclang"; required: false } + Depends { name: "clang_defines" } pluginTestDepends: [ "CppEditor", @@ -20,24 +22,11 @@ QtcPlugin { condition: libclang.present - cpp.defines: { - var defines = base; - // The following defines are used to determine the clang include path for intrinsics. - defines.push('CLANG_VERSION="' + libclang.llvmVersion + '"'); - var resourceDir = FileInfo.joinPaths(libclang.llvmLibDir, "clang", libclang.llvmVersion, - "include"); - defines.push('CLANG_RESOURCE_DIR="' + resourceDir + '"'); - defines.push('CLANG_BINDIR="' + libclang.llvmBinDir + '"'); - return defines; - } - files: [ "clangactivationsequencecontextprocessor.cpp", "clangactivationsequencecontextprocessor.h", "clangactivationsequenceprocessor.cpp", "clangactivationsequenceprocessor.h", - "clangassistproposal.cpp", - "clangassistproposal.h", "clangassistproposalitem.cpp", "clangassistproposalitem.h", "clangassistproposalmodel.cpp", diff --git a/src/plugins/clangcodemodel/clangcodemodelplugin.cpp b/src/plugins/clangcodemodel/clangcodemodelplugin.cpp index b2c44f0e90..5edfcca397 100644 --- a/src/plugins/clangcodemodel/clangcodemodelplugin.cpp +++ b/src/plugins/clangcodemodel/clangcodemodelplugin.cpp @@ -27,27 +27,33 @@ #include "clangconstants.h" #include "clangprojectsettingswidget.h" +#include "clangutils.h" #ifdef WITH_TESTS # include "test/clangbatchfileprocessor.h" # include "test/clangcodecompletion_test.h" #endif +#include <coreplugin/actionmanager/actioncontainer.h> +#include <coreplugin/actionmanager/actionmanager.h> + #include <cpptools/cppmodelmanager.h> +#include <projectexplorer/buildconfiguration.h> #include <projectexplorer/projectpanelfactory.h> #include <projectexplorer/projectexplorer.h> #include <projectexplorer/session.h> +#include <projectexplorer/target.h> #include <projectexplorer/taskhub.h> #include <texteditor/textmark.h> +#include <QtConcurrent> + namespace ClangCodeModel { namespace Internal { -namespace { - -void addProjectPanelWidget() +static void addProjectPanelWidget() { auto panelFactory = new ProjectExplorer::ProjectPanelFactory(); panelFactory->setPriority(60); @@ -58,7 +64,32 @@ void addProjectPanelWidget() ProjectExplorer::ProjectPanelFactory::registerFactory(panelFactory); } -} // anonymous namespace +void ClangCodeModelPlugin::generateCompilationDB() { + using namespace CppTools; + + ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject(); + if (!project) + return; + + m_generatorWatcher.setFuture(QtConcurrent::run( + &Utils::generateCompilationDB, + project->projectDirectory(), + CppModelManager::instance()->projectInfo(project))); +} + +static bool isDBGenerationEnabled(ProjectExplorer::Project *project) +{ + using namespace CppTools; + if (!project) + return false; + ProjectInfo projectInfo = CppModelManager::instance()->projectInfo(project); + return projectInfo.isValid() && !projectInfo.projectParts().isEmpty(); +} + +ClangCodeModelPlugin::~ClangCodeModelPlugin() +{ + m_generatorWatcher.waitForFinished(); +} bool ClangCodeModelPlugin::initialize(const QStringList &arguments, QString *errorMessage) { @@ -77,9 +108,69 @@ bool ClangCodeModelPlugin::initialize(const QStringList &arguments, QString *err addProjectPanelWidget(); + createCompilationDBButton(); + return true; } +void ClangCodeModelPlugin::createCompilationDBButton() +{ + Core::ActionContainer *mbuild = + Core::ActionManager::actionContainer(ProjectExplorer::Constants::M_BUILDPROJECT); + // generate compile_commands.json + m_generateCompilationDBAction = new ::Utils::ParameterAction( + tr("Generate compilation database"), + tr("Generate compilation database for \"%1\""), + ::Utils::ParameterAction::AlwaysEnabled, this); + + ProjectExplorer::Project *startupProject = ProjectExplorer::SessionManager::startupProject(); + m_generateCompilationDBAction->setEnabled(isDBGenerationEnabled(startupProject)); + if (startupProject) + m_generateCompilationDBAction->setParameter(startupProject->displayName()); + + Core::Command *command = Core::ActionManager::registerAction(m_generateCompilationDBAction, + Constants::GENERATE_COMPILATION_DB); + command->setAttribute(Core::Command::CA_UpdateText); + command->setDescription(m_generateCompilationDBAction->text()); + mbuild->addAction(command, ProjectExplorer::Constants::G_BUILD_BUILD); + + connect(&m_generatorWatcher, &QFutureWatcher<void>::finished, this, [this] () { + m_generateCompilationDBAction->setEnabled( + isDBGenerationEnabled(ProjectExplorer::SessionManager::startupProject())); + }); + connect(m_generateCompilationDBAction, &QAction::triggered, this, [this] { + if (!m_generateCompilationDBAction->isEnabled()) + return; + + m_generateCompilationDBAction->setEnabled(false); + generateCompilationDB(); + }); + connect(CppTools::CppModelManager::instance(), &CppTools::CppModelManager::projectPartsUpdated, + this, [this](ProjectExplorer::Project *project) { + if (project != ProjectExplorer::SessionManager::startupProject()) + return; + m_generateCompilationDBAction->setParameter(project->displayName()); + if (!m_generatorWatcher.isRunning()) + m_generateCompilationDBAction->setEnabled(isDBGenerationEnabled(project)); + }); + connect(ProjectExplorer::SessionManager::instance(), + &ProjectExplorer::SessionManager::startupProjectChanged, + this, + [this](ProjectExplorer::Project *project) { + m_generateCompilationDBAction->setParameter(project ? project->displayName() : ""); + if (!m_generatorWatcher.isRunning()) + m_generateCompilationDBAction->setEnabled(isDBGenerationEnabled(project)); + }); + connect(ProjectExplorer::SessionManager::instance(), + &ProjectExplorer::SessionManager::projectDisplayNameChanged, + this, + [this](ProjectExplorer::Project *project) { + if (project != ProjectExplorer::SessionManager::startupProject()) + return; + m_generateCompilationDBAction->setParameter(project->displayName()); + }); +} + void ClangCodeModelPlugin::extensionsInitialized() { } diff --git a/src/plugins/clangcodemodel/clangcodemodelplugin.h b/src/plugins/clangcodemodel/clangcodemodelplugin.h index 8e41fe6020..5e24352a76 100644 --- a/src/plugins/clangcodemodel/clangcodemodelplugin.h +++ b/src/plugins/clangcodemodel/clangcodemodelplugin.h @@ -29,15 +29,20 @@ #include <extensionsystem/iplugin.h> +#include <utils/parameteraction.h> + +#include <QFutureWatcher> + namespace ClangCodeModel { namespace Internal { -class ClangCodeModelPlugin: public ExtensionSystem::IPlugin +class ClangCodeModelPlugin final: public ExtensionSystem::IPlugin { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "ClangCodeModel.json") public: + ~ClangCodeModelPlugin(); bool initialize(const QStringList &arguments, QString *errorMessage); void extensionsInitialized(); @@ -45,8 +50,12 @@ private: void maybeHandleBatchFileAndExit() const; private: - ModelManagerSupportProviderClang m_modelManagerSupportProvider; + void generateCompilationDB(); + void createCompilationDBButton(); + ModelManagerSupportProviderClang m_modelManagerSupportProvider; + Utils::ParameterAction *m_generateCompilationDBAction = nullptr; + QFutureWatcher<void> m_generatorWatcher; #ifdef WITH_TESTS QList<QObject *> createTestObjects() const; #endif diff --git a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp index 974b2d3e86..2afa03a3b4 100644 --- a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp +++ b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp @@ -26,7 +26,6 @@ #include "clangassistproposalitem.h" #include "clangactivationsequenceprocessor.h" -#include "clangassistproposal.h" #include "clangassistproposalmodel.h" #include "clangcompletionassistprocessor.h" #include "clangcompletioncontextanalyzer.h" @@ -41,6 +40,7 @@ #include <texteditor/codeassist/assistproposalitem.h> #include <texteditor/codeassist/functionhintproposal.h> +#include <texteditor/codeassist/genericproposal.h> #include <texteditor/codeassist/ifunctionhintproposalmodel.h> #include <cplusplus/BackwardsScanner.h> @@ -64,15 +64,58 @@ namespace Internal { using ClangBackEnd::CodeCompletion; using TextEditor::AssistProposalItemInterface; -namespace { +static void addAssistProposalItem(QList<AssistProposalItemInterface *> &items, + const CodeCompletion &codeCompletion, + const QString &name) +{ + ClangAssistProposalItem *item = new ClangAssistProposalItem; + items.push_back(item); -QList<AssistProposalItemInterface *> toAssistProposalItems(const CodeCompletions &completions) + item->setText(name); + item->setOrder(int(codeCompletion.priority)); + item->appendCodeCompletion(codeCompletion); +} + +static void addFunctionOverloadAssistProposalItem(QList<AssistProposalItemInterface *> &items, + AssistProposalItemInterface *sameItem, + const ClangCompletionAssistInterface *interface, + const CodeCompletion &codeCompletion, + const QString &name) { + ClangBackEnd::CodeCompletionChunk resultType = codeCompletion.chunks.first(); + auto *item = static_cast<ClangAssistProposalItem *>(sameItem); + item->setHasOverloadsWithParameters(true); + if (resultType.kind != ClangBackEnd::CodeCompletionChunk::ResultType) { + // It's the constructor. + // CLANG-UPGRADE-CHECK: Can we get here with constructor definition? + if (!item->firstCodeCompletion().hasParameters) + item->removeFirstCodeCompletion(); + item->appendCodeCompletion(codeCompletion); + return; + } + + QTextCursor cursor = interface->textEditorWidget()->textCursor(); + cursor.setPosition(interface->position()); + cursor.movePosition(QTextCursor::StartOfWord); + + if (::Utils::Text::matchPreviousWord(*interface->textEditorWidget(), + cursor, + resultType.text.toString())) { + addAssistProposalItem(items, codeCompletion, name); + } else { + item->appendCodeCompletion(codeCompletion); + } +} +static QList<AssistProposalItemInterface *> toAssistProposalItems( + const CodeCompletions &completions, + const ClangCompletionAssistInterface *interface) +{ bool signalCompletion = false; // TODO bool slotCompletion = false; // TODO - QHash<QString, ClangAssistProposalItem *> items; + QList<AssistProposalItemInterface *> items; + items.reserve(completions.size()); for (const CodeCompletion &codeCompletion : completions) { if (codeCompletion.text.isEmpty()) // TODO: Make isValid()? continue; @@ -81,35 +124,42 @@ QList<AssistProposalItemInterface *> toAssistProposalItems(const CodeCompletions if (slotCompletion && codeCompletion.completionKind != CodeCompletion::SlotCompletionKind) continue; - QString name; - if (codeCompletion.completionKind == CodeCompletion::KeywordCompletionKind) - name = CompletionChunksToTextConverter::convertToName(codeCompletion.chunks); - else - name = codeCompletion.text.toString(); + const QString name = codeCompletion.completionKind == CodeCompletion::KeywordCompletionKind + ? CompletionChunksToTextConverter::convertToName(codeCompletion.chunks) + : codeCompletion.text.toString(); + + if (codeCompletion.completionKind == CodeCompletion::ConstructorCompletionKind + || codeCompletion.completionKind == CodeCompletion::ClassCompletionKind) { + auto samePreviousConstructor + = std::find_if(items.begin(), + items.end(), + [&name](const AssistProposalItemInterface *item) { + return item->text() == name; + }); + if (samePreviousConstructor == items.end()) { + addAssistProposalItem(items, codeCompletion, name); + } else { + addFunctionOverloadAssistProposalItem(items, *samePreviousConstructor, interface, + codeCompletion, name); + } + continue; + } - ClangAssistProposalItem *item = items.value(name, 0); - if (item) { - if (codeCompletion.hasParameters) - item->setHasOverloadsWithParameters(true); + if (!items.empty() && items.last()->text() == name) { + if ((codeCompletion.completionKind == CodeCompletion::FunctionCompletionKind + || codeCompletion.completionKind == CodeCompletion::FunctionDefinitionCompletionKind) + && codeCompletion.hasParameters) { + addFunctionOverloadAssistProposalItem(items, items.back(), interface, + codeCompletion, name); + } } else { - item = new ClangAssistProposalItem; - items.insert(name, item); - - item->setText(name); - item->setOrder(int(codeCompletion.priority)); - item->setCodeCompletion(codeCompletion); + addAssistProposalItem(items, codeCompletion, name); } } - QList<AssistProposalItemInterface *> results; - results.reserve(items.size()); - std::copy(items.cbegin(), items.cend(), std::back_inserter(results)); - - return results; + return items; } -} // Anonymous - using namespace CPlusPlus; using namespace TextEditor; @@ -143,18 +193,17 @@ static CodeCompletions filterFunctionSignatures(const CodeCompletions &completio } void ClangCompletionAssistProcessor::handleAvailableCompletions( - const CodeCompletions &completions, - CompletionCorrection neededCorrection) + const CodeCompletions &completions) { QTC_CHECK(m_completions.isEmpty()); if (m_sentRequestType == NormalCompletion) { - m_completions = toAssistProposalItems(completions); + m_completions = toAssistProposalItems(completions, m_interface.data()); if (m_addSnippets && !m_completions.isEmpty()) addSnippets(); - setAsyncProposalAvailable(createProposal(neededCorrection)); + setAsyncProposalAvailable(createProposal()); } else { const CodeCompletions functionSignatures = filterFunctionSignatures(completions); if (!functionSignatures.isEmpty()) @@ -447,11 +496,11 @@ bool ClangCompletionAssistProcessor::completePreprocessorDirectives() { foreach (const QString &preprocessorCompletion, m_preprocessorCompletions) addCompletionItem(preprocessorCompletion, - Icons::iconForType(Icons::MacroIconType)); + ::Utils::CodeModelIcon::iconForType(::Utils::CodeModelIcon::Macro)); if (m_interface->objcEnabled()) addCompletionItem(QLatin1String("import"), - Icons::iconForType(Icons::MacroIconType)); + ::Utils::CodeModelIcon::iconForType(::Utils::CodeModelIcon::Macro)); return !m_completions.isEmpty(); } @@ -591,13 +640,12 @@ bool ClangCompletionAssistProcessor::sendCompletionRequest(int position, return false; } -TextEditor::IAssistProposal *ClangCompletionAssistProcessor::createProposal( - CompletionCorrection neededCorrection) +TextEditor::IAssistProposal *ClangCompletionAssistProcessor::createProposal() { m_requestSent = false; - TextEditor::GenericProposalModelPtr model(new ClangAssistProposalModel(neededCorrection)); + TextEditor::GenericProposalModelPtr model(new ClangAssistProposalModel()); model->loadContent(m_completions); - return new ClangAssistProposal(m_positionForProposal, model); + return new GenericProposal(m_positionForProposal, model); } IAssistProposal *ClangCompletionAssistProcessor::createFunctionHintProposal( diff --git a/src/plugins/clangcodemodel/clangcompletionassistprocessor.h b/src/plugins/clangcodemodel/clangcompletionassistprocessor.h index d406422aa3..f5f7b06684 100644 --- a/src/plugins/clangcodemodel/clangcompletionassistprocessor.h +++ b/src/plugins/clangcodemodel/clangcompletionassistprocessor.h @@ -50,8 +50,7 @@ public: TextEditor::IAssistProposal *perform(const TextEditor::AssistInterface *interface) override; - void handleAvailableCompletions(const CodeCompletions &completions, - CompletionCorrection neededCorrection); + void handleAvailableCompletions(const CodeCompletions &completions); bool running() final { return m_requestSent; } const TextEditor::TextEditorWidget *textEditorWidget() const; @@ -62,8 +61,7 @@ private: int findStartOfName(int pos = -1) const; bool accepts() const; - TextEditor::IAssistProposal *createProposal( - CompletionCorrection neededCorrection = CompletionCorrection::NoCorrection); + TextEditor::IAssistProposal *createProposal(); TextEditor::IAssistProposal *createFunctionHintProposal( const CodeCompletions &completions); diff --git a/src/plugins/clangcodemodel/clangconstants.h b/src/plugins/clangcodemodel/clangconstants.h index 294618aa88..da6223f133 100644 --- a/src/plugins/clangcodemodel/clangconstants.h +++ b/src/plugins/clangcodemodel/clangconstants.h @@ -29,6 +29,7 @@ namespace ClangCodeModel { namespace Constants { const char CLANG_MODELMANAGERSUPPORT_ID[] = "ClangCodeModel.ClangCodeModel"; +const char GENERATE_COMPILATION_DB[] = "ClangCodeModel.GenerateCompilationDB"; const char CLANG_ERROR[] = "Clang.Error"; const char CLANG_WARNING[] = "Clang.Warning"; diff --git a/src/plugins/clangcodemodel/clangcurrentdocumentfilter.cpp b/src/plugins/clangcodemodel/clangcurrentdocumentfilter.cpp index 25f0d4f234..951c6efd53 100644 --- a/src/plugins/clangcodemodel/clangcurrentdocumentfilter.cpp +++ b/src/plugins/clangcodemodel/clangcurrentdocumentfilter.cpp @@ -69,11 +69,6 @@ static QString addType(const QString &signature, const ClangBackEnd::ExtraInfo & return signature + QLatin1String(" -> ", 4) + extraInfo.typeSpelling.toString(); } -static QString addTypeToVariableName(const QString &name, const ClangBackEnd::ExtraInfo &extraInfo) -{ - return extraInfo.typeSpelling.toString() + QLatin1String(" ") + name; -} - static Core::LocatorFilterEntry makeEntry(Core::ILocatorFilter *filter, const ClangBackEnd::TokenInfoContainer &info) { @@ -84,20 +79,18 @@ static Core::LocatorFilterEntry makeEntry(Core::ILocatorFilter *filter, QString extra; ClangBackEnd::HighlightingType mainType = info.types.mainHighlightingType; if (mainType == ClangBackEnd::HighlightingType::VirtualFunction - || mainType == ClangBackEnd::HighlightingType::Function) { + || mainType == ClangBackEnd::HighlightingType::Function + || mainType == ClangBackEnd::HighlightingType::GlobalVariable + || mainType == ClangBackEnd::HighlightingType::Field + || mainType == ClangBackEnd::HighlightingType::QtProperty) { displayName = addType(displayName, extraInfo); extra = extraInfo.semanticParentTypeSpelling.toString(); - } else if (mainType == ClangBackEnd::HighlightingType::GlobalVariable - || mainType == ClangBackEnd::HighlightingType::Field - || mainType == ClangBackEnd::HighlightingType::QtProperty) { - displayName = addTypeToVariableName(displayName, extraInfo); - extra = extraInfo.semanticParentTypeSpelling.toString(); } else { extra = extraInfo.typeSpelling.toString(); } entry.displayName = displayName; entry.extraInfo = extra; - entry.displayIcon = CPlusPlus::Icons::iconForType(Utils::iconTypeForToken(info)); + entry.displayIcon = ::Utils::CodeModelIcon::iconForType(Utils::iconTypeForToken(info)); return entry; } diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp index 2c6608c6b8..25054f14ec 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp @@ -475,7 +475,7 @@ private: } CppTools::CompilerOptionsBuilder builder(m_projectPart); - builder.addLanguageOption(fileKind); + builder.updateLanguageOption(fileKind); m_options.append(builder.options()); } diff --git a/src/plugins/clangcodemodel/clangoverviewmodel.cpp b/src/plugins/clangcodemodel/clangoverviewmodel.cpp index e663eec27a..a8704fe808 100644 --- a/src/plugins/clangcodemodel/clangoverviewmodel.cpp +++ b/src/plugins/clangcodemodel/clangoverviewmodel.cpp @@ -171,7 +171,7 @@ QVariant TokenTreeItem::data(int column, int role) const } case Qt::DecorationRole: { - return CPlusPlus::Icons::iconForType(ClangCodeModel::Utils::iconTypeForToken(token)); + return ::Utils::CodeModelIcon::iconForType(ClangCodeModel::Utils::iconTypeForToken(token)); } case CppTools::AbstractOverviewModel::FileNameRole: { diff --git a/src/plugins/clangcodemodel/clangutils.cpp b/src/plugins/clangcodemodel/clangutils.cpp index 4a55973bed..8f11758ac4 100644 --- a/src/plugins/clangcodemodel/clangutils.cpp +++ b/src/plugins/clangcodemodel/clangutils.cpp @@ -39,13 +39,19 @@ #include <cpptools/projectpart.h> #include <cpptools/cppcodemodelsettings.h> #include <cpptools/cpptoolsreuse.h> +#include <projectexplorer/buildconfiguration.h> #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/target.h> #include <utils/algorithm.h> +#include <utils/fileutils.h> #include <utils/qtcassert.h> #include <QDir> #include <QFile> +#include <QJsonArray> +#include <QJsonDocument> +#include <QJsonObject> #include <QStringList> #include <QTextBlock> @@ -86,17 +92,32 @@ static QString creatorResourcePath() #endif } +static QString clangIncludeDirectory(const QString &clangVersion, + const QString &clangResourceDirectory) +{ +#ifndef UNIT_TESTS + return Core::ICore::clangIncludeDirectory(clangVersion, clangResourceDirectory); +#else + return QString(); +#endif +} + class LibClangOptionsBuilder final : public CompilerOptionsBuilder { public: LibClangOptionsBuilder(const ProjectPart &projectPart) - : CompilerOptionsBuilder(projectPart, CLANG_VERSION, CLANG_RESOURCE_DIR) + : CompilerOptionsBuilder(projectPart) + , m_clangVersion(CLANG_VERSION) + , m_clangResourceDirectory(CLANG_RESOURCE_DIR) { } void addPredefinedHeaderPathsOptions() final { CompilerOptionsBuilder::addPredefinedHeaderPathsOptions(); + add("-nostdinc"); + add("-nostdlibinc"); + addClangIncludeFolder(); addWrappedQtHeadersIncludePath(); } @@ -117,6 +138,13 @@ public: } private: + void addClangIncludeFolder() + { + QTC_CHECK(!m_clangVersion.isEmpty()); + add("-I"); + add(clangIncludeDirectory(m_clangVersion, m_clangResourceDirectory)); + } + void addWrappedQtHeadersIncludePath() { static const QString resourcePath = creatorResourcePath(); @@ -125,9 +153,9 @@ private: if (m_projectPart.qtVersion != CppTools::ProjectPart::NoQt) { const QString wrappedQtCoreHeaderPath = wrappedQtHeadersPath + "/QtCore"; - add(includeDirOption()); + add(includeDirOptionForPath(wrappedQtHeadersPath)); add(QDir::toNativeSeparators(wrappedQtHeadersPath)); - add(includeDirOption()); + add(includeDirOptionForPath(wrappedQtHeadersPath)); add(QDir::toNativeSeparators(wrappedQtCoreHeaderPath)); } } @@ -136,10 +164,13 @@ private: { const QString path = ModelManagerSupportClang::instance()->dummyUiHeaderOnDiskDirPath(); if (!path.isEmpty()) { - add(includeDirOption()); + add("-I"); add(QDir::toNativeSeparators(path)); } } + + QString m_clangVersion; + QString m_clangResourceDirectory; }; /** @@ -205,52 +236,52 @@ int clangColumn(const QTextBlock &line, int cppEditorColumn) return line.text().left(cppEditorColumn).toUtf8().size() + 1; } -CPlusPlus::Icons::IconType iconTypeForToken(const ClangBackEnd::TokenInfoContainer &token) +::Utils::CodeModelIcon::Type iconTypeForToken(const ClangBackEnd::TokenInfoContainer &token) { const ClangBackEnd::ExtraInfo &extraInfo = token.extraInfo; if (extraInfo.signal) - return CPlusPlus::Icons::SignalIconType; + return ::Utils::CodeModelIcon::Signal; ClangBackEnd::AccessSpecifier access = extraInfo.accessSpecifier; if (extraInfo.slot) { switch (access) { case ClangBackEnd::AccessSpecifier::Public: case ClangBackEnd::AccessSpecifier::Invalid: - return CPlusPlus::Icons::SlotPublicIconType; + return ::Utils::CodeModelIcon::SlotPublic; case ClangBackEnd::AccessSpecifier::Protected: - return CPlusPlus::Icons::SlotProtectedIconType; + return ::Utils::CodeModelIcon::SlotProtected; case ClangBackEnd::AccessSpecifier::Private: - return CPlusPlus::Icons::SlotPrivateIconType; + return ::Utils::CodeModelIcon::SlotPrivate; } } ClangBackEnd::HighlightingType mainType = token.types.mainHighlightingType; if (mainType == ClangBackEnd::HighlightingType::QtProperty) - return CPlusPlus::Icons::PropertyIconType; + return ::Utils::CodeModelIcon::Property; if (mainType == ClangBackEnd::HighlightingType::PreprocessorExpansion || mainType == ClangBackEnd::HighlightingType::PreprocessorDefinition) { - return CPlusPlus::Icons::MacroIconType; + return ::Utils::CodeModelIcon::Macro; } if (mainType == ClangBackEnd::HighlightingType::Enumeration) - return CPlusPlus::Icons::EnumeratorIconType; + return ::Utils::CodeModelIcon::Enumerator; if (mainType == ClangBackEnd::HighlightingType::Type || mainType == ClangBackEnd::HighlightingType::Keyword) { const ClangBackEnd::MixinHighlightingTypes &types = token.types.mixinHighlightingTypes; if (types.contains(ClangBackEnd::HighlightingType::Enum)) - return CPlusPlus::Icons::EnumIconType; + return ::Utils::CodeModelIcon::Enum; if (types.contains(ClangBackEnd::HighlightingType::Struct)) - return CPlusPlus::Icons::StructIconType; + return ::Utils::CodeModelIcon::Struct; if (types.contains(ClangBackEnd::HighlightingType::Namespace)) - return CPlusPlus::Icons::NamespaceIconType; + return ::Utils::CodeModelIcon::Namespace; if (types.contains(ClangBackEnd::HighlightingType::Class)) - return CPlusPlus::Icons::ClassIconType; + return ::Utils::CodeModelIcon::Class; if (mainType == ClangBackEnd::HighlightingType::Keyword) - return CPlusPlus::Icons::KeywordIconType; - return CPlusPlus::Icons::ClassIconType; + return ::Utils::CodeModelIcon::Keyword; + return ::Utils::CodeModelIcon::Class; } ClangBackEnd::StorageClass storageClass = extraInfo.storageClass; @@ -261,21 +292,21 @@ CPlusPlus::Icons::IconType iconTypeForToken(const ClangBackEnd::TokenInfoContain switch (access) { case ClangBackEnd::AccessSpecifier::Public: case ClangBackEnd::AccessSpecifier::Invalid: - return CPlusPlus::Icons::FuncPublicIconType; + return ::Utils::CodeModelIcon::FuncPublic; case ClangBackEnd::AccessSpecifier::Protected: - return CPlusPlus::Icons::FuncProtectedIconType; + return ::Utils::CodeModelIcon::FuncProtected; case ClangBackEnd::AccessSpecifier::Private: - return CPlusPlus::Icons::FuncPrivateIconType; + return ::Utils::CodeModelIcon::FuncPrivate; } } else { switch (access) { case ClangBackEnd::AccessSpecifier::Public: case ClangBackEnd::AccessSpecifier::Invalid: - return CPlusPlus::Icons::FuncPublicStaticIconType; + return ::Utils::CodeModelIcon::FuncPublicStatic; case ClangBackEnd::AccessSpecifier::Protected: - return CPlusPlus::Icons::FuncProtectedStaticIconType; + return ::Utils::CodeModelIcon::FuncProtectedStatic; case ClangBackEnd::AccessSpecifier::Private: - return CPlusPlus::Icons::FuncPrivateStaticIconType; + return ::Utils::CodeModelIcon::FuncPrivateStatic; } } } @@ -285,26 +316,26 @@ CPlusPlus::Icons::IconType iconTypeForToken(const ClangBackEnd::TokenInfoContain switch (access) { case ClangBackEnd::AccessSpecifier::Public: case ClangBackEnd::AccessSpecifier::Invalid: - return CPlusPlus::Icons::VarPublicIconType; + return ::Utils::CodeModelIcon::VarPublic; case ClangBackEnd::AccessSpecifier::Protected: - return CPlusPlus::Icons::VarProtectedIconType; + return ::Utils::CodeModelIcon::VarProtected; case ClangBackEnd::AccessSpecifier::Private: - return CPlusPlus::Icons::VarPrivateIconType; + return ::Utils::CodeModelIcon::VarPrivate; } } else { switch (access) { case ClangBackEnd::AccessSpecifier::Public: case ClangBackEnd::AccessSpecifier::Invalid: - return CPlusPlus::Icons::VarPublicStaticIconType; + return ::Utils::CodeModelIcon::VarPublicStatic; case ClangBackEnd::AccessSpecifier::Protected: - return CPlusPlus::Icons::VarProtectedStaticIconType; + return ::Utils::CodeModelIcon::VarProtectedStatic; case ClangBackEnd::AccessSpecifier::Private: - return CPlusPlus::Icons::VarPrivateStaticIconType; + return ::Utils::CodeModelIcon::VarPrivateStatic; } } } - return CPlusPlus::Icons::UnknownIconType; + return ::Utils::CodeModelIcon::Unknown; } QString diagnosticCategoryPrefixRemoved(const QString &text) @@ -332,5 +363,54 @@ QString diagnosticCategoryPrefixRemoved(const QString &text) return text; } +static ::Utils::FileName buildDirectory(const CppTools::ProjectPart &projectPart) +{ + ProjectExplorer::Target *target = projectPart.project->activeTarget(); + if (!target) + return ::Utils::FileName(); + + ProjectExplorer::BuildConfiguration *buildConfig = target->activeBuildConfiguration(); + if (!buildConfig) + return ::Utils::FileName(); + + return buildConfig->buildDirectory(); +} + +static QJsonObject createFileObject(CompilerOptionsBuilder &optionsBuilder, + const ProjectFile &projFile, + const ::Utils::FileName &buildDir) +{ + optionsBuilder.updateLanguageOption(ProjectFile::classify(projFile.path)); + + QJsonObject fileObject; + fileObject["file"] = projFile.path; + QJsonArray args = QJsonArray::fromStringList(optionsBuilder.options()); + args.append(QDir::toNativeSeparators(projFile.path)); + fileObject["arguments"] = args; + fileObject["directory"] = buildDir.toString(); + return fileObject; +} + +void generateCompilationDB(::Utils::FileName projectDir, CppTools::ProjectInfo projectInfo) +{ + QFile compileCommandsFile(projectDir.toString() + "/compile_commands.json"); + + QJsonArray array; + for (ProjectPart::Ptr projectPart : projectInfo.projectParts()) { + const ::Utils::FileName buildDir = buildDirectory(*projectPart); + + CompilerOptionsBuilder optionsBuilder(*projectPart); + optionsBuilder.build(CppTools::ProjectFile::Unclassified, + CppTools::CompilerOptionsBuilder::PchUsage::None); + + for (const ProjectFile &projFile : projectPart->files) + array.push_back(createFileObject(optionsBuilder, projFile, buildDir)); + } + + compileCommandsFile.open(QIODevice::WriteOnly | QIODevice::Truncate); + compileCommandsFile.write(QJsonDocument(array).toJson()); + compileCommandsFile.close(); +} + } // namespace Utils } // namespace Clang diff --git a/src/plugins/clangcodemodel/clangutils.h b/src/plugins/clangcodemodel/clangutils.h index 8ba10911b8..d35aaf1f26 100644 --- a/src/plugins/clangcodemodel/clangutils.h +++ b/src/plugins/clangcodemodel/clangutils.h @@ -35,6 +35,11 @@ QT_END_NAMESPACE namespace CppTools { class CppEditorDocumentHandle; +class ProjectInfo; +} + +namespace Utils { +class FileName; } namespace ClangBackEnd { class TokenInfoContainer; } @@ -58,7 +63,9 @@ int clangColumn(const QTextBlock &lineText, int cppEditorColumn); QString diagnosticCategoryPrefixRemoved(const QString &text); -CPlusPlus::Icons::IconType iconTypeForToken(const ClangBackEnd::TokenInfoContainer &token); +::Utils::CodeModelIcon::Type iconTypeForToken(const ClangBackEnd::TokenInfoContainer &token); + +void generateCompilationDB(::Utils::FileName projectDir, CppTools::ProjectInfo projectInfo); } // namespace Utils } // namespace Clang diff --git a/src/plugins/clangpchmanager/clangpchmanager.qbs b/src/plugins/clangpchmanager/clangpchmanager.qbs index 8e7c5447a6..8c22188633 100644 --- a/src/plugins/clangpchmanager/clangpchmanager.qbs +++ b/src/plugins/clangpchmanager/clangpchmanager.qbs @@ -5,6 +5,7 @@ QtcPlugin { name: "ClangPchManager" Depends { name: "libclang"; required: false } + Depends { name: "clang_defines" } condition: libclang.present && libclang.toolingEnabled Depends { name: "ClangSupport" } @@ -14,19 +15,7 @@ QtcPlugin { Depends { name: "CppTools" } Depends { name: "ProjectExplorer" } - cpp.defines: { - var defines = base; - defines.push("CLANGPCHMANAGER_LIB"); - - // The following defines are used to determine the clang include path for intrinsics. - defines.push('CLANG_VERSION="' + libclang.llvmVersion + '"'); - var resourceDir = FileInfo.joinPaths(libclang.llvmLibDir, "clang", libclang.llvmVersion, - "include"); - defines.push('CLANG_RESOURCE_DIR="' + resourceDir + '"'); - defines.push('CLANG_BINDIR="' + libclang.llvmBinDir + '"'); - return defines; - } - + cpp.defines: base.concat("CLANGPCHMANAGER_LIB") cpp.includePaths: ["."] files: [ diff --git a/src/plugins/clangpchmanager/projectupdater.cpp b/src/plugins/clangpchmanager/projectupdater.cpp index 9d0342d20a..ce890ee117 100644 --- a/src/plugins/clangpchmanager/projectupdater.cpp +++ b/src/plugins/clangpchmanager/projectupdater.cpp @@ -29,7 +29,9 @@ #include <filepathid.h> #include <pchmanagerserverinterface.h> +#include <removegeneratedfilesmessage.h> #include <removeprojectpartsmessage.h> +#include <updategeneratedfilesmessage.h> #include <updateprojectpartsmessage.h> #include <cpptools/compileroptionsbuilder.h> @@ -62,15 +64,10 @@ ProjectUpdater::ProjectUpdater(ClangBackEnd::ProjectManagementServerInterface &s { } -void ProjectUpdater::updateProjectParts(const std::vector<CppTools::ProjectPart *> &projectParts, - ClangBackEnd::V2::FileContainers &&generatedFiles) +void ProjectUpdater::updateProjectParts(const std::vector<CppTools::ProjectPart *> &projectParts) { - m_excludedPaths = createExcludedPaths(generatedFiles); - - ClangBackEnd::UpdateProjectPartsMessage message{toProjectPartContainers(projectParts), - std::move(generatedFiles)}; - - m_server.updateProjectParts(std::move(message)); + m_server.updateProjectParts( + ClangBackEnd::UpdateProjectPartsMessage{toProjectPartContainers(projectParts)}); } void ProjectUpdater::removeProjectParts(const QStringList &projectPartIds) @@ -80,9 +77,41 @@ void ProjectUpdater::removeProjectParts(const QStringList &projectPartIds) m_server.removeProjectParts(std::move(message)); } -void ProjectUpdater::setExcludedPaths(Utils::PathStringVector &&excludedPaths) +void ProjectUpdater::updateGeneratedFiles(ClangBackEnd::V2::FileContainers &&generatedFiles) +{ + std::sort(generatedFiles.begin(), generatedFiles.end()); + + m_generatedFiles.update(generatedFiles); + + m_excludedPaths = createExcludedPaths(m_generatedFiles.fileContainers()); + + m_server.updateGeneratedFiles( + ClangBackEnd::UpdateGeneratedFilesMessage{std::move(generatedFiles)}); +} + +void ProjectUpdater::removeGeneratedFiles(ClangBackEnd::FilePaths &&filePaths) +{ + m_generatedFiles.remove(filePaths); + + m_excludedPaths = createExcludedPaths(m_generatedFiles.fileContainers()); + + m_server.removeGeneratedFiles( + ClangBackEnd::RemoveGeneratedFilesMessage{std::move(filePaths)}); +} + +void ProjectUpdater::setExcludedPaths(ClangBackEnd::FilePaths &&excludedPaths) +{ + m_excludedPaths = std::move(excludedPaths); +} + +const ClangBackEnd::FilePaths &ProjectUpdater::excludedPaths() const { - m_excludedPaths = excludedPaths; + return m_excludedPaths; +} + +const ClangBackEnd::GeneratedFiles &ProjectUpdater::generatedFiles() const +{ + return m_generatedFiles; } void ProjectUpdater::addToHeaderAndSources(HeaderAndSources &headerAndSources, @@ -111,13 +140,16 @@ HeaderAndSources ProjectUpdater::headerAndSourcesFromProjectPart( for (const CppTools::ProjectFile &projectFile : projectPart->files) addToHeaderAndSources(headerAndSources, projectFile); + std::sort(headerAndSources.sources.begin(), headerAndSources.sources.end()); + std::sort(headerAndSources.headers.begin(), headerAndSources.headers.end()); + return headerAndSources; } QStringList ProjectUpdater::compilerArguments(CppTools::ProjectPart *projectPart) { using CppTools::CompilerOptionsBuilder; - CompilerOptionsBuilder builder(*projectPart, CLANG_VERSION, CLANG_RESOURCE_DIR); + CompilerOptionsBuilder builder(*projectPart, CppTools::UseSystemHeader::Yes); return builder.build(CppTools::ProjectFile::CXXHeader, CompilerOptionsBuilder::PchUsage::None); } @@ -143,6 +175,8 @@ Utils::SmallStringVector ProjectUpdater::createIncludeSearchPaths( includePaths.emplace_back(projectPartHeaderPath.path); } + std::sort(includePaths.begin(), includePaths.end()); + return includePaths; } @@ -175,17 +209,19 @@ std::vector<ClangBackEnd::V2::ProjectPartContainer> ProjectUpdater::toProjectPar std::back_inserter(projectPartContainers), std::bind(&ProjectUpdater::toProjectPartContainer, this, _1)); + std::sort(projectPartContainers.begin(), projectPartContainers.end()); + return projectPartContainers; } -Utils::PathStringVector ProjectUpdater::createExcludedPaths( +ClangBackEnd::FilePaths ProjectUpdater::createExcludedPaths( const ClangBackEnd::V2::FileContainers &generatedFiles) { - Utils::PathStringVector excludedPaths; + ClangBackEnd::FilePaths excludedPaths; excludedPaths.reserve(generatedFiles.size()); auto convertToPath = [] (const ClangBackEnd::V2::FileContainer &fileContainer) { - return fileContainer.filePath.path(); + return fileContainer.filePath; }; std::transform(generatedFiles.begin(), diff --git a/src/plugins/clangpchmanager/projectupdater.h b/src/plugins/clangpchmanager/projectupdater.h index e4066cd0d1..c0040863a9 100644 --- a/src/plugins/clangpchmanager/projectupdater.h +++ b/src/plugins/clangpchmanager/projectupdater.h @@ -30,6 +30,7 @@ #include <compilermacro.h> #include <filecontainerv2.h> #include <filepathcachinginterface.h> +#include <generatedfiles.h> namespace ProjectExplorer { class Macro; @@ -66,12 +67,17 @@ public: ProjectUpdater(ClangBackEnd::ProjectManagementServerInterface &server, ClangBackEnd::FilePathCachingInterface &filePathCache); - void updateProjectParts(const std::vector<CppTools::ProjectPart *> &projectParts, - ClangBackEnd::V2::FileContainers &&generatedFiles); + void updateProjectParts(const std::vector<CppTools::ProjectPart *> &projectParts); void removeProjectParts(const QStringList &projectPartIds); + void updateGeneratedFiles(ClangBackEnd::V2::FileContainers &&generatedFiles); + void removeGeneratedFiles(ClangBackEnd::FilePaths &&filePaths); + unittest_public: - void setExcludedPaths(Utils::PathStringVector &&excludedPaths); + void setExcludedPaths(ClangBackEnd::FilePaths &&excludedPaths); + const ClangBackEnd::FilePaths &excludedPaths() const; + + const ClangBackEnd::GeneratedFiles &generatedFiles() const; HeaderAndSources headerAndSourcesFromProjectPart(CppTools::ProjectPart *projectPart) const; ClangBackEnd::V2::ProjectPartContainer toProjectPartContainer( @@ -85,11 +91,12 @@ unittest_public: const ProjectExplorer::Macros &projectMacros); static Utils::SmallStringVector createIncludeSearchPaths( const CppTools::ProjectPartHeaderPaths &projectPartHeaderPaths); - static Utils::PathStringVector createExcludedPaths( + static ClangBackEnd::FilePaths createExcludedPaths( const ClangBackEnd::V2::FileContainers &generatedFiles); private: - Utils::PathStringVector m_excludedPaths; + ClangBackEnd::GeneratedFiles m_generatedFiles; + ClangBackEnd::FilePaths m_excludedPaths; ClangBackEnd::ProjectManagementServerInterface &m_server; ClangBackEnd::FilePathCachingInterface &m_filePathCache; }; diff --git a/src/plugins/clangpchmanager/qtcreatorprojectupdater.cpp b/src/plugins/clangpchmanager/qtcreatorprojectupdater.cpp index 53b37ee2b5..5331e2ef05 100644 --- a/src/plugins/clangpchmanager/qtcreatorprojectupdater.cpp +++ b/src/plugins/clangpchmanager/qtcreatorprojectupdater.cpp @@ -55,6 +55,8 @@ std::vector<ClangBackEnd::V2::FileContainer> createGeneratedFiles() std::back_inserter(generatedFiles), toFileContainer); + std::sort(generatedFiles.begin(), generatedFiles.end()); + return generatedFiles; } diff --git a/src/plugins/clangpchmanager/qtcreatorprojectupdater.h b/src/plugins/clangpchmanager/qtcreatorprojectupdater.h index 387e4573ad..9be66f1444 100644 --- a/src/plugins/clangpchmanager/qtcreatorprojectupdater.h +++ b/src/plugins/clangpchmanager/qtcreatorprojectupdater.h @@ -71,8 +71,7 @@ public: void projectPartsUpdated(ProjectExplorer::Project *project) { - ProjectUpdaterType::updateProjectParts(Internal::createProjectParts(project), - Internal::createGeneratedFiles()); + ProjectUpdaterType::updateProjectParts(Internal::createProjectParts(project)); } void projectPartsRemoved(const QStringList &projectPartIds) @@ -80,15 +79,35 @@ public: ProjectUpdaterType::removeProjectParts(projectPartIds); } + void abstractEditorUpdated(const QString &filePath, const QByteArray &contents) + { + ProjectUpdaterType::updateGeneratedFiles({{ClangBackEnd::FilePath{filePath}, contents}}); + } + + void abstractEditorRemoved(const QString &filePath) + { + ProjectUpdaterType::removeGeneratedFiles({ClangBackEnd::FilePath{filePath}}); + } + private: void connectToCppModelManager() { + ProjectUpdaterType::updateGeneratedFiles(Internal::createGeneratedFiles()); + QObject::connect(Internal::cppModelManager(), &CppTools::CppModelManager::projectPartsUpdated, [&] (ProjectExplorer::Project *project) { projectPartsUpdated(project); }); QObject::connect(Internal::cppModelManager(), &CppTools::CppModelManager::projectPartsRemoved, [&] (const QStringList &projectPartIds) { projectPartsRemoved(projectPartIds); }); + QObject::connect(Internal::cppModelManager(), + &CppTools::CppModelManager::abstractEditorSupportContentsUpdated, + [&] (const QString &filePath, const QByteArray &contents) { + abstractEditorUpdated(filePath, contents); + }); + QObject::connect(Internal::cppModelManager(), + &CppTools::CppModelManager::abstractEditorSupportRemoved, + [&] (const QString &filePath) { abstractEditorRemoved(filePath); }); } }; diff --git a/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.cpp b/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.cpp index 654253ae9a..77d4a9ef6e 100644 --- a/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.cpp +++ b/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.cpp @@ -153,7 +153,7 @@ Utils::SmallStringVector ClangQueryProjectsFindFilter::compilerArguments(CppTool { using CppTools::CompilerOptionsBuilder; - CompilerOptionsBuilder builder(*projectPart, CLANG_VERSION, CLANG_RESOURCE_DIR); + CompilerOptionsBuilder builder(*projectPart, CppTools::UseSystemHeader::Yes); return Utils::SmallStringVector(builder.build(fileKind, CompilerOptionsBuilder::PchUsage::None)); diff --git a/src/plugins/clangrefactoring/clangrefactoring.qbs b/src/plugins/clangrefactoring/clangrefactoring.qbs index 803986423c..af92d01aec 100644 --- a/src/plugins/clangrefactoring/clangrefactoring.qbs +++ b/src/plugins/clangrefactoring/clangrefactoring.qbs @@ -5,6 +5,7 @@ QtcPlugin { name: "ClangRefactoring" Depends { name: "libclang"; required: false } + Depends { name: "clang_defines" } condition: libclang.present && libclang.toolingEnabled Depends { name: "ClangSupport" } @@ -16,19 +17,7 @@ QtcPlugin { Depends { name: "ProjectExplorer" } Depends { name: "TextEditor" } - cpp.defines: { - var defines = base; - defines.push("CLANGPCHMANAGER_LIB"); - - // The following defines are used to determine the clang include path for intrinsics. - defines.push('CLANG_VERSION="' + libclang.llvmVersion + '"'); - var resourceDir = FileInfo.joinPaths(libclang.llvmLibDir, "clang", libclang.llvmVersion, - "include"); - defines.push('CLANG_RESOURCE_DIR="' + resourceDir + '"'); - defines.push('CLANG_BINDIR="' + libclang.llvmBinDir + '"'); - return defines; - } - + cpp.defines: base.concat("CLANGPCHMANAGER_LIB") cpp.includePaths: ["."] files: [ diff --git a/src/plugins/clangrefactoring/refactoringengine.cpp b/src/plugins/clangrefactoring/refactoringengine.cpp index 952ed9bf19..57122fd3be 100644 --- a/src/plugins/clangrefactoring/refactoringengine.cpp +++ b/src/plugins/clangrefactoring/refactoringengine.cpp @@ -74,7 +74,7 @@ void RefactoringEngine::startLocalRenaming(const CppTools::CursorInEditor &data, QString filePath = data.filePath().toString(); QTextCursor textCursor = data.cursor(); - CompilerOptionsBuilder optionsBuilder{*projectPart, CLANG_VERSION, CLANG_RESOURCE_DIR}; + CompilerOptionsBuilder optionsBuilder{*projectPart, CppTools::UseSystemHeader::Yes}; Utils::SmallStringVector commandLine{optionsBuilder.build( fileKindInProjectPart(projectPart, filePath), CppTools::getPchUsage())}; diff --git a/src/plugins/clangtools/clangtidyclazytool.cpp b/src/plugins/clangtools/clangtidyclazytool.cpp index d3f3d841b7..27d7fe171b 100644 --- a/src/plugins/clangtools/clangtidyclazytool.cpp +++ b/src/plugins/clangtools/clangtidyclazytool.cpp @@ -254,7 +254,7 @@ ClangTidyClazyTool::ClangTidyClazyTool() &ClangToolsDiagnosticModel::fixItsToApplyCountChanged, [this](int c) { m_applyFixitsButton->setEnabled(c); - static_cast<DiagnosticView *>(m_diagnosticView)->setSelectedFixItsCount(c); + static_cast<DiagnosticView *>(m_diagnosticView.data())->setSelectedFixItsCount(c); }); connect(m_applyFixitsButton, &QToolButton::clicked, [this]() { QVector<DiagnosticItem *> diagnosticItems; @@ -269,10 +269,8 @@ ClangTidyClazyTool::ClangTidyClazyTool() const QString toolTip = tr("Clang-Tidy and Clazy use a customized Clang executable from the " "Clang project to search for errors and warnings."); - Debugger::registerPerspective(ClangTidyClazyPerspectiveId, new Perspective( - tr("Clang-Tidy and Clazy"), - {{ClangTidyClazyDockId, m_diagnosticView, {}, Perspective::SplitVertical}} - )); + auto perspective = new Perspective(ClangTidyClazyPerspectiveId, tr("Clang-Tidy and Clazy")); + perspective->addWindow(m_diagnosticView, Perspective::SplitVertical, nullptr); action = new QAction(tr("Clang-Tidy and Clazy..."), this); action->setToolTip(toolTip); @@ -284,14 +282,14 @@ ClangTidyClazyTool::ClangTidyClazyTool() action->setEnabled(m_startAction->isEnabled()); }); - ToolbarDescription tidyClazyToolbar; - tidyClazyToolbar.addAction(m_startAction); - tidyClazyToolbar.addAction(m_stopAction); - tidyClazyToolbar.addAction(m_goBack); - tidyClazyToolbar.addAction(m_goNext); - tidyClazyToolbar.addWidget(m_filterLineEdit); - tidyClazyToolbar.addWidget(m_applyFixitsButton); - Debugger::registerToolbar(ClangTidyClazyPerspectiveId, tidyClazyToolbar); + perspective->addToolbarAction(m_startAction); + perspective->addToolbarAction(m_stopAction); + perspective->addToolbarAction(m_goBack); + perspective->addToolbarAction(m_goNext); + perspective->addToolbarWidget(m_filterLineEdit); + perspective->addToolbarWidget(m_applyFixitsButton); + + Debugger::registerPerspective(perspective); updateRunActions(); diff --git a/src/plugins/clangtools/clangtidyclazytool.h b/src/plugins/clangtools/clangtidyclazytool.h index 72832451d1..2391afbe3a 100644 --- a/src/plugins/clangtools/clangtidyclazytool.h +++ b/src/plugins/clangtools/clangtidyclazytool.h @@ -39,7 +39,6 @@ namespace Internal { class DiagnosticFilterModel; const char ClangTidyClazyPerspectiveId[] = "ClangTidyClazy.Perspective"; -const char ClangTidyClazyDockId[] = "ClangTidyClazy.Dock"; class ClangTidyClazyTool final : public ClangTool { diff --git a/src/plugins/clangtools/clangtool.cpp b/src/plugins/clangtools/clangtool.cpp index 248bee44ea..da23b619fd 100644 --- a/src/plugins/clangtools/clangtool.cpp +++ b/src/plugins/clangtools/clangtool.cpp @@ -98,6 +98,11 @@ ClangTool::ClangTool(const QString &name) m_stopAction = Debugger::createStopAction(); } +ClangTool::~ClangTool() +{ + delete m_diagnosticView; +} + FileInfos ClangTool::collectFileInfos(Project *project, bool askUserForFileSelection) const { auto projectInfo = CppTools::CppModelManager::instance()->projectInfo(project); diff --git a/src/plugins/clangtools/clangtool.h b/src/plugins/clangtools/clangtool.h index 6363cedb64..39d66b7e73 100644 --- a/src/plugins/clangtools/clangtool.h +++ b/src/plugins/clangtools/clangtool.h @@ -44,7 +44,7 @@ class ClangTool : public QObject public: ClangTool(const QString &name); - virtual ~ClangTool() = default; + virtual ~ClangTool(); virtual void startTool(bool askUserForFileSelection) = 0; @@ -72,7 +72,7 @@ protected: void initDiagnosticView(); ClangToolsDiagnosticModel *m_diagnosticModel = nullptr; - Debugger::DetailedErrorView *m_diagnosticView = nullptr; + QPointer<Debugger::DetailedErrorView> m_diagnosticView; QAction *m_startAction = nullptr; QAction *m_stopAction = nullptr; diff --git a/src/plugins/clangtools/clangtoolruncontrol.cpp b/src/plugins/clangtools/clangtoolruncontrol.cpp index 8e33d18b3a..08cea9383f 100644 --- a/src/plugins/clangtools/clangtoolruncontrol.cpp +++ b/src/plugins/clangtools/clangtoolruncontrol.cpp @@ -145,16 +145,17 @@ private: if (buildType == BuildConfiguration::Release) { const QString wrongMode = ClangToolRunControl::tr("Release"); const QString toolName = m_parent->tool()->name(); - const QString title = ClangToolRunControl::tr("Run %1 in %2 Mode?").arg(toolName) - .arg(wrongMode); - const QString message = ClangToolRunControl::tr( - "<html><head/><body>" - "<p>You are trying to run the tool \"%1\" on an application in %2 mode. The tool is " + const QString title = ClangToolRunControl::tr("Run %1 in %2 Mode?").arg(toolName, wrongMode); + const QString problem = ClangToolRunControl::tr( + "You are trying to run the tool \"%1\" on an application in %2 mode. The tool is " "designed to be used in Debug mode since enabled assertions can reduce the number of " - "false positives.</p>" - "<p>Do you want to continue and run the tool in %2 mode?</p>" - "</body></html>") - .arg(toolName).arg(wrongMode); + "false positives.").arg(toolName, wrongMode); + const QString question = ClangToolRunControl::tr( + "Do you want to continue and run the tool in %1 mode?").arg(wrongMode); + const QString message = QString("<html><head/><body>" + "<p>%1</p>" + "<p>%2</p>" + "</body></html>").arg(problem, question); if (Utils::CheckableMessageBox::doNotAskAgainQuestion(Core::ICore::mainWindow(), title, message, Core::ICore::settings(), "ClangToolsCorrectModeWarning") != QDialogButtonBox::Yes) @@ -190,9 +191,7 @@ static AnalyzeUnits toAnalyzeUnits(const FileInfos &fileInfos) AnalyzeUnits unitsToAnalyze; const CompilerOptionsBuilder::PchUsage pchUsage = CppTools::getPchUsage(); for (const FileInfo &fileInfo : fileInfos) { - CompilerOptionsBuilder optionsBuilder(*fileInfo.projectPart, - CLANG_VERSION, - CLANG_RESOURCE_DIR); + CompilerOptionsBuilder optionsBuilder(*fileInfo.projectPart); QStringList arguments = extraClangToolsPrependOptions(); arguments.append(optionsBuilder.build(fileInfo.kind, pchUsage)); arguments.append(extraClangToolsAppendOptions()); @@ -228,7 +227,7 @@ ClangToolRunControl::ClangToolRunControl(RunControl *runControl, const FileInfos &fileInfos) : RunWorker(runControl) , m_projectBuilder(new ProjectBuilder(runControl, target->project(), this)) - , m_clangExecutable(CppTools::clangExecutable(CLANG_BINDIR)) + , m_clangExecutable(Core::ICore::clangExecutable(CLANG_BINDIR)) , m_temporaryDir("clangtools-XXXXXX") , m_target(target) , m_fileInfos(fileInfos) @@ -299,7 +298,7 @@ void ClangToolRunControl::start() // Create log dir if (!m_temporaryDir.isValid()) { const QString errorMessage - = toolName + tr(": Failed to create temporary dir, stop."); + = tr("%1: Failed to create temporary dir, stop.").arg(toolName); appendMessage(errorMessage, Utils::ErrorMessageFormat); TaskHub::addTask(Task::Error, errorMessage, Debugger::Constants::ANALYZERTASK_ID); TaskHub::requestPopup(); @@ -448,13 +447,13 @@ void ClangToolRunControl::updateProgressValue() void ClangToolRunControl::finalize() { const QString toolName = tool()->name(); - appendMessage(toolName + tr(" finished: " - "Processed %1 files successfully, %2 failed.") - .arg(m_filesAnalyzed).arg(m_filesNotAnalyzed), + appendMessage(tr("%1 finished: " + "Processed %2 files successfully, %3 failed.") + .arg(toolName, m_filesAnalyzed, m_filesNotAnalyzed), Utils::NormalMessageFormat); if (m_filesNotAnalyzed != 0) { - QString msg = toolName + tr(": Not all files could be analyzed."); + QString msg = tr("%1: Not all files could be analyzed.").arg(toolName); TaskHub::addTask(Task::Error, msg, Debugger::Constants::ANALYZERTASK_ID); TaskHub::requestPopup(); } diff --git a/src/plugins/clangtools/clangtools.qbs b/src/plugins/clangtools/clangtools.qbs index e0bab2c34c..97759e54c5 100644 --- a/src/plugins/clangtools/clangtools.qbs +++ b/src/plugins/clangtools/clangtools.qbs @@ -12,7 +12,9 @@ QtcPlugin { Depends { name: "ProjectExplorer" } Depends { name: "QtcSsh" } Depends { name: "Utils" } + Depends { name: "libclang"; required: false } + Depends { name: "clang_defines" } Depends { name: "Qt.widgets" } @@ -23,24 +25,12 @@ QtcPlugin { condition: libclang.present + cpp.defines: base.concat("CLANGPCHMANAGER_LIB") cpp.includePaths: base.concat(libclang.llvmIncludeDir) cpp.libraryPaths: base.concat(libclang.llvmLibDir) cpp.dynamicLibraries: base.concat(libclang.llvmLibs) cpp.rpaths: base.concat(libclang.llvmLibDir) - cpp.defines: { - var defines = base; - defines.push("CLANGPCHMANAGER_LIB"); - - // The following defines are used to determine the clang include path for intrinsics. - defines.push('CLANG_VERSION="' + libclang.llvmVersion + '"'); - var resourceDir = FileInfo.joinPaths(libclang.llvmLibDir, "clang", libclang.llvmVersion, - "include"); - defines.push('CLANG_RESOURCE_DIR="' + resourceDir + '"'); - defines.push('CLANG_BINDIR="' + libclang.llvmBinDir + '"'); - return defines; - } - files: [ "clangfileinfo.h", "clangfixitsrefactoringchanges.cpp", diff --git a/src/plugins/clangtools/clangtoolsbasicsettings.ui b/src/plugins/clangtools/clangtoolsbasicsettings.ui index 22842500d5..4b6f14111e 100644 --- a/src/plugins/clangtools/clangtoolsbasicsettings.ui +++ b/src/plugins/clangtools/clangtoolsbasicsettings.ui @@ -10,9 +10,6 @@ <height>300</height> </rect> </property> - <property name="windowTitle"> - <string>Form</string> - </property> <layout class="QVBoxLayout" name="verticalLayout_2"> <property name="leftMargin"> <number>0</number> diff --git a/src/plugins/clangtools/clangtoolspreconfiguredsessiontests.cpp b/src/plugins/clangtools/clangtoolspreconfiguredsessiontests.cpp index d08bfcd23c..6014e00821 100644 --- a/src/plugins/clangtools/clangtoolspreconfiguredsessiontests.cpp +++ b/src/plugins/clangtools/clangtoolspreconfiguredsessiontests.cpp @@ -29,6 +29,7 @@ #include "clangtidyclazytool.h" #include "clangtoolsutils.h" +#include <coreplugin/icore.h> #include <cpptools/compileroptionsbuilder.h> #include <cpptools/projectinfo.h> #include <projectexplorer/kitinformation.h> @@ -168,7 +169,7 @@ static QList<Target *> validTargets(Project *project) const ToolChain * const toolchain = ToolChainKitInformation::toolChain(kit, ProjectExplorer::Constants::CXX_LANGUAGE_ID); QTC_ASSERT(toolchain, return false); - if (CppTools::clangExecutable(CLANG_BINDIR).isEmpty()) { + if (Core::ICore::clangExecutable(CLANG_BINDIR).isEmpty()) { qWarning("Project \"%s\": Skipping target \"%s\" since no suitable clang was found for the toolchain.", qPrintable(projectFileName), qPrintable(target->displayName())); diff --git a/src/plugins/clangtools/clangtoolsunittests.cpp b/src/plugins/clangtools/clangtoolsunittests.cpp index 98577a78a0..eed554633a 100644 --- a/src/plugins/clangtools/clangtoolsunittests.cpp +++ b/src/plugins/clangtools/clangtoolsunittests.cpp @@ -29,6 +29,7 @@ #include "clangtidyclazytool.h" #include "clangtoolsutils.h" +#include <coreplugin/icore.h> #include <cpptools/cppcodemodelsettings.h> #include <cpptools/cppmodelmanager.h> #include <cpptools/cpptoolstestcase.h> @@ -62,7 +63,7 @@ void ClangToolsUnitTests::initTestCase() if (!toolchain) QSKIP("This test requires that there is a kit with a toolchain."); - if (CppTools::clangExecutable(CLANG_BINDIR).isEmpty()) + if (Core::ICore::clangExecutable(CLANG_BINDIR).isEmpty()) QSKIP("No clang suitable for analyzing found"); m_tmpDir = new CppTools::Tests::TemporaryCopiedDir(QLatin1String(":/unit-tests")); diff --git a/src/plugins/classview/classviewnavigationwidget.cpp b/src/plugins/classview/classviewnavigationwidget.cpp index 58cab5a6d8..a2f793fcab 100644 --- a/src/plugins/classview/classviewnavigationwidget.cpp +++ b/src/plugins/classview/classviewnavigationwidget.cpp @@ -173,7 +173,7 @@ QList<QToolButton *> NavigationWidget::createToolButtons() // create a button fullProjectsModeButton = new QToolButton(); fullProjectsModeButton->setIcon( - CPlusPlus::Icons::iconForType(CPlusPlus::Icons::ClassIconType)); + ::Utils::CodeModelIcon::iconForType(::Utils::CodeModelIcon::Class)); fullProjectsModeButton->setCheckable(true); fullProjectsModeButton->setToolTip(tr("Show Subprojects")); diff --git a/src/plugins/classview/classviewtreeitemmodel.cpp b/src/plugins/classview/classviewtreeitemmodel.cpp index b00f8e3020..0e295324c9 100644 --- a/src/plugins/classview/classviewtreeitemmodel.cpp +++ b/src/plugins/classview/classviewtreeitemmodel.cpp @@ -62,7 +62,7 @@ QVariant TreeItemModel::data(const QModelIndex &index, int role) const bool ok = false; int type = iconType.toInt(&ok); if (ok && type >= 0) - return CPlusPlus::Icons::iconForType(static_cast<CPlusPlus::Icons::IconType>(type)); + return ::Utils::CodeModelIcon::iconForType(static_cast<::Utils::CodeModelIcon::Type>(type)); } } break; diff --git a/src/plugins/classview/classviewutils.cpp b/src/plugins/classview/classviewutils.cpp index 793fa3ea6d..53a673bb76 100644 --- a/src/plugins/classview/classviewutils.cpp +++ b/src/plugins/classview/classviewutils.cpp @@ -43,29 +43,29 @@ namespace Constants { //! Default icon sort order const int IconSortOrder[] = { - CPlusPlus::Icons::NamespaceIconType, - CPlusPlus::Icons::EnumIconType, - CPlusPlus::Icons::ClassIconType, - CPlusPlus::Icons::FuncPublicIconType, - CPlusPlus::Icons::FuncProtectedIconType, - CPlusPlus::Icons::FuncPrivateIconType, - CPlusPlus::Icons::FuncPublicStaticIconType, - CPlusPlus::Icons::FuncProtectedStaticIconType, - CPlusPlus::Icons::FuncPrivateStaticIconType, - CPlusPlus::Icons::SignalIconType, - CPlusPlus::Icons::SlotPublicIconType, - CPlusPlus::Icons::SlotProtectedIconType, - CPlusPlus::Icons::SlotPrivateIconType, - CPlusPlus::Icons::VarPublicIconType, - CPlusPlus::Icons::VarProtectedIconType, - CPlusPlus::Icons::VarPrivateIconType, - CPlusPlus::Icons::VarPublicStaticIconType, - CPlusPlus::Icons::VarProtectedStaticIconType, - CPlusPlus::Icons::VarPrivateStaticIconType, - CPlusPlus::Icons::EnumeratorIconType, - CPlusPlus::Icons::KeywordIconType, - CPlusPlus::Icons::MacroIconType, - CPlusPlus::Icons::UnknownIconType + Utils::CodeModelIcon::Namespace, + Utils::CodeModelIcon::Enum, + Utils::CodeModelIcon::Class, + Utils::CodeModelIcon::FuncPublic, + Utils::CodeModelIcon::FuncProtected, + Utils::CodeModelIcon::FuncPrivate, + Utils::CodeModelIcon::FuncPublicStatic, + Utils::CodeModelIcon::FuncProtectedStatic, + Utils::CodeModelIcon::FuncPrivateStatic, + Utils::CodeModelIcon::Signal, + Utils::CodeModelIcon::SlotPublic, + Utils::CodeModelIcon::SlotProtected, + Utils::CodeModelIcon::SlotPrivate, + Utils::CodeModelIcon::VarPublic, + Utils::CodeModelIcon::VarProtected, + Utils::CodeModelIcon::VarPrivate, + Utils::CodeModelIcon::VarPublicStatic, + Utils::CodeModelIcon::VarProtectedStatic, + Utils::CodeModelIcon::VarPrivateStatic, + Utils::CodeModelIcon::Enumerator, + Utils::CodeModelIcon::Keyword, + Utils::CodeModelIcon::Macro, + Utils::CodeModelIcon::Unknown }; } // namespace Constants diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.cpp b/src/plugins/cmakeprojectmanager/builddirmanager.cpp index db703727dc..68a7ceb684 100644 --- a/src/plugins/cmakeprojectmanager/builddirmanager.cpp +++ b/src/plugins/cmakeprojectmanager/builddirmanager.cpp @@ -64,7 +64,7 @@ BuildDirManager::~BuildDirManager() = default; Utils::FileName BuildDirManager::workDirectory(const BuildDirParameters ¶meters) const { const Utils::FileName bdir = parameters.buildDirectory; - const CMakeTool *cmake = parameters.cmakeTool; + const CMakeTool *cmake = parameters.cmakeTool(); if (bdir.exists()) { m_buildDirToTempDir.erase(bdir); return bdir; @@ -141,7 +141,7 @@ bool BuildDirManager::hasConfigChanged() const CMakeConfig currentConfig = takeCMakeConfiguration(); - const CMakeTool *tool = m_parameters.cmakeTool; + const CMakeTool *tool = m_parameters.cmakeTool(); QTC_ASSERT(tool, return false); // No cmake... we should not have ended up here in the first place const QString extraKitGenerator = m_parameters.extraGenerator; const QString mainKitGenerator = m_parameters.generator; @@ -196,7 +196,7 @@ void BuildDirManager::setParametersAndRequestParse(const BuildDirParameters &par int newReaderReparseOptions, int existingReaderReparseOptions) { - if (!parameters.cmakeTool) { + if (!parameters.cmakeTool()) { TaskHub::addTask(Task::Error, tr("The kit needs to define a CMake tool to parse this project."), ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM); @@ -240,7 +240,7 @@ void BuildDirManager::becameDirty() if (!m_parameters.buildConfiguration || !m_parameters.buildConfiguration->isActive()) return; - const CMakeTool *tool = m_parameters.cmakeTool; + const CMakeTool *tool = m_parameters.cmakeTool(); if (!tool->isAutoRun()) return; diff --git a/src/plugins/cmakeprojectmanager/builddirparameters.cpp b/src/plugins/cmakeprojectmanager/builddirparameters.cpp index 4af170b490..481695f7e9 100644 --- a/src/plugins/cmakeprojectmanager/builddirparameters.cpp +++ b/src/plugins/cmakeprojectmanager/builddirparameters.cpp @@ -27,6 +27,7 @@ #include "cmakebuildconfiguration.h" #include "cmakekitinformation.h" +#include "cmaketoolmanager.h" #include <projectexplorer/kit.h> #include <projectexplorer/kitinformation.h> @@ -53,7 +54,7 @@ BuildDirParameters::BuildDirParameters(CMakeBuildConfiguration *bc) environment = bc->environment(); - cmakeTool = CMakeKitInformation::cmakeTool(k); + cmakeToolId = CMakeKitInformation::cmakeToolId(k); auto tc = ToolChainKitInformation::toolChain(k, Constants::CXX_LANGUAGE_ID); if (tc) @@ -74,7 +75,12 @@ BuildDirParameters::BuildDirParameters(CMakeBuildConfiguration *bc) generatorArguments = CMakeGeneratorKitInformation::generatorArguments(k); } -bool BuildDirParameters::isValid() const { return buildConfiguration && cmakeTool; } +bool BuildDirParameters::isValid() const { return buildConfiguration && cmakeTool(); } + +CMakeTool *BuildDirParameters::cmakeTool() const +{ + return CMakeToolManager::findById(cmakeToolId); +} BuildDirParameters::BuildDirParameters(const BuildDirParameters &) = default; diff --git a/src/plugins/cmakeprojectmanager/builddirparameters.h b/src/plugins/cmakeprojectmanager/builddirparameters.h index 1c26b45ffe..92f5f16eee 100644 --- a/src/plugins/cmakeprojectmanager/builddirparameters.h +++ b/src/plugins/cmakeprojectmanager/builddirparameters.h @@ -46,6 +46,7 @@ public: BuildDirParameters(const BuildDirParameters &other); bool isValid() const; + CMakeTool *cmakeTool() const; CMakeBuildConfiguration *buildConfiguration = nullptr; QString projectName; @@ -54,7 +55,7 @@ public: Utils::FileName buildDirectory; Utils::FileName workDirectory; // either buildDirectory or a QTemporaryDirectory! Utils::Environment environment; - CMakeTool *cmakeTool = nullptr; + Core::Id cmakeToolId; QByteArray cxxToolChainId; QByteArray cToolChainId; diff --git a/src/plugins/cmakeprojectmanager/builddirreader.cpp b/src/plugins/cmakeprojectmanager/builddirreader.cpp index 1d15eb7f7f..3cf74ad6f4 100644 --- a/src/plugins/cmakeprojectmanager/builddirreader.cpp +++ b/src/plugins/cmakeprojectmanager/builddirreader.cpp @@ -41,8 +41,9 @@ namespace Internal { BuildDirReader *BuildDirReader::createReader(const BuildDirParameters &p) { - QTC_ASSERT(p.isValid() && p.cmakeTool, return nullptr); - if (p.cmakeTool->hasServerMode()) + CMakeTool *cmake = p.cmakeTool(); + QTC_ASSERT(p.isValid() && cmake, return nullptr); + if (cmake->hasServerMode()) return new ServerModeReader; return new TeaLeafReader; } diff --git a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp index 0677bb9ae2..306ec7b4e1 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp @@ -109,11 +109,6 @@ CMakeBuildConfiguration *CMakeBuildStep::cmakeBuildConfiguration() const return static_cast<CMakeBuildConfiguration *>(buildConfiguration()); } -CMakeBuildConfiguration *CMakeBuildStep::targetsActiveBuildConfiguration() const -{ - return static_cast<CMakeBuildConfiguration *>(target()->activeBuildConfiguration()); -} - CMakeRunConfiguration *CMakeBuildStep::targetsActiveRunConfiguration() const { return qobject_cast<CMakeRunConfiguration *>(target()->activeRunConfiguration()); @@ -154,8 +149,6 @@ bool CMakeBuildStep::init(QList<const BuildStep *> &earlierSteps) { bool canInit = true; CMakeBuildConfiguration *bc = cmakeBuildConfiguration(); - if (!bc) - bc = targetsActiveBuildConfiguration(); if (!bc) { emit addTask(Task::buildConfigurationMissingTask()); canInit = false; @@ -241,8 +234,6 @@ void CMakeBuildStep::run(QFutureInterface<bool> &fi) { // Make sure CMake state was written to disk before trying to build: CMakeBuildConfiguration *bc = cmakeBuildConfiguration(); - if (!bc) - bc = targetsActiveBuildConfiguration(); QTC_ASSERT(bc, return); bool mustDelay = false; @@ -535,8 +526,6 @@ void CMakeBuildStepConfigWidget::selectedBuildTargetsChanged() void CMakeBuildStepConfigWidget::updateDetails() { BuildConfiguration *bc = m_buildStep->buildConfiguration(); - if (!bc) - bc = m_buildStep->targetsActiveBuildConfiguration(); if (!bc) { m_summaryText = tr("<b>No build configuration found on this kit.</b>"); emit updateSummary(); @@ -566,7 +555,7 @@ QString CMakeBuildStepConfigWidget::summaryText() const CMakeBuildStepFactory::CMakeBuildStepFactory() { registerStep<CMakeBuildStep>(Constants::CMAKE_BUILD_STEP_ID); - setDisplayName(tr("Build", "Display name for CMakeProjectManager::CMakeBuildStep id.")); + setDisplayName(CMakeBuildStep::tr("Build", "Display name for CMakeProjectManager::CMakeBuildStep id.")); setSupportedProjectType(Constants::CMAKEPROJECT_ID); } diff --git a/src/plugins/cmakeprojectmanager/cmakebuildstep.h b/src/plugins/cmakeprojectmanager/cmakebuildstep.h index 68c40d5752..098310f1eb 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildstep.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildstep.h @@ -55,7 +55,6 @@ public: explicit CMakeBuildStep(ProjectExplorer::BuildStepList *bsl); CMakeBuildConfiguration *cmakeBuildConfiguration() const; - CMakeBuildConfiguration *targetsActiveBuildConfiguration() const; bool init(QList<const BuildStep *> &earlierSteps) override; void run(QFutureInterface<bool> &fi) override; @@ -139,8 +138,6 @@ private: class CMakeBuildStepFactory : public ProjectExplorer::BuildStepFactory { - Q_OBJECT - public: CMakeBuildStepFactory(); }; diff --git a/src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp b/src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp index c4531fed20..7e6db558e5 100644 --- a/src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp @@ -44,7 +44,7 @@ CMakeConfigItem::CMakeConfigItem() = default; CMakeConfigItem::CMakeConfigItem(const CMakeConfigItem &other) : key(other.key), type(other.type), isAdvanced(other.isAdvanced), - inCMakeCache(false), isUnset(other.isUnset), value(other.value), + isUnset(other.isUnset), value(other.value), documentation(other.documentation), values(other.values) {} diff --git a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp index 6903be8f2c..3646b066b5 100644 --- a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp +++ b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp @@ -83,13 +83,16 @@ Core::Id CMakeKitInformation::id() return TOOL_ID; } -CMakeTool *CMakeKitInformation::cmakeTool(const Kit *k) +Core::Id CMakeKitInformation::cmakeToolId(const Kit *k) { if (!k) - return nullptr; + return {}; + return Core::Id::fromSetting(k->value(TOOL_ID)); +} - const QVariant id = k->value(TOOL_ID); - return CMakeToolManager::findById(Core::Id::fromSetting(id)); +CMakeTool *CMakeKitInformation::cmakeTool(const Kit *k) +{ + return CMakeToolManager::findById(cmakeToolId(k)); } void CMakeKitInformation::setCMakeTool(Kit *k, const Core::Id id) diff --git a/src/plugins/cmakeprojectmanager/cmakekitinformation.h b/src/plugins/cmakeprojectmanager/cmakekitinformation.h index 87f9de0b67..3da3f7d7b2 100644 --- a/src/plugins/cmakeprojectmanager/cmakekitinformation.h +++ b/src/plugins/cmakeprojectmanager/cmakekitinformation.h @@ -43,6 +43,7 @@ public: static Core::Id id(); + static Core::Id cmakeToolId(const ProjectExplorer::Kit *k); static CMakeTool *cmakeTool(const ProjectExplorer::Kit *k); static void setCMakeTool(ProjectExplorer::Kit *k, const Core::Id id); diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro index 1b80127ace..c242998441 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro @@ -20,6 +20,7 @@ HEADERS = builddirmanager.h \ cmakelocatorfilter.h \ cmakefilecompletionassist.h \ cmaketool.h \ + cmaketoolsettingsaccessor.h \ cmakeparser.h \ cmakesettingspage.h \ cmaketoolmanager.h \ @@ -56,6 +57,7 @@ SOURCES = builddirmanager.cpp \ cmakelocatorfilter.cpp \ cmakefilecompletionassist.cpp \ cmaketool.cpp \ + cmaketoolsettingsaccessor.cpp \ cmakeparser.cpp \ cmakesettingspage.cpp \ cmaketoolmanager.cpp \ diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs index a69662f5b9..d0ce6bebe2 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs @@ -69,6 +69,8 @@ QtcPlugin { "cmaketool.h", "cmaketoolmanager.cpp", "cmaketoolmanager.h", + "cmaketoolsettingsaccessor.cpp", + "cmaketoolsettingsaccessor.h", "cmakesettingspage.h", "cmakesettingspage.cpp", "cmakeindenter.h", diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp index da3b80d570..806c5f1ab8 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp @@ -106,9 +106,9 @@ bool CMakeProjectPlugin::initialize(const QStringList & /*arguments*/, QString * new CMakeToolManager(this); - KitManager::registerKitInformation(new CMakeKitInformation); - KitManager::registerKitInformation(new CMakeGeneratorKitInformation); - KitManager::registerKitInformation(new CMakeConfigurationKitInformation); + KitManager::registerKitInformation<CMakeKitInformation>(); + KitManager::registerKitInformation<CMakeGeneratorKitInformation>(); + KitManager::registerKitInformation<CMakeConfigurationKitInformation>(); //menus ActionContainer *msubproject = diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp index a5cb8c4d38..1c0c4f2ee9 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp @@ -112,6 +112,8 @@ CMakeRunConfigurationFactory::CMakeRunConfigurationFactory() registerRunConfiguration<CMakeRunConfiguration>("CMakeProjectManager.CMakeRunConfiguration."); addSupportedProjectType(CMakeProjectManager::Constants::CMAKEPROJECT_ID); addSupportedTargetDeviceType(ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE); + + addRunWorkerFactory<SimpleTargetRunner>(ProjectExplorer::Constants::NORMAL_RUN_MODE); } } // Internal diff --git a/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp b/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp index 2d9dc9e37d..037bd8e35e 100644 --- a/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp +++ b/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp @@ -108,8 +108,7 @@ public: m_executable(executable), m_isAutoRun(autoRun), m_autoCreateBuildDirectory(autoCreate), - m_autodetected(autodetected), - m_changed(true) + m_autodetected(autodetected) {} CMakeToolTreeItem() = default; @@ -250,6 +249,9 @@ CMakeToolTreeItem *CMakeToolItemModel::cmakeToolItem(const QModelIndex &index) c void CMakeToolItemModel::removeCMakeTool(const Core::Id &id) { + if (m_removedItems.contains(id)) + return; // Item has already been removed in the model! + CMakeToolTreeItem *treeItem = cmakeToolItem(id); QTC_ASSERT(treeItem, return); @@ -278,13 +280,11 @@ void CMakeToolItemModel::apply() foreach (CMakeToolTreeItem *item, toRegister) { CMakeTool::Detection detection = item->m_autodetected ? CMakeTool::AutoDetection : CMakeTool::ManualDetection; - CMakeTool *cmake = new CMakeTool(detection, item->m_id); + auto cmake = std::make_unique<CMakeTool>(detection, item->m_id); cmake->setDisplayName(item->m_name); cmake->setCMakeExecutable(item->m_executable); - if (!CMakeToolManager::registerCMakeTool(cmake)) { + if (!CMakeToolManager::registerCMakeTool(std::move(cmake))) item->m_changed = true; - delete cmake; - } } CMakeToolManager::setDefaultCMakeTool(defaultItemId()); diff --git a/src/plugins/cmakeprojectmanager/cmaketool.cpp b/src/plugins/cmakeprojectmanager/cmaketool.cpp index e123bd4e5a..795f2dc7cb 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketool.cpp @@ -55,18 +55,45 @@ bool CMakeTool::Generator::matches(const QString &n, const QString &ex) const return n == name && (ex.isEmpty() || extraGenerators.contains(ex)); } +namespace Internal { + +// -------------------------------------------------------------------- +// CMakeIntrospectionData: +// -------------------------------------------------------------------- + +class IntrospectionData +{ +public: + bool m_didAttemptToRun = false; + bool m_didRun = false; + bool m_hasServerMode = false; + + bool m_queriedServerMode = false; + bool m_triedCapabilities = false; + + QList<CMakeTool::Generator> m_generators; + QMap<QString, QStringList> m_functionArgs; + QStringList m_variables; + QStringList m_functions; + CMakeTool::Version m_version; +}; + +} // namespace Internal + /////////////////////////// // CMakeTool /////////////////////////// CMakeTool::CMakeTool(Detection d, const Core::Id &id) : - m_id(id), m_isAutoDetected(d == AutoDetection) + m_id(id), m_isAutoDetected(d == AutoDetection), + m_introspection(std::make_unique<Internal::IntrospectionData>()) { QTC_ASSERT(m_id.isValid(), m_id = Core::Id::fromString(QUuid::createUuid().toString())); } -CMakeTool::CMakeTool(const QVariantMap &map, bool fromSdk) : m_isAutoDetected(fromSdk) +CMakeTool::CMakeTool(const QVariantMap &map, bool fromSdk) : + CMakeTool(fromSdk ? CMakeTool::AutoDetection : CMakeTool::ManualDetection, + Core::Id::fromSetting(map.value(CMAKE_INFORMATION_ID))) { - m_id = Core::Id::fromSetting(map.value(CMAKE_INFORMATION_ID)); m_displayName = map.value(CMAKE_INFORMATION_DISPLAYNAME).toString(); m_isAutoRun = map.value(CMAKE_INFORMATION_AUTORUN, true).toBool(); m_autoCreateBuildDirectory = map.value(CMAKE_INFORMATION_AUTO_CREATE_BUILD_DIRECTORY, false).toBool(); @@ -78,6 +105,8 @@ CMakeTool::CMakeTool(const QVariantMap &map, bool fromSdk) : m_isAutoDetected(fr setCMakeExecutable(Utils::FileName::fromString(map.value(CMAKE_INFORMATION_COMMAND).toString())); } +CMakeTool::~CMakeTool() = default; + Core::Id CMakeTool::createId() { return Core::Id::fromString(QUuid::createUuid().toString()); @@ -88,8 +117,8 @@ void CMakeTool::setCMakeExecutable(const Utils::FileName &executable) if (m_executable == executable) return; - m_didRun = false; - m_didAttemptToRun = false; + m_introspection->m_didRun = false; + m_introspection->m_didAttemptToRun = false; m_executable = executable; CMakeToolManager::notifyAboutUpdate(this); @@ -118,15 +147,15 @@ bool CMakeTool::isValid() const if (!m_id.isValid()) return false; - if (!m_didAttemptToRun) + if (!m_introspection->m_didAttemptToRun) supportedGenerators(); - return m_didRun; + return m_introspection->m_didRun; } Utils::SynchronousProcessResponse CMakeTool::run(const QStringList &args, bool mayFail) const { - if (m_didAttemptToRun && !m_didRun) { + if (m_introspection->m_didAttemptToRun && !m_introspection->m_didRun) { Utils::SynchronousProcessResponse response; response.result = Utils::SynchronousProcessResponse::StartFailed; return response; @@ -141,8 +170,8 @@ Utils::SynchronousProcessResponse CMakeTool::run(const QStringList &args, bool m cmake.setTimeOutMessageBoxEnabled(false); Utils::SynchronousProcessResponse response = cmake.runBlocking(m_executable.toString(), args); - m_didAttemptToRun = true; - m_didRun = mayFail ? true : (response.result == Utils::SynchronousProcessResponse::Finished); + m_introspection->m_didAttemptToRun = true; + m_introspection->m_didRun = mayFail ? true : (response.result == Utils::SynchronousProcessResponse::Finished); return response; } @@ -182,16 +211,16 @@ bool CMakeTool::autoCreateBuildDirectory() const QList<CMakeTool::Generator> CMakeTool::supportedGenerators() const { readInformation(QueryType::GENERATORS); - return m_generators; + return m_introspection->m_generators; } TextEditor::Keywords CMakeTool::keywords() { - if (m_functions.isEmpty()) { + if (m_introspection->m_functions.isEmpty()) { Utils::SynchronousProcessResponse response; response = run({"--help-command-list"}); if (response.result == Utils::SynchronousProcessResponse::Finished) - m_functions = response.stdOut().split('\n'); + m_introspection->m_functions = response.stdOut().split('\n'); response = run({"--help-commands"}); if (response.result == Utils::SynchronousProcessResponse::Finished) @@ -199,29 +228,31 @@ TextEditor::Keywords CMakeTool::keywords() response = run({"--help-property-list"}); if (response.result == Utils::SynchronousProcessResponse::Finished) - m_variables = parseVariableOutput(response.stdOut()); + m_introspection->m_variables = parseVariableOutput(response.stdOut()); response = run({"--help-variable-list"}); if (response.result == Utils::SynchronousProcessResponse::Finished) { - m_variables.append(parseVariableOutput(response.stdOut())); - m_variables = Utils::filteredUnique(m_variables); - Utils::sort(m_variables); + m_introspection->m_variables.append(parseVariableOutput(response.stdOut())); + m_introspection->m_variables = Utils::filteredUnique(m_introspection->m_variables); + Utils::sort(m_introspection->m_variables); } } - return TextEditor::Keywords(m_variables, m_functions, m_functionArgs); + return TextEditor::Keywords(m_introspection->m_variables, + m_introspection->m_functions, + m_introspection->m_functionArgs); } bool CMakeTool::hasServerMode() const { readInformation(QueryType::SERVER_MODE); - return m_hasServerMode; + return m_introspection->m_hasServerMode; } CMakeTool::Version CMakeTool::version() const { readInformation(QueryType::VERSION); - return m_version; + return m_introspection->m_version; } bool CMakeTool::isAutoDetected() const @@ -254,16 +285,16 @@ CMakeTool::PathMapper CMakeTool::pathMapper() const void CMakeTool::readInformation(CMakeTool::QueryType type) const { - if ((type == QueryType::GENERATORS && !m_generators.isEmpty()) - || (type == QueryType::SERVER_MODE && m_queriedServerMode) - || (type == QueryType::VERSION && !m_version.fullVersion.isEmpty())) + if ((type == QueryType::GENERATORS && !m_introspection->m_generators.isEmpty()) + || (type == QueryType::SERVER_MODE && m_introspection->m_queriedServerMode) + || (type == QueryType::VERSION && !m_introspection->m_version.fullVersion.isEmpty())) return; - if (!m_triedCapabilities) { + if (!m_introspection->m_triedCapabilities) { fetchFromCapabilities(); - m_triedCapabilities = true; - m_queriedServerMode = true; // Got added after "-E capabilities" support! - if (type == QueryType::GENERATORS && !m_generators.isEmpty()) + m_introspection->m_triedCapabilities = true; + m_introspection->m_queriedServerMode = true; // Got added after "-E capabilities" support! + if (type == QueryType::GENERATORS && !m_introspection->m_generators.isEmpty()) return; } @@ -312,7 +343,7 @@ static QStringList parseDefinition(const QString &definition) void CMakeTool::parseFunctionDetailsOutput(const QString &output) { QSet<QString> functionSet; - functionSet.fromList(m_functions); + functionSet.fromList(m_introspection->m_functions); bool expectDefinition = false; QString currentDefinition; @@ -333,13 +364,13 @@ void CMakeTool::parseFunctionDetailsOutput(const QString &output) if (!words.isEmpty()) { const QString command = words.takeFirst(); if (functionSet.contains(command)) { - QStringList tmp = words + m_functionArgs[command]; + QStringList tmp = words + m_introspection->m_functionArgs[command]; Utils::sort(tmp); - m_functionArgs[command] = Utils::filteredUnique(tmp); + m_introspection->m_functionArgs[command] = Utils::filteredUnique(tmp); } } if (!words.isEmpty() && functionSet.contains(words.at(0))) - m_functionArgs[words.at(0)]; + m_introspection->m_functionArgs[words.at(0)]; currentDefinition.clear(); } else { currentDefinition.append(line.trimmed() + ' '); @@ -374,10 +405,13 @@ void CMakeTool::fetchGeneratorsFromHelp() const Utils::SynchronousProcessResponse response = run({"--help"}); if (response.result != Utils::SynchronousProcessResponse::Finished) return; + parseGeneratorsFromHelp(response.stdOut().split('\n')); +} +void CMakeTool::parseGeneratorsFromHelp(const QStringList &lines) const +{ bool inGeneratorSection = false; QHash<QString, QStringList> generatorInfo; - const QStringList lines = response.stdOut().split('\n'); foreach (const QString &line, lines) { if (line.isEmpty()) continue; @@ -418,7 +452,7 @@ void CMakeTool::fetchGeneratorsFromHelp() const // Populate genertor list: for (auto it = generatorInfo.constBegin(); it != generatorInfo.constEnd(); ++it) - m_generators.append(Generator(it.key(), it.value())); + m_introspection->m_generators.append(Generator(it.key(), it.value())); } void CMakeTool::fetchVersionFromVersionOutput() const @@ -427,17 +461,21 @@ void CMakeTool::fetchVersionFromVersionOutput() const if (response.result != Utils::SynchronousProcessResponse::Finished) return; + parseVersionFormVersionOutput(response.stdOut().split('\n')); +} + +void CMakeTool::parseVersionFormVersionOutput(const QStringList &lines) const +{ QRegularExpression versionLine("^cmake.* version ((\\d+).(\\d+).(\\d+).*)$"); - const QString responseText = response.stdOut(); - for (const QStringRef &line : responseText.splitRef(QLatin1Char('\n'))) { + for (const QString &line : lines) { QRegularExpressionMatch match = versionLine.match(line); if (!match.hasMatch()) continue; - m_version.major = match.captured(2).toInt(); - m_version.minor = match.captured(3).toInt(); - m_version.patch = match.captured(4).toInt(); - m_version.fullVersion = match.captured(1).toUtf8(); + m_introspection->m_version.major = match.captured(2).toInt(); + m_introspection->m_version.minor = match.captured(3).toInt(); + m_introspection->m_version.patch = match.captured(4).toInt(); + m_introspection->m_version.fullVersion = match.captured(1).toUtf8(); break; } } @@ -448,26 +486,31 @@ void CMakeTool::fetchFromCapabilities() const if (response.result != Utils::SynchronousProcessResponse::Finished) return; - auto doc = QJsonDocument::fromJson(response.stdOut().toUtf8()); + parseFromCapabilities(response.stdOut()); +} + +void CMakeTool::parseFromCapabilities(const QString &input) const +{ + auto doc = QJsonDocument::fromJson(input.toUtf8()); if (!doc.isObject()) return; const QVariantMap data = doc.object().toVariantMap(); - m_hasServerMode = data.value("serverMode").toBool(); + m_introspection->m_hasServerMode = data.value("serverMode").toBool(); const QVariantList generatorList = data.value("generators").toList(); for (const QVariant &v : generatorList) { const QVariantMap gen = v.toMap(); - m_generators.append(Generator(gen.value("name").toString(), - gen.value("extraGenerators").toStringList(), - gen.value("platformSupport").toBool(), - gen.value("toolsetSupport").toBool())); + m_introspection->m_generators.append(Generator(gen.value("name").toString(), + gen.value("extraGenerators").toStringList(), + gen.value("platformSupport").toBool(), + gen.value("toolsetSupport").toBool())); } const QVariantMap versionInfo = data.value("version").toMap(); - m_version.major = versionInfo.value("major").toInt(); - m_version.minor = versionInfo.value("minor").toInt(); - m_version.patch = versionInfo.value("patch").toInt(); - m_version.fullVersion = versionInfo.value("string").toByteArray(); + m_introspection->m_version.major = versionInfo.value("major").toInt(); + m_introspection->m_version.minor = versionInfo.value("minor").toInt(); + m_introspection->m_version.patch = versionInfo.value("patch").toInt(); + m_introspection->m_version.fullVersion = versionInfo.value("string").toByteArray(); } } // namespace CMakeProjectManager diff --git a/src/plugins/cmakeprojectmanager/cmaketool.h b/src/plugins/cmakeprojectmanager/cmaketool.h index 95556cefd7..c36511dbd4 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.h +++ b/src/plugins/cmakeprojectmanager/cmaketool.h @@ -43,9 +43,10 @@ namespace ProjectExplorer { class Kit; } namespace CMakeProjectManager { -class CMAKE_EXPORT CMakeTool : public QObject +namespace Internal { class IntrospectionData; } + +class CMAKE_EXPORT CMakeTool { - Q_OBJECT public: enum Detection { ManualDetection, @@ -79,7 +80,7 @@ public: explicit CMakeTool(Detection d, const Core::Id &id); explicit CMakeTool(const QVariantMap &map, bool fromSdk); - ~CMakeTool() override = default; + ~CMakeTool(); static Core::Id createId(); @@ -120,8 +121,11 @@ private: QStringList parseVariableOutput(const QString &output); void fetchGeneratorsFromHelp() const; + void parseGeneratorsFromHelp(const QStringList &lines) const; void fetchVersionFromVersionOutput() const; + void parseVersionFormVersionOutput(const QStringList &lines) const; void fetchFromCapabilities() const; + void parseFromCapabilities(const QString &input) const; Core::Id m_id; QString m_displayName; @@ -131,18 +135,7 @@ private: bool m_isAutoDetected = false; bool m_autoCreateBuildDirectory = false; - mutable bool m_didAttemptToRun = false; - mutable bool m_didRun = false; - mutable bool m_hasServerMode = false; - - mutable bool m_queriedServerMode = false; - mutable bool m_triedCapabilities = false; - - mutable QList<Generator> m_generators; - mutable QMap<QString, QStringList> m_functionArgs; - mutable QStringList m_variables; - mutable QStringList m_functions; - mutable Version m_version; + std::unique_ptr<Internal::IntrospectionData> m_introspection; PathMapper m_pathMapper; }; diff --git a/src/plugins/cmakeprojectmanager/cmaketoolmanager.cpp b/src/plugins/cmakeprojectmanager/cmaketoolmanager.cpp index d7af9c454f..a90fe59c81 100644 --- a/src/plugins/cmakeprojectmanager/cmaketoolmanager.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketoolmanager.cpp @@ -25,16 +25,12 @@ #include "cmaketoolmanager.h" +#include "cmaketoolsettingsaccessor.h" + #include <coreplugin/icore.h> -#include <projectexplorer/toolchainmanager.h> -#include <utils/persistentsettings.h> -#include <utils/qtcassert.h> -#include <utils/environment.h> -#include <utils/algorithm.h> -#include <QFileInfo> -#include <QDebug> -#include <QDir> +#include <utils/pointeralgorithm.h> +#include <utils/qtcassert.h> using namespace Core; using namespace Utils; @@ -42,161 +38,22 @@ using namespace ProjectExplorer; namespace CMakeProjectManager { -const char CMAKETOOL_COUNT_KEY[] = "CMakeTools.Count"; -const char CMAKETOOL_DEFAULT_KEY[] = "CMakeTools.Default"; -const char CMAKETOOL_DATA_KEY[] = "CMakeTools."; -const char CMAKETOOL_FILE_VERSION_KEY[] = "Version"; -const char CMAKETOOL_FILENAME[] = "/cmaketools.xml"; +// -------------------------------------------------------------------- +// CMakeToolManagerPrivate: +// -------------------------------------------------------------------- class CMakeToolManagerPrivate { public: Id m_defaultCMake; - QList<CMakeTool *> m_cmakeTools; - PersistentSettingsWriter *m_writer = nullptr; - QList<CMakeToolManager::AutodetectionHelper> m_autoDetectionHelpers; + std::vector<std::unique_ptr<CMakeTool>> m_cmakeTools; + Internal::CMakeToolSettingsAccessor m_accessor; }; static CMakeToolManagerPrivate *d = nullptr; -static void addCMakeTool(CMakeTool *item) -{ - QTC_ASSERT(item->id().isValid(), return); - - d->m_cmakeTools.append(item); - - //set the first registered cmake tool as default if there is not already one - if (!d->m_defaultCMake.isValid()) - CMakeToolManager::setDefaultCMakeTool(item->id()); -} - -static FileName userSettingsFileName() -{ - return FileName::fromString(ICore::userResourcePath() + CMAKETOOL_FILENAME); -} - -static QList<CMakeTool *> readCMakeTools(const FileName &fileName, Core::Id *defaultId, bool fromSDK) -{ - PersistentSettingsReader reader; - if (!reader.load(fileName)) - return QList<CMakeTool *>(); - - QVariantMap data = reader.restoreValues(); - - // Check version - int version = data.value(QLatin1String(CMAKETOOL_FILE_VERSION_KEY), 0).toInt(); - if (version < 1) - return QList<CMakeTool *>(); - - QList<CMakeTool *> loaded; - - int count = data.value(QLatin1String(CMAKETOOL_COUNT_KEY), 0).toInt(); - for (int i = 0; i < count; ++i) { - const QString key = QString::fromLatin1(CMAKETOOL_DATA_KEY) + QString::number(i); - if (!data.contains(key)) - continue; - - const QVariantMap dbMap = data.value(key).toMap(); - auto item = new CMakeTool(dbMap,fromSDK); - if (item->isAutoDetected()) { - if (!item->cmakeExecutable().toFileInfo().isExecutable()) { - qWarning() << QString::fromLatin1("CMakeTool \"%1\" (%2) read from \"%3\" dropped since the command is not executable.") - .arg(item->cmakeExecutable().toUserOutput(), item->id().toString(), fileName.toUserOutput()); - delete item; - continue; - } - } - - loaded.append(item); - } - - *defaultId = Id::fromSetting(data.value(QLatin1String(CMAKETOOL_DEFAULT_KEY), defaultId->toSetting())); - - return loaded; -} - -static void readAndDeleteLegacyCMakeSettings () -{ - // restore the legacy cmake - QSettings *settings = ICore::settings(); - settings->beginGroup(QLatin1String("CMakeSettings")); - - FileName exec = FileName::fromUserInput(settings->value(QLatin1String("cmakeExecutable")).toString()); - if (exec.toFileInfo().isExecutable()) { - CMakeTool *item = CMakeToolManager::findByCommand(exec); - if (!item) { - item = new CMakeTool(CMakeTool::ManualDetection, CMakeTool::createId()); - item->setCMakeExecutable(exec); - item->setDisplayName(CMakeToolManager::tr("CMake at %1").arg(item->cmakeExecutable().toUserOutput())); - - if (!CMakeToolManager::registerCMakeTool(item)) { - delete item; - item = nullptr; - } - } - - //this setting used to be the default cmake, make sure it is again - if (item) - d->m_defaultCMake = item->id(); - } - - settings->remove(QString()); - settings->endGroup(); -} - -static QList<CMakeTool *> autoDetectCMakeTools() -{ - Utils::Environment env = Environment::systemEnvironment(); - - Utils::FileNameList path = env.path(); - path = Utils::filteredUnique(path); - - if (HostOsInfo::isWindowsHost()) { - const QString progFiles = QLatin1String(qgetenv("ProgramFiles")); - path.append(Utils::FileName::fromString(progFiles + "/CMake")); - path.append(Utils::FileName::fromString(progFiles + "/CMake/bin")); - const QString progFilesX86 = QLatin1String(qgetenv("ProgramFiles(x86)")); - if (!progFilesX86.isEmpty()) { - path.append(Utils::FileName::fromString(progFilesX86 + "/CMake")); - path.append(Utils::FileName::fromString(progFilesX86 + "/CMake/bin")); - } - } - - if (HostOsInfo::isMacHost()) { - path.append(Utils::FileName::fromString("/Applications/CMake.app/Contents/bin")); - path.append(Utils::FileName::fromString("/usr/local/bin")); - path.append(Utils::FileName::fromString("/opt/local/bin")); - } - - const QStringList execs = env.appendExeExtensions(QLatin1String("cmake")); - - FileNameList suspects; - foreach (const Utils::FileName &base, path) { - if (base.isEmpty()) - continue; - - QFileInfo fi; - for (const QString &exec : execs) { - fi.setFile(base.toString(), exec); - if (fi.exists() && fi.isFile() && fi.isExecutable()) - suspects << FileName::fromString(fi.absoluteFilePath()); - } - } - - QList<CMakeTool *> found; - foreach (const FileName &command, suspects) { - auto item = new CMakeTool(CMakeTool::AutoDetection, CMakeTool::createId()); - item->setCMakeExecutable(command); - item->setDisplayName(CMakeToolManager::tr("System CMake at %1").arg(command.toUserOutput())); - - found.append(item); - } - - //execute custom helpers if available - foreach (CMakeToolManager::AutodetectionHelper source, d->m_autoDetectionHelpers) - found.append(source()); - - return found; -} +// -------------------------------------------------------------------- +// CMakeToolManager: +// -------------------------------------------------------------------- CMakeToolManager *CMakeToolManager::m_instance = nullptr; @@ -206,7 +63,6 @@ CMakeToolManager::CMakeToolManager(QObject *parent) : QObject(parent) m_instance = this; d = new CMakeToolManagerPrivate; - d->m_writer = new PersistentSettingsWriter(userSettingsFileName(), QStringLiteral("QtCreatorCMakeTools")); connect(ICore::instance(), &ICore::saveSettingsRequested, this, &CMakeToolManager::saveCMakeTools); @@ -217,8 +73,6 @@ CMakeToolManager::CMakeToolManager(QObject *parent) : QObject(parent) CMakeToolManager::~CMakeToolManager() { - delete d->m_writer; - qDeleteAll(d->m_cmakeTools); delete d; } @@ -229,85 +83,70 @@ CMakeToolManager *CMakeToolManager::instance() QList<CMakeTool *> CMakeToolManager::cmakeTools() { - return d->m_cmakeTools; + return Utils::toRawPointer<QList>(d->m_cmakeTools); } Id CMakeToolManager::registerOrFindCMakeTool(const FileName &command) { - CMakeTool *cmake = findByCommand(command); - if (cmake) + if (CMakeTool *cmake = findByCommand(command)) return cmake->id(); - cmake = new CMakeTool(CMakeTool::ManualDetection, CMakeTool::createId()); + auto cmake = std::make_unique<CMakeTool>(CMakeTool::ManualDetection, CMakeTool::createId()); cmake->setCMakeExecutable(command); cmake->setDisplayName(tr("CMake at %1").arg(command.toUserOutput())); - addCMakeTool(cmake); - emit m_instance->cmakeAdded(cmake->id()); - return cmake->id(); + Core::Id id = cmake->id(); + QTC_ASSERT(registerCMakeTool(std::move(cmake)), return Core::Id()); + return id; } -bool CMakeToolManager::registerCMakeTool(CMakeTool *tool) +bool CMakeToolManager::registerCMakeTool(std::unique_ptr<CMakeTool> &&tool) { - if (!tool || d->m_cmakeTools.contains(tool)) + if (!tool || Utils::contains(d->m_cmakeTools, tool.get())) return true; - QTC_ASSERT(tool->id().isValid(),return false); + const Core::Id toolId = tool->id(); + QTC_ASSERT(toolId.isValid(),return false); //make sure the same id was not used before - foreach (CMakeTool *current, d->m_cmakeTools) { - if (tool->id() == current->id()) - return false; - } + QTC_ASSERT(!Utils::contains(d->m_cmakeTools, [toolId](const std::unique_ptr<CMakeTool> &known) { + return toolId == known->id(); + }), return false); + + d->m_cmakeTools.emplace_back(std::move(tool)); + + emit CMakeToolManager::m_instance->cmakeAdded(toolId); + + ensureDefaultCMakeToolIsValid(); - addCMakeTool(tool); - emit m_instance->cmakeAdded(tool->id()); return true; } void CMakeToolManager::deregisterCMakeTool(const Id &id) { - int idx = Utils::indexOf(d->m_cmakeTools, Utils::equal(&CMakeTool::id, id)); - if (idx >= 0) { - CMakeTool *toRemove = d->m_cmakeTools.takeAt(idx); - if (toRemove->id() == d->m_defaultCMake) { - if (d->m_cmakeTools.isEmpty()) - d->m_defaultCMake = Id(); - else - d->m_defaultCMake = d->m_cmakeTools.first()->id(); - - emit m_instance->defaultCMakeChanged(); - } + auto toRemove = Utils::take(d->m_cmakeTools, Utils::equal(&CMakeTool::id, id)); + if (toRemove.has_value()) { + + ensureDefaultCMakeToolIsValid(); emit m_instance->cmakeRemoved(id); - delete toRemove; } } CMakeTool *CMakeToolManager::defaultCMakeTool() { - CMakeTool *tool = findById(d->m_defaultCMake); - if (!tool) { - //if the id is not valid, we set the firstly registered one as default - if (!d->m_cmakeTools.isEmpty()) { - d->m_defaultCMake = d->m_cmakeTools.first()->id(); - emit m_instance->defaultCMakeChanged(); - - return d->m_cmakeTools.first(); - } - } - return tool; + return findById(d->m_defaultCMake); } void CMakeToolManager::setDefaultCMakeTool(const Id &id) { - if (d->m_defaultCMake == id) - return; - - if (findById(id)) { + if (d->m_defaultCMake != id && findById(id)) { d->m_defaultCMake = id; emit m_instance->defaultCMakeChanged(); + return; } + + ensureDefaultCMakeToolIsValid(); } CMakeTool *CMakeToolManager::findByCommand(const FileName &command) @@ -322,105 +161,40 @@ CMakeTool *CMakeToolManager::findById(const Id &id) void CMakeToolManager::restoreCMakeTools() { - Core::Id defaultId; - - FileName sdkSettingsFile = FileName::fromString(ICore::installerResourcePath() - + CMAKETOOL_FILENAME); - - QList<CMakeTool *> toolsToRegister = readCMakeTools(sdkSettingsFile, &defaultId, true); - - //read the tools from the user settings file - QList<CMakeTool *> readTools = readCMakeTools(userSettingsFileName(), &defaultId, false); - - //autodetect tools - QList<CMakeTool *> autoDetected = autoDetectCMakeTools(); - - //filter out the tools that were stored in SDK - for (int i = readTools.size() - 1; i >= 0; i--) { - CMakeTool *currTool = readTools.takeAt(i); - if (Utils::anyOf(toolsToRegister, Utils::equal(&CMakeTool::id, currTool->id()))) { - delete currTool; - } else { - //if the current tool is marked as autodetected and NOT in the autodetected list, - //it is a leftover SDK provided tool. The user will not be able to edit it, - //so we automatically drop it - if (currTool->isAutoDetected()) { - if (!Utils::anyOf(autoDetected, - Utils::equal(&CMakeTool::cmakeExecutable, currTool->cmakeExecutable()))) { - - qWarning() << QString::fromLatin1("Previously SDK provided CMakeTool \"%1\" (%2) dropped.") - .arg(currTool->cmakeExecutable().toUserOutput(), currTool->id().toString()); - - delete currTool; - continue; - } - } - toolsToRegister.append(currTool); - } - } - - //filter out the tools that are already known - while (autoDetected.size()) { - CMakeTool *currTool = autoDetected.takeFirst(); - if (Utils::anyOf(toolsToRegister, - Utils::equal(&CMakeTool::cmakeExecutable, currTool->cmakeExecutable()))) - delete currTool; - else - toolsToRegister.append(currTool); - } - - // Store all tools - foreach (CMakeTool *current, toolsToRegister) { - if (!registerCMakeTool(current)) { - //this should never happen, but lets make sure we do not leak memory - qWarning() << QString::fromLatin1("CMakeTool \"%1\" (%2) dropped.") - .arg(current->cmakeExecutable().toUserOutput(), current->id().toString()); + Internal::CMakeToolSettingsAccessor::CMakeTools tools + = d->m_accessor.restoreCMakeTools(ICore::dialogParent()); + d->m_cmakeTools = std::move(tools.cmakeTools); + setDefaultCMakeTool(tools.defaultToolId); - delete current; - } - } - - if (CMakeToolManager::findById(defaultId)) - d->m_defaultCMake = defaultId; - - // restore the legacy cmake settings only once and keep them around - readAndDeleteLegacyCMakeSettings(); emit m_instance->cmakeToolsLoaded(); } -void CMakeToolManager::registerAutodetectionHelper(CMakeToolManager::AutodetectionHelper helper) -{ - d->m_autoDetectionHelpers.append(helper); -} - void CMakeToolManager::notifyAboutUpdate(CMakeTool *tool) { - if (!tool || !d->m_cmakeTools.contains(tool)) + if (!tool || !Utils::contains(d->m_cmakeTools, tool)) return; emit m_instance->cmakeUpdated(tool->id()); } void CMakeToolManager::saveCMakeTools() { - QTC_ASSERT(d->m_writer, return); - QVariantMap data; - data.insert(QLatin1String(CMAKETOOL_FILE_VERSION_KEY), 1); - data.insert(QLatin1String(CMAKETOOL_DEFAULT_KEY), d->m_defaultCMake.toSetting()); - - int count = 0; - foreach (CMakeTool *item, d->m_cmakeTools) { - QFileInfo fi = item->cmakeExecutable().toFileInfo(); - - if (fi.isExecutable()) { - QVariantMap tmp = item->toMap(); - if (tmp.isEmpty()) - continue; - data.insert(QString::fromLatin1(CMAKETOOL_DATA_KEY) + QString::number(count), tmp); - ++count; - } + d->m_accessor.saveCMakeTools(cmakeTools(), d->m_defaultCMake, ICore::dialogParent()); +} + +void CMakeToolManager::ensureDefaultCMakeToolIsValid() +{ + const Core::Id oldId = d->m_defaultCMake; + if (d->m_cmakeTools.size() == 0) { + d->m_defaultCMake = Core::Id(); + } else { + if (findById(d->m_defaultCMake)) + return; + d->m_defaultCMake = d->m_cmakeTools.at(0)->id(); } - data.insert(QLatin1String(CMAKETOOL_COUNT_KEY), count); - d->m_writer->save(data, ICore::mainWindow()); + + // signaling: + if (oldId != d->m_defaultCMake) + emit m_instance->defaultCMakeChanged(); } } // namespace CMakeProjectManager diff --git a/src/plugins/cmakeprojectmanager/cmaketoolmanager.h b/src/plugins/cmakeprojectmanager/cmaketoolmanager.h index 81ffab8522..bd7f232553 100644 --- a/src/plugins/cmakeprojectmanager/cmaketoolmanager.h +++ b/src/plugins/cmakeprojectmanager/cmaketoolmanager.h @@ -40,8 +40,6 @@ class CMAKE_EXPORT CMakeToolManager : public QObject { Q_OBJECT public: - typedef std::function<QList<CMakeTool *> ()> AutodetectionHelper; - CMakeToolManager(QObject *parent); ~CMakeToolManager() override; @@ -50,14 +48,13 @@ public: static QList<CMakeTool *> cmakeTools(); static Core::Id registerOrFindCMakeTool(const Utils::FileName &command); - static bool registerCMakeTool(CMakeTool *tool); + static bool registerCMakeTool(std::unique_ptr<CMakeTool> &&tool); static void deregisterCMakeTool(const Core::Id &id); static CMakeTool *defaultCMakeTool(); static void setDefaultCMakeTool(const Core::Id &id); static CMakeTool *findByCommand(const Utils::FileName &command); static CMakeTool *findById(const Core::Id &id); - static void registerAutodetectionHelper(AutodetectionHelper helper); static void notifyAboutUpdate(CMakeTool *); static void restoreCMakeTools(); @@ -72,6 +69,7 @@ signals: private: static void saveCMakeTools(); + static void ensureDefaultCMakeToolIsValid(); static CMakeToolManager *m_instance; }; diff --git a/src/plugins/cmakeprojectmanager/cmaketoolsettingsaccessor.cpp b/src/plugins/cmakeprojectmanager/cmaketoolsettingsaccessor.cpp new file mode 100644 index 0000000000..2f2d40b91d --- /dev/null +++ b/src/plugins/cmakeprojectmanager/cmaketoolsettingsaccessor.cpp @@ -0,0 +1,257 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "cmaketoolsettingsaccessor.h" + +#include "cmaketool.h" +#include "cmaketoolmanager.h" + +#include <coreplugin/icore.h> + +#include <app/app_version.h> + +#include <utils/algorithm.h> +#include <utils/environment.h> + +#include <QDebug> +#include <QDir> +#include <QFileInfo> + +using namespace Utils; + +namespace CMakeProjectManager { +namespace Internal { + +// -------------------------------------------------------------------- +// CMakeToolSettingsUpgraders: +// -------------------------------------------------------------------- + +class CMakeToolSettingsUpgraderV0 : public Utils::VersionUpgrader +{ + // Necessary to make Version 1 supported. +public: + CMakeToolSettingsUpgraderV0() : Utils::VersionUpgrader(0, "4.6") { } + + // NOOP + QVariantMap upgrade(const QVariantMap &data) final { return data; } +}; + +// -------------------------------------------------------------------- +// Helpers: +// -------------------------------------------------------------------- + +static const char CMAKE_TOOL_COUNT_KEY[] = "CMakeTools.Count"; +static const char CMAKE_TOOL_DATA_KEY[] = "CMakeTools."; +static const char CMAKE_TOOL_DEFAULT_KEY[] = "CMakeTools.Default"; +static const char CMAKE_TOOL_FILENAME[] = "/cmaketools.xml"; + + +static std::vector<std::unique_ptr<CMakeTool>> autoDetectCMakeTools() +{ + Utils::Environment env = Environment::systemEnvironment(); + + Utils::FileNameList path = env.path(); + path = Utils::filteredUnique(path); + + if (HostOsInfo::isWindowsHost()) { + const QString progFiles = QLatin1String(qgetenv("ProgramFiles")); + path.append(Utils::FileName::fromString(progFiles + "/CMake")); + path.append(Utils::FileName::fromString(progFiles + "/CMake/bin")); + const QString progFilesX86 = QLatin1String(qgetenv("ProgramFiles(x86)")); + if (!progFilesX86.isEmpty()) { + path.append(Utils::FileName::fromString(progFilesX86 + "/CMake")); + path.append(Utils::FileName::fromString(progFilesX86 + "/CMake/bin")); + } + } + + if (HostOsInfo::isMacHost()) { + path.append(Utils::FileName::fromString("/Applications/CMake.app/Contents/bin")); + path.append(Utils::FileName::fromString("/usr/local/bin")); + path.append(Utils::FileName::fromString("/opt/local/bin")); + } + + const QStringList execs = env.appendExeExtensions(QLatin1String("cmake")); + + FileNameList suspects; + foreach (const Utils::FileName &base, path) { + if (base.isEmpty()) + continue; + + QFileInfo fi; + for (const QString &exec : execs) { + fi.setFile(QDir(base.toString()), exec); + if (fi.exists() && fi.isFile() && fi.isExecutable()) + suspects << FileName::fromString(fi.absoluteFilePath()); + } + } + + std::vector<std::unique_ptr<CMakeTool>> found; + foreach (const FileName &command, suspects) { + auto item = std::make_unique<CMakeTool>(CMakeTool::AutoDetection, CMakeTool::createId()); + item->setCMakeExecutable(command); + item->setDisplayName(CMakeToolManager::tr("System CMake at %1").arg(command.toUserOutput())); + + found.emplace_back(std::move(item)); + } + + return found; +} + + +static std::vector<std::unique_ptr<CMakeTool>> +mergeTools(std::vector<std::unique_ptr<CMakeTool>> &sdkTools, + std::vector<std::unique_ptr<CMakeTool>> &userTools, + std::vector<std::unique_ptr<CMakeTool>> &autoDetectedTools) +{ + std::vector<std::unique_ptr<CMakeTool>> result = std::move(sdkTools); + while (userTools.size() > 0) { + std::unique_ptr<CMakeTool> userTool = std::move(userTools[0]); + userTools.erase(std::begin(userTools)); + + if (!Utils::contains(result, Utils::equal(&CMakeTool::id, userTool->id()))) { + if (userTool->isAutoDetected() + && !Utils::contains(autoDetectedTools, Utils::equal(&CMakeTool::cmakeExecutable, + userTool->cmakeExecutable()))) { + + qWarning() << QString::fromLatin1("Previously SDK provided CMakeTool \"%1\" (%2) dropped.") + .arg(userTool->cmakeExecutable().toUserOutput(), userTool->id().toString()); + continue; + } + result.emplace_back(std::move(userTool)); + } + } + + // add all the autodetected tools that are not known yet + while (autoDetectedTools.size() > 0) { + std::unique_ptr<CMakeTool> autoDetectedTool = std::move(autoDetectedTools[0]); + autoDetectedTools.erase(std::begin(autoDetectedTools)); + + if (!Utils::contains(result, + Utils::equal(&CMakeTool::cmakeExecutable, autoDetectedTool->cmakeExecutable()))) + result.emplace_back(std::move(autoDetectedTool)); + } + + return result; +} + + +// -------------------------------------------------------------------- +// CMakeToolSettingsAccessor: +// -------------------------------------------------------------------- + +CMakeToolSettingsAccessor::CMakeToolSettingsAccessor() : + UpgradingSettingsAccessor("QtCreatorCMakeTools", + QCoreApplication::translate("CMakeProjectManager::CMakeToolManager", "CMake"), + Core::Constants::IDE_DISPLAY_NAME) +{ + setBaseFilePath(FileName::fromString(Core::ICore::userResourcePath() + CMAKE_TOOL_FILENAME)); + + addVersionUpgrader(std::make_unique<CMakeToolSettingsUpgraderV0>()); +} + +CMakeToolSettingsAccessor::CMakeTools CMakeToolSettingsAccessor::restoreCMakeTools(QWidget *parent) const +{ + CMakeTools result; + + const FileName sdkSettingsFile = FileName::fromString(Core::ICore::installerResourcePath() + + CMAKE_TOOL_FILENAME); + + CMakeTools sdkTools = cmakeTools(restoreSettings(sdkSettingsFile, parent), true); + + //read the tools from the user settings file + CMakeTools userTools = cmakeTools(restoreSettings(parent), false); + + //autodetect tools + std::vector<std::unique_ptr<CMakeTool>> autoDetectedTools = autoDetectCMakeTools(); + + //filter out the tools that were stored in SDK + std::vector<std::unique_ptr<CMakeTool>> toRegister = mergeTools(sdkTools.cmakeTools, + userTools.cmakeTools, + autoDetectedTools); + + // Store all tools + for (auto it = std::begin(toRegister); it != std::end(toRegister); ++it) + result.cmakeTools.emplace_back(std::move(*it)); + + result.defaultToolId = userTools.defaultToolId.isValid() ? userTools.defaultToolId : sdkTools.defaultToolId; + + // Set default TC... + return result; +} + +void CMakeToolSettingsAccessor::saveCMakeTools(const QList<CMakeTool *> &cmakeTools, + const Core::Id &defaultId, + QWidget *parent) +{ + QVariantMap data; + data.insert(QLatin1String(CMAKE_TOOL_DEFAULT_KEY), defaultId.toSetting()); + + int count = 0; + for (const CMakeTool *item : cmakeTools) { + QFileInfo fi = item->cmakeExecutable().toFileInfo(); + + if (fi.isExecutable()) { + QVariantMap tmp = item->toMap(); + if (tmp.isEmpty()) + continue; + data.insert(QString::fromLatin1(CMAKE_TOOL_DATA_KEY) + QString::number(count), tmp); + ++count; + } + } + data.insert(QLatin1String(CMAKE_TOOL_COUNT_KEY), count); + + saveSettings(data, parent); +} + +CMakeToolSettingsAccessor::CMakeTools +CMakeToolSettingsAccessor::cmakeTools(const QVariantMap &data, bool fromSdk) const +{ + CMakeTools result; + + int count = data.value(QLatin1String(CMAKE_TOOL_COUNT_KEY), 0).toInt(); + for (int i = 0; i < count; ++i) { + const QString key = QString::fromLatin1(CMAKE_TOOL_DATA_KEY) + QString::number(i); + if (!data.contains(key)) + continue; + + const QVariantMap dbMap = data.value(key).toMap(); + auto item = std::make_unique<CMakeTool>(dbMap, fromSdk); + if (item->isAutoDetected() && !item->cmakeExecutable().toFileInfo().isExecutable()) { + qWarning() << QString::fromLatin1("CMakeTool \"%1\" (%2) dropped since the command is not executable.") + .arg(item->cmakeExecutable().toUserOutput(), item->id().toString()); + continue; + } + + result.cmakeTools.emplace_back(std::move(item)); + } + + result.defaultToolId = Core::Id::fromSetting(data.value(CMAKE_TOOL_DEFAULT_KEY, + Core::Id().toSetting())); + + return result; +} + +} // namespace Internal +} // namespace CMakeProjectManager diff --git a/src/plugins/cmakeprojectmanager/cmaketoolsettingsaccessor.h b/src/plugins/cmakeprojectmanager/cmaketoolsettingsaccessor.h new file mode 100644 index 0000000000..05c7ac6920 --- /dev/null +++ b/src/plugins/cmakeprojectmanager/cmaketoolsettingsaccessor.h @@ -0,0 +1,65 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include <utils/settingsaccessor.h> + +#include <coreplugin/id.h> + +#include <QList> + +#include <memory> + +namespace Core { class Id; } + +namespace CMakeProjectManager { + +class CMakeTool; + +namespace Internal { + +class CMakeToolSettingsAccessor : public Utils::UpgradingSettingsAccessor +{ +public: + CMakeToolSettingsAccessor(); + + struct CMakeTools { + Core::Id defaultToolId; + std::vector<std::unique_ptr<CMakeTool>> cmakeTools; + }; + + CMakeTools restoreCMakeTools(QWidget *parent) const; + + void saveCMakeTools(const QList<CMakeTool *> &cmakeTools, + const Core::Id &defaultId, + QWidget *parent); + +private: + CMakeTools cmakeTools(const QVariantMap &data, bool fromSdk) const; +}; + +} // namespace Internal +} // namespace CMakeProjectManager diff --git a/src/plugins/cmakeprojectmanager/servermode.cpp b/src/plugins/cmakeprojectmanager/servermode.cpp index 473b58ed65..2fe3d894e2 100644 --- a/src/plugins/cmakeprojectmanager/servermode.cpp +++ b/src/plugins/cmakeprojectmanager/servermode.cpp @@ -103,7 +103,7 @@ ServerMode::ServerMode(const Environment &env, m_connectionTimer.setInterval(100); connect(&m_connectionTimer, &QTimer::timeout, this, &ServerMode::connectToServer); - m_cmakeProcess.reset(new QtcProcess); + m_cmakeProcess = std::make_unique<QtcProcess>(); m_cmakeProcess->setEnvironment(env); m_cmakeProcess->setWorkingDirectory(buildDirectory.toString()); diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index b0fd84118b..3451e704da 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -98,13 +98,14 @@ ServerModeReader::~ServerModeReader() void ServerModeReader::setParameters(const BuildDirParameters &p) { - QTC_ASSERT(p.cmakeTool, return); + CMakeTool *cmake = p.cmakeTool(); + QTC_ASSERT(cmake, return); BuildDirReader::setParameters(p); if (!m_cmakeServer) { m_cmakeServer.reset(new ServerMode(p.environment, p.sourceDirectory, p.workDirectory, - p.cmakeTool->cmakeExecutable(), + cmake->cmakeExecutable(), p.generator, p.extraGenerator, p.platform, p.toolset, true, 1)); connect(m_cmakeServer.get(), &ServerMode::errorOccured, @@ -139,15 +140,17 @@ void ServerModeReader::setParameters(const BuildDirParameters &p) bool ServerModeReader::isCompatible(const BuildDirParameters &p) { - if (!p.cmakeTool) + CMakeTool *newCmake = p.cmakeTool(); + CMakeTool *oldCmake = m_parameters.cmakeTool(); + if (!newCmake || !oldCmake) return false; // Server mode connection got lost, reset... - if (!m_parameters.cmakeTool->cmakeExecutable().isEmpty() && !m_cmakeServer) + if (!oldCmake && oldCmake->cmakeExecutable().isEmpty() && !m_cmakeServer) return false; - return p.cmakeTool->hasServerMode() - && p.cmakeTool->cmakeExecutable() == m_parameters.cmakeTool->cmakeExecutable() + return newCmake->hasServerMode() + && newCmake->cmakeExecutable() == oldCmake->cmakeExecutable() && p.environment == m_parameters.environment && p.generator == m_parameters.generator && p.extraGenerator == m_parameters.extraGenerator diff --git a/src/plugins/cmakeprojectmanager/tealeafreader.cpp b/src/plugins/cmakeprojectmanager/tealeafreader.cpp index 2cca6c3569..6577decf18 100644 --- a/src/plugins/cmakeprojectmanager/tealeafreader.cpp +++ b/src/plugins/cmakeprojectmanager/tealeafreader.cpp @@ -131,8 +131,8 @@ TeaLeafReader::TeaLeafReader() connect(EditorManager::instance(), &EditorManager::aboutToSave, this, [this](const IDocument *document) { if (m_cmakeFiles.contains(document->filePath()) - || !m_parameters.cmakeTool - || !m_parameters.cmakeTool->isAutoRun()) + || !m_parameters.cmakeTool() + || !m_parameters.cmakeTool()->isAutoRun()) emit dirty(); }); @@ -154,9 +154,9 @@ TeaLeafReader::~TeaLeafReader() bool TeaLeafReader::isCompatible(const BuildDirParameters &p) { - if (!p.cmakeTool) + if (!p.cmakeTool()) return false; - return !p.cmakeTool->hasServerMode(); + return !p.cmakeTool()->hasServerMode(); } void TeaLeafReader::resetData() @@ -409,7 +409,8 @@ void TeaLeafReader::cleanUpProcess() void TeaLeafReader::extractData() { - QTC_ASSERT(m_parameters.isValid() && m_parameters.cmakeTool, return); + CMakeTool *cmake = m_parameters.cmakeTool(); + QTC_ASSERT(m_parameters.isValid() && cmake, return); const FileName srcDir = m_parameters.sourceDirectory; const FileName bldDir = m_parameters.workDirectory; @@ -436,7 +437,7 @@ void TeaLeafReader::extractData() // setFolderName CMakeCbpParser cbpparser; // Parsing - if (!cbpparser.parseCbpFile(m_parameters.cmakeTool->pathMapper(), cbpFile, srcDir)) + if (!cbpparser.parseCbpFile(cmake->pathMapper(), cbpFile, srcDir)) return; m_projectName = cbpparser.projectName(); @@ -461,7 +462,8 @@ void TeaLeafReader::extractData() void TeaLeafReader::startCMake(const QStringList &configurationArguments) { - QTC_ASSERT(m_parameters.isValid() && m_parameters.cmakeTool, return); + CMakeTool *cmake = m_parameters.cmakeTool(); + QTC_ASSERT(m_parameters.isValid() && cmake, return); const FileName workDirectory = m_parameters.workDirectory; QTC_ASSERT(!m_cmakeProcess, return); @@ -506,7 +508,7 @@ void TeaLeafReader::startCMake(const QStringList &configurationArguments) TaskHub::clearTasks(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM); MessageManager::write(tr("Running \"%1 %2\" in %3.") - .arg(m_parameters.cmakeTool->cmakeExecutable().toUserOutput()) + .arg(cmake->cmakeExecutable().toUserOutput()) .arg(args) .arg(workDirectory.toUserOutput())); @@ -516,7 +518,7 @@ void TeaLeafReader::startCMake(const QStringList &configurationArguments) tr("Configuring \"%1\"").arg(m_parameters.projectName), "CMake.Configure"); - m_cmakeProcess->setCommand(m_parameters.cmakeTool->cmakeExecutable().toString(), args); + m_cmakeProcess->setCommand(cmake->cmakeExecutable().toString(), args); emit configurationStarted(); m_cmakeProcess->start(); } diff --git a/src/plugins/coreplugin/actionmanager/actioncontainer.cpp b/src/plugins/coreplugin/actionmanager/actioncontainer.cpp index e1374ac73a..b602dc54cd 100644 --- a/src/plugins/coreplugin/actionmanager/actioncontainer.cpp +++ b/src/plugins/coreplugin/actionmanager/actioncontainer.cpp @@ -202,29 +202,29 @@ QList<Group>::const_iterator ActionContainerPrivate::findGroup(Id groupId) const QAction *ActionContainerPrivate::insertLocation(Id groupId) const { QList<Group>::const_iterator it = findGroup(groupId); - QTC_ASSERT(it != m_groups.constEnd(), return 0); + QTC_ASSERT(it != m_groups.constEnd(), return nullptr); return insertLocation(it); } QAction *ActionContainerPrivate::insertLocation(QList<Group>::const_iterator group) const { if (group == m_groups.constEnd()) - return 0; + return nullptr; ++group; while (group != m_groups.constEnd()) { if (!group->items.isEmpty()) { QObject *item = group->items.first(); - if (Command *cmd = qobject_cast<Command *>(item)) { + if (auto cmd = qobject_cast<Command *>(item)) { return cmd->action(); - } else if (ActionContainer *container = qobject_cast<ActionContainer *>(item)) { + } else if (auto container = qobject_cast<ActionContainer *>(item)) { if (container->menu()) return container->menu()->menuAction(); } - QTC_ASSERT(false, return 0); + QTC_ASSERT(false, return nullptr); } ++group; } - return 0; + return nullptr; } void ActionContainerPrivate::addAction(Command *command, Id groupId) @@ -247,11 +247,11 @@ void ActionContainerPrivate::addAction(Command *command, Id groupId) void ActionContainerPrivate::addMenu(ActionContainer *menu, Id groupId) { - ActionContainerPrivate *containerPrivate = static_cast<ActionContainerPrivate *>(menu); + auto containerPrivate = static_cast<ActionContainerPrivate *>(menu); if (!containerPrivate->canBeAddedToMenu()) return; - MenuActionContainer *container = static_cast<MenuActionContainer *>(containerPrivate); + auto container = static_cast<MenuActionContainer *>(containerPrivate); const Id actualGroupId = groupId.isValid() ? groupId : Id(Constants::G_DEFAULT_TWO); QList<Group>::const_iterator groupIt = findGroup(actualGroupId); QTC_ASSERT(groupIt != m_groups.constEnd(), return); @@ -265,11 +265,11 @@ void ActionContainerPrivate::addMenu(ActionContainer *menu, Id groupId) void ActionContainerPrivate::addMenu(ActionContainer *before, ActionContainer *menu, Id groupId) { - ActionContainerPrivate *containerPrivate = static_cast<ActionContainerPrivate *>(menu); + auto containerPrivate = static_cast<ActionContainerPrivate *>(menu); if (!containerPrivate->canBeAddedToMenu()) return; - MenuActionContainer *container = static_cast<MenuActionContainer *>(containerPrivate); + auto container = static_cast<MenuActionContainer *>(containerPrivate); const Id actualGroupId = groupId.isValid() ? groupId : Id(Constants::G_DEFAULT_TWO); QList<Group>::const_iterator groupIt = findGroup(actualGroupId); QTC_ASSERT(groupIt != m_groups.constEnd(), return); @@ -293,7 +293,7 @@ void ActionContainerPrivate::addMenu(ActionContainer *before, ActionContainer *m Command *ActionContainerPrivate::addSeparator(const Context &context, Id group, QAction **outSeparator) { static int separatorIdCount = 0; - QAction *separator = new QAction(this); + auto separator = new QAction(this); separator->setSeparator(true); Id sepId = id().withSuffix(".Separator.").withSuffix(++separatorIdCount); Command *cmd = ActionManager::registerAction(separator, sepId, context); @@ -309,12 +309,12 @@ void ActionContainerPrivate::clear() while (it.hasNext()) { Group &group = it.next(); foreach (QObject *item, group.items) { - if (Command *command = qobject_cast<Command *>(item)) { + if (auto command = qobject_cast<Command *>(item)) { removeAction(command->action()); disconnect(command, &Command::activeStateChanged, this, &ActionContainerPrivate::scheduleUpdate); disconnect(command, &QObject::destroyed, this, &ActionContainerPrivate::itemDestroyed); - } else if (ActionContainer *container = qobject_cast<ActionContainer *>(item)) { + } else if (auto container = qobject_cast<ActionContainer *>(item)) { container->clear(); disconnect(container, &QObject::destroyed, this, &ActionContainerPrivate::itemDestroyed); @@ -344,12 +344,12 @@ Id ActionContainerPrivate::id() const QMenu *ActionContainerPrivate::menu() const { - return 0; + return nullptr; } QMenuBar *ActionContainerPrivate::menuBar() const { - return 0; + return nullptr; } bool ActionContainerPrivate::canAddAction(Command *action) const @@ -429,7 +429,7 @@ bool MenuActionContainer::updateInternal() while (it.hasNext()) { const Group &group = it.next(); foreach (QObject *item, group.items) { - if (ActionContainerPrivate *container = qobject_cast<ActionContainerPrivate*>(item)) { + if (auto container = qobject_cast<ActionContainerPrivate*>(item)) { actions.removeAll(container->menu()->menuAction()); if (container == this) { QByteArray warning = Q_FUNC_INFO + QByteArray(" container '"); @@ -443,7 +443,7 @@ bool MenuActionContainer::updateInternal() hasitems = true; break; } - } else if (Command *command = qobject_cast<Command *>(item)) { + } else if (auto command = qobject_cast<Command *>(item)) { actions.removeAll(command->action()); if (command->isActive()) { hasitems = true; @@ -488,7 +488,7 @@ bool MenuActionContainer::canBeAddedToMenu() const */ MenuBarActionContainer::MenuBarActionContainer(Id id) - : ActionContainerPrivate(id), m_menuBar(0) + : ActionContainerPrivate(id), m_menuBar(nullptr) { setOnAllDisabledBehavior(Show); } diff --git a/src/plugins/coreplugin/actionmanager/actioncontainer_p.h b/src/plugins/coreplugin/actionmanager/actioncontainer_p.h index 27fed6a705..ffa24eecdd 100644 --- a/src/plugins/coreplugin/actionmanager/actioncontainer_p.h +++ b/src/plugins/coreplugin/actionmanager/actioncontainer_p.h @@ -46,7 +46,7 @@ class ActionContainerPrivate : public ActionContainer public: ActionContainerPrivate(Id id); - ~ActionContainerPrivate() override {} + ~ActionContainerPrivate() override = default; void setOnAllDisabledBehavior(OnAllDisabledBehavior behavior) override; ActionContainer::OnAllDisabledBehavior onAllDisabledBehavior() const override; diff --git a/src/plugins/coreplugin/actionmanager/actionmanager.cpp b/src/plugins/coreplugin/actionmanager/actionmanager.cpp index 748a295afd..9b2bec82dc 100644 --- a/src/plugins/coreplugin/actionmanager/actionmanager.cpp +++ b/src/plugins/coreplugin/actionmanager/actionmanager.cpp @@ -152,7 +152,7 @@ using namespace Core::Internal; Emitted when a command (with the \a id) is added. */ -static ActionManager *m_instance = 0; +static ActionManager *m_instance = nullptr; static ActionManagerPrivate *d; /*! @@ -198,7 +198,7 @@ ActionContainer *ActionManager::createMenu(Id id) if (it != d->m_idContainerMap.constEnd()) return it.value(); - MenuActionContainer *mc = new MenuActionContainer(id); + auto mc = new MenuActionContainer(id); d->m_idContainerMap.insert(id, mc); connect(mc, &QObject::destroyed, d, &ActionManagerPrivate::containerDestroyed); @@ -219,10 +219,10 @@ ActionContainer *ActionManager::createMenuBar(Id id) if (it != d->m_idContainerMap.constEnd()) return it.value(); - QMenuBar *mb = new QMenuBar; // No parent (System menu bar on Mac OS X) + auto mb = new QMenuBar; // No parent (System menu bar on macOS) mb->setObjectName(id.toString()); - MenuBarActionContainer *mbc = new MenuBarActionContainer(id); + auto mbc = new MenuBarActionContainer(id); mbc->setMenuBar(mb); d->m_idContainerMap.insert(id, mbc); @@ -268,7 +268,7 @@ Command *ActionManager::command(Id id) if (warnAboutFindFailures) qWarning() << "ActionManagerPrivate::command(): failed to find :" << id.name(); - return 0; + return nullptr; } return it.value(); } @@ -287,7 +287,7 @@ ActionContainer *ActionManager::actionContainer(Id id) if (warnAboutFindFailures) qWarning() << "ActionManagerPrivate::actionContainer(): failed to find :" << id.name(); - return 0; + return nullptr; } return it.value(); } @@ -415,13 +415,13 @@ bool ActionManagerPrivate::hasContext(const Context &context) const void ActionManagerPrivate::containerDestroyed() { - ActionContainerPrivate *container = static_cast<ActionContainerPrivate *>(sender()); + auto container = static_cast<ActionContainerPrivate *>(sender()); m_idContainerMap.remove(m_idContainerMap.key(container)); } void ActionManagerPrivate::actionTriggered() { - QAction *action = qobject_cast<QAction *>(QObject::sender()); + auto action = qobject_cast<QAction *>(QObject::sender()); if (action) showShortcutPopup(action->shortcut().toString()); } diff --git a/src/plugins/coreplugin/actionmanager/actionmanager_p.h b/src/plugins/coreplugin/actionmanager/actionmanager_p.h index 0573bbe675..216f936273 100644 --- a/src/plugins/coreplugin/actionmanager/actionmanager_p.h +++ b/src/plugins/coreplugin/actionmanager/actionmanager_p.h @@ -46,8 +46,8 @@ class ActionManagerPrivate : public QObject Q_OBJECT public: - typedef QHash<Id, Action *> IdCmdMap; - typedef QHash<Id, ActionContainerPrivate *> IdContainerMap; + using IdCmdMap = QHash<Id, Action *>; + using IdContainerMap = QHash<Id, ActionContainerPrivate *>; ~ActionManagerPrivate() override; diff --git a/src/plugins/coreplugin/actionmanager/command.cpp b/src/plugins/coreplugin/actionmanager/command.cpp index 45d72ecead..4d9715f8b8 100644 --- a/src/plugins/coreplugin/actionmanager/command.cpp +++ b/src/plugins/coreplugin/actionmanager/command.cpp @@ -200,12 +200,9 @@ namespace Internal { \internal */ Action::Action(Id id) - : m_attributes(0), + : m_attributes({}), m_id(id), - m_isKeyInitialized(false), - m_action(new Utils::ProxyAction(this)), - m_active(false), - m_contextInitialized(false) + m_action(new Utils::ProxyAction(this)) { m_action->setShortcutVisibleInToolTip(true); connect(m_action, &QAction::changed, this, &Action::updateActiveState); @@ -276,9 +273,9 @@ void Action::setCurrentContext(const Context &context) { m_context = context; - QAction *currentAction = 0; + QAction *currentAction = nullptr; for (int i = 0; i < m_context.size(); ++i) { - if (QAction *a = m_contextActionMap.value(m_context.at(i), 0)) { + if (QAction *a = m_contextActionMap.value(m_context.at(i), nullptr)) { currentAction = a; break; } @@ -319,7 +316,7 @@ void Action::addOverrideAction(QAction *action, const Context &context, bool scr for (int i = 0; i < context.size(); ++i) { Id id = context.at(i); if (m_contextActionMap.contains(id)) - qWarning("%s", qPrintable(msgActionWarning(action, id, m_contextActionMap.value(id, 0)))); + qWarning("%s", qPrintable(msgActionWarning(action, id, m_contextActionMap.value(id, nullptr)))); m_contextActionMap.insert(id, action); } } @@ -332,7 +329,7 @@ void Action::removeOverrideAction(QAction *action) QMutableMapIterator<Id, QPointer<QAction> > it(m_contextActionMap); while (it.hasNext()) { it.next(); - if (it.value() == 0) + if (it.value() == nullptr) it.remove(); else if (it.value() == action) it.remove(); @@ -369,7 +366,7 @@ bool Action::isScriptable(const Context &context) const return m_scriptableMap.value(m_action->action()); for (int i = 0; i < context.size(); ++i) { - if (QAction *a = m_contextActionMap.value(context.at(i), 0)) { + if (QAction *a = m_contextActionMap.value(context.at(i), nullptr)) { if (m_scriptableMap.contains(a) && m_scriptableMap.value(a)) return true; } @@ -433,7 +430,7 @@ void Command::augmentActionWithShortcutToolTip(QAction *a) const QToolButton *Command::toolButtonWithAppendedShortcut(QAction *action, Command *cmd) { - QToolButton *button = new QToolButton; + auto button = new QToolButton; button->setDefaultAction(action); if (cmd) cmd->augmentActionWithShortcutToolTip(action); diff --git a/src/plugins/coreplugin/actionmanager/command_p.h b/src/plugins/coreplugin/actionmanager/command_p.h index 046f6041cf..6b8734ad14 100644 --- a/src/plugins/coreplugin/actionmanager/command_p.h +++ b/src/plugins/coreplugin/actionmanager/command_p.h @@ -86,15 +86,15 @@ private: Id m_id; QKeySequence m_defaultKey; QString m_defaultText; - bool m_isKeyInitialized; + bool m_isKeyInitialized = false; - Utils::ProxyAction *m_action; + Utils::ProxyAction *m_action = nullptr; QString m_toolTip; QMap<Id, QPointer<QAction> > m_contextActionMap; QMap<QAction*, bool> m_scriptableMap; - bool m_active; - bool m_contextInitialized; + bool m_active = false; + bool m_contextInitialized = false; }; } // namespace Internal diff --git a/src/plugins/coreplugin/actionmanager/commandbutton.cpp b/src/plugins/coreplugin/actionmanager/commandbutton.cpp index 29ac42ad73..3f4f5b7a13 100644 --- a/src/plugins/coreplugin/actionmanager/commandbutton.cpp +++ b/src/plugins/coreplugin/actionmanager/commandbutton.cpp @@ -44,13 +44,13 @@ using namespace Core; CommandButton::CommandButton(QWidget *parent) : QToolButton(parent) - , m_command(0) + , m_command(nullptr) { } CommandButton::CommandButton(Id id, QWidget *parent) : QToolButton(parent) - , m_command(0) + , m_command(nullptr) { setCommandId(id); } diff --git a/src/plugins/coreplugin/actionmanager/commandmappings.cpp b/src/plugins/coreplugin/actionmanager/commandmappings.cpp index f17c195024..7febf11b29 100644 --- a/src/plugins/coreplugin/actionmanager/commandmappings.cpp +++ b/src/plugins/coreplugin/actionmanager/commandmappings.cpp @@ -77,21 +77,21 @@ public: importButton = new QPushButton(CommandMappings::tr("Import..."), groupBox); exportButton = new QPushButton(CommandMappings::tr("Export..."), groupBox); - QHBoxLayout *hboxLayout1 = new QHBoxLayout(); + auto hboxLayout1 = new QHBoxLayout(); hboxLayout1->addWidget(defaultButton); hboxLayout1->addStretch(); hboxLayout1->addWidget(importButton); hboxLayout1->addWidget(exportButton); - QHBoxLayout *hboxLayout = new QHBoxLayout(); + auto hboxLayout = new QHBoxLayout(); hboxLayout->addWidget(filterEdit); - QVBoxLayout *vboxLayout1 = new QVBoxLayout(groupBox); + auto vboxLayout1 = new QVBoxLayout(groupBox); vboxLayout1->addLayout(hboxLayout); vboxLayout1->addWidget(commandList); vboxLayout1->addLayout(hboxLayout1); - QVBoxLayout *vboxLayout = new QVBoxLayout(parent); + auto vboxLayout = new QVBoxLayout(parent); vboxLayout->addWidget(groupBox); q->connect(exportButton, &QPushButton::clicked, diff --git a/src/plugins/coreplugin/basefilewizard.cpp b/src/plugins/coreplugin/basefilewizard.cpp index b252d0de2b..b388b7f7d8 100644 --- a/src/plugins/coreplugin/basefilewizard.cpp +++ b/src/plugins/coreplugin/basefilewizard.cpp @@ -89,7 +89,7 @@ void BaseFileWizard::accept() reject(); return; case BaseFileWizardFactory::OverwriteError: - QMessageBox::critical(0, tr("Existing files"), errorMessage); + QMessageBox::critical(nullptr, tr("Existing files"), errorMessage); reject(); return; case BaseFileWizardFactory::OverwriteOk: @@ -132,7 +132,7 @@ void BaseFileWizard::accept() // Post generation handler if (!m_factory->postGenerateFiles(this, m_files, &errorMessage)) if (!errorMessage.isEmpty()) - QMessageBox::critical(0, tr("File Generation Failure"), errorMessage); + QMessageBox::critical(nullptr, tr("File Generation Failure"), errorMessage); Wizard::accept(); } diff --git a/src/plugins/coreplugin/basefilewizardfactory.cpp b/src/plugins/coreplugin/basefilewizardfactory.cpp index 3e90da89d4..633980bf39 100644 --- a/src/plugins/coreplugin/basefilewizardfactory.cpp +++ b/src/plugins/coreplugin/basefilewizardfactory.cpp @@ -78,7 +78,7 @@ Utils::Wizard *BaseFileWizardFactory::runWizardImpl(const QString &path, QWidget Id platform, const QVariantMap &extraValues) { - QTC_ASSERT(!path.isEmpty(), return 0); + QTC_ASSERT(!path.isEmpty(), return nullptr); // Create dialog and run it. Ensure that the dialog is deleted when // leaving the func, but not before the IFileWizardExtension::process diff --git a/src/plugins/coreplugin/basefilewizardfactory.h b/src/plugins/coreplugin/basefilewizardfactory.h index 586e350cdc..d37592d5fd 100644 --- a/src/plugins/coreplugin/basefilewizardfactory.h +++ b/src/plugins/coreplugin/basefilewizardfactory.h @@ -47,7 +47,7 @@ class BaseFileWizard; class CORE_EXPORT WizardDialogParameters { public: - typedef QList<QWizardPage *> WizardPageList; + using WizardPageList = QList<QWizardPage *>; enum DialogParameterEnum { ForceCapitalLetterForFileName = 0x01 diff --git a/src/plugins/coreplugin/coreplugin.cpp b/src/plugins/coreplugin/coreplugin.cpp index 53a3cba228..67d2e33495 100644 --- a/src/plugins/coreplugin/coreplugin.cpp +++ b/src/plugins/coreplugin/coreplugin.cpp @@ -58,8 +58,10 @@ #include <utils/theme/theme_p.h> #include <QtPlugin> -#include <QDebug> + #include <QDateTime> +#include <QDebug> +#include <QDir> #include <QMenu> #include <QUuid> @@ -68,9 +70,6 @@ using namespace Core::Internal; using namespace Utils; CorePlugin::CorePlugin() - : m_mainWindow(0) - , m_editMode(0) - , m_locator(0) { qRegisterMetaType<Id>(); qRegisterMetaType<Core::Search::TextPosition>(); @@ -87,7 +86,7 @@ CorePlugin::~CorePlugin() DesignMode::destroyModeIfRequired(); delete m_mainWindow; - setCreatorTheme(0); + setCreatorTheme(nullptr); } struct CoreArguments { @@ -187,6 +186,12 @@ bool CorePlugin::initialize(const QStringList &arguments, QString *errorMessage) tr("Is %1 running on any unix-based platform?") .arg(Constants::IDE_DISPLAY_NAME), []() { return QVariant(Utils::HostOsInfo::isAnyUnixHost()).toString(); }); + expander->registerVariable("HostOs:PathListSeparator", + tr("Return the path list separator for the platform."), + []() { return QString(Utils::HostOsInfo::pathListSeparator()); }); + expander->registerVariable("HostOs:ExecutableSuffix", + tr("Return the platform executable suffix."), + []() { return QString(Utils::HostOsInfo::withExecutableSuffix("")); }); expander->registerVariable("IDE:ResourcePath", tr("The directory where %1 finds its pre-installed resources.") .arg(Constants::IDE_DISPLAY_NAME), @@ -239,7 +244,7 @@ QObject *CorePlugin::remoteCommand(const QStringList & /* options */, return nullptr; } IDocument *res = m_mainWindow->openFiles( - args, ICore::OpenFilesFlags(ICore::SwitchMode | ICore::CanContainLineAndColumnNumbers), + args, ICore::OpenFilesFlags(ICore::SwitchMode | ICore::CanContainLineAndColumnNumbers | ICore::SwitchSplitIfAlreadyVisible), workingDirectory); m_mainWindow->raiseWindow(); return res; @@ -255,17 +260,27 @@ void CorePlugin::addToPathChooserContextMenu(Utils::PathChooser *pathChooser, QM QList<QAction*> actions = menu->actions(); QAction *firstAction = actions.isEmpty() ? nullptr : actions.first(); - auto *showInGraphicalShell = new QAction(Core::FileUtils::msgGraphicalShellAction(), menu); - connect(showInGraphicalShell, &QAction::triggered, pathChooser, [pathChooser]() { - Core::FileUtils::showInGraphicalShell(pathChooser, pathChooser->path()); - }); - menu->insertAction(firstAction, showInGraphicalShell); - - auto *showInTerminal = new QAction(Core::FileUtils::msgTerminalAction(), menu); - connect(showInTerminal, &QAction::triggered, pathChooser, [pathChooser]() { - Core::FileUtils::openTerminal(pathChooser->path()); - }); - menu->insertAction(firstAction, showInTerminal); + if (QDir().exists(pathChooser->path())) { + auto *showInGraphicalShell = new QAction(Core::FileUtils::msgGraphicalShellAction(), menu); + connect(showInGraphicalShell, &QAction::triggered, pathChooser, [pathChooser]() { + Core::FileUtils::showInGraphicalShell(pathChooser, pathChooser->path()); + }); + menu->insertAction(firstAction, showInGraphicalShell); + + auto *showInTerminal = new QAction(Core::FileUtils::msgTerminalAction(), menu); + connect(showInTerminal, &QAction::triggered, pathChooser, [pathChooser]() { + Core::FileUtils::openTerminal(pathChooser->path()); + }); + menu->insertAction(firstAction, showInTerminal); + + } else { + auto *mkPathAct = new QAction(tr("Create Folder"), menu); + connect(mkPathAct, &QAction::triggered, pathChooser, [pathChooser]() { + QDir().mkpath(pathChooser->path()); + pathChooser->triggerChanged(); + }); + menu->insertAction(firstAction, mkPathAct); + } if (firstAction) menu->insertSeparator(firstAction); diff --git a/src/plugins/coreplugin/coreplugin.h b/src/plugins/coreplugin/coreplugin.h index 7e1ae1664c..b427bdd4d1 100644 --- a/src/plugins/coreplugin/coreplugin.h +++ b/src/plugins/coreplugin/coreplugin.h @@ -78,9 +78,9 @@ private slots: private: static void addToPathChooserContextMenu(Utils::PathChooser *pathChooser, QMenu *menu); - MainWindow *m_mainWindow; - EditMode *m_editMode; - Locator *m_locator; + MainWindow *m_mainWindow = nullptr; + EditMode *m_editMode = nullptr; + Locator *m_locator = nullptr; ReaperPrivate m_reaper; }; diff --git a/src/plugins/coreplugin/coreplugin.pro b/src/plugins/coreplugin/coreplugin.pro index 93c52d3dda..53b3943476 100644 --- a/src/plugins/coreplugin/coreplugin.pro +++ b/src/plugins/coreplugin/coreplugin.pro @@ -224,7 +224,8 @@ HEADERS += corejsextensions.h \ coreicons.h \ editormanager/documentmodel_p.h \ diffservice.h \ - menubarfilter.h + menubarfilter.h \ + editormanager/ieditorfactory_p.h FORMS += dialogs/newdialog.ui \ dialogs/saveitemsdialog.ui \ diff --git a/src/plugins/coreplugin/coreplugin.qbs b/src/plugins/coreplugin/coreplugin.qbs index bab2b06259..c19b5d6845 100644 --- a/src/plugins/coreplugin/coreplugin.qbs +++ b/src/plugins/coreplugin/coreplugin.qbs @@ -229,7 +229,7 @@ Project { "editorview.cpp", "editorview.h", "editorwindow.cpp", "editorwindow.h", "ieditor.cpp", "ieditor.h", - "ieditorfactory.cpp", "ieditorfactory.h", + "ieditorfactory.cpp", "ieditorfactory.h", "ieditorfactory_p.h", "iexternaleditor.cpp", "iexternaleditor.h", "openeditorsview.cpp", "openeditorsview.h", "openeditorswindow.cpp", "openeditorswindow.h", diff --git a/src/plugins/coreplugin/designmode.cpp b/src/plugins/coreplugin/designmode.cpp index 735121192a..64c4bb1455 100644 --- a/src/plugins/coreplugin/designmode.cpp +++ b/src/plugins/coreplugin/designmode.cpp @@ -80,7 +80,7 @@ static DesignModePrivate *d = nullptr; DesignMode::DesignMode() { ICore::addPreCloseListener([]() -> bool { - m_instance->currentEditorChanged(0); + m_instance->currentEditorChanged(nullptr); return true; }); @@ -130,7 +130,7 @@ void DesignMode::registerDesignWidget(QWidget *widget, setDesignModeIsRequired(); int index = d->m_stackWidget->addWidget(widget); - DesignEditorInfo *info = new DesignEditorInfo; + auto info = new DesignEditorInfo; info->mimeTypes = mimeTypes; info->context = context; info->widgetIndex = index; @@ -181,10 +181,10 @@ void DesignMode::currentEditorChanged(IEditor *editor) if (!mimeEditorAvailable) { setActiveContext(Context()); - if (ModeManager::currentMode() == id()) + if (ModeManager::currentModeId() == id()) ModeManager::activateMode(Constants::MODE_EDIT); setEnabled(false); - d->m_currentEditor = 0; + d->m_currentEditor = nullptr; emit actionsUpdated(d->m_currentEditor.data()); } else { d->m_currentEditor = editor; @@ -214,7 +214,7 @@ void DesignMode::setActiveContext(const Context &context) if (d->m_activeContext == context) return; - if (ModeManager::currentMode() == id()) + if (ModeManager::currentModeId() == id()) ICore::updateAdditionalContexts(d->m_activeContext, context); d->m_activeContext = context; diff --git a/src/plugins/coreplugin/dialogs/externaltoolconfig.cpp b/src/plugins/coreplugin/dialogs/externaltoolconfig.cpp index 2cce88ec24..3e5255ea59 100644 --- a/src/plugins/coreplugin/dialogs/externaltoolconfig.cpp +++ b/src/plugins/coreplugin/dialogs/externaltoolconfig.cpp @@ -121,14 +121,14 @@ QVariant ExternalToolModel::data(const QString &category, int role) const QMimeData *ExternalToolModel::mimeData(const QModelIndexList &indexes) const { if (indexes.isEmpty()) - return 0; + return nullptr; QModelIndex modelIndex = indexes.first(); ExternalTool *tool = toolForIndex(modelIndex); - QTC_ASSERT(tool, return 0); + QTC_ASSERT(tool, return nullptr); bool found; QString category = categoryForIndex(modelIndex.parent(), &found); - QTC_ASSERT(found, return 0); - QMimeData *md = new QMimeData(); + QTC_ASSERT(found, return nullptr); + auto md = new QMimeData(); QByteArray ba; QDataStream stream(&ba, QIODevice::WriteOnly); stream << category << m_tools.value(category).indexOf(tool); @@ -230,7 +230,7 @@ Qt::ItemFlags ExternalToolModel::flags(const QModelIndex &index) const return TOOLSMENU_ITEM_FLAGS; return CATEGORY_ITEM_FLAGS; } - return 0; + return nullptr; } bool ExternalToolModel::setData(const QModelIndex &modelIndex, const QVariant &value, int role) @@ -342,7 +342,7 @@ QModelIndex ExternalToolModel::addTool(const QModelIndex &atIndex) if (!found) category = categoryForIndex(atIndex.parent(), &found); - ExternalTool *tool = new ExternalTool; + auto tool = new ExternalTool; tool->setDisplayCategory(category); tool->setDisplayName(tr("New Tool")); tool->setDescription(tr("This tool prints a line of useful text")); @@ -440,7 +440,7 @@ ExternalToolConfig::ExternalToolConfig(QWidget *parent) : connect(ui->revertButton, &QAbstractButton::clicked, this, &ExternalToolConfig::revertCurrentItem); connect(ui->removeButton, &QAbstractButton::clicked, this, &ExternalToolConfig::removeTool); - QMenu *menu = new QMenu(ui->addButton); + auto menu = new QMenu(ui->addButton); ui->addButton->setMenu(menu); QAction *addTool = new QAction(tr("Add Tool"), this); menu->addAction(addTool); diff --git a/src/plugins/coreplugin/dialogs/externaltoolconfig.h b/src/plugins/coreplugin/dialogs/externaltoolconfig.h index 1a2b72b1ac..acc2a68edc 100644 --- a/src/plugins/coreplugin/dialogs/externaltoolconfig.h +++ b/src/plugins/coreplugin/dialogs/externaltoolconfig.h @@ -46,7 +46,7 @@ class ExternalToolModel : public QAbstractItemModel public: explicit ExternalToolModel(QObject *parent); - ~ExternalToolModel(); + ~ExternalToolModel() override; int columnCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &modelIndex, int role = Qt::DisplayRole) const override; @@ -86,8 +86,8 @@ class ExternalToolConfig : public QWidget Q_OBJECT public: - explicit ExternalToolConfig(QWidget *parent = 0); - ~ExternalToolConfig(); + explicit ExternalToolConfig(QWidget *parent = nullptr); + ~ExternalToolConfig() override; void setTools(const QMap<QString, QList<ExternalTool *> > &tools); QMap<QString, QList<ExternalTool *> > tools() const; diff --git a/src/plugins/coreplugin/dialogs/filepropertiesdialog.cpp b/src/plugins/coreplugin/dialogs/filepropertiesdialog.cpp index 059da5e9c6..33d2123238 100644 --- a/src/plugins/coreplugin/dialogs/filepropertiesdialog.cpp +++ b/src/plugins/coreplugin/dialogs/filepropertiesdialog.cpp @@ -71,10 +71,9 @@ void FilePropertiesDialog::refresh() m_ui->name->setText(fileInfo.fileName()); m_ui->path->setText(QDir::toNativeSeparators(fileInfo.canonicalPath())); - const Utils::MimeType mt = Utils::mimeTypeForFile(fileInfo); - m_ui->mimeType->setText(mt.isValid() ? mt.name() : tr("Undefined")); + m_ui->mimeType->setText(Utils::mimeTypeForFile(fileInfo).name()); - const Core::EditorManager::EditorFactoryList factories = Core::EditorManager::editorFactories(m_fileName); + const Core::EditorFactoryList factories = Core::IEditorFactory::preferredEditorFactories(m_fileName); m_ui->defaultEditor->setText(!factories.isEmpty() ? factories.at(0)->displayName() : tr("Undefined")); m_ui->owner->setText(fileInfo.owner()); diff --git a/src/plugins/coreplugin/dialogs/ioptionspage.cpp b/src/plugins/coreplugin/dialogs/ioptionspage.cpp index 86281fb01a..a8dbfbffde 100644 --- a/src/plugins/coreplugin/dialogs/ioptionspage.cpp +++ b/src/plugins/coreplugin/dialogs/ioptionspage.cpp @@ -169,7 +169,7 @@ const QList<Core::IOptionsPage *> Core::IOptionsPage::allOptionsPages() bool Core::IOptionsPage::matches(const QString &searchKeyWord) const { if (!m_keywordsInitialized) { - IOptionsPage *that = const_cast<IOptionsPage *>(this); + auto that = const_cast<IOptionsPage *>(this); QWidget *widget = that->widget(); if (!widget) return false; diff --git a/src/plugins/coreplugin/dialogs/newdialog.cpp b/src/plugins/coreplugin/dialogs/newdialog.cpp index 7ae0953ad1..7e1cca297e 100644 --- a/src/plugins/coreplugin/dialogs/newdialog.cpp +++ b/src/plugins/coreplugin/dialogs/newdialog.cpp @@ -61,10 +61,10 @@ using namespace Core::Internal; class WizardFactoryContainer { public: - WizardFactoryContainer() : wizard(nullptr), wizardOption(0) {} + WizardFactoryContainer() = default; WizardFactoryContainer(Core::IWizardFactory *w, int i): wizard(w), wizardOption(i) {} - Core::IWizardFactory *wizard; - int wizardOption; + Core::IWizardFactory *wizard = nullptr; + int wizardOption = 0; }; inline Core::IWizardFactory *factoryOfItem(const QStandardItem *item = nullptr) @@ -175,8 +175,7 @@ QWidget *NewDialog::m_currentDialog = nullptr; NewDialog::NewDialog(QWidget *parent) : QDialog(parent), - m_ui(new Ui::NewDialog), - m_okButton(nullptr) + m_ui(new Ui::NewDialog) { QTC_CHECK(m_currentDialog == nullptr); @@ -257,10 +256,10 @@ void NewDialog::setWizardFactories(QList<IWizardFactory *> factories, QStandardItem *projectKindItem = new QStandardItem(tr("Projects")); projectKindItem->setData(IWizardFactory::ProjectWizard, Qt::UserRole); - projectKindItem->setFlags(0); // disable item to prevent focus + projectKindItem->setFlags(nullptr); // disable item to prevent focus QStandardItem *filesKindItem = new QStandardItem(tr("Files and Classes")); filesKindItem->setData(IWizardFactory::FileWizard, Qt::UserRole); - filesKindItem->setFlags(0); // disable item to prevent focus + filesKindItem->setFlags(nullptr); // disable item to prevent focus parentItem->appendRow(projectKindItem); parentItem->appendRow(filesKindItem); @@ -355,7 +354,7 @@ QWidget *NewDialog::currentDialog() bool NewDialog::event(QEvent *event) { if (event->type() == QEvent::ShortcutOverride) { - QKeyEvent *ke = static_cast<QKeyEvent *>(event); + auto ke = static_cast<QKeyEvent *>(event); if (ke->key() == Qt::Key_Escape && !ke->modifiers()) { ke->accept(); return true; @@ -518,7 +517,7 @@ void NewDialog::reject() void NewDialog::updateOkButton() { - m_okButton->setEnabled(currentWizardFactory() != 0); + m_okButton->setEnabled(currentWizardFactory() != nullptr); } void NewDialog::setSelectedPlatform(const QString & /*platform*/) diff --git a/src/plugins/coreplugin/dialogs/newdialog.h b/src/plugins/coreplugin/dialogs/newdialog.h index df0c9c777b..46047cbd4d 100644 --- a/src/plugins/coreplugin/dialogs/newdialog.h +++ b/src/plugins/coreplugin/dialogs/newdialog.h @@ -82,7 +82,7 @@ private: Ui::NewDialog *m_ui; QStandardItemModel *m_model; QSortFilterProxyModel *m_filterProxyModel; - QPushButton *m_okButton; + QPushButton *m_okButton = nullptr; QIcon m_dummyIcon; QList<QStandardItem*> m_categoryItems; QString m_defaultLocation; diff --git a/src/plugins/coreplugin/dialogs/promptoverwritedialog.cpp b/src/plugins/coreplugin/dialogs/promptoverwritedialog.cpp index 95b6a948d2..a9434616c9 100644 --- a/src/plugins/coreplugin/dialogs/promptoverwritedialog.cpp +++ b/src/plugins/coreplugin/dialogs/promptoverwritedialog.cpp @@ -63,7 +63,7 @@ PromptOverwriteDialog::PromptOverwriteDialog(QWidget *parent) : setWindowTitle(tr("Overwrite Existing Files")); setModal(true); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); - QVBoxLayout *mainLayout = new QVBoxLayout(this); + auto mainLayout = new QVBoxLayout(this); mainLayout->addWidget(m_label); m_view->setRootIsDecorated(false); m_view->setUniformRowHeights(true); @@ -105,7 +105,7 @@ QStandardItem *PromptOverwriteDialog::itemForFile(const QString &f) const if (fileNameOfItem(item) == f) return item; } - return 0; + return nullptr; } QStringList PromptOverwriteDialog::files(Qt::CheckState cs) const diff --git a/src/plugins/coreplugin/dialogs/readonlyfilesdialog.cpp b/src/plugins/coreplugin/dialogs/readonlyfilesdialog.cpp index 15039e5d7a..af41349cff 100644 --- a/src/plugins/coreplugin/dialogs/readonlyfilesdialog.cpp +++ b/src/plugins/coreplugin/dialogs/readonlyfilesdialog.cpp @@ -53,7 +53,7 @@ class ReadOnlyFilesDialogPrivate Q_DECLARE_TR_FUNCTIONS(Core::ReadOnlyFilesDialog) public: - ReadOnlyFilesDialogPrivate(ReadOnlyFilesDialog *parent, IDocument *document = 0, bool useSaveAs = false); + ReadOnlyFilesDialogPrivate(ReadOnlyFilesDialog *parent, IDocument *document = nullptr, bool useSaveAs = false); ~ReadOnlyFilesDialogPrivate(); enum ReadOnlyFilesTreeColumn { @@ -324,7 +324,7 @@ QRadioButton *ReadOnlyFilesDialogPrivate::createRadioButtonForItem(QTreeWidgetIt ReadOnlyFilesTreeColumn type) { - QRadioButton *radioButton = new QRadioButton(q); + auto radioButton = new QRadioButton(q); group->addButton(radioButton, type); item->setTextAlignment(type, Qt::AlignHCenter); ui.treeWidget->setItemWidget(item, type, radioButton); @@ -353,7 +353,7 @@ void ReadOnlyFilesDialogPrivate::setAll(int index) // Check for every file if the selected operation is available and change it to the operation. foreach (ReadOnlyFilesDialogPrivate::ButtonGroupForFile groupForFile, buttonGroups) { - QRadioButton *radioButton = qobject_cast<QRadioButton*> (groupForFile.group->button(type)); + auto radioButton = qobject_cast<QRadioButton*> (groupForFile.group->button(type)); if (radioButton) radioButton->setChecked(true); } @@ -400,11 +400,11 @@ void ReadOnlyFilesDialogPrivate::initDialog(const QStringList &fileNames) const QString directory = info.absolutePath(); // Setup a default entry with filename folder and make writable radio button. - QTreeWidgetItem *item = new QTreeWidgetItem(ui.treeWidget); + auto item = new QTreeWidgetItem(ui.treeWidget); item->setText(FileName, visibleName); item->setIcon(FileName, FileIconProvider::icon(fileName)); item->setText(Folder, Utils::FileUtils::shortNativePath(Utils::FileName(QFileInfo(directory)))); - QButtonGroup *radioButtonGroup = new QButtonGroup; + auto radioButtonGroup = new QButtonGroup; // Add a button for opening the file with a version control system // if the file is managed by an version control system which allows opening files. @@ -442,7 +442,7 @@ void ReadOnlyFilesDialogPrivate::initDialog(const QStringList &fileNames) if (useSaveAs) createRadioButtonForItem(item, radioButtonGroup, SaveAs); // If the file is managed by a version control system save the vcs for this file. - versionControls[fileName] = fileManagedByVCS ? versionControlForFile : 0; + versionControls[fileName] = fileManagedByVCS ? versionControlForFile : nullptr; // Also save the buttongroup for every file to get the result for each entry. ReadOnlyFilesDialogPrivate::ButtonGroupForFile groupForFile; diff --git a/src/plugins/coreplugin/dialogs/saveitemsdialog.cpp b/src/plugins/coreplugin/dialogs/saveitemsdialog.cpp index edee9a6bca..f3e476fed3 100644 --- a/src/plugins/coreplugin/dialogs/saveitemsdialog.cpp +++ b/src/plugins/coreplugin/dialogs/saveitemsdialog.cpp @@ -166,7 +166,7 @@ void SaveItemsDialog::collectFilesToDiff() { m_filesToDiff.clear(); foreach (QTreeWidgetItem *item, m_ui.treeWidget->selectedItems()) { - if (IDocument *doc = item->data(0, Qt::UserRole).value<IDocument*>()) + if (auto doc = item->data(0, Qt::UserRole).value<IDocument*>()) m_filesToDiff.append(doc->filePath().toString()); } reject(); diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.cpp b/src/plugins/coreplugin/dialogs/settingsdialog.cpp index 1cc52d6331..ddb91fe469 100644 --- a/src/plugins/coreplugin/dialogs/settingsdialog.cpp +++ b/src/plugins/coreplugin/dialogs/settingsdialog.cpp @@ -101,7 +101,7 @@ class CategoryModel : public QAbstractListModel { public: CategoryModel(); - ~CategoryModel(); + ~CategoryModel() override; int rowCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; @@ -172,7 +172,7 @@ void CategoryModel::setPages(const QList<IOptionsPage*> &pages, if (!category) { category = new Category; category->id = categoryId; - category->tabWidget = 0; + category->tabWidget = nullptr; category->index = -1; m_categories.append(category); } @@ -189,7 +189,7 @@ void CategoryModel::setPages(const QList<IOptionsPage*> &pages, if (!category) { category = new Category; category->id = categoryId; - category->tabWidget = 0; + category->tabWidget = nullptr; category->index = -1; m_categories.append(category); } @@ -233,7 +233,7 @@ Category *CategoryModel::findCategoryById(Id id) return category; } - return 0; + return nullptr; } // ----------- Category filter model @@ -245,7 +245,7 @@ Category *CategoryModel::findCategoryById(Id id) class CategoryFilterModel : public QSortFilterProxyModel { public: - CategoryFilterModel() {} + CategoryFilterModel() = default; protected: bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override; @@ -284,7 +284,7 @@ class CategoryListViewDelegate : public QStyledItemDelegate public: explicit CategoryListViewDelegate(QObject *parent) : QStyledItemDelegate(parent) {} - QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const + QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override { QSize size = QStyledItemDelegate::sizeHint(option, index); size.setHeight(qMax(size.height(), 32)); @@ -540,7 +540,7 @@ void SettingsDialog::createGui() headerLabelFont.setPointSize(pointSize + 2); m_headerLabel->setFont(headerLabelFont); - QHBoxLayout *headerHLayout = new QHBoxLayout; + auto headerHLayout = new QHBoxLayout; const int leftMargin = QApplication::style()->pixelMetric(QStyle::PM_LayoutLeftMargin); headerHLayout->addSpacerItem(new QSpacerItem(leftMargin, 0, QSizePolicy::Fixed, QSizePolicy::Ignored)); headerHLayout->addWidget(m_headerLabel); @@ -559,7 +559,7 @@ void SettingsDialog::createGui() connect(buttonBox, &QDialogButtonBox::accepted, this, &SettingsDialog::accept); connect(buttonBox, &QDialogButtonBox::rejected, this, &SettingsDialog::reject); - QGridLayout *mainGridLayout = new QGridLayout; + auto mainGridLayout = new QGridLayout; mainGridLayout->addWidget(m_filterLineEdit, 0, 0, 1, 1); mainGridLayout->addLayout(headerHLayout, 0, 1, 1, 1); mainGridLayout->addWidget(m_categoryList, 1, 0, 1, 1); @@ -598,12 +598,12 @@ void SettingsDialog::ensureCategoryWidget(Category *category) return; m_model.ensurePages(category); - QTabWidget *tabWidget = new QTabWidget; + auto tabWidget = new QTabWidget; tabWidget->tabBar()->setObjectName("qc_settings_main_tabbar"); // easier lookup in Squish for (IOptionsPage *page : category->pages) { QWidget *widget = page->widget(); ICore::setupScreenShooter(page->displayName(), widget); - SmartScrollArea *ssa = new SmartScrollArea(this); + auto ssa = new SmartScrollArea(this); ssa->setWidget(widget); widget->setAutoFillBackground(false); tabWidget->addTab(ssa, page->displayName()); diff --git a/src/plugins/coreplugin/dialogs/shortcutsettings.cpp b/src/plugins/coreplugin/dialogs/shortcutsettings.cpp index 625833bad1..decb0a1f76 100644 --- a/src/plugins/coreplugin/dialogs/shortcutsettings.cpp +++ b/src/plugins/coreplugin/dialogs/shortcutsettings.cpp @@ -125,7 +125,7 @@ QSize ShortcutButton::sizeHint() const { if (m_preferredWidth < 0) { // initialize size hint const QString originalText = text(); - ShortcutButton *that = const_cast<ShortcutButton *>(this); + auto that = const_cast<ShortcutButton *>(this); that->setText(m_checkedText); m_preferredWidth = QPushButton::sizeHint().width(); that->setText(m_uncheckedText); @@ -153,7 +153,7 @@ bool ShortcutButton::eventFilter(QObject *obj, QEvent *evt) return true; } if (evt->type() == QEvent::KeyPress) { - QKeyEvent *k = static_cast<QKeyEvent*>(evt); + auto k = static_cast<QKeyEvent*>(evt); int nextKey = k->key(); if (m_keyNum > 3 || nextKey == Qt::Key_Control @@ -486,8 +486,8 @@ void ShortcutSettingsWidget::initialize() if (c->action() && c->action()->isSeparator()) continue; - QTreeWidgetItem *item = 0; - ShortcutItem *s = new ShortcutItem; + QTreeWidgetItem *item = nullptr; + auto s = new ShortcutItem; m_scitems << s; item = new QTreeWidgetItem; s->m_cmd = c; diff --git a/src/plugins/coreplugin/documentmanager.cpp b/src/plugins/coreplugin/documentmanager.cpp index a647930e35..1fcbe6c770 100644 --- a/src/plugins/coreplugin/documentmanager.cpp +++ b/src/plugins/coreplugin/documentmanager.cpp @@ -436,7 +436,7 @@ void DocumentManager::renamedFile(const QString &from, const QString &to) void DocumentManager::filePathChanged(const FileName &oldName, const FileName &newName) { - IDocument *doc = qobject_cast<IDocument *>(sender()); + auto doc = qobject_cast<IDocument *>(sender()); QTC_ASSERT(doc, return); if (doc == d->m_blockedIDocument) return; @@ -456,7 +456,7 @@ void DocumentManager::addDocument(IDocument *document, bool addWatcher) void DocumentManager::documentDestroyed(QObject *obj) { - IDocument *document = static_cast<IDocument*>(obj); + auto document = static_cast<IDocument*>(obj); // Check the special unwatched first: if (!d->m_documentsWithoutWatch.removeOne(document)) removeFileInfo(document); @@ -487,7 +487,7 @@ bool DocumentManager::removeDocument(IDocument *document) because the file was saved under different name. */ void DocumentManager::checkForNewFileName() { - IDocument *document = qobject_cast<IDocument *>(sender()); + auto document = qobject_cast<IDocument *>(sender()); // We modified the IDocument // Trust the other code to also update the m_states map if (document == d->m_blockedIDocument) @@ -720,7 +720,7 @@ bool DocumentManager::saveDocument(IDocument *document, const QString &fileName, return ret; } -QString DocumentManager::allDocumentFactoryFiltersString(QString *allFilesFilter = 0) +QString DocumentManager::allDocumentFactoryFiltersString(QString *allFilesFilter = nullptr) { QSet<QString> uniqueFilters; diff --git a/src/plugins/coreplugin/documentmanager.h b/src/plugins/coreplugin/documentmanager.h index b74734ac3c..038cad8b18 100644 --- a/src/plugins/coreplugin/documentmanager.h +++ b/src/plugins/coreplugin/documentmanager.h @@ -54,7 +54,7 @@ public: KeepLinks }; - typedef QPair<QString, Id> RecentFile; + using RecentFile = QPair<QString, Id>; static DocumentManager *instance(); diff --git a/src/plugins/coreplugin/editmode.cpp b/src/plugins/coreplugin/editmode.cpp index eb4522d65a..c3d47d291c 100644 --- a/src/plugins/coreplugin/editmode.cpp +++ b/src/plugins/coreplugin/editmode.cpp @@ -61,13 +61,13 @@ EditMode::EditMode() : auto editorPlaceHolder = new EditorManagerPlaceHolder; m_rightSplitWidgetLayout->insertWidget(0, editorPlaceHolder); - MiniSplitter *rightPaneSplitter = new MiniSplitter; + auto rightPaneSplitter = new MiniSplitter; rightPaneSplitter->insertWidget(0, rightSplitWidget); rightPaneSplitter->insertWidget(1, new RightPanePlaceHolder(Constants::MODE_EDIT)); rightPaneSplitter->setStretchFactor(0, 1); rightPaneSplitter->setStretchFactor(1, 0); - MiniSplitter *splitter = new MiniSplitter; + auto splitter = new MiniSplitter; splitter->setOrientation(Qt::Vertical); splitter->insertWidget(0, rightPaneSplitter); QWidget *outputPane = new OutputPanePlaceHolder(Constants::MODE_EDIT, splitter); @@ -87,7 +87,7 @@ EditMode::EditMode() : this, &EditMode::grabEditorManager); m_splitter->setFocusProxy(editorPlaceHolder); - IContext *modeContextObject = new IContext(this); + auto modeContextObject = new IContext(this); modeContextObject->setContext(Context(Constants::C_EDITORMANAGER)); modeContextObject->setWidget(m_splitter); ICore::addContextObject(modeContextObject); diff --git a/src/plugins/coreplugin/editmode.h b/src/plugins/coreplugin/editmode.h index d11ab206e4..4bce114511 100644 --- a/src/plugins/coreplugin/editmode.h +++ b/src/plugins/coreplugin/editmode.h @@ -44,7 +44,7 @@ class EditMode : public IMode public: EditMode(); - ~EditMode(); + ~EditMode() override; private: void grabEditorManager(Id mode); diff --git a/src/plugins/coreplugin/editormanager/documentmodel.cpp b/src/plugins/coreplugin/editormanager/documentmodel.cpp index 7ca7ff5f0b..dcf6a0eb0a 100644 --- a/src/plugins/coreplugin/editormanager/documentmodel.cpp +++ b/src/plugins/coreplugin/editormanager/documentmodel.cpp @@ -295,7 +295,7 @@ QVariant DocumentModelPrivate::data(const QModelIndex &index, int role) const void DocumentModelPrivate::itemChanged() { - IDocument *document = qobject_cast<IDocument *>(sender()); + auto document = qobject_cast<IDocument *>(sender()); const Utils::optional<int> idx = indexOfDocument(document); if (!idx) @@ -439,7 +439,7 @@ void DocumentModelPrivate::DynamicEntry::setNumberedName(int number) } // Internal DocumentModel::Entry::Entry() : - document(0), + document(nullptr), isSuspended(false) { } @@ -450,9 +450,7 @@ DocumentModel::Entry::~Entry() delete document; } -DocumentModel::DocumentModel() -{ -} +DocumentModel::DocumentModel() = default; void DocumentModel::init() { @@ -561,7 +559,7 @@ DocumentModel::Entry *DocumentModel::entryAtRow(int row) { int entryIndex = row - 1/*<no document>*/; if (entryIndex < 0) - return 0; + return nullptr; return d->m_entries[entryIndex]; } diff --git a/src/plugins/coreplugin/editormanager/documentmodel_p.h b/src/plugins/coreplugin/editormanager/documentmodel_p.h index ae6ff016fa..10f8ebfb4d 100644 --- a/src/plugins/coreplugin/editormanager/documentmodel_p.h +++ b/src/plugins/coreplugin/editormanager/documentmodel_p.h @@ -42,7 +42,7 @@ class DocumentModelPrivate : public QAbstractItemModel Q_OBJECT public: - ~DocumentModelPrivate(); + ~DocumentModelPrivate() override; int columnCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 4671f17422..f33143bc40 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -44,6 +44,7 @@ #include <coreplugin/diffservice.h> #include <coreplugin/documentmanager.h> #include <coreplugin/editormanager/ieditorfactory.h> +#include <coreplugin/editormanager/ieditorfactory_p.h> #include <coreplugin/editormanager/iexternaleditor.h> #include <coreplugin/editortoolbar.h> #include <coreplugin/fileutils.h> @@ -121,6 +122,7 @@ static const char autoSuspendMinDocumentCountKey[] = "EditorManager/AutoSuspendM static const char warnBeforeOpeningBigTextFilesKey[] = "EditorManager/WarnBeforeOpeningBigTextFiles"; static const char bigTextFileSizeLimitKey[] = "EditorManager/BigTextFileSizeLimitInMB"; static const char fileSystemCaseSensitivityKey[] = "Core/FileSystemCaseSensitivity"; +static const char preferredEditorFactoriesKey[] = "EditorManager/PreferredEditorFactories"; static const char scratchBufferKey[] = "_q_emScratchBuffer"; @@ -576,6 +578,17 @@ IEditor *EditorManagerPrivate::openEditor(EditorView *view, const QString &fileN const QList<IEditor *> editors = DocumentModel::editorsForFilePath(fn); if (!editors.isEmpty()) { IEditor *editor = editors.first(); + if (flags & EditorManager::SwitchSplitIfAlreadyVisible) { + for (IEditor *ed : editors) { + EditorView *v = viewForEditor(ed); + // Don't switch to a view where editor is not its current editor + if (v && v->currentEditor() == ed) { + editor = ed; + view = v; + break; + } + } + } editor = activateEditor(view, editor, flags); if (editor && flags & EditorManager::CanContainLineAndColumnNumber) editor->gotoLine(lineNumber, columnNumber); @@ -589,7 +602,7 @@ IEditor *EditorManagerPrivate::openEditor(EditorView *view, const QString &fileN realFn = fn; } - EditorManager::EditorFactoryList factories = EditorManagerPrivate::findFactories(Id(), fn); + EditorFactoryList factories = EditorManagerPrivate::findFactories(Id(), fn); if (factories.isEmpty()) { Utils::MimeType mimeType = Utils::mimeTypeForFile(fn); QMessageBox msgbox(QMessageBox::Critical, EditorManager::tr("File Error"), @@ -652,9 +665,9 @@ IEditor *EditorManagerPrivate::openEditor(EditorView *view, const QString &fileN IEditorFactory *selectedFactory = nullptr; if (!factories.isEmpty()) { - QPushButton *button = qobject_cast<QPushButton *>(msgbox.button(QMessageBox::Open)); + auto button = qobject_cast<QPushButton *>(msgbox.button(QMessageBox::Open)); QTC_ASSERT(button, return nullptr); - QMenu *menu = new QMenu(button); + auto menu = new QMenu(button); foreach (IEditorFactory *factory, factories) { QAction *action = menu->addAction(factory->displayName()); connect(action, &QAction::triggered, &msgbox, [&selectedFactory, factory, &msgbox]() { @@ -772,7 +785,7 @@ EditorView *EditorManagerPrivate::viewForEditor(IEditor *editor) QWidget *w = editor->widget(); while (w) { w = w->parentWidget(); - if (EditorView *view = qobject_cast<EditorView *>(w)) + if (auto view = qobject_cast<EditorView *>(w)) return view; } return nullptr; @@ -925,15 +938,11 @@ void EditorManagerPrivate::showPopupOrSelectDocument() Id EditorManagerPrivate::getOpenWithEditorId(const QString &fileName, bool *isExternalEditor) { // Collect editors that can open the file - Utils::MimeType mt = Utils::mimeTypeForFile(fileName); - //Unable to determine mime type of fileName. Falling back to text/plain", - if (!mt.isValid()) - mt = Utils::mimeTypeForName("text/plain"); QList<Id> allEditorIds; QStringList allEditorDisplayNames; QList<Id> externalEditorIds; // Built-in - const EditorManager::EditorFactoryList editors = EditorManager::editorFactories(mt, false); + const EditorFactoryList editors = IEditorFactory::preferredEditorFactories(fileName); const int size = editors.size(); allEditorDisplayNames.reserve(size); for (int i = 0; i < size; i++) { @@ -941,7 +950,8 @@ Id EditorManagerPrivate::getOpenWithEditorId(const QString &fileName, bool *isEx allEditorDisplayNames.push_back(editors.at(i)->displayName()); } // External editors - const EditorManager::ExternalEditorList exEditors = EditorManager::externalEditors(mt, false); + const Utils::MimeType mt = Utils::mimeTypeForFile(fileName); + const ExternalEditorList exEditors = IExternalEditor::externalEditors(mt); const int esize = exEditors.size(); for (int i = 0; i < esize; i++) { externalEditorIds.push_back(exEditors.at(i)->id()); @@ -963,6 +973,39 @@ Id EditorManagerPrivate::getOpenWithEditorId(const QString &fileName, bool *isEx return selectedId; } +static QMap<QString, QVariant> toMap(const QHash<Utils::MimeType, IEditorFactory *> &hash) +{ + QMap<QString, QVariant> map; + auto it = hash.begin(); + const auto end = hash.end(); + while (it != end) { + map.insert(it.key().name(), it.value()->id().toSetting()); + ++it; + } + return map; +} + +static QHash<Utils::MimeType, IEditorFactory *> fromMap(const QMap<QString, QVariant> &map) +{ + const EditorFactoryList factories = IEditorFactory::allEditorFactories(); + QHash<Utils::MimeType, IEditorFactory *> hash; + auto it = map.begin(); + const auto end = map.end(); + while (it != end) { + const Utils::MimeType mimeType = Utils::mimeTypeForName(it.key()); + if (mimeType.isValid()) { + const Id factoryId = Id::fromSetting(it.value()); + IEditorFactory *factory = Utils::findOrDefault(factories, + Utils::equal(&IEditorFactory::id, + factoryId)); + if (factory) + hash.insert(mimeType, factory); + } + ++it; + } + return hash; +} + void EditorManagerPrivate::saveSettings() { ICore::settingsDatabase()->setValue(documentStatesKey, d->m_editorStates); @@ -984,6 +1027,7 @@ void EditorManagerPrivate::saveSettings() qsettings->remove(fileSystemCaseSensitivityKey); else qsettings->setValue(fileSystemCaseSensitivityKey, sensitivity); + qsettings->setValue(preferredEditorFactoriesKey, toMap(userPreferredEditorFactories())); } void EditorManagerPrivate::readSettings() @@ -1015,6 +1059,9 @@ void EditorManagerPrivate::readSettings() else HostOsInfo::setOverrideFileNameCaseSensitivity(sensitivity); } + const QHash<Utils::MimeType, IEditorFactory *> preferredEditorFactories = fromMap( + qs->value(preferredEditorFactoriesKey).toMap()); + setUserPreferredEditorFactories(preferredEditorFactories); SettingsDatabase *settings = ICore::settingsDatabase(); if (settings->contains(documentStatesKey)) { @@ -1112,14 +1159,14 @@ void EditorManagerPrivate::setBigFileSizeLimit(int limitInMB) d->m_bigFileSizeLimitInMB = limitInMB; } -EditorManager::EditorFactoryList EditorManagerPrivate::findFactories(Id editorId, const QString &fileName) +EditorFactoryList EditorManagerPrivate::findFactories(Id editorId, const QString &fileName) { if (debugEditorManager) qDebug() << Q_FUNC_INFO << editorId.name() << fileName; - EditorManager::EditorFactoryList factories; + EditorFactoryList factories; if (!editorId.isValid()) { - factories = EditorManager::editorFactories(fileName, false); + factories = IEditorFactory::preferredEditorFactories(fileName); } else { // Find by editor id IEditorFactory *factory = Utils::findOrDefault(IEditorFactory::allEditorFactories(), @@ -1519,7 +1566,7 @@ EditorArea *EditorManagerPrivate::findEditorArea(const EditorView *view, int *ar { SplitterOrView *current = view->parentSplitterOrView(); while (current) { - if (EditorArea *area = qobject_cast<EditorArea *>(current)) { + if (auto area = qobject_cast<EditorArea *>(current)) { int index = d->m_editorAreas.indexOf(area); QTC_ASSERT(index >= 0, return nullptr); if (areaIndex) @@ -1933,7 +1980,7 @@ void EditorManagerPrivate::vcsOpenCurrentEditor() void EditorManagerPrivate::handleDocumentStateChange() { updateActions(); - IDocument *document = qobject_cast<IDocument *>(sender()); + auto document = qobject_cast<IDocument *>(sender()); if (!document->isModified()) document->removeAutoSaveFile(); if (EditorManager::currentDocument() == document) @@ -2035,7 +2082,7 @@ void EditorManagerPrivate::copyFilePathFromContextMenu() void EditorManagerPrivate::copyLocationFromContextMenu() { - const QAction *action = qobject_cast<const QAction *>(sender()); + const auto action = qobject_cast<const QAction *>(sender()); if (!d->m_contextMenuEntry || !action) return; const QString text = d->m_contextMenuEntry->fileName().toUserOutput() @@ -2454,42 +2501,38 @@ void EditorManager::addNativeDirAndOpenWithActions(QMenu *contextMenu, DocumentM void EditorManager::populateOpenWithMenu(QMenu *menu, const QString &fileName) { - typedef QList<IEditorFactory*> EditorFactoryList; - typedef QList<IExternalEditor*> ExternalEditorList; + using EditorFactoryList = QList<IEditorFactory*>; + using ExternalEditorList = QList<IExternalEditor*>; menu->clear(); - bool anyMatches = false; - + const EditorFactoryList factories = IEditorFactory::preferredEditorFactories(fileName); const Utils::MimeType mt = Utils::mimeTypeForFile(fileName); - if (mt.isValid()) { - const EditorFactoryList factories = editorFactories(mt, false); - const ExternalEditorList extEditors = externalEditors(mt, false); - anyMatches = !factories.empty() || !extEditors.empty(); - if (anyMatches) { - // Add all suitable editors - foreach (IEditorFactory *editorFactory, factories) { - Core::Id editorId = editorFactory->id(); - // Add action to open with this very editor factory - QString const actionTitle = editorFactory->displayName(); - QAction *action = menu->addAction(actionTitle); - // Below we need QueuedConnection because otherwise, if a qrc file - // is inside of a qrc file itself, and the qrc editor opens the Open with menu, - // crashes happen, because the editor instance is deleted by openEditorWith - // while the menu is still being processed. - connect(action, &QAction::triggered, d, - [fileName, editorId]() { - EditorManagerPrivate::openEditorWith(fileName, editorId); - }, Qt::QueuedConnection); - } - // Add all suitable external editors - foreach (IExternalEditor *externalEditor, extEditors) { - QAction *action = menu->addAction(externalEditor->displayName()); - Core::Id editorId = externalEditor->id(); - connect(action, &QAction::triggered, [fileName, editorId]() { - EditorManager::openExternalEditor(fileName, editorId); - }); - } + const ExternalEditorList extEditors = IExternalEditor::externalEditors(mt); + const bool anyMatches = !factories.empty() || !extEditors.empty(); + if (anyMatches) { + // Add all suitable editors + foreach (IEditorFactory *editorFactory, factories) { + Core::Id editorId = editorFactory->id(); + // Add action to open with this very editor factory + QString const actionTitle = editorFactory->displayName(); + QAction *action = menu->addAction(actionTitle); + // Below we need QueuedConnection because otherwise, if a qrc file + // is inside of a qrc file itself, and the qrc editor opens the Open with menu, + // crashes happen, because the editor instance is deleted by openEditorWith + // while the menu is still being processed. + connect(action, &QAction::triggered, d, + [fileName, editorId]() { + EditorManagerPrivate::openEditorWith(fileName, editorId); + }, Qt::QueuedConnection); + } + // Add all suitable external editors + foreach (IExternalEditor *externalEditor, extEditors) { + QAction *action = menu->addAction(externalEditor->displayName()); + Core::Id editorId = externalEditor->id(); + connect(action, &QAction::triggered, [fileName, editorId]() { + EditorManager::openExternalEditor(fileName, editorId); + }); } } menu->setEnabled(anyMatches); @@ -2565,96 +2608,6 @@ IEditor *EditorManager::activateEditorForDocument(IDocument *document, OpenEdito return EditorManagerPrivate::activateEditorForDocument(EditorManagerPrivate::currentEditorView(), document, flags); } -/* For something that has a 'QStringList mimeTypes' (IEditorFactory - * or IExternalEditor), find the one best matching the mimetype passed in. - * Recurse over the parent classes of the mimetype to find them. */ -template <class EditorFactoryLike> -static void mimeTypeFactoryLookup(const Utils::MimeType &mimeType, - const QList<EditorFactoryLike*> &allFactories, - bool firstMatchOnly, - QList<EditorFactoryLike*> *list) -{ - QSet<EditorFactoryLike *> matches; - // search breadth-first through parent hierarchy, e.g. for hierarchy - // * application/x-ruby - // * application/x-executable - // * application/octet-stream - // * text/plain - QList<Utils::MimeType> queue; - QSet<QString> seen; - queue.append(mimeType); - seen.insert(mimeType.name()); - while (!queue.isEmpty()) { - Utils::MimeType mt = queue.takeFirst(); - // check for matching factories - foreach (EditorFactoryLike *factory, allFactories) { - if (!matches.contains(factory)) { - foreach (const QString &mimeName, factory->mimeTypes()) { - if (mt.matchesName(mimeName)) { - list->append(factory); - if (firstMatchOnly) - return; - matches.insert(factory); - } - } - } - } - // add parent mime types - QStringList parentNames = mt.parentMimeTypes(); - foreach (const QString &parentName, parentNames) { - const Utils::MimeType parent = Utils::mimeTypeForName(parentName); - if (parent.isValid()) { - int seenSize = seen.size(); - seen.insert(parent.name()); - if (seen.size() != seenSize) // not seen before, so add - queue.append(parent); - } - } - } -} - -EditorManager::EditorFactoryList - EditorManager::editorFactories(const Utils::MimeType &mimeType, bool bestMatchOnly) -{ - EditorFactoryList rc; - const EditorFactoryList allFactories = IEditorFactory::allEditorFactories(); - mimeTypeFactoryLookup(mimeType, allFactories, bestMatchOnly, &rc); - if (debugEditorManager) - qDebug() << Q_FUNC_INFO << mimeType.name() << " returns " << rc; - return rc; -} - -EditorManager::EditorFactoryList - EditorManager::editorFactories(const QString &fileName, bool bestMatchOnly) -{ - const QFileInfo fileInfo(fileName); - // Find by mime type - Utils::MimeType mimeType = Utils::mimeTypeForFile(fileInfo); - if (!mimeType.isValid()) { - qWarning("%s unable to determine mime type of %s. Falling back to text/plain", - Q_FUNC_INFO, fileName.toUtf8().constData()); - mimeType = Utils::mimeTypeForName("text/plain"); - } - // open text files > 48 MB in binary editor - if (fileInfo.size() > EditorManager::maxTextFileSize() - && mimeType.name().startsWith("text")) { - mimeType = Utils::mimeTypeForName("application/octet-stream"); - } - - return EditorManager::editorFactories(mimeType, bestMatchOnly); -} - -EditorManager::ExternalEditorList - EditorManager::externalEditors(const Utils::MimeType &mimeType, bool bestMatchOnly) -{ - ExternalEditorList rc; - const ExternalEditorList allEditors = IExternalEditor::allExternalEditors(); - mimeTypeFactoryLookup(mimeType, allEditors, bestMatchOnly, &rc); - if (debugEditorManager) - qDebug() << Q_FUNC_INFO << mimeType.name() << " returns " << rc; - return rc; -} - IEditor *EditorManager::openEditor(const QString &fileName, Id editorId, OpenEditorFlags flags, bool *newEditor) { diff --git a/src/plugins/coreplugin/editormanager/editormanager.h b/src/plugins/coreplugin/editormanager/editormanager.h index 17d84431e3..30023e2bc7 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.h +++ b/src/plugins/coreplugin/editormanager/editormanager.h @@ -75,9 +75,7 @@ class CORE_EXPORT EditorManager : public QObject Q_OBJECT public: - typedef QList<IEditorFactory *> EditorFactoryList; - typedef QList<IExternalEditor *> ExternalEditorList; - typedef std::function<QString (const QString &)> WindowTitleHandler; + using WindowTitleHandler = std::function<QString (const QString &)>; static EditorManager *instance(); @@ -89,7 +87,8 @@ public: CanContainLineAndColumnNumber = 8, OpenInOtherSplit = 16, DoNotSwitchToDesignMode = 32, - DoNotSwitchToEditMode = 64 + DoNotSwitchToEditMode = 64, + SwitchSplitIfAlreadyVisible = 128 }; Q_DECLARE_FLAGS(OpenEditorFlags, OpenEditorFlag) @@ -150,10 +149,6 @@ public: const std::function<void()> &function = nullptr); static void hideEditorStatusBar(const QString &id); - static EditorFactoryList editorFactories(const Utils::MimeType &mimeType, bool bestMatchOnly = true); - static EditorFactoryList editorFactories(const QString &fileName, bool bestMatchOnly = true); - static ExternalEditorList externalEditors(const Utils::MimeType &mimeType, bool bestMatchOnly = true); - static bool isAutoSaveFile(const QString &fileName); static QTextCodec *defaultTextCodec(); diff --git a/src/plugins/coreplugin/editormanager/editormanager_p.h b/src/plugins/coreplugin/editormanager/editormanager_p.h index 07c81e9ca3..b9e021bcb8 100644 --- a/src/plugins/coreplugin/editormanager/editormanager_p.h +++ b/src/plugins/coreplugin/editormanager/editormanager_p.h @@ -30,12 +30,14 @@ #include "editormanager.h" #include "editorview.h" #include "ieditor.h" +#include "ieditorfactory.h" #include <coreplugin/idocument.h> #include <QList> #include <QObject> #include <QPointer> +#include <QSet> #include <QString> #include <QVariant> @@ -185,7 +187,7 @@ private: static OpenEditorsWindow *windowPopup(); static void showPopupOrSelectDocument(); - static EditorManager::EditorFactoryList findFactories(Id editorId, const QString &fileName); + static EditorFactoryList findFactories(Id editorId, const QString &fileName); static IEditor *createEditor(IEditorFactory *factory, const QString &fileName); static void addEditor(IEditor *editor); static void removeEditor(IEditor *editor, bool removeSusependedEntry); diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp index 1394572c57..aea929a3aa 100644 --- a/src/plugins/coreplugin/editormanager/editorview.cpp +++ b/src/plugins/coreplugin/editormanager/editorview.cpp @@ -68,10 +68,9 @@ EditorView::EditorView(SplitterOrView *parentSplitterOrView, QWidget *parent) : m_container(new QStackedWidget(this)), m_infoBarDisplay(new InfoBarDisplay(this)), m_statusHLine(new QFrame(this)), - m_statusWidget(new QFrame(this)), - m_currentNavigationHistoryPosition(0) + m_statusWidget(new QFrame(this)) { - QVBoxLayout *tl = new QVBoxLayout(this); + auto tl = new QVBoxLayout(this); tl->setSpacing(0); tl->setMargin(0); { @@ -106,7 +105,7 @@ EditorView::EditorView(SplitterOrView *parentSplitterOrView, QWidget *parent) : m_statusWidget->setLineWidth(0); m_statusWidget->setAutoFillBackground(true); - QHBoxLayout *hbox = new QHBoxLayout(m_statusWidget); + auto hbox = new QHBoxLayout(m_statusWidget); hbox->setContentsMargins(1, 0, 1, 1); m_statusWidgetLabel = new QLabel; m_statusWidgetLabel->setContentsMargins(3, 0, 3, 0); @@ -153,9 +152,7 @@ EditorView::EditorView(SplitterOrView *parentSplitterOrView, QWidget *parent) : updateNavigatorActions(); } -EditorView::~EditorView() -{ -} +EditorView::~EditorView() = default; SplitterOrView *EditorView::parentSplitterOrView() const { @@ -173,7 +170,7 @@ EditorView *EditorView::findNextView() QTC_ASSERT(splitter->count() == 2, return nullptr); // is current the first child? then the next view is the first one in current's sibling if (splitter->widget(0) == current) { - SplitterOrView *second = qobject_cast<SplitterOrView *>(splitter->widget(1)); + auto second = qobject_cast<SplitterOrView *>(splitter->widget(1)); QTC_ASSERT(second, return nullptr); return second->findFirstView(); } @@ -196,7 +193,7 @@ EditorView *EditorView::findPreviousView() QTC_ASSERT(splitter->count() == 2, return nullptr); // is current the last child? then the previous view is the first child in current's sibling if (splitter->widget(1) == current) { - SplitterOrView *first = qobject_cast<SplitterOrView *>(splitter->widget(0)); + auto first = qobject_cast<SplitterOrView *>(splitter->widget(0)); QTC_ASSERT(first, return nullptr); return first->findFirstView(); } @@ -652,7 +649,7 @@ EditorView *SplitterOrView::findFirstView() { if (m_splitter) { for (int i = 0; i < m_splitter->count(); ++i) { - if (SplitterOrView *splitterOrView = qobject_cast<SplitterOrView*>(m_splitter->widget(i))) + if (auto splitterOrView = qobject_cast<SplitterOrView*>(m_splitter->widget(i))) if (EditorView *result = splitterOrView->findFirstView()) return result; } @@ -665,7 +662,7 @@ EditorView *SplitterOrView::findLastView() { if (m_splitter) { for (int i = m_splitter->count() - 1; 0 < i; --i) { - if (SplitterOrView *splitterOrView = qobject_cast<SplitterOrView*>(m_splitter->widget(i))) + if (auto splitterOrView = qobject_cast<SplitterOrView*>(m_splitter->widget(i))) if (EditorView *result = splitterOrView->findLastView()) return result; } @@ -678,7 +675,7 @@ SplitterOrView *SplitterOrView::findParentSplitter() const { QWidget *w = parentWidget(); while (w) { - if (SplitterOrView *splitter = qobject_cast<SplitterOrView *>(w)) { + if (auto splitter = qobject_cast<SplitterOrView *>(w)) { QTC_CHECK(splitter->splitter()); return splitter; } @@ -801,7 +798,7 @@ const QList<IEditor *> SplitterOrView::unsplitAll_helper() QList<IEditor *> editorsToDelete; if (m_splitter) { for (int i = 0; i < m_splitter->count(); ++i) { - if (SplitterOrView *splitterOrView = qobject_cast<SplitterOrView*>(m_splitter->widget(i))) + if (auto splitterOrView = qobject_cast<SplitterOrView*>(m_splitter->widget(i))) editorsToDelete.append(splitterOrView->unsplitAll_helper()); } } @@ -814,7 +811,7 @@ void SplitterOrView::unsplit() return; Q_ASSERT(m_splitter->count() == 1); - SplitterOrView *childSplitterOrView = qobject_cast<SplitterOrView*>(m_splitter->widget(0)); + auto childSplitterOrView = qobject_cast<SplitterOrView*>(m_splitter->widget(0)); QSplitter *oldSplitter = m_splitter; m_splitter = nullptr; QList<IEditor *> editorsToDelete; @@ -838,7 +835,7 @@ void SplitterOrView::unsplit() m_view = childSplitterOrView->takeView(); m_view->setParentSplitterOrView(this); m_layout->addWidget(m_view); - QSplitter *parentSplitter = qobject_cast<QSplitter *>(parentWidget()); + auto parentSplitter = qobject_cast<QSplitter *>(parentWidget()); if (parentSplitter) { // not the toplevel splitterOrView if (parentSplitter->orientation() == Qt::Horizontal) m_view->setCloseSplitIcon(parentSplitter->widget(0) == this ? diff --git a/src/plugins/coreplugin/editormanager/editorview.h b/src/plugins/coreplugin/editormanager/editorview.h index 457df776e5..245c140f06 100644 --- a/src/plugins/coreplugin/editormanager/editorview.h +++ b/src/plugins/coreplugin/editormanager/editorview.h @@ -142,7 +142,7 @@ private: QList<EditLocation> m_navigationHistory; QList<EditLocation> m_editorHistory; - int m_currentNavigationHistoryPosition; + int m_currentNavigationHistoryPosition = 0; void updateCurrentPositionInNavigationHistory(); public: diff --git a/src/plugins/coreplugin/editormanager/editorwindow.cpp b/src/plugins/coreplugin/editormanager/editorwindow.cpp index 84666e115c..83b8707131 100644 --- a/src/plugins/coreplugin/editormanager/editorwindow.cpp +++ b/src/plugins/coreplugin/editormanager/editorwindow.cpp @@ -29,6 +29,7 @@ #include "editormanager_p.h" #include <aggregation/aggregate.h> +#include <coreplugin/coreconstants.h> #include <coreplugin/icontext.h> #include <coreplugin/icore.h> #include <coreplugin/locator/locatormanager.h> @@ -67,7 +68,10 @@ EditorWindow::EditorWindow(QWidget *parent) : resize(QSize(800, 600)); static int windowId = 0; - ICore::registerWindow(this, Context(Id("EditorManager.ExternalWindow.").withSuffix(++windowId))); + + ICore::registerWindow(this, + Context(Id("EditorManager.ExternalWindow.").withSuffix(++windowId), + Constants::C_EDITORMANAGER)); connect(m_area, &EditorArea::windowTitleNeedsUpdate, this, &EditorWindow::updateWindowTitle); @@ -82,7 +86,7 @@ EditorWindow::EditorWindow(QWidget *parent) : EditorWindow::~EditorWindow() { if (m_area) - disconnect(m_area, 0, this, 0); + disconnect(m_area, nullptr, this, nullptr); } EditorArea *EditorWindow::editorArea() const diff --git a/src/plugins/coreplugin/editormanager/editorwindow.h b/src/plugins/coreplugin/editormanager/editorwindow.h index 2327e0145f..d17aeb27f3 100644 --- a/src/plugins/coreplugin/editormanager/editorwindow.h +++ b/src/plugins/coreplugin/editormanager/editorwindow.h @@ -36,8 +36,8 @@ class EditorWindow : public QWidget { Q_OBJECT public: - explicit EditorWindow(QWidget *parent = 0); - ~EditorWindow(); + explicit EditorWindow(QWidget *parent = nullptr); + ~EditorWindow() override; EditorArea *editorArea() const; diff --git a/src/plugins/coreplugin/editormanager/ieditorfactory.cpp b/src/plugins/coreplugin/editormanager/ieditorfactory.cpp index b32b6036bc..c889e39404 100644 --- a/src/plugins/coreplugin/editormanager/ieditorfactory.cpp +++ b/src/plugins/coreplugin/editormanager/ieditorfactory.cpp @@ -24,12 +24,18 @@ ****************************************************************************/ #include "ieditorfactory.h" +#include "ieditorfactory_p.h" +#include "editormanager.h" +#include <utils/mimetypes/mimedatabase.h> #include <utils/qtcassert.h> +#include <QFileInfo> + namespace Core { static QList<IEditorFactory *> g_editorFactories; +static QHash<Utils::MimeType, IEditorFactory *> g_userPreferredEditorFactories; IEditorFactory::IEditorFactory(QObject *parent) : QObject(parent) @@ -42,9 +48,62 @@ IEditorFactory::~IEditorFactory() g_editorFactories.removeOne(this); } -const QList<IEditorFactory *> IEditorFactory::allEditorFactories() +const EditorFactoryList IEditorFactory::allEditorFactories() { return g_editorFactories; } +/*! + Returns all available editors for this \a mimeType in the default order + (editors ordered by mime type hierarchy). +*/ +const EditorFactoryList IEditorFactory::defaultEditorFactories(const Utils::MimeType &mimeType) +{ + EditorFactoryList rc; + const EditorFactoryList allFactories = IEditorFactory::allEditorFactories(); + Internal::mimeTypeFactoryLookup(mimeType, allFactories, &rc); + return rc; +} + +/*! + Returns the available editors for \a fileName in order of preference. + That is the default order for the file's MIME type but with a user overridden default + editor first, and if the file is a too large text file, with the binary editor as the + very first. +*/ +const EditorFactoryList IEditorFactory::preferredEditorFactories(const QString &fileName) +{ + const QFileInfo fileInfo(fileName); + // default factories by mime type + const Utils::MimeType mimeType = Utils::mimeTypeForFile(fileInfo); + EditorFactoryList factories = defaultEditorFactories(mimeType); + const auto factories_moveToFront = [&factories](IEditorFactory *f) { + factories.removeAll(f); + factories.prepend(f); + }; + // user preferred factory to front + IEditorFactory *userPreferred = Internal::userPreferredEditorFactories().value(mimeType); + if (userPreferred) + factories_moveToFront(userPreferred); + // open text files > 48 MB in binary editor + if (fileInfo.size() > EditorManager::maxTextFileSize() + && mimeType.inherits("text/plain")) { + const Utils::MimeType binary = Utils::mimeTypeForName("application/octet-stream"); + const EditorFactoryList binaryEditors = defaultEditorFactories(binary); + if (!binaryEditors.isEmpty()) + factories_moveToFront(binaryEditors.first()); + } + return factories; +} + +QHash<Utils::MimeType, Core::IEditorFactory *> Core::Internal::userPreferredEditorFactories() +{ + return g_userPreferredEditorFactories; +} + +void Internal::setUserPreferredEditorFactories(const QHash<Utils::MimeType, IEditorFactory *> &factories) +{ + g_userPreferredEditorFactories = factories; +} + } // Core diff --git a/src/plugins/coreplugin/editormanager/ieditorfactory.h b/src/plugins/coreplugin/editormanager/ieditorfactory.h index d7600adf71..a759854e72 100644 --- a/src/plugins/coreplugin/editormanager/ieditorfactory.h +++ b/src/plugins/coreplugin/editormanager/ieditorfactory.h @@ -28,12 +28,17 @@ #include <coreplugin/core_global.h> #include <coreplugin/id.h> +#include <utils/mimetypes/mimetype.h> + #include <QObject> #include <QStringList> namespace Core { class IEditor; +class IEditorFactory; + +using EditorFactoryList = QList<IEditorFactory *>; class CORE_EXPORT IEditorFactory : public QObject { @@ -43,7 +48,9 @@ public: IEditorFactory(QObject *parent = nullptr); ~IEditorFactory() override; - static const QList<IEditorFactory *> allEditorFactories(); + static const EditorFactoryList allEditorFactories(); + static const EditorFactoryList defaultEditorFactories(const Utils::MimeType &mimeType); + static const EditorFactoryList preferredEditorFactories(const QString &fileName); QString displayName() const { return m_displayName; } void setDisplayName(const QString &displayName) { m_displayName = displayName; } diff --git a/src/plugins/coreplugin/editormanager/ieditorfactory_p.h b/src/plugins/coreplugin/editormanager/ieditorfactory_p.h new file mode 100644 index 0000000000..3da7cf2fa9 --- /dev/null +++ b/src/plugins/coreplugin/editormanager/ieditorfactory_p.h @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include <utils/mimetypes/mimetype.h> +#include <utils/mimetypes/mimedatabase.h> + +#include <QHash> +#include <QSet> + +namespace Core { + +class IEditorFactory; + +namespace Internal { + +QHash<Utils::MimeType, IEditorFactory *> userPreferredEditorFactories(); +void setUserPreferredEditorFactories(const QHash<Utils::MimeType, IEditorFactory *> &factories); + +/* For something that has a 'QStringList mimeTypes' (IEditorFactory + * or IExternalEditor), find the one best matching the mimetype passed in. + * Recurse over the parent classes of the mimetype to find them. */ +template <class EditorFactoryLike> +static void mimeTypeFactoryLookup(const Utils::MimeType &mimeType, + const QList<EditorFactoryLike*> &allFactories, + QList<EditorFactoryLike*> *list) +{ + QSet<EditorFactoryLike *> matches; + // search breadth-first through parent hierarchy, e.g. for hierarchy + // * application/x-ruby + // * application/x-executable + // * application/octet-stream + // * text/plain + QList<Utils::MimeType> queue; + QSet<QString> seen; + queue.append(mimeType); + seen.insert(mimeType.name()); + while (!queue.isEmpty()) { + Utils::MimeType mt = queue.takeFirst(); + // check for matching factories + foreach (EditorFactoryLike *factory, allFactories) { + if (!matches.contains(factory)) { + foreach (const QString &mimeName, factory->mimeTypes()) { + if (mt.matchesName(mimeName)) { + list->append(factory); + matches.insert(factory); + } + } + } + } + // add parent mime types + QStringList parentNames = mt.parentMimeTypes(); + foreach (const QString &parentName, parentNames) { + const Utils::MimeType parent = Utils::mimeTypeForName(parentName); + if (parent.isValid()) { + int seenSize = seen.size(); + seen.insert(parent.name()); + if (seen.size() != seenSize) // not seen before, so add + queue.append(parent); + } + } + } +} + +} // Internal +} // Core diff --git a/src/plugins/coreplugin/editormanager/iexternaleditor.cpp b/src/plugins/coreplugin/editormanager/iexternaleditor.cpp index 246003162f..9fdb561587 100644 --- a/src/plugins/coreplugin/editormanager/iexternaleditor.cpp +++ b/src/plugins/coreplugin/editormanager/iexternaleditor.cpp @@ -25,6 +25,8 @@ #include "iexternaleditor.h" +#include "ieditorfactory_p.h" + namespace Core { /*! @@ -66,9 +68,17 @@ IExternalEditor::~IExternalEditor() g_externalEditors.removeOne(this); } -const QList<IExternalEditor *> IExternalEditor::allExternalEditors() +const ExternalEditorList IExternalEditor::allExternalEditors() { return g_externalEditors; } +const ExternalEditorList IExternalEditor::externalEditors(const Utils::MimeType &mimeType) +{ + ExternalEditorList rc; + const ExternalEditorList allEditors = IExternalEditor::allExternalEditors(); + Internal::mimeTypeFactoryLookup(mimeType, allEditors, &rc); + return rc; +} + } // Core diff --git a/src/plugins/coreplugin/editormanager/iexternaleditor.h b/src/plugins/coreplugin/editormanager/iexternaleditor.h index 712af48eb8..97ca8c2760 100644 --- a/src/plugins/coreplugin/editormanager/iexternaleditor.h +++ b/src/plugins/coreplugin/editormanager/iexternaleditor.h @@ -27,11 +27,16 @@ #include <coreplugin/core_global.h> +#include <utils/mimetypes/mimetype.h> + #include <QObject> namespace Core { class Id; +class IExternalEditor; + +using ExternalEditorList = QList<IExternalEditor *>; class CORE_EXPORT IExternalEditor : public QObject { @@ -41,7 +46,8 @@ public: explicit IExternalEditor(QObject *parent = nullptr); ~IExternalEditor() override; - static const QList<IExternalEditor *> allExternalEditors(); + static const ExternalEditorList allExternalEditors(); + static const ExternalEditorList externalEditors(const Utils::MimeType &mimeType); virtual QStringList mimeTypes() const = 0; virtual Id id() const = 0; diff --git a/src/plugins/coreplugin/editormanager/openeditorsview.cpp b/src/plugins/coreplugin/editormanager/openeditorsview.cpp index 1a7e0d618c..234fe28e5a 100644 --- a/src/plugins/coreplugin/editormanager/openeditorsview.cpp +++ b/src/plugins/coreplugin/editormanager/openeditorsview.cpp @@ -65,9 +65,7 @@ OpenEditorsWidget::OpenEditorsWidget() this, &OpenEditorsWidget::contextMenuRequested); } -OpenEditorsWidget::~OpenEditorsWidget() -{ -} +OpenEditorsWidget::~OpenEditorsWidget() = default; void OpenEditorsWidget::updateCurrentItem(IEditor *editor) { @@ -93,7 +91,7 @@ void OpenEditorsWidget::handleActivated(const QModelIndex &index) // work around a bug in itemviews where the delegate wouldn't get the QStyle::State_MouseOver QPoint cursorPos = QCursor::pos(); QWidget *vp = viewport(); - QMouseEvent e(QEvent::MouseMove, vp->mapFromGlobal(cursorPos), cursorPos, Qt::NoButton, 0, 0); + QMouseEvent e(QEvent::MouseMove, vp->mapFromGlobal(cursorPos), cursorPos, Qt::NoButton, nullptr, nullptr); QCoreApplication::sendEvent(vp, &e); } } diff --git a/src/plugins/coreplugin/editormanager/openeditorsview.h b/src/plugins/coreplugin/editormanager/openeditorsview.h index fbde103154..f50a50e3dd 100644 --- a/src/plugins/coreplugin/editormanager/openeditorsview.h +++ b/src/plugins/coreplugin/editormanager/openeditorsview.h @@ -39,7 +39,7 @@ class ProxyModel : public QAbstractProxyModel { Q_OBJECT public: - explicit ProxyModel(QObject *parent = 0); + explicit ProxyModel(QObject *parent = nullptr); QModelIndex mapFromSource(const QModelIndex & sourceIndex) const override; QModelIndex mapToSource(const QModelIndex & proxyIndex) const override; @@ -69,7 +69,7 @@ class OpenEditorsWidget : public OpenDocumentsTreeView public: OpenEditorsWidget(); - ~OpenEditorsWidget(); + ~OpenEditorsWidget() override; private: void handleActivated(const QModelIndex &); @@ -88,7 +88,7 @@ class OpenEditorsViewFactory : public INavigationWidgetFactory public: OpenEditorsViewFactory(); - NavigationView createWidget(); + NavigationView createWidget() override; }; } // namespace Internal diff --git a/src/plugins/coreplugin/editormanager/openeditorswindow.cpp b/src/plugins/coreplugin/editormanager/openeditorswindow.cpp index f937f43663..d766531f51 100644 --- a/src/plugins/coreplugin/editormanager/openeditorswindow.cpp +++ b/src/plugins/coreplugin/editormanager/openeditorswindow.cpp @@ -72,7 +72,7 @@ OpenEditorsWindow::OpenEditorsWindow(QWidget *parent) : setFrameStyle(m_editorList->frameStyle()); m_editorList->setFrameStyle(QFrame::NoFrame); - QVBoxLayout *layout = new QVBoxLayout(this); + auto layout = new QVBoxLayout(this); layout->setMargin(0); layout->addWidget(m_editorList); @@ -97,7 +97,7 @@ bool OpenEditorsWindow::eventFilter(QObject *obj, QEvent *e) { if (obj == m_editorList) { if (e->type() == QEvent::KeyPress) { - QKeyEvent *ke = static_cast<QKeyEvent*>(e); + auto ke = static_cast<QKeyEvent*>(e); if (ke->key() == Qt::Key_Escape) { setVisible(false); return true; @@ -108,7 +108,7 @@ bool OpenEditorsWindow::eventFilter(QObject *obj, QEvent *e) return true; } } else if (e->type() == QEvent::KeyRelease) { - QKeyEvent *ke = static_cast<QKeyEvent*>(e); + auto ke = static_cast<QKeyEvent*>(e); if (ke->modifiers() == 0 /*HACK this is to overcome some event inconsistencies between platforms*/ || (ke->modifiers() == Qt::AltModifier @@ -133,7 +133,7 @@ void OpenEditorsWindow::selectUpDown(bool up) int index = m_editorList->indexOfTopLevelItem(m_editorList->currentItem()); if (index < 0) return; - QTreeWidgetItem *editor = 0; + QTreeWidgetItem *editor = nullptr; int count = 0; while (!editor && count < itemCount) { if (up) { @@ -245,7 +245,7 @@ void OpenEditorsWindow::addItem(DocumentModel::Entry *entry, entriesDone.insert(entry); QString title = entry->displayName(); QTC_ASSERT(!title.isEmpty(), return); - QTreeWidgetItem *item = new QTreeWidgetItem(); + auto item = new QTreeWidgetItem(); if (entry->document->isModified()) title += tr("*"); item->setIcon(0, !entry->fileName().isEmpty() && entry->document->isFileReadOnly() diff --git a/src/plugins/coreplugin/editormanager/openeditorswindow.h b/src/plugins/coreplugin/editormanager/openeditorswindow.h index 9bd769bf8c..4786620c16 100644 --- a/src/plugins/coreplugin/editormanager/openeditorswindow.h +++ b/src/plugins/coreplugin/editormanager/openeditorswindow.h @@ -45,9 +45,9 @@ namespace Internal { class OpenEditorsTreeWidget : public QTreeWidget { public: - explicit OpenEditorsTreeWidget(QWidget *parent = 0) : QTreeWidget(parent) {} - ~OpenEditorsTreeWidget() {} - QSize sizeHint() const; + explicit OpenEditorsTreeWidget(QWidget *parent = nullptr) : QTreeWidget(parent) {} + ~OpenEditorsTreeWidget() override = default; + QSize sizeHint() const override; }; @@ -58,16 +58,16 @@ class OpenEditorsWindow : public QFrame public: enum Mode {ListMode, HistoryMode }; - explicit OpenEditorsWindow(QWidget *parent = 0); + explicit OpenEditorsWindow(QWidget *parent = nullptr); void setEditors(const QList<EditLocation> &globalHistory, EditorView *view); - bool eventFilter(QObject *src, QEvent *e); - void focusInEvent(QFocusEvent *); - void setVisible(bool visible); + bool eventFilter(QObject *src, QEvent *e) override; + void focusInEvent(QFocusEvent*) override; + void setVisible(bool visible) override; void selectNextEditor(); void selectPreviousEditor(); - QSize sizeHint() const; + QSize sizeHint() const override; public slots: void selectAndHide(); diff --git a/src/plugins/coreplugin/editormanager/systemeditor.h b/src/plugins/coreplugin/editormanager/systemeditor.h index 1589dd21ce..10fb0dc949 100644 --- a/src/plugins/coreplugin/editormanager/systemeditor.h +++ b/src/plugins/coreplugin/editormanager/systemeditor.h @@ -35,13 +35,13 @@ class SystemEditor : public IExternalEditor Q_OBJECT public: - explicit SystemEditor(QObject *parent = 0); + explicit SystemEditor(QObject *parent = nullptr); - QStringList mimeTypes() const; - Id id() const; - QString displayName() const; + QStringList mimeTypes() const override; + Id id() const override; + QString displayName() const override; - bool startEditor(const QString &fileName, QString *errorMessage); + bool startEditor(const QString &fileName, QString *errorMessage) override; }; } // namespace Internal diff --git a/src/plugins/coreplugin/editortoolbar.cpp b/src/plugins/coreplugin/editortoolbar.cpp index 83384eb337..55430f1a42 100644 --- a/src/plugins/coreplugin/editortoolbar.cpp +++ b/src/plugins/coreplugin/editortoolbar.cpp @@ -93,7 +93,7 @@ EditorToolBarPrivate::EditorToolBarPrivate(QWidget *parent, EditorToolBar *q) : m_closeEditorButton(new QToolButton(q)), m_lockButton(new QToolButton(q)), m_dragHandle(new QToolButton(q)), - m_dragHandleMenu(0), + m_dragHandleMenu(nullptr), m_goBackAction(new QAction(Utils::Icons::PREV_TOOLBAR.icon(), EditorManager::tr("Go Back"), parent)), m_goForwardAction(new QAction(Utils::Icons::NEXT_TOOLBAR.icon(), EditorManager::tr("Go Forward"), parent)), m_backButton(new QToolButton(q)), @@ -105,7 +105,7 @@ EditorToolBarPrivate::EditorToolBarPrivate(QWidget *parent, EditorToolBar *q) : EditorManager::tr("Split Side by Side"), parent)), m_splitNewWindowAction(new QAction(EditorManager::tr("Open in New Window"), parent)), m_closeSplitButton(new QToolButton(q)), - m_activeToolBar(0), + m_activeToolBar(nullptr), m_toolBarPlaceholder(new QWidget(q)), m_defaultToolBar(new QWidget(q)), m_isStandalone(false) @@ -118,7 +118,7 @@ EditorToolBarPrivate::EditorToolBarPrivate(QWidget *parent, EditorToolBar *q) : EditorToolBar::EditorToolBar(QWidget *parent) : Utils::StyledBar(parent), d(new EditorToolBarPrivate(parent, this)) { - QHBoxLayout *toolBarLayout = new QHBoxLayout(this); + auto toolBarLayout = new QHBoxLayout(this); toolBarLayout->setMargin(0); toolBarLayout->setSpacing(0); toolBarLayout->addWidget(d->m_defaultToolBar); @@ -164,7 +164,7 @@ EditorToolBar::EditorToolBar(QWidget *parent) : d->m_splitButton->setToolTip(tr("Split")); d->m_splitButton->setPopupMode(QToolButton::InstantPopup); d->m_splitButton->setProperty("noArrow", true); - QMenu *splitMenu = new QMenu(d->m_splitButton); + auto splitMenu = new QMenu(d->m_splitButton); splitMenu->addAction(d->m_horizontalSplitAction); splitMenu->addAction(d->m_verticalSplitAction); splitMenu->addAction(d->m_splitNewWindowAction); @@ -173,7 +173,7 @@ EditorToolBar::EditorToolBar(QWidget *parent) : d->m_closeSplitButton->setAutoRaise(true); d->m_closeSplitButton->setIcon(Utils::Icons::CLOSE_SPLIT_BOTTOM.icon()); - QHBoxLayout *toplayout = new QHBoxLayout(this); + auto toplayout = new QHBoxLayout(this); toplayout->setSpacing(0); toplayout->setMargin(0); toplayout->addWidget(d->m_backButton); @@ -236,14 +236,14 @@ void EditorToolBar::removeToolbarForEditor(IEditor *editor) disconnect(editor->document(), &IDocument::changed, this, &EditorToolBar::checkDocumentStatus); QWidget *toolBar = editor->toolBar(); - if (toolBar != 0) { + if (toolBar != nullptr) { if (d->m_activeToolBar == toolBar) { d->m_activeToolBar = d->m_defaultToolBar; d->m_activeToolBar->setVisible(true); } d->m_toolBarPlaceholder->layout()->removeWidget(toolBar); toolBar->setVisible(false); - toolBar->setParent(0); + toolBar->setParent(nullptr); } } @@ -319,7 +319,7 @@ void EditorToolBar::setMenuProvider(const EditorToolBar::MenuProvider &provider) void EditorToolBar::setCurrentEditor(IEditor *editor) { - IDocument *document = editor ? editor->document() : 0; + IDocument *document = editor ? editor->document() : nullptr; const Utils::optional<int> index = DocumentModel::rowOfDocument(document); if (QTC_GUARD(index)) d->m_editorList->setCurrentIndex(*index); @@ -327,7 +327,7 @@ void EditorToolBar::setCurrentEditor(IEditor *editor) // If we never added the toolbar from the editor, we will never change // the editor, so there's no need to update the toolbar either. if (!d->m_isStandalone) - updateToolBar(editor ? editor->toolBar() : 0); + updateToolBar(editor ? editor->toolBar() : nullptr); updateDocumentStatus(document); } @@ -353,7 +353,7 @@ void EditorToolBar::fillListContextMenu(QMenu *menu) } else { IEditor *editor = EditorManager::currentEditor(); DocumentModel::Entry *entry = editor ? DocumentModel::entryForDocument(editor->document()) - : 0; + : nullptr; EditorManager::addSaveAndCloseEditorActions(menu, entry, editor); menu->addSeparator(); EditorManager::addNativeDirAndOpenWithActions(menu, entry); @@ -386,7 +386,7 @@ void EditorToolBar::updateActionShortcuts() void EditorToolBar::checkDocumentStatus() { - IDocument *document = qobject_cast<IDocument *>(sender()); + auto document = qobject_cast<IDocument *>(sender()); QTC_ASSERT(document, return); DocumentModel::Entry *entry = DocumentModel::entryAtRow( d->m_editorList->currentIndex()); @@ -397,7 +397,7 @@ void EditorToolBar::checkDocumentStatus() void EditorToolBar::updateDocumentStatus(IDocument *document) { - d->m_closeEditorButton->setEnabled(document != 0); + d->m_closeEditorButton->setEnabled(document != nullptr); if (!document) { d->m_lockButton->setIcon(QIcon()); diff --git a/src/plugins/coreplugin/editortoolbar.h b/src/plugins/coreplugin/editortoolbar.h index 1d0c49ffdf..b8d7fad468 100644 --- a/src/plugins/coreplugin/editortoolbar.h +++ b/src/plugins/coreplugin/editortoolbar.h @@ -53,7 +53,7 @@ public: explicit EditorToolBar(QWidget *parent = nullptr); ~EditorToolBar() override; - typedef std::function<void(QMenu*)> MenuProvider; + using MenuProvider = std::function<void(QMenu*)>; enum ToolbarCreationFlags { FlagsNone = 0, FlagsStandalone = 1 }; /** diff --git a/src/plugins/coreplugin/externaltool.cpp b/src/plugins/coreplugin/externaltool.cpp index 08e3ecc29b..1b61747dd2 100644 --- a/src/plugins/coreplugin/externaltool.cpp +++ b/src/plugins/coreplugin/externaltool.cpp @@ -81,11 +81,7 @@ const char kFalse[] = "false"; // #pragma mark -- ExternalTool ExternalTool::ExternalTool() : - m_displayCategory(QLatin1String("")), // difference between isNull and isEmpty - m_order(-1), - m_outputHandling(ShowInPane), - m_errorHandling(ShowInPane), - m_modifiesCurrentDocument(false) + m_displayCategory(QLatin1String("")) // difference between isNull and isEmpty { } @@ -129,9 +125,7 @@ ExternalTool &ExternalTool::operator=(const ExternalTool &other) return *this; } -ExternalTool::~ExternalTool() -{ -} +ExternalTool::~ExternalTool() = default; QString ExternalTool::id() const { @@ -354,7 +348,7 @@ ExternalTool * ExternalTool::createFromXml(const QByteArray &xml, QString *error int nameLocale = -1; int categoryLocale = -1; const QStringList &locales = splitLocale(locale); - ExternalTool *tool = new ExternalTool; + auto tool = new ExternalTool; QXmlStreamReader reader(xml); if (!reader.readNextStartElement() || reader.name() != QLatin1String(kExternalTool)) @@ -442,7 +436,7 @@ ExternalTool * ExternalTool::createFromXml(const QByteArray &xml, QString *error if (errorMessage) *errorMessage = reader.errorString(); delete tool; - return 0; + return nullptr; } return tool; } @@ -452,10 +446,10 @@ ExternalTool * ExternalTool::createFromFile(const QString &fileName, QString *er QString absFileName = QFileInfo(fileName).absoluteFilePath(); FileReader reader; if (!reader.fetch(absFileName, errorMessage)) - return 0; + return nullptr; ExternalTool *tool = ExternalTool::createFromXml(reader.data(), errorMessage, locale); if (!tool) - return 0; + return nullptr; tool->m_fileName = absFileName; return tool; } @@ -541,7 +535,7 @@ bool ExternalTool::operator==(const ExternalTool &other) const ExternalToolRunner::ExternalToolRunner(const ExternalTool *tool) : m_tool(new ExternalTool(tool)), - m_process(0), + m_process(nullptr), m_outputCodec(QTextCodec::codecForLocale()), m_hasError(false) { diff --git a/src/plugins/coreplugin/externaltool.h b/src/plugins/coreplugin/externaltool.h index e284de3e91..b511b9e0e2 100644 --- a/src/plugins/coreplugin/externaltool.h +++ b/src/plugins/coreplugin/externaltool.h @@ -103,15 +103,15 @@ private: QString m_description; QString m_displayName; QString m_displayCategory; - int m_order; + int m_order = -1; QStringList m_executables; QString m_arguments; QString m_input; QString m_workingDirectory; QList<Utils::EnvironmentItem> m_environment; - OutputHandling m_outputHandling; - OutputHandling m_errorHandling; - bool m_modifiesCurrentDocument; + OutputHandling m_outputHandling = ShowInPane; + OutputHandling m_errorHandling = ShowInPane; + bool m_modifiesCurrentDocument = false; QString m_fileName; QString m_presetFileName; diff --git a/src/plugins/coreplugin/externaltoolmanager.cpp b/src/plugins/coreplugin/externaltoolmanager.cpp index 80d98243b6..1ba8a04acb 100644 --- a/src/plugins/coreplugin/externaltoolmanager.cpp +++ b/src/plugins/coreplugin/externaltoolmanager.cpp @@ -56,8 +56,8 @@ struct ExternalToolManagerPrivate QAction *m_configureAction; }; -static ExternalToolManager *m_instance = 0; -static ExternalToolManagerPrivate *d = 0; +static ExternalToolManager *m_instance = nullptr; +static ExternalToolManagerPrivate *d = nullptr; static void writeSettings(); static void readSettings(const QMap<QString, ExternalTool *> &tools, @@ -211,7 +211,7 @@ void ExternalToolManager::setToolsByCategory(const QMap<QString, QList<ExternalT it.toFront(); while (it.hasNext()) { it.next(); - ActionContainer *container = 0; + ActionContainer *container = nullptr; const QString &containerName = it.key(); if (containerName.isEmpty()) { // no displayCategory, so put into external tools menu directly container = mexternaltools; @@ -227,8 +227,8 @@ void ExternalToolManager::setToolsByCategory(const QMap<QString, QList<ExternalT foreach (ExternalTool *tool, it.value()) { const QString &toolId = tool->id(); // tool action and command - QAction *action = 0; - Command *command = 0; + QAction *action = nullptr; + Command *command = nullptr; if (d->m_actions.contains(toolId)) { action = d->m_actions.value(toolId); command = ActionManager::command(externalToolsPrefix.withSuffix(toolId)); @@ -236,7 +236,7 @@ void ExternalToolManager::setToolsByCategory(const QMap<QString, QList<ExternalT action = new QAction(tool->displayName(), m_instance); d->m_actions.insert(toolId, action); connect(action, &QAction::triggered, [tool] { - ExternalToolRunner *runner = new ExternalToolRunner(tool); + auto runner = new ExternalToolRunner(tool); if (runner->hasError()) MessageManager::write(runner->errorString()); }); diff --git a/src/plugins/coreplugin/find/basetextfind.cpp b/src/plugins/coreplugin/find/basetextfind.cpp index f0b3ad64c3..b9c38b3a5e 100644 --- a/src/plugins/coreplugin/find/basetextfind.cpp +++ b/src/plugins/coreplugin/find/basetextfind.cpp @@ -111,7 +111,7 @@ void BaseTextFind::setTextCursor(const QTextCursor &cursor) QTextDocument *BaseTextFind::document() const { - QTC_ASSERT(d->m_editor || d->m_plaineditor, return 0); + QTC_ASSERT(d->m_editor || d->m_plaineditor, return nullptr); return d->m_editor ? d->m_editor->document() : d->m_plaineditor->document(); } @@ -140,7 +140,7 @@ void BaseTextFind::resetIncrementalSearch() void BaseTextFind::clearHighlights() { - highlightAll(QString(), 0); + highlightAll(QString(), nullptr); } QString BaseTextFind::currentFindString() const @@ -191,7 +191,7 @@ IFindSupport::Result BaseTextFind::findIncremental(const QString &txt, FindFlags if (found) highlightAll(txt, findFlags); else - highlightAll(QString(), 0); + highlightAll(QString(), nullptr); return found ? Found : NotFound; } diff --git a/src/plugins/coreplugin/find/currentdocumentfind.cpp b/src/plugins/coreplugin/find/currentdocumentfind.cpp index eca3527bac..834b651ce7 100644 --- a/src/plugins/coreplugin/find/currentdocumentfind.cpp +++ b/src/plugins/coreplugin/find/currentdocumentfind.cpp @@ -40,7 +40,7 @@ using namespace Core; using namespace Core::Internal; CurrentDocumentFind::CurrentDocumentFind() - : m_currentFind(0) + : m_currentFind(nullptr) { connect(qApp, &QApplication::focusChanged, this, &CurrentDocumentFind::updateCandidateFindFilter); @@ -48,7 +48,7 @@ CurrentDocumentFind::CurrentDocumentFind() void CurrentDocumentFind::removeConnections() { - disconnect(qApp, 0, this, 0); + disconnect(qApp, nullptr, this, nullptr); removeFindSupportConnections(); } @@ -82,7 +82,7 @@ bool CurrentDocumentFind::supportsReplace() const FindFlags CurrentDocumentFind::supportedFindFlags() const { - QTC_ASSERT(m_currentFind, return 0); + QTC_ASSERT(m_currentFind, return nullptr); return m_currentFind->supportedFindFlags(); } @@ -134,7 +134,7 @@ int CurrentDocumentFind::replaceAll(const QString &before, const QString &after, QTC_CHECK(m_currentWidget); int count = m_currentFind->replaceAll(before, after, findFlags); Utils::FadingIndicator::showText(m_currentWidget, - tr("%n occurrences replaced.", 0, count), + tr("%n occurrences replaced.", nullptr, count), Utils::FadingIndicator::SmallText); return count; } @@ -155,7 +155,7 @@ void CurrentDocumentFind::updateCandidateFindFilter(QWidget *old, QWidget *now) { Q_UNUSED(old) QWidget *candidate = now; - QPointer<IFindSupport> impl = 0; + QPointer<IFindSupport> impl = nullptr; while (!impl && candidate) { impl = Aggregation::query<IFindSupport>(candidate); if (!impl) @@ -215,8 +215,8 @@ void CurrentDocumentFind::removeFindSupportConnections() void CurrentDocumentFind::clearFindSupport() { removeFindSupportConnections(); - m_currentWidget = 0; - m_currentFind = 0; + m_currentWidget = nullptr; + m_currentFind = nullptr; emit changed(); } diff --git a/src/plugins/coreplugin/find/currentdocumentfind.h b/src/plugins/coreplugin/find/currentdocumentfind.h index a0d40d8706..32aa5b97f8 100644 --- a/src/plugins/coreplugin/find/currentdocumentfind.h +++ b/src/plugins/coreplugin/find/currentdocumentfind.h @@ -61,7 +61,7 @@ public: void removeConnections(); bool setFocusToCurrentFindSupport(); - bool eventFilter(QObject *obj, QEvent *event); + bool eventFilter(QObject *obj, QEvent *event) override; signals: void changed(); diff --git a/src/plugins/coreplugin/find/findplugin.cpp b/src/plugins/coreplugin/find/findplugin.cpp index dad9776247..3fcc8fa14b 100644 --- a/src/plugins/coreplugin/find/findplugin.cpp +++ b/src/plugins/coreplugin/find/findplugin.cpp @@ -181,24 +181,24 @@ public: void setupFilterMenuItems(); void readSettings(); - Internal::CurrentDocumentFind *m_currentDocumentFind = 0; - Internal::FindToolBar *m_findToolBar = 0; - Internal::FindToolWindow *m_findDialog = 0; - SearchResultWindow *m_searchResultWindow = 0; + Internal::CurrentDocumentFind *m_currentDocumentFind = nullptr; + Internal::FindToolBar *m_findToolBar = nullptr; + Internal::FindToolWindow *m_findDialog = nullptr; + SearchResultWindow *m_searchResultWindow = nullptr; FindFlags m_findFlags; CompletionModel m_findCompletionModel; QStringListModel m_replaceCompletionModel; QStringList m_replaceCompletions; - QAction *m_openFindDialog = 0; + QAction *m_openFindDialog = nullptr; }; -Find *m_instance = 0; -FindPrivate *d = 0; +Find *m_instance = nullptr; +FindPrivate *d = nullptr; void Find::destroy() { delete m_instance; - m_instance = 0; + m_instance = nullptr; if (d) { delete d->m_currentDocumentFind; delete d->m_findToolBar; @@ -245,7 +245,7 @@ void Find::extensionsInitialized() void Find::aboutToShutdown() { d->m_findToolBar->setVisible(false); - d->m_findToolBar->setParent(0); + d->m_findToolBar->setParent(nullptr); d->m_currentDocumentFind->removeConnections(); } diff --git a/src/plugins/coreplugin/find/findtoolbar.cpp b/src/plugins/coreplugin/find/findtoolbar.cpp index 793b2990f8..e1aee5b9a7 100644 --- a/src/plugins/coreplugin/find/findtoolbar.cpp +++ b/src/plugins/coreplugin/find/findtoolbar.cpp @@ -121,26 +121,26 @@ FindToolBar::FindToolBar(CurrentDocumentFind *currentDocumentFind) static_cast<void (QCompleter::*)(const QModelIndex &)>(&QCompleter::activated), this, &FindToolBar::findCompleterActivated); - QAction *shiftEnterAction = new QAction(m_ui.findEdit); + auto shiftEnterAction = new QAction(m_ui.findEdit); shiftEnterAction->setShortcut(QKeySequence(tr("Shift+Enter"))); shiftEnterAction->setShortcutContext(Qt::WidgetShortcut); connect(shiftEnterAction, &QAction::triggered, this, &FindToolBar::invokeFindPrevious); m_ui.findEdit->addAction(shiftEnterAction); - QAction *shiftReturnAction = new QAction(m_ui.findEdit); + auto shiftReturnAction = new QAction(m_ui.findEdit); shiftReturnAction->setShortcut(QKeySequence(tr("Shift+Return"))); shiftReturnAction->setShortcutContext(Qt::WidgetShortcut); connect(shiftReturnAction, &QAction::triggered, this, &FindToolBar::invokeFindPrevious); m_ui.findEdit->addAction(shiftReturnAction); - QAction *shiftEnterReplaceAction = new QAction(m_ui.replaceEdit); + auto shiftEnterReplaceAction = new QAction(m_ui.replaceEdit); shiftEnterReplaceAction->setShortcut(QKeySequence(tr("Shift+Enter"))); shiftEnterReplaceAction->setShortcutContext(Qt::WidgetShortcut); connect(shiftEnterReplaceAction, &QAction::triggered, this, &FindToolBar::invokeReplacePrevious); m_ui.replaceEdit->addAction(shiftEnterReplaceAction); - QAction *shiftReturnReplaceAction = new QAction(m_ui.replaceEdit); + auto shiftReturnReplaceAction = new QAction(m_ui.replaceEdit); shiftReturnReplaceAction->setShortcut(QKeySequence(tr("Shift+Return"))); shiftReturnReplaceAction->setShortcutContext(Qt::WidgetShortcut); connect(shiftReturnReplaceAction, &QAction::triggered, @@ -313,9 +313,7 @@ FindToolBar::FindToolBar(CurrentDocumentFind *currentDocumentFind) connect(&m_findStepTimer, &QTimer::timeout, this, &FindToolBar::invokeFindStep); } -FindToolBar::~FindToolBar() -{ -} +FindToolBar::~FindToolBar() = default; void FindToolBar::findCompleterActivated(const QModelIndex &index) { @@ -342,7 +340,7 @@ void FindToolBar::installEventFilters() bool FindToolBar::eventFilter(QObject *obj, QEvent *event) { if (event->type() == QEvent::KeyPress) { - QKeyEvent *ke = static_cast<QKeyEvent *>(event); + auto ke = static_cast<QKeyEvent *>(event); if (ke->key() == Qt::Key_Down) { if (obj == m_ui.findEdit) { if (m_ui.findEdit->text().isEmpty()) @@ -358,7 +356,7 @@ bool FindToolBar::eventFilter(QObject *obj, QEvent *event) if ((obj == m_ui.findEdit || obj == m_findCompleter->popup()) && event->type() == QEvent::KeyPress) { - QKeyEvent *ke = static_cast<QKeyEvent *>(event); + auto ke = static_cast<QKeyEvent *>(event); if (ke->key() == Qt::Key_Space && (ke->modifiers() & Utils::HostOsInfo::controlModifier())) { QString completedText = m_currentDocumentFind->completedFindString(); if (!completedText.isEmpty()) { @@ -368,7 +366,7 @@ bool FindToolBar::eventFilter(QObject *obj, QEvent *event) } } } else if (obj == this && event->type() == QEvent::ShortcutOverride) { - QKeyEvent *ke = static_cast<QKeyEvent *>(event); + auto ke = static_cast<QKeyEvent *>(event); if (ke->key() == Qt::Key_Space && (ke->modifiers() & Utils::HostOsInfo::controlModifier())) { event->accept(); return true; @@ -394,7 +392,7 @@ void FindToolBar::adaptToCandidate() void FindToolBar::updateGlobalActions() { IFindSupport *candidate = m_currentDocumentFind->candidate(); - bool enabled = (candidate != 0); + bool enabled = (candidate != nullptr); bool replaceEnabled = enabled && candidate->supportsReplace(); m_findInDocumentAction->setEnabled(enabled || (toolBarHasFocus() && isEnabled())); m_findNextSelectedAction->setEnabled(enabled); @@ -670,7 +668,7 @@ void FindToolBar::findFlagsChanged() void FindToolBar::findEditButtonClicked() { - OptionsPopup *popup = new OptionsPopup(m_ui.findEdit); + auto popup = new OptionsPopup(m_ui.findEdit); popup->show(); } @@ -753,7 +751,7 @@ FindToolBarPlaceHolder *FindToolBar::findToolBarPlaceHolder() const } candidate = candidate->parentWidget(); } - return 0; + return nullptr; } bool FindToolBar::toolBarHasFocus() const @@ -826,7 +824,7 @@ void FindToolBar::openFindToolBar(OpenFlags flags) FindToolBarPlaceHolder *previousHolder = FindToolBarPlaceHolder::getCurrent(); if (previousHolder != holder) { if (previousHolder) - previousHolder->setWidget(0); + previousHolder->setWidget(nullptr); holder->setWidget(this); FindToolBarPlaceHolder::setCurrent(holder); } @@ -987,7 +985,7 @@ OptionsPopup::OptionsPopup(QWidget *parent) : QWidget(parent, Qt::Popup) { setAttribute(Qt::WA_DeleteOnClose); - QVBoxLayout *layout = new QVBoxLayout(this); + auto layout = new QVBoxLayout(this); layout->setContentsMargins(2, 2, 2, 2); layout->setSpacing(2); setLayout(layout); @@ -1003,7 +1001,7 @@ OptionsPopup::OptionsPopup(QWidget *parent) bool OptionsPopup::event(QEvent *ev) { if (ev->type() == QEvent::ShortcutOverride) { - QKeyEvent *ke = static_cast<QKeyEvent *>(ev); + auto ke = static_cast<QKeyEvent *>(ev); if (ke->key() == Qt::Key_Escape && !ke->modifiers()) { ev->accept(); return true; @@ -1014,9 +1012,9 @@ bool OptionsPopup::event(QEvent *ev) bool OptionsPopup::eventFilter(QObject *obj, QEvent *ev) { - QCheckBox *checkbox = qobject_cast<QCheckBox *>(obj); + auto checkbox = qobject_cast<QCheckBox *>(obj); if (ev->type() == QEvent::KeyPress && checkbox) { - QKeyEvent *ke = static_cast<QKeyEvent *>(ev); + auto ke = static_cast<QKeyEvent *>(ev); if (!ke->modifiers() && (ke->key() == Qt::Key_Enter || ke->key() == Qt::Key_Return)) { checkbox->click(); ev->accept(); @@ -1028,7 +1026,7 @@ bool OptionsPopup::eventFilter(QObject *obj, QEvent *ev) void OptionsPopup::actionChanged() { - QAction *action = qobject_cast<QAction *>(sender()); + auto action = qobject_cast<QAction *>(sender()); QTC_ASSERT(action, return); QCheckBox *checkbox = m_checkboxMap.value(action); QTC_ASSERT(checkbox, return); diff --git a/src/plugins/coreplugin/find/findtoolbar.h b/src/plugins/coreplugin/find/findtoolbar.h index c1c78e6bcc..1095317682 100644 --- a/src/plugins/coreplugin/find/findtoolbar.h +++ b/src/plugins/coreplugin/find/findtoolbar.h @@ -51,8 +51,8 @@ public: explicit OptionsPopup(QWidget *parent); protected: - bool event(QEvent *ev); - bool eventFilter(QObject *obj, QEvent *ev); + bool event(QEvent *ev) override; + bool eventFilter(QObject *obj, QEvent *ev) override; private: void actionChanged(); @@ -77,7 +77,7 @@ public: Q_DECLARE_FLAGS(OpenFlags, OpenFlag) explicit FindToolBar(CurrentDocumentFind *currentDocumentFind); - ~FindToolBar(); + ~FindToolBar() override; void readSettings(); void writeSettings(); @@ -91,8 +91,8 @@ public slots: void setBackward(bool backward); protected: - bool focusNextPrevChild(bool next); - void resizeEvent(QResizeEvent *event); + bool focusNextPrevChild(bool next) override; + void resizeEvent(QResizeEvent *event) override; private: void invokeFindNext(); @@ -147,7 +147,7 @@ private: void acceptCandidateAndMoveToolBar(); void indicateSearchState(IFindSupport::Result searchState); - bool eventFilter(QObject *obj, QEvent *event); + bool eventFilter(QObject *obj, QEvent *event) override; void setFindText(const QString &text); QString getFindText(); QString getReplaceText(); diff --git a/src/plugins/coreplugin/find/findtoolwindow.cpp b/src/plugins/coreplugin/find/findtoolwindow.cpp index 7bb01b67a3..85897fb8ae 100644 --- a/src/plugins/coreplugin/find/findtoolwindow.cpp +++ b/src/plugins/coreplugin/find/findtoolwindow.cpp @@ -41,7 +41,7 @@ using namespace Core; using namespace Core::Internal; -static FindToolWindow *m_instance = 0; +static FindToolWindow *m_instance = nullptr; static bool validateRegExp(Utils::FancyLineEdit *edit, QString *errorMessage) { @@ -63,8 +63,8 @@ static bool validateRegExp(Utils::FancyLineEdit *edit, QString *errorMessage) FindToolWindow::FindToolWindow(QWidget *parent) : QWidget(parent), m_findCompleter(new QCompleter(this)), - m_currentFilter(0), - m_configWidget(0) + m_currentFilter(nullptr), + m_configWidget(nullptr) { m_instance = this; m_ui.setupUi(this); @@ -93,7 +93,7 @@ FindToolWindow::FindToolWindow(QWidget *parent) connect(m_ui.searchTerm, &Utils::FancyLineEdit::validChanged, this, &FindToolWindow::updateButtonStates); - QVBoxLayout *layout = new QVBoxLayout; + auto layout = new QVBoxLayout; layout->setMargin(0); layout->setSpacing(0); m_ui.configWidget->setLayout(layout); @@ -115,7 +115,7 @@ FindToolWindow *FindToolWindow::instance() bool FindToolWindow::event(QEvent *event) { if (event->type() == QEvent::KeyPress) { - QKeyEvent *ke = static_cast<QKeyEvent *>(event); + auto ke = static_cast<QKeyEvent *>(event); if ((ke->key() == Qt::Key_Return || ke->key() == Qt::Key_Enter) && (ke->modifiers() == Qt::NoModifier || ke->modifiers() == Qt::KeypadModifier)) { ke->accept(); @@ -130,7 +130,7 @@ bool FindToolWindow::event(QEvent *event) bool FindToolWindow::eventFilter(QObject *obj, QEvent *event) { if (obj == m_ui.searchTerm && event->type() == QEvent::KeyPress) { - QKeyEvent *ke = static_cast<QKeyEvent *>(event); + auto ke = static_cast<QKeyEvent *>(event); if (ke->key() == Qt::Key_Down) { if (m_ui.searchTerm->text().isEmpty()) m_findCompleter->setCompletionPrefix(QString()); @@ -247,12 +247,12 @@ void FindToolWindow::setCurrentFilter(int index) m_ui.configWidget->layout()->addWidget(m_configWidget); } else { if (configWidget) - configWidget->setParent(0); + configWidget->setParent(nullptr); } } QWidget *w = m_ui.configWidget; while (w) { - QScrollArea *sa = qobject_cast<QScrollArea *>(w); + auto sa = qobject_cast<QScrollArea *>(w); if (sa) { sa->updateGeometry(); break; @@ -268,7 +268,7 @@ void FindToolWindow::setCurrentFilter(int index) void FindToolWindow::acceptAndGetParameters(QString *term, IFindFilter **filter) { QTC_ASSERT(filter, return); - *filter = 0; + *filter = nullptr; Find::updateFindCompletion(m_ui.searchTerm->text()); int index = m_ui.filterList->currentIndex(); QString searchTerm = m_ui.searchTerm->text(); @@ -277,13 +277,13 @@ void FindToolWindow::acceptAndGetParameters(QString *term, IFindFilter **filter) if (term) *term = searchTerm; if (searchTerm.isEmpty() && *filter && !(*filter)->isValid()) - *filter = 0; + *filter = nullptr; } void FindToolWindow::search() { QString term; - IFindFilter *filter = 0; + IFindFilter *filter = nullptr; acceptAndGetParameters(&term, &filter); QTC_ASSERT(filter, return); filter->findAll(term, Find::findFlags()); @@ -292,7 +292,7 @@ void FindToolWindow::search() void FindToolWindow::replace() { QString term; - IFindFilter *filter = 0; + IFindFilter *filter = nullptr; acceptAndGetParameters(&term, &filter); QTC_ASSERT(filter, return); filter->replaceAll(term, Find::findFlags()); diff --git a/src/plugins/coreplugin/find/findtoolwindow.h b/src/plugins/coreplugin/find/findtoolwindow.h index 10097f1e80..91db0bd4db 100644 --- a/src/plugins/coreplugin/find/findtoolwindow.h +++ b/src/plugins/coreplugin/find/findtoolwindow.h @@ -42,8 +42,8 @@ class FindToolWindow : public QWidget Q_OBJECT public: - explicit FindToolWindow(QWidget *parent = 0); - ~FindToolWindow(); + explicit FindToolWindow(QWidget *parent = nullptr); + ~FindToolWindow() override; static FindToolWindow *instance(); void setFindFilters(const QList<IFindFilter *> &filters); @@ -55,8 +55,8 @@ public: void writeSettings(); protected: - bool event(QEvent *event); - bool eventFilter(QObject *obj, QEvent *event); + bool event(QEvent *event) override; + bool eventFilter(QObject *obj, QEvent *event) override; private: void search(); diff --git a/src/plugins/coreplugin/find/highlightscrollbarcontroller.cpp b/src/plugins/coreplugin/find/highlightscrollbarcontroller.cpp index e9c8b237ae..c760460fac 100644 --- a/src/plugins/coreplugin/find/highlightscrollbarcontroller.cpp +++ b/src/plugins/coreplugin/find/highlightscrollbarcontroller.cpp @@ -204,7 +204,7 @@ void HighlightScrollBarOverlay::drawHighlights(QPainter *painter, const QColor &color = creatorTheme()->color(itColor.key()); const QMap<int, int> &positions = itColor.value(); const auto itPosEnd = positions.constEnd(); - const int firstPos = int(docStart / lineHeight); + const auto firstPos = int(docStart / lineHeight); auto itPos = positions.upperBound(firstPos); if (itPos != positions.constBegin()) --itPos; diff --git a/src/plugins/coreplugin/find/ifindsupport.h b/src/plugins/coreplugin/find/ifindsupport.h index 384caddf27..213e1feb0d 100644 --- a/src/plugins/coreplugin/find/ifindsupport.h +++ b/src/plugins/coreplugin/find/ifindsupport.h @@ -40,7 +40,7 @@ public: enum Result { Found, NotFound, NotYetFound }; IFindSupport() : QObject(nullptr) {} - ~IFindSupport() override {} + ~IFindSupport() override = default; virtual bool supportsReplace() const = 0; virtual FindFlags supportedFindFlags() const = 0; diff --git a/src/plugins/coreplugin/find/itemviewfind.cpp b/src/plugins/coreplugin/find/itemviewfind.cpp index cc2dd466e5..13174c8cd9 100644 --- a/src/plugins/coreplugin/find/itemviewfind.cpp +++ b/src/plugins/coreplugin/find/itemviewfind.cpp @@ -230,7 +230,7 @@ IFindSupport::Result ItemViewFind::find(const QString &searchTxt, d->m_view->setCurrentIndex(resultIndex); d->m_view->scrollTo(resultIndex); if (resultIndex.parent().isValid()) - if (QTreeView *treeView = qobject_cast<QTreeView *>(d->m_view)) + if (auto treeView = qobject_cast<QTreeView *>(d->m_view)) treeView->expand(resultIndex.parent()); if (wrapped) *wrapped = anyWrapped; diff --git a/src/plugins/coreplugin/find/searchresulttreeitemdelegate.cpp b/src/plugins/coreplugin/find/searchresulttreeitemdelegate.cpp index de67e62b99..81ec2541c6 100644 --- a/src/plugins/coreplugin/find/searchresulttreeitemdelegate.cpp +++ b/src/plugins/coreplugin/find/searchresulttreeitemdelegate.cpp @@ -134,7 +134,7 @@ int SearchResultTreeItemDelegate::drawLineNumber(QPainter *painter, const QStyle opt.palette.setColor(cg, QPalette::Text, Qt::darkGray); const QStyle *style = QApplication::style(); - const int textMargin = style->pixelMetric(QStyle::PM_FocusFrameHMargin, 0, 0) + 1; + const int textMargin = style->pixelMetric(QStyle::PM_FocusFrameHMargin, nullptr, nullptr) + 1; const QRect rowRect = lineNumberAreaRect.adjusted(-textMargin, 0, textMargin-lineNumberAreaHorizontalPadding, 0); QItemDelegate::drawDisplay(painter, opt, rowRect, lineText); diff --git a/src/plugins/coreplugin/find/searchresulttreeitemdelegate.h b/src/plugins/coreplugin/find/searchresulttreeitemdelegate.h index 99e05c2248..0551e4c8d7 100644 --- a/src/plugins/coreplugin/find/searchresulttreeitemdelegate.h +++ b/src/plugins/coreplugin/find/searchresulttreeitemdelegate.h @@ -33,8 +33,8 @@ namespace Internal { class SearchResultTreeItemDelegate: public QItemDelegate { public: - SearchResultTreeItemDelegate(int tabWidth, QObject *parent = 0); - void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; + SearchResultTreeItemDelegate(int tabWidth, QObject *parent = nullptr); + void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; void setTabWidth(int width); private: diff --git a/src/plugins/coreplugin/find/searchresulttreeitems.cpp b/src/plugins/coreplugin/find/searchresulttreeitems.cpp index e87681023b..51d6f9ced8 100644 --- a/src/plugins/coreplugin/find/searchresulttreeitems.cpp +++ b/src/plugins/coreplugin/find/searchresulttreeitems.cpp @@ -44,7 +44,7 @@ SearchResultTreeItem::~SearchResultTreeItem() bool SearchResultTreeItem::isLeaf() const { - return childrenCount() == 0 && parent() != 0; + return childrenCount() == 0 && parent() != nullptr; } Qt::CheckState SearchResultTreeItem::checkState() const @@ -96,7 +96,7 @@ int SearchResultTreeItem::insertionIndex(const QString &text, SearchResultTreeIt if (insertionPosition != m_children.end() && (*insertionPosition)->item.text == text) (*existingItem) = (*insertionPosition); else - *existingItem = 0; + *existingItem = nullptr; } return insertionPosition - m_children.begin(); } @@ -113,7 +113,7 @@ void SearchResultTreeItem::insertChild(int index, SearchResultTreeItem *child) void SearchResultTreeItem::insertChild(int index, const SearchResultItem &item) { - SearchResultTreeItem *child = new SearchResultTreeItem(item, this); + auto child = new SearchResultTreeItem(item, this); insertChild(index, child); } diff --git a/src/plugins/coreplugin/find/searchresulttreeitems.h b/src/plugins/coreplugin/find/searchresulttreeitems.h index 1709bc11d0..d4aa10f4ca 100644 --- a/src/plugins/coreplugin/find/searchresulttreeitems.h +++ b/src/plugins/coreplugin/find/searchresulttreeitems.h @@ -37,7 +37,7 @@ class SearchResultTreeItem { public: explicit SearchResultTreeItem(const SearchResultItem &item = SearchResultItem(), - SearchResultTreeItem *parent = NULL); + SearchResultTreeItem *parent = nullptr); virtual ~SearchResultTreeItem(); bool isLeaf() const; diff --git a/src/plugins/coreplugin/find/searchresulttreemodel.cpp b/src/plugins/coreplugin/find/searchresulttreemodel.cpp index a60b46553c..ea2c5ae9df 100644 --- a/src/plugins/coreplugin/find/searchresulttreemodel.cpp +++ b/src/plugins/coreplugin/find/searchresulttreemodel.cpp @@ -37,7 +37,7 @@ using namespace Core::Internal; SearchResultTreeModel::SearchResultTreeModel(QObject *parent) : QAbstractItemModel(parent) - , m_currentParent(0) + , m_currentParent(nullptr) , m_showReplaceUI(false) , m_editorFontIsUsed(false) { @@ -178,7 +178,7 @@ QVariant SearchResultTreeModel::data(const QModelIndex &idx, int role) const bool SearchResultTreeModel::setData(const QModelIndex &idx, const QVariant &value, int role) { if (role == Qt::CheckStateRole) { - Qt::CheckState checkState = static_cast<Qt::CheckState>(value.toInt()); + auto checkState = static_cast<Qt::CheckState>(value.toInt()); return setCheckState(idx, checkState); } return QAbstractItemModel::setData(idx, value, role); @@ -308,7 +308,7 @@ QSet<SearchResultTreeItem *> SearchResultTreeModel::addPath(const QStringList &p QSet<SearchResultTreeItem *> pathNodes; SearchResultTreeItem *currentItem = m_rootItem; QModelIndex currentItemIndex = QModelIndex(); - SearchResultTreeItem *partItem = 0; + SearchResultTreeItem *partItem = nullptr; QStringList currentPath; foreach (const QString &part, path) { const int insertionIndex = currentItem->insertionIndex(part, &partItem); @@ -418,7 +418,7 @@ QList<QModelIndex> SearchResultTreeModel::addResults(const QList<SearchResultIte void SearchResultTreeModel::clear() { beginResetModel(); - m_currentParent = NULL; + m_currentParent = nullptr; m_rootItem->clearChildren(); m_editorFontIsUsed = false; endResetModel(); diff --git a/src/plugins/coreplugin/find/searchresulttreemodel.h b/src/plugins/coreplugin/find/searchresulttreemodel.h index 9eeb10eec3..a8514e74c3 100644 --- a/src/plugins/coreplugin/find/searchresulttreemodel.h +++ b/src/plugins/coreplugin/find/searchresulttreemodel.h @@ -41,8 +41,8 @@ class SearchResultTreeModel : public QAbstractItemModel Q_OBJECT public: - SearchResultTreeModel(QObject *parent = 0); - ~SearchResultTreeModel(); + SearchResultTreeModel(QObject *parent = nullptr); + ~SearchResultTreeModel() override; void setShowReplaceUI(bool show); void setTextEditorFont(const QFont &font, const SearchResultColor &color); @@ -56,8 +56,8 @@ public: bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; QVariant headerData(int section, Qt::Orientation orientation, int role) const override; - QModelIndex next(const QModelIndex &idx, bool includeGenerated = false, bool *wrapped = 0) const; - QModelIndex prev(const QModelIndex &idx, bool includeGenerated = false, bool *wrapped = 0) const; + QModelIndex next(const QModelIndex &idx, bool includeGenerated = false, bool *wrapped = nullptr) const; + QModelIndex prev(const QModelIndex &idx, bool includeGenerated = false, bool *wrapped = nullptr) const; QList<QModelIndex> addResults(const QList<SearchResultItem> &items, SearchResult::AddMode mode); @@ -74,8 +74,8 @@ private: QSet<SearchResultTreeItem *> addPath(const QStringList &path); QVariant data(const SearchResultTreeItem *row, int role) const; bool setCheckState(const QModelIndex &idx, Qt::CheckState checkState, bool firstCall = true); - QModelIndex nextIndex(const QModelIndex &idx, bool *wrapped = 0) const; - QModelIndex prevIndex(const QModelIndex &idx, bool *wrapped = 0) const; + QModelIndex nextIndex(const QModelIndex &idx, bool *wrapped = nullptr) const; + QModelIndex prevIndex(const QModelIndex &idx, bool *wrapped = nullptr) const; SearchResultTreeItem *treeItemAtIndex(const QModelIndex &idx) const; SearchResultTreeItem *m_rootItem; diff --git a/src/plugins/coreplugin/find/searchresulttreeview.cpp b/src/plugins/coreplugin/find/searchresulttreeview.cpp index a8a3d3ba69..6a9b7067bf 100644 --- a/src/plugins/coreplugin/find/searchresulttreeview.cpp +++ b/src/plugins/coreplugin/find/searchresulttreeview.cpp @@ -89,7 +89,7 @@ void SearchResultTreeView::emitJumpToSearchResult(const QModelIndex &index) void SearchResultTreeView::setTabWidth(int tabWidth) { - SearchResultTreeItemDelegate *delegate = static_cast<SearchResultTreeItemDelegate *>(itemDelegate()); + auto delegate = static_cast<SearchResultTreeItemDelegate *>(itemDelegate()); delegate->setTabWidth(tabWidth); doItemsLayout(); } diff --git a/src/plugins/coreplugin/find/searchresulttreeview.h b/src/plugins/coreplugin/find/searchresulttreeview.h index bf80cba1ad..961940fe01 100644 --- a/src/plugins/coreplugin/find/searchresulttreeview.h +++ b/src/plugins/coreplugin/find/searchresulttreeview.h @@ -40,7 +40,7 @@ class SearchResultTreeView : public Utils::TreeView Q_OBJECT public: - explicit SearchResultTreeView(QWidget *parent = 0); + explicit SearchResultTreeView(QWidget *parent = nullptr); void setAutoExpandResults(bool expand); void setTextEditorFont(const QFont &font, const SearchResultColor &color); diff --git a/src/plugins/coreplugin/find/searchresultwidget.cpp b/src/plugins/coreplugin/find/searchresultwidget.cpp index d22531954d..9428a31a1d 100644 --- a/src/plugins/coreplugin/find/searchresultwidget.cpp +++ b/src/plugins/coreplugin/find/searchresultwidget.cpp @@ -69,7 +69,7 @@ public: } - QSize sizeHint() const + QSize sizeHint() const override { QSize sh = QLineEdit::minimumSizeHint(); sh.rwidth() += qMax(25 * fontMetrics().width(QLatin1Char('x')), @@ -81,7 +81,7 @@ public: SearchResultWidget::SearchResultWidget(QWidget *parent) : QWidget(parent) { - QVBoxLayout *layout = new QVBoxLayout(this); + auto layout = new QVBoxLayout(this); layout->setMargin(0); layout->setSpacing(0); setLayout(layout); @@ -122,7 +122,7 @@ SearchResultWidget::SearchResultWidget(QWidget *parent) : m_messageWidget->setLineWidth(1); } m_messageWidget->setAutoFillBackground(true); - QHBoxLayout *messageLayout = new QHBoxLayout(m_messageWidget); + auto messageLayout = new QHBoxLayout(m_messageWidget); messageLayout->setMargin(2); m_messageWidget->setLayout(messageLayout); QLabel *messageLabel = new QLabel(tr("Search was canceled.")); @@ -134,7 +134,7 @@ SearchResultWidget::SearchResultWidget(QWidget *parent) : m_searchResultTreeView = new SearchResultTreeView(this); m_searchResultTreeView->setFrameStyle(QFrame::NoFrame); m_searchResultTreeView->setAttribute(Qt::WA_MacShowFocusRect, false); - Aggregation::Aggregate * agg = new Aggregation::Aggregate; + auto agg = new Aggregation::Aggregate; agg->add(m_searchResultTreeView); agg->add(new ItemViewFind(m_searchResultTreeView, ItemDataRoles::ResultLineRole)); @@ -144,7 +144,7 @@ SearchResultWidget::SearchResultWidget(QWidget *parent) : m_infoBarDisplay.setInfoBar(&m_infoBar); m_descriptionContainer = new QWidget(topFindWidget); - QHBoxLayout *descriptionLayout = new QHBoxLayout(m_descriptionContainer); + auto descriptionLayout = new QHBoxLayout(m_descriptionContainer); m_descriptionContainer->setLayout(descriptionLayout); descriptionLayout->setMargin(0); m_descriptionContainer->setMinimumWidth(200); @@ -282,7 +282,7 @@ void SearchResultWidget::addResults(const QList<SearchResultItem> &items, Search emit paused(true); InfoBarEntry info(sizeWarningId, tr("The search resulted in more than %n items, do you still want to continue?", - 0, SEARCHRESULT_WARNING_LIMIT)); + nullptr, SEARCHRESULT_WARNING_LIMIT)); info.setCancelButtonInfo(tr("Cancel"), [this]() { cancelAfterSizeWarning(); }); info.setCustomButtonInfo(tr("Continue"), [this]() { continueAfterSizeWarning(); }); m_infoBar.addInfo(info); @@ -499,12 +499,12 @@ QList<SearchResultItem> SearchResultWidget::checkedItems() const const int fileCount = model->rowCount(); for (int i = 0; i < fileCount; ++i) { QModelIndex fileIndex = model->index(i, 0); - SearchResultTreeItem *fileItem = static_cast<SearchResultTreeItem *>(fileIndex.internalPointer()); - QTC_ASSERT(fileItem != 0, continue); + auto fileItem = static_cast<SearchResultTreeItem *>(fileIndex.internalPointer()); + QTC_ASSERT(fileItem != nullptr, continue); for (int rowIndex = 0; rowIndex < fileItem->childrenCount(); ++rowIndex) { QModelIndex textIndex = model->index(rowIndex, 0, fileIndex); - SearchResultTreeItem *rowItem = static_cast<SearchResultTreeItem *>(textIndex.internalPointer()); - QTC_ASSERT(rowItem != 0, continue); + auto rowItem = static_cast<SearchResultTreeItem *>(textIndex.internalPointer()); + QTC_ASSERT(rowItem != nullptr, continue); if (rowItem->checkState()) result << rowItem->item; } @@ -517,7 +517,7 @@ void SearchResultWidget::updateMatchesFoundLabel() if (m_count == 0) m_matchesFoundLabel->setText(tr("No matches found.")); else - m_matchesFoundLabel->setText(tr("%n matches found.", 0, m_count)); + m_matchesFoundLabel->setText(tr("%n matches found.", nullptr, m_count)); } } // namespace Internal diff --git a/src/plugins/coreplugin/find/searchresultwidget.h b/src/plugins/coreplugin/find/searchresultwidget.h index 5309ed69e1..22193a231e 100644 --- a/src/plugins/coreplugin/find/searchresultwidget.h +++ b/src/plugins/coreplugin/find/searchresultwidget.h @@ -49,8 +49,8 @@ class SearchResultWidget : public QWidget { Q_OBJECT public: - explicit SearchResultWidget(QWidget *parent = 0); - ~SearchResultWidget(); + explicit SearchResultWidget(QWidget *parent = nullptr); + ~SearchResultWidget() override; void setInfo(const QString &label, const QString &toolTip, const QString &term); QWidget *additionalReplaceWidget() const; diff --git a/src/plugins/coreplugin/find/searchresultwindow.cpp b/src/plugins/coreplugin/find/searchresultwindow.cpp index 7c790df2fa..7cea0166d1 100644 --- a/src/plugins/coreplugin/find/searchresultwindow.cpp +++ b/src/plugins/coreplugin/find/searchresultwindow.cpp @@ -67,7 +67,7 @@ namespace Internal { setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); } - QSize sizeHint() const + QSize sizeHint() const override { if (widget()) return widget()->size(); @@ -109,7 +109,7 @@ namespace Internal { SearchResultWindowPrivate::SearchResultWindowPrivate(SearchResultWindow *window, QWidget *nsp) : q(window), - m_expandCollapseButton(0), + m_expandCollapseButton(nullptr), m_expandCollapseAction(new QAction(tr("Expand All"), window)), m_spacer(new QWidget), m_historyLabel(new QLabel(tr("History:"))), @@ -178,7 +178,7 @@ namespace Internal { void SearchResultWindowPrivate::moveWidgetToTop() { - SearchResultWidget *widget = qobject_cast<SearchResultWidget *>(sender()); + auto widget = qobject_cast<SearchResultWidget *>(sender()); QTC_ASSERT(widget, return); int index = m_searchResultWidgets.indexOf(widget); if (index == 0) @@ -212,7 +212,7 @@ namespace Internal { void SearchResultWindowPrivate::popupRequested(bool focus) { - SearchResultWidget *widget = qobject_cast<SearchResultWidget *>(sender()); + auto widget = qobject_cast<SearchResultWidget *>(sender()); QTC_ASSERT(widget, return); int internalIndex = m_searchResultWidgets.indexOf(widget) + 1/*account for "new search" entry*/; setCurrentIndex(internalIndex, focus); @@ -297,7 +297,7 @@ using namespace Core::Internal; \internal */ -SearchResultWindow *SearchResultWindow::m_instance = 0; +SearchResultWindow *SearchResultWindow::m_instance = nullptr; /*! \internal @@ -316,7 +316,7 @@ SearchResultWindow::~SearchResultWindow() { qDeleteAll(d->m_searchResults); delete d->m_widget; - d->m_widget = 0; + d->m_widget = nullptr; delete d; } diff --git a/src/plugins/coreplugin/findplaceholder.cpp b/src/plugins/coreplugin/findplaceholder.cpp index 90ade039d5..101ccf87df 100644 --- a/src/plugins/coreplugin/findplaceholder.cpp +++ b/src/plugins/coreplugin/findplaceholder.cpp @@ -30,12 +30,12 @@ using namespace Core; -FindToolBarPlaceHolder *FindToolBarPlaceHolder::m_current = 0; +FindToolBarPlaceHolder *FindToolBarPlaceHolder::m_current = nullptr; static QList<FindToolBarPlaceHolder *> g_findToolBarPlaceHolders; FindToolBarPlaceHolder::FindToolBarPlaceHolder(QWidget *owner, QWidget *parent) - : QWidget(parent), m_owner(owner), m_subWidget(0), m_lightColored(false) + : QWidget(parent), m_owner(owner), m_subWidget(nullptr) { g_findToolBarPlaceHolders.append(this); setLayout(new QVBoxLayout); @@ -48,10 +48,10 @@ FindToolBarPlaceHolder::~FindToolBarPlaceHolder() g_findToolBarPlaceHolders.removeOne(this); if (m_subWidget) { m_subWidget->setVisible(false); - m_subWidget->setParent(0); + m_subWidget->setParent(nullptr); } if (m_current == this) - m_current = 0; + m_current = nullptr; } const QList<FindToolBarPlaceHolder *> FindToolBarPlaceHolder::allFindToolbarPlaceHolders() @@ -82,7 +82,7 @@ void FindToolBarPlaceHolder::setWidget(Internal::FindToolBar *widget) { if (m_subWidget) { m_subWidget->setVisible(false); - m_subWidget->setParent(0); + m_subWidget->setParent(nullptr); } m_subWidget = widget; if (m_subWidget) { diff --git a/src/plugins/coreplugin/findplaceholder.h b/src/plugins/coreplugin/findplaceholder.h index 685fae6fb0..a9f8fa9c73 100644 --- a/src/plugins/coreplugin/findplaceholder.h +++ b/src/plugins/coreplugin/findplaceholder.h @@ -56,7 +56,7 @@ public: private: QWidget *m_owner; QPointer<Internal::FindToolBar> m_subWidget; - bool m_lightColored; + bool m_lightColored = false; static FindToolBarPlaceHolder *m_current; }; diff --git a/src/plugins/coreplugin/generalsettings.cpp b/src/plugins/coreplugin/generalsettings.cpp index b4eedbb0d9..27788d5711 100644 --- a/src/plugins/coreplugin/generalsettings.cpp +++ b/src/plugins/coreplugin/generalsettings.cpp @@ -48,7 +48,7 @@ namespace Internal { const char settingsKeyDPI[] = "Core/EnableHighDpiScaling"; GeneralSettings::GeneralSettings() - : m_page(0), m_dialog(0) + : m_page(nullptr), m_dialog(nullptr) { setId(Constants::SETTINGS_ID_INTERFACE); setDisplayName(tr("Interface")); @@ -143,7 +143,7 @@ void GeneralSettings::finish() { delete m_widget; delete m_page; - m_page = 0; + m_page = nullptr; } void GeneralSettings::resetInterfaceColor() diff --git a/src/plugins/coreplugin/generalsettings.h b/src/plugins/coreplugin/generalsettings.h index 584048bf72..ed0f177532 100644 --- a/src/plugins/coreplugin/generalsettings.h +++ b/src/plugins/coreplugin/generalsettings.h @@ -44,9 +44,9 @@ class GeneralSettings : public IOptionsPage public: GeneralSettings(); - QWidget *widget(); - void apply(); - void finish(); + QWidget *widget() override; + void apply() override; + void finish() override; private: void resetInterfaceColor(); diff --git a/src/plugins/coreplugin/generatedfile.cpp b/src/plugins/coreplugin/generatedfile.cpp index 094d1ab148..7d3c77c8cb 100644 --- a/src/plugins/coreplugin/generatedfile.cpp +++ b/src/plugins/coreplugin/generatedfile.cpp @@ -49,19 +49,18 @@ namespace Core { class GeneratedFilePrivate : public QSharedData { public: - GeneratedFilePrivate() : binary(false) {} + GeneratedFilePrivate() = default; explicit GeneratedFilePrivate(const QString &p); QString path; QByteArray contents; Id editorId; - bool binary; + bool binary = false; GeneratedFile::Attributes attributes; }; GeneratedFilePrivate::GeneratedFilePrivate(const QString &p) : path(QDir::cleanPath(p)), - binary(false), - attributes(0) + attributes({}) { } @@ -75,10 +74,7 @@ GeneratedFile::GeneratedFile(const QString &p) : { } -GeneratedFile::GeneratedFile(const GeneratedFile &rhs) : - m_d(rhs.m_d) -{ -} +GeneratedFile::GeneratedFile(const GeneratedFile &rhs) = default; GeneratedFile &GeneratedFile::operator=(const GeneratedFile &rhs) { @@ -87,9 +83,7 @@ GeneratedFile &GeneratedFile::operator=(const GeneratedFile &rhs) return *this; } -GeneratedFile::~GeneratedFile() -{ -} +GeneratedFile::~GeneratedFile() = default; QString GeneratedFile::path() const { diff --git a/src/plugins/coreplugin/generatedfile.h b/src/plugins/coreplugin/generatedfile.h index 9fb2815837..1cd97d95cf 100644 --- a/src/plugins/coreplugin/generatedfile.h +++ b/src/plugins/coreplugin/generatedfile.h @@ -84,6 +84,6 @@ private: QSharedDataPointer<GeneratedFilePrivate> m_d; }; -typedef QList<GeneratedFile> GeneratedFiles; +using GeneratedFiles = QList<GeneratedFile>; } // namespace Core diff --git a/src/plugins/coreplugin/helpmanager.cpp b/src/plugins/coreplugin/helpmanager.cpp index 82ce813904..51a2c426d7 100644 --- a/src/plugins/coreplugin/helpmanager.cpp +++ b/src/plugins/coreplugin/helpmanager.cpp @@ -57,10 +57,7 @@ namespace Core { struct HelpManagerPrivate { - HelpManagerPrivate() : - m_needsSetup(true), m_helpEngine(nullptr), m_collectionWatcher(nullptr) - {} - + HelpManagerPrivate() = default; ~HelpManagerPrivate(); const QStringList documentationFromInstaller(); @@ -68,9 +65,9 @@ struct HelpManagerPrivate void writeSettings(); void cleanUpDocumentation(); - bool m_needsSetup; - QHelpEngineCore *m_helpEngine; - Utils::FileSystemWatcher *m_collectionWatcher; + bool m_needsSetup = true; + QHelpEngineCore *m_helpEngine = nullptr; + Utils::FileSystemWatcher *m_collectionWatcher = nullptr; // data for delayed initialization QSet<QString> m_filesToRegister; @@ -506,7 +503,7 @@ void HelpManagerPrivate::writeSettings() namespace Core { -HelpManager *HelpManager::instance() { return 0; } +HelpManager *HelpManager::instance() { return nullptr; } QString HelpManager::collectionFilePath() { return QString(); } @@ -542,7 +539,7 @@ void HelpManager::handleHelpRequest(const QUrl &, HelpManager::HelpViewerLocatio void HelpManager::handleHelpRequest(const QString &, HelpViewerLocation) {} HelpManager::HelpManager(QObject *) {} -HelpManager::~HelpManager() {} +HelpManager::~HelpManager() = default; void HelpManager::aboutToShutdown() {} void HelpManager::setupHelpManager() {} diff --git a/src/plugins/coreplugin/helpmanager.h b/src/plugins/coreplugin/helpmanager.h index 466f0feff3..33ba4f07a1 100644 --- a/src/plugins/coreplugin/helpmanager.h +++ b/src/plugins/coreplugin/helpmanager.h @@ -56,7 +56,7 @@ public: ExternalHelpAlways = 3 }; - typedef QHash<QString, QStringList> Filters; + using Filters = QHash<QString, QStringList>; static HelpManager *instance(); static QString collectionFilePath(); diff --git a/src/plugins/coreplugin/icontext.h b/src/plugins/coreplugin/icontext.h index 01daa739b5..d7bb022c5b 100644 --- a/src/plugins/coreplugin/icontext.h +++ b/src/plugins/coreplugin/icontext.h @@ -40,7 +40,7 @@ namespace Core { class CORE_EXPORT Context { public: - Context() {} + Context() = default; explicit Context(Id c1) { add(c1); } Context(Id c1, Id c2) { add(c1); add(c2); } @@ -51,7 +51,7 @@ public: Id at(int i) const { return d.at(i); } // FIXME: Make interface slimmer. - typedef QList<Id>::const_iterator const_iterator; + using const_iterator = QList<Id>::const_iterator; const_iterator begin() const { return d.begin(); } const_iterator end() const { return d.end(); } int indexOf(Id c) const { return d.indexOf(c); } diff --git a/src/plugins/coreplugin/icore.cpp b/src/plugins/coreplugin/icore.cpp index 359cb7012e..f88f0f8df4 100644 --- a/src/plugins/coreplugin/icore.cpp +++ b/src/plugins/coreplugin/icore.cpp @@ -337,8 +337,8 @@ ICore::ICore(MainWindow *mainwindow) ICore::~ICore() { - m_instance = 0; - m_mainwindow = 0; + m_instance = nullptr; + m_mainwindow = nullptr; } void ICore::showNewItemDialog(const QString &title, @@ -459,6 +459,28 @@ QString ICore::libexecPath() return QDir::cleanPath(QApplication::applicationDirPath() + '/' + RELATIVE_LIBEXEC_PATH); } +static QString clangIncludePath(const QString &clangVersion) +{ + return "/lib/clang/" + clangVersion + "/include"; +} + +QString ICore::clangIncludeDirectory(const QString &clangVersion, const QString &clangResourceDirectory) +{ + QDir dir(libexecPath() + "/clang" + clangIncludePath(clangVersion)); + if (!dir.exists() || !QFileInfo(dir, "stdint.h").exists()) + dir = QDir(clangResourceDirectory); + return QDir::toNativeSeparators(dir.canonicalPath()); +} + +QString ICore::clangExecutable(const QString &clangBinDirectory) +{ + const QString hostExeSuffix(QTC_HOST_EXE_SUFFIX); + QFileInfo executable(libexecPath() + "/clang/bin/clang" + hostExeSuffix); + if (!executable.exists()) + executable = QFileInfo(clangBinDirectory + "/clang" + hostExeSuffix); + return QDir::toNativeSeparators(executable.canonicalFilePath()); +} + static QString compilerString() { #if defined(Q_CC_CLANG) // must be before GNU, because clang claims to be GNU too @@ -509,6 +531,11 @@ QWidget *ICore::currentContextWidget() return context ? context->widget() : nullptr; } +IContext *ICore::contextObject(QWidget *widget) +{ + return m_mainwindow->contextObject(widget); +} + QMainWindow *ICore::mainWindow() { diff --git a/src/plugins/coreplugin/icore.h b/src/plugins/coreplugin/icore.h index 4d53fedf91..37ce9b05dd 100644 --- a/src/plugins/coreplugin/icore.h +++ b/src/plugins/coreplugin/icore.h @@ -97,6 +97,9 @@ public: static QString installerResourcePath(); static QString documentationPath(); static QString libexecPath(); + static QString clangExecutable(const QString &clangBinDirectory); + static QString clangIncludeDirectory(const QString &clangVersion, + const QString &clangResourceDirectory); static QString versionString(); static QString buildCompatibilityString(); @@ -109,6 +112,7 @@ public: static IContext *currentContextObject(); static QWidget *currentContextWidget(); + static IContext *contextObject(QWidget *widget); // Adds and removes additional active contexts, these contexts are appended // to the currently active contexts. static void updateAdditionalContexts(const Context &remove, const Context &add, @@ -127,7 +131,8 @@ public: SwitchMode = 1, CanContainLineAndColumnNumbers = 2, /// Stop loading once the first file fails to load - StopOnLoadFail = 4 + StopOnLoadFail = 4, + SwitchSplitIfAlreadyVisible = 8 }; static void openFiles(const QStringList &fileNames, OpenFilesFlags flags = None); diff --git a/src/plugins/coreplugin/id.cpp b/src/plugins/coreplugin/id.cpp index 90a755f123..6e081746ae 100644 --- a/src/plugins/coreplugin/id.cpp +++ b/src/plugins/coreplugin/id.cpp @@ -56,9 +56,7 @@ namespace Core { class StringHolder { public: - StringHolder() - : n(0), str(0) - {} + StringHolder() = default; StringHolder(const char *s, int length) : n(length), str(s) @@ -72,8 +70,8 @@ public: h &= 0x0fffffff; } } - int n; - const char *str; + int n = 0; + const char *str = nullptr; quintptr h; }; diff --git a/src/plugins/coreplugin/id.h b/src/plugins/coreplugin/id.h index af56c32b10..fc912da1b0 100644 --- a/src/plugins/coreplugin/id.h +++ b/src/plugins/coreplugin/id.h @@ -40,8 +40,9 @@ namespace Core { class CORE_EXPORT Id { public: - Id() : m_id(0) {} + Id() = default; Id(const char *name); // Good to use. + Id(const QLatin1String &) = delete; Id withSuffix(int suffix) const; Id withSuffix(const char *suffix) const; @@ -72,11 +73,9 @@ public: static QStringList toStringList(const QSet<Id> &ids); private: - // Intentionally unimplemented - Id(const QLatin1String &) = delete; explicit Id(quintptr uid) : m_id(uid) {} - quintptr m_id; + quintptr m_id = 0; }; inline uint qHash(Id id) { return static_cast<uint>(id.uniqueIdentifier()); } diff --git a/src/plugins/coreplugin/idocumentfactory.cpp b/src/plugins/coreplugin/idocumentfactory.cpp index 016d562d8b..26ef65f608 100644 --- a/src/plugins/coreplugin/idocumentfactory.cpp +++ b/src/plugins/coreplugin/idocumentfactory.cpp @@ -49,7 +49,7 @@ const QList<IDocumentFactory *> IDocumentFactory::allDocumentFactories() IDocument *IDocumentFactory::open(const QString &filename) { - QTC_ASSERT(m_opener, return 0); + QTC_ASSERT(m_opener, return nullptr); return m_opener(filename); } diff --git a/src/plugins/coreplugin/idocumentfactory.h b/src/plugins/coreplugin/idocumentfactory.h index 9e203870f6..7534528c1f 100644 --- a/src/plugins/coreplugin/idocumentfactory.h +++ b/src/plugins/coreplugin/idocumentfactory.h @@ -46,7 +46,7 @@ public: static const QList<IDocumentFactory *> allDocumentFactories(); - typedef std::function<IDocument *(const QString &fileName)> Opener; + using Opener = std::function<IDocument *(const QString &fileName)>; IDocument *open(const QString &filename); QStringList mimeTypes() const { return m_mimeTypes; } diff --git a/src/plugins/coreplugin/inavigationwidgetfactory.cpp b/src/plugins/coreplugin/inavigationwidgetfactory.cpp index eb7c78993d..7fd39cccb7 100644 --- a/src/plugins/coreplugin/inavigationwidgetfactory.cpp +++ b/src/plugins/coreplugin/inavigationwidgetfactory.cpp @@ -91,7 +91,6 @@ static QList<INavigationWidgetFactory *> g_navigationWidgetFactories; Creates a \l{Core::NavigationViewFactory}. */ INavigationWidgetFactory::INavigationWidgetFactory() - : m_priority(0) { g_navigationWidgetFactories.append(this); } diff --git a/src/plugins/coreplugin/inavigationwidgetfactory.h b/src/plugins/coreplugin/inavigationwidgetfactory.h index b39786cfa6..f69687e517 100644 --- a/src/plugins/coreplugin/inavigationwidgetfactory.h +++ b/src/plugins/coreplugin/inavigationwidgetfactory.h @@ -78,7 +78,7 @@ public: private: QString m_displayName; - int m_priority; + int m_priority = 0; Id m_id; QKeySequence m_activationSequence; }; diff --git a/src/plugins/coreplugin/infobar.cpp b/src/plugins/coreplugin/infobar.cpp index 7efd7220cb..3ca512c554 100644 --- a/src/plugins/coreplugin/infobar.cpp +++ b/src/plugins/coreplugin/infobar.cpp @@ -202,7 +202,7 @@ void InfoBarDisplay::setInfoBar(InfoBar *infoBar) void InfoBarDisplay::infoBarDestroyed() { - m_infoBar = 0; + m_infoBar = nullptr; // Calling update() here causes a complicated crash on shutdown. // So instead we rely on the view now being either destroyed (in which case it // will delete the widgets itself) or setInfoBar() being called explicitly. @@ -233,10 +233,10 @@ void InfoBarDisplay::update() infoWidget->setLineWidth(1); infoWidget->setAutoFillBackground(true); - QHBoxLayout *hbox = new QHBoxLayout; + auto hbox = new QHBoxLayout; hbox->setMargin(2); - auto *vbox = new QVBoxLayout(infoWidget); + auto vbox = new QVBoxLayout(infoWidget); vbox->setMargin(0); vbox->addLayout(hbox); @@ -250,7 +250,7 @@ void InfoBarDisplay::update() vbox->addWidget(detailsWidget); } - auto *showDetailsButton = new QToolButton; + auto showDetailsButton = new QToolButton; showDetailsButton->setCheckable(true); showDetailsButton->setChecked(m_isShowingDetailsWidget); showDetailsButton->setText(tr("&Show Details")); @@ -271,7 +271,7 @@ void InfoBarDisplay::update() } if (!info.buttonText.isEmpty()) { - QToolButton *infoWidgetButton = new QToolButton; + auto infoWidgetButton = new QToolButton; infoWidgetButton->setText(info.buttonText); connect(infoWidgetButton, &QAbstractButton::clicked, [info]() { info.m_buttonCallBack(); }); @@ -279,7 +279,7 @@ void InfoBarDisplay::update() } const Id id = info.id; - QToolButton *infoWidgetSuppressButton = 0; + QToolButton *infoWidgetSuppressButton = nullptr; if (info.globalSuppression == InfoBarEntry::GlobalSuppressionEnabled) { infoWidgetSuppressButton = new QToolButton; infoWidgetSuppressButton->setText(tr("Do Not Show Again")); diff --git a/src/plugins/coreplugin/iversioncontrol.cpp b/src/plugins/coreplugin/iversioncontrol.cpp index 678e4ecc8c..befa60fbab 100644 --- a/src/plugins/coreplugin/iversioncontrol.cpp +++ b/src/plugins/coreplugin/iversioncontrol.cpp @@ -87,7 +87,7 @@ ShellCommand *IVersionControl::createInitialCheckoutCommand(const QString &url, Q_UNUSED(baseDirectory); Q_UNUSED(localName); Q_UNUSED(extraArgs); - return 0; + return nullptr; } QString IVersionControl::vcsTopic(const QString &topLevel) @@ -106,9 +106,7 @@ IVersionControl::OpenSupportMode IVersionControl::openSupportMode(const QString return NoOpen; } -IVersionControl::TopicCache::~TopicCache() -{ -} +IVersionControl::TopicCache::~TopicCache() = default; /*! Returns the topic for repository under \a topLevel. @@ -175,7 +173,7 @@ bool TestVersionControl::managesFile(const QString &workingDirectory, const QStr QFileInfo fi(workingDirectory + QLatin1Char('/') + fileName); QString dir = fi.absolutePath(); - if (!managesDirectory(dir, 0)) + if (!managesDirectory(dir, nullptr)) return false; QString file = fi.absoluteFilePath(); return m_managedFiles.contains(file); diff --git a/src/plugins/coreplugin/iversioncontrol.h b/src/plugins/coreplugin/iversioncontrol.h index 6386487e70..cdb780f7fc 100644 --- a/src/plugins/coreplugin/iversioncontrol.h +++ b/src/plugins/coreplugin/iversioncontrol.h @@ -241,7 +241,7 @@ class CORE_EXPORT TestVersionControl : public IVersionControl Q_OBJECT public: TestVersionControl(Id id, const QString &name) : - m_id(id), m_displayName(name), m_dirCount(0), m_fileCount(0) + m_id(id), m_displayName(name) { } ~TestVersionControl() override; @@ -273,8 +273,8 @@ private: QString m_displayName; QHash<QString, QString> m_managedDirs; QSet<QString> m_managedFiles; - mutable int m_dirCount; - mutable int m_fileCount; + mutable int m_dirCount = 0; + mutable int m_fileCount = 0; }; } // namespace Core diff --git a/src/plugins/coreplugin/iwizardfactory.cpp b/src/plugins/coreplugin/iwizardfactory.cpp index 2b74a17118..ce784e9e79 100644 --- a/src/plugins/coreplugin/iwizardfactory.cpp +++ b/src/plugins/coreplugin/iwizardfactory.cpp @@ -151,7 +151,7 @@ namespace { static QList<IFeatureProvider *> s_providerList; QList<IWizardFactory *> s_allFactories; QList<IWizardFactory::FactoryCreator> s_factoryCreators; -QAction *s_inspectWizardAction = 0; +QAction *s_inspectWizardAction = nullptr; bool s_areFactoriesLoaded = false; bool s_isWizardRunning = false; QWidget *s_currentWizard = nullptr; @@ -270,7 +270,7 @@ QString IWizardFactory::runPath(const QString &defaultPath) Utils::Wizard *IWizardFactory::runWizard(const QString &path, QWidget *parent, Id platform, const QVariantMap &variables) { - QTC_ASSERT(!s_isWizardRunning, return 0); + QTC_ASSERT(!s_isWizardRunning, return nullptr); s_isWizardRunning = true; ICore::updateNewItemDialogState(); diff --git a/src/plugins/coreplugin/iwizardfactory.h b/src/plugins/coreplugin/iwizardfactory.h index 4ab761d792..77339199ae 100644 --- a/src/plugins/coreplugin/iwizardfactory.h +++ b/src/plugins/coreplugin/iwizardfactory.h @@ -92,7 +92,7 @@ public: virtual bool isAvailable(Id platformId) const; QSet<Id> supportedPlatforms() const; - typedef std::function<QList<IWizardFactory *>()> FactoryCreator; + using FactoryCreator = std::function<QList<IWizardFactory *>()>; static void registerFactoryCreator(const FactoryCreator &creator); // Utility to find all registered wizards diff --git a/src/plugins/coreplugin/jsexpander.cpp b/src/plugins/coreplugin/jsexpander.cpp index 0c44512497..effa3464cc 100644 --- a/src/plugins/coreplugin/jsexpander.cpp +++ b/src/plugins/coreplugin/jsexpander.cpp @@ -101,7 +101,7 @@ JsExpander::JsExpander() JsExpander::~JsExpander() { delete d; - d = 0; + d = nullptr; } } // namespace Core diff --git a/src/plugins/coreplugin/locator/basefilefilter.cpp b/src/plugins/coreplugin/locator/basefilefilter.cpp index 2053528687..27cec55045 100644 --- a/src/plugins/coreplugin/locator/basefilefilter.cpp +++ b/src/plugins/coreplugin/locator/basefilefilter.cpp @@ -67,8 +67,7 @@ public: } // Internal } // Core -BaseFileFilter::Iterator::~Iterator() -{} +BaseFileFilter::Iterator::~Iterator() = default; BaseFileFilter::BaseFileFilter() : d(new Internal::BaseFileFilterPrivate) diff --git a/src/plugins/coreplugin/locator/directoryfilter.cpp b/src/plugins/coreplugin/locator/directoryfilter.cpp index 5bcfd9eb45..645bae42d3 100644 --- a/src/plugins/coreplugin/locator/directoryfilter.cpp +++ b/src/plugins/coreplugin/locator/directoryfilter.cpp @@ -212,7 +212,7 @@ void DirectoryFilter::refresh(QFutureInterface<void> &future) if (future.isProgressUpdateNeeded() || future.progressValue() == 0 /*workaround for regression in Qt*/) { future.setProgressValueAndText(subDirIterator.currentProgress(), - tr("%1 filter update: %n files", 0, filesFound.size()).arg(displayName())); + tr("%1 filter update: %n files", nullptr, filesFound.size()).arg(displayName())); } } diff --git a/src/plugins/coreplugin/locator/executefilter.cpp b/src/plugins/coreplugin/locator/executefilter.cpp index 810ed8e8c2..b85bf4ff28 100644 --- a/src/plugins/coreplugin/locator/executefilter.cpp +++ b/src/plugins/coreplugin/locator/executefilter.cpp @@ -85,7 +85,7 @@ void ExecuteFilter::accept(LocatorFilterEntry selection, Q_UNUSED(newText) Q_UNUSED(selectionStart) Q_UNUSED(selectionLength) - ExecuteFilter *p = const_cast<ExecuteFilter *>(this); + auto p = const_cast<ExecuteFilter *>(this); const QString value = selection.displayName.trimmed(); const int index = m_commandHistory.indexOf(value); diff --git a/src/plugins/coreplugin/locator/ilocatorfilter.cpp b/src/plugins/coreplugin/locator/ilocatorfilter.cpp index 5ba268b5e3..79aee8f637 100644 --- a/src/plugins/coreplugin/locator/ilocatorfilter.cpp +++ b/src/plugins/coreplugin/locator/ilocatorfilter.cpp @@ -167,8 +167,8 @@ bool ILocatorFilter::openConfigDialog(QWidget *parent, bool &needsRefresh) QDialog dialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint); dialog.setWindowTitle(msgConfigureDialogTitle()); - QVBoxLayout *vlayout = new QVBoxLayout(&dialog); - QHBoxLayout *hlayout = new QHBoxLayout; + auto vlayout = new QVBoxLayout(&dialog); + auto hlayout = new QHBoxLayout; QLineEdit *shortcutEdit = new QLineEdit(shortcutString()); QCheckBox *includeByDefault = new QCheckBox(msgIncludeByDefault()); includeByDefault->setToolTip(msgIncludeByDefaultToolTip()); diff --git a/src/plugins/coreplugin/locator/javascriptfilter.h b/src/plugins/coreplugin/locator/javascriptfilter.h index feaf326036..a11b9c0f21 100644 --- a/src/plugins/coreplugin/locator/javascriptfilter.h +++ b/src/plugins/coreplugin/locator/javascriptfilter.h @@ -43,9 +43,9 @@ class JavaScriptFilter : public Core::ILocatorFilter Q_OBJECT public: JavaScriptFilter(); - ~JavaScriptFilter(); + ~JavaScriptFilter() override; - virtual void prepareSearch(const QString &entry) override; + void prepareSearch(const QString &entry) override; QList<Core::LocatorFilterEntry> matchesFor(QFutureInterface<Core::LocatorFilterEntry> &future, const QString &entry) override; void accept(Core::LocatorFilterEntry selection, QString *newText, diff --git a/src/plugins/coreplugin/locator/locator.cpp b/src/plugins/coreplugin/locator/locator.cpp index dcfdba10ab..bdc1664c26 100644 --- a/src/plugins/coreplugin/locator/locator.cpp +++ b/src/plugins/coreplugin/locator/locator.cpp @@ -196,7 +196,7 @@ void Locator::updateFilterActions() continue; Id filterId = filter->id(); Id actionId = filter->actionId(); - QAction *action = 0; + QAction *action = nullptr; if (!actionCopy.contains(filterId)) { // register new action action = new QAction(filter->displayName(), this); diff --git a/src/plugins/coreplugin/locator/locator_test.cpp b/src/plugins/coreplugin/locator/locator_test.cpp index 68a65b88cd..8d6e4453a2 100644 --- a/src/plugins/coreplugin/locator/locator_test.cpp +++ b/src/plugins/coreplugin/locator/locator_test.cpp @@ -55,7 +55,7 @@ public: class ReferenceData { public: - ReferenceData() {} + ReferenceData() = default; ReferenceData(const QString &searchText, const ResultDataList &results) : searchText(searchText), results(results) {} diff --git a/src/plugins/coreplugin/locator/locatorfiltertest.cpp b/src/plugins/coreplugin/locator/locatorfiltertest.cpp index 889f3ba040..8318e008c1 100644 --- a/src/plugins/coreplugin/locator/locatorfiltertest.cpp +++ b/src/plugins/coreplugin/locator/locatorfiltertest.cpp @@ -41,9 +41,7 @@ BasicLocatorFilterTest::BasicLocatorFilterTest(ILocatorFilter *filter) : m_filte { } -BasicLocatorFilterTest::~BasicLocatorFilterTest() -{ -} +BasicLocatorFilterTest::~BasicLocatorFilterTest() = default; QList<LocatorFilterEntry> BasicLocatorFilterTest::matchesFor(const QString &searchText) { @@ -57,9 +55,7 @@ QList<LocatorFilterEntry> BasicLocatorFilterTest::matchesFor(const QString &sear return locatorSearch.results(); } -ResultData::ResultData() -{ -} +ResultData::ResultData() = default; ResultData::ResultData(const QString &textColumn1, const QString &textColumn2) : textColumn1(textColumn1), textColumn2(textColumn2) diff --git a/src/plugins/coreplugin/locator/locatorfiltertest.h b/src/plugins/coreplugin/locator/locatorfiltertest.h index 2841f72643..1b7a074bb7 100644 --- a/src/plugins/coreplugin/locator/locatorfiltertest.h +++ b/src/plugins/coreplugin/locator/locatorfiltertest.h @@ -51,7 +51,7 @@ private: class CORE_EXPORT ResultData { public: - typedef QList<ResultData> ResultDataList; + using ResultDataList = QList<ResultData>; ResultData(); ResultData(const QString &textColumn1, const QString &textColumn2); @@ -67,7 +67,7 @@ public: QString textColumn2; }; -typedef ResultData::ResultDataList ResultDataList; +using ResultDataList = ResultData::ResultDataList; } // namespace Tests } // namespace Core diff --git a/src/plugins/coreplugin/locator/locatormanager.cpp b/src/plugins/coreplugin/locator/locatormanager.cpp index 01c43b261a..0ff25b02cd 100644 --- a/src/plugins/coreplugin/locator/locatormanager.cpp +++ b/src/plugins/coreplugin/locator/locatormanager.cpp @@ -34,6 +34,8 @@ #include <extensionsystem/pluginmanager.h> #include <utils/qtcassert.h> +#include <QApplication> + using namespace Core::Internal; namespace Core { @@ -95,4 +97,15 @@ QWidget *LocatorManager::createLocatorInputWidget(QWidget *window) return locatorWidget; } +bool LocatorManager::locatorHasFocus() +{ + QWidget *w = qApp->focusWidget(); + while (w) { + if (qobject_cast<LocatorWidget *>(w)) + return true; + w = w->parentWidget(); + } + return false; +} + } // namespace Core diff --git a/src/plugins/coreplugin/locator/locatormanager.h b/src/plugins/coreplugin/locator/locatormanager.h index ffc7493cd0..5d58da418a 100644 --- a/src/plugins/coreplugin/locator/locatormanager.h +++ b/src/plugins/coreplugin/locator/locatormanager.h @@ -44,6 +44,8 @@ public: static void show(const QString &text, int selectionStart = -1, int selectionLength = 0); static QWidget *createLocatorInputWidget(QWidget *window); + + static bool locatorHasFocus(); }; } // namespace Core diff --git a/src/plugins/coreplugin/locator/locatorsettingspage.cpp b/src/plugins/coreplugin/locator/locatorsettingspage.cpp index 638448f103..d1b2df2183 100644 --- a/src/plugins/coreplugin/locator/locatorsettingspage.cpp +++ b/src/plugins/coreplugin/locator/locatorsettingspage.cpp @@ -161,7 +161,7 @@ QVariant CategoryItem::data(int column, int role) const } LocatorSettingsPage::LocatorSettingsPage(Locator *plugin) - : m_plugin(plugin), m_widget(0) + : m_plugin(plugin), m_widget(nullptr) { setId(Constants::FILTER_OPTIONS_PAGE); setDisplayName(QCoreApplication::translate("Locator", Constants::FILTER_OPTIONS_PAGE)); diff --git a/src/plugins/coreplugin/locator/locatorsettingspage.h b/src/plugins/coreplugin/locator/locatorsettingspage.h index bf2736e644..b2ce1a507b 100644 --- a/src/plugins/coreplugin/locator/locatorsettingspage.h +++ b/src/plugins/coreplugin/locator/locatorsettingspage.h @@ -52,9 +52,9 @@ class LocatorSettingsPage : public IOptionsPage public: explicit LocatorSettingsPage(Locator *plugin); - QWidget *widget(); - void apply(); - void finish(); + QWidget *widget() override; + void apply() override; + void finish() override; private: void updateButtonStates(); diff --git a/src/plugins/coreplugin/locator/locatorwidget.cpp b/src/plugins/coreplugin/locator/locatorwidget.cpp index 55be82072a..33a66f77ec 100644 --- a/src/plugins/coreplugin/locator/locatorwidget.cpp +++ b/src/plugins/coreplugin/locator/locatorwidget.cpp @@ -115,7 +115,7 @@ class CompletionList : public Utils::TreeView public: CompletionList(QWidget *parent = nullptr); - void setModel(QAbstractItemModel *model); + void setModel(QAbstractItemModel *model) override; void resizeHeaders(); @@ -124,8 +124,8 @@ public: void showCurrentItemToolTip(); - void keyPressEvent(QKeyEvent *event); - bool eventFilter(QObject *watched, QEvent *event); + void keyPressEvent(QKeyEvent *event) override; + bool eventFilter(QObject *watched, QEvent *event) override; private: QMetaObject::Connection m_updateSizeConnection; @@ -276,7 +276,7 @@ void CompletionList::setModel(QAbstractItemModel *newModel) }; if (model()) { - disconnect(model(), 0, this, 0); + disconnect(model(), nullptr, this, nullptr); } QTreeView::setModel(newModel); if (newModel) { @@ -506,7 +506,7 @@ void CompletionList::keyPressEvent(QKeyEvent *event) bool CompletionList::eventFilter(QObject *watched, QEvent *event) { if (watched == this && event->type() == QEvent::ShortcutOverride) { - QKeyEvent *ke = static_cast<QKeyEvent *>(event); + auto ke = static_cast<QKeyEvent *>(event); switch (ke->key()) { case Qt::Key_Escape: if (!ke->modifiers()) { @@ -537,7 +537,7 @@ LocatorWidget::LocatorWidget(Locator *locator) : setSizePolicy(sizePolicy); setMinimumSize(QSize(200, 0)); - QHBoxLayout *layout = new QHBoxLayout(this); + auto layout = new QHBoxLayout(this); setLayout(layout); layout->setMargin(0); layout->addWidget(m_fileLineEdit); @@ -592,6 +592,8 @@ LocatorWidget::LocatorWidget(Locator *locator) : updatePlaceholderText(locateCmd); } + connect(qApp, &QApplication::focusChanged, this, &LocatorWidget::updatePreviousFocusWidget); + connect(locator, &Locator::filtersChanged, this, &LocatorWidget::updateFilterList); updateFilterList(); } @@ -620,10 +622,32 @@ void LocatorWidget::updateFilterList() m_filterMenu->addAction(m_configureAction); } +bool LocatorWidget::isInMainWindow() const +{ + return window() == ICore::mainWindow(); +} + +void LocatorWidget::updatePreviousFocusWidget(QWidget *previous, QWidget *current) +{ + const auto isInLocator = [this](QWidget *w) { return w == this || isAncestorOf(w); }; + if (isInLocator(current) && !isInLocator(previous)) + m_previousFocusWidget = previous; +} + +static void resetFocus(QPointer<QWidget> previousFocus, bool isInMainWindow) +{ + if (previousFocus) { + previousFocus->setFocus(); + ICore::raiseWindow(previousFocus); + } else if (isInMainWindow) { + ModeManager::setFocusToCurrentMode(); + } +} + bool LocatorWidget::eventFilter(QObject *obj, QEvent *event) { if (obj == m_fileLineEdit && event->type() == QEvent::ShortcutOverride) { - QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); + auto keyEvent = static_cast<QKeyEvent *>(event); switch (keyEvent->key()) { case Qt::Key_P: case Qt::Key_N: @@ -638,7 +662,7 @@ bool LocatorWidget::eventFilter(QObject *obj, QEvent *event) if (QToolTip::isVisible()) QToolTip::hideText(); - QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); + auto keyEvent = static_cast<QKeyEvent *>(event); switch (keyEvent->key()) { case Qt::Key_PageUp: case Qt::Key_PageDown: @@ -683,7 +707,7 @@ bool LocatorWidget::eventFilter(QObject *obj, QEvent *event) break; } } else if (obj == m_fileLineEdit && event->type() == QEvent::KeyRelease) { - QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); + auto keyEvent = static_cast<QKeyEvent *>(event); if (m_possibleToolTipRequest) { m_possibleToolTipRequest = false; if ((keyEvent->key() == Qt::Key_Alt) @@ -695,18 +719,23 @@ bool LocatorWidget::eventFilter(QObject *obj, QEvent *event) } else if (obj == m_fileLineEdit && event->type() == QEvent::FocusOut) { emit lostFocus(); } else if (obj == m_fileLineEdit && event->type() == QEvent::FocusIn) { - QFocusEvent *fev = static_cast<QFocusEvent *>(event); + auto fev = static_cast<QFocusEvent *>(event); if (fev->reason() != Qt::ActiveWindowFocusReason) showPopupNow(); } else if (obj == this && event->type() == QEvent::ParentChange) { emit parentChanged(); } else if (obj == this && event->type() == QEvent::ShortcutOverride) { - QKeyEvent *ke = static_cast<QKeyEvent *>(event); + auto ke = static_cast<QKeyEvent *>(event); switch (ke->key()) { case Qt::Key_Escape: if (!ke->modifiers()) { event->accept(); - QTimer::singleShot(0, this, &LocatorWidget::setFocusToCurrentMode); + QTimer::singleShot(0, + this, + [focus = m_previousFocusWidget, + isInMainWindow = isInMainWindow()] { + resetFocus(focus, isInMainWindow); + }); return true; } break; @@ -723,11 +752,6 @@ bool LocatorWidget::eventFilter(QObject *obj, QEvent *event) return QWidget::eventFilter(obj, event); } -void LocatorWidget::setFocusToCurrentMode() -{ - ModeManager::setFocusToCurrentMode(); -} - void LocatorWidget::showPopupDelayed() { m_updateRequested = true; @@ -858,7 +882,7 @@ void LocatorWidget::acceptEntry(int row) entry.filter->accept(entry, &newText, &selectionStart, &selectionLength); if (newText.isEmpty()) { emit hidePopup(); - m_fileLineEdit->clearFocus(); + resetFocus(m_previousFocusWidget, isInMainWindow()); } else { showText(newText, selectionStart, selectionLength); } diff --git a/src/plugins/coreplugin/locator/locatorwidget.h b/src/plugins/coreplugin/locator/locatorwidget.h index 59805a76e2..6d5a3a2a74 100644 --- a/src/plugins/coreplugin/locator/locatorwidget.h +++ b/src/plugins/coreplugin/locator/locatorwidget.h @@ -79,10 +79,11 @@ private: void showConfigureDialog(); void addSearchResults(int firstIndex, int endIndex); void handleSearchFinished(); - void setFocusToCurrentMode(); void updateFilterList(); + bool isInMainWindow() const; - bool eventFilter(QObject *obj, QEvent *event); + void updatePreviousFocusWidget(QWidget *previous, QWidget *current); + bool eventFilter(QObject *obj, QEvent *event) override; void updateCompletionList(const QString &text); QList<ILocatorFilter*> filtersFor(const QString &text, QString &searchText); @@ -103,6 +104,7 @@ private: QWidget *m_progressIndicator = nullptr; QTimer m_showProgressTimer; Utils::optional<int> m_rowRequestedForAccept; + QPointer<QWidget> m_previousFocusWidget; }; class LocatorPopup : public QWidget diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp index cd76507098..68af2e6f89 100644 --- a/src/plugins/coreplugin/mainwindow.cpp +++ b/src/plugins/coreplugin/mainwindow.cpp @@ -192,7 +192,7 @@ MainWindow::MainWindow() : statusBar()->setProperty("p_styled", true); auto dropSupport = new DropSupport(this, [](QDropEvent *event, DropSupport *) { - return event->source() == 0; // only accept drops from the "outside" (e.g. file manager) + return event->source() == nullptr; // only accept drops from the "outside" (e.g. file manager) }); connect(dropSupport, &DropSupport::filesDropped, this, &MainWindow::openDroppedFiles); @@ -795,15 +795,10 @@ void MainWindow::openFile() static IDocumentFactory *findDocumentFactory(const QList<IDocumentFactory*> &fileFactories, const QFileInfo &fi) { - const MimeType mt = Utils::mimeTypeForFile(fi); - if (mt.isValid()) { - const QString typeName = mt.name(); - foreach (IDocumentFactory *factory, fileFactories) { - if (factory->mimeTypes().contains(typeName)) - return factory; - } - } - return 0; + const QString typeName = Utils::mimeTypeForFile(fi).name(); + return Utils::findOrDefault(fileFactories, [typeName](IDocumentFactory *f) { + return f->mimeTypes().contains(typeName); + }); } /*! Either opens \a fileNames with editors or loads a project. @@ -845,6 +840,8 @@ IDocument *MainWindow::openFiles(const QStringList &fileNames, QFlags<EditorManager::OpenEditorFlag> emFlags; if (flags & ICore::CanContainLineAndColumnNumbers) emFlags |= EditorManager::CanContainLineAndColumnNumber; + if (flags & ICore::SwitchSplitIfAlreadyVisible) + emFlags |= EditorManager::SwitchSplitIfAlreadyVisible; IEditor *editor = EditorManager::openEditor(absoluteFilePath, Id(), emFlags); if (!editor) { if (flags & ICore::StopOnLoadFail) @@ -953,7 +950,7 @@ void MainWindow::updateContextObject(const QList<IContext *> &context) if (debugMainWindow) { qDebug() << "new context objects =" << context; foreach (IContext *c, context) - qDebug() << (c ? c->widget() : 0) << (c ? c->widget()->metaObject()->className() : 0); + qDebug() << (c ? c->widget() : nullptr) << (c ? c->widget()->metaObject()->className() : nullptr); } } @@ -1152,7 +1149,7 @@ void MainWindow::destroyVersionDialog() { if (m_versionDialog) { m_versionDialog->deleteLater(); - m_versionDialog = 0; + m_versionDialog = nullptr; } } diff --git a/src/plugins/coreplugin/manhattanstyle.cpp b/src/plugins/coreplugin/manhattanstyle.cpp index add7b8c753..78e819a9c3 100644 --- a/src/plugins/coreplugin/manhattanstyle.cpp +++ b/src/plugins/coreplugin/manhattanstyle.cpp @@ -142,7 +142,7 @@ ManhattanStyle::ManhattanStyle(const QString &baseStyleName) ManhattanStyle::~ManhattanStyle() { delete d; - d = 0; + d = nullptr; } QPixmap ManhattanStyle::generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap, const QStyleOption *opt) const @@ -398,7 +398,7 @@ void ManhattanStyle::drawPrimitive(PrimitiveElement element, const QStyleOption QRect oldRect; QRect newRect; if (widget && (element == PE_PanelButtonTool) && !animating) { - QWidget *w = const_cast<QWidget *> (widget); + auto w = const_cast<QWidget *> (widget); int oldState = w->property("_q_stylestate").toInt(); oldRect = w->property("_q_stylerect").toRect(); newRect = w->rect(); @@ -422,7 +422,7 @@ void ManhattanStyle::drawPrimitive(PrimitiveElement element, const QStyleOption opt.state = (QStyle::State)oldState; opt.state |= State_Animating; startImage.fill(0); - Transition *t = new Transition; + auto t = new Transition; t->setWidget(w); QPainter startPainter(&startImage); if (!anim) { @@ -630,7 +630,7 @@ void ManhattanStyle::drawControl(ControlElement element, const QStyleOption *opt switch (element) { case CE_MenuItem: painter->save(); - if (const QStyleOptionMenuItem *mbi = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) { + if (const auto mbi = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) { const bool enabled = mbi->state & State_Enabled; QStyleOptionMenuItem item = *mbi; item.rect = mbi->rect; @@ -649,7 +649,7 @@ void ManhattanStyle::drawControl(ControlElement element, const QStyleOption *opt case CE_MenuBarItem: painter->save(); - if (const QStyleOptionMenuItem *mbi = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) { + if (const auto mbi = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) { const bool act = mbi->state & (State_Sunken | State_Selected); const bool dis = !(mbi->state & State_Enabled); @@ -687,7 +687,7 @@ void ManhattanStyle::drawControl(ControlElement element, const QStyleOption *opt break; case CE_ComboBoxLabel: - if (const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(option)) { + if (const auto cb = qstyleoption_cast<const QStyleOptionComboBox *>(option)) { if (panelWidget(widget)) { painter->save(); QRect editRect = subControlRect(CC_ComboBox, cb, SC_ComboBoxEditField, widget); @@ -872,7 +872,7 @@ void ManhattanStyle::drawComplexControl(ComplexControl control, const QStyleOpti QRect rect = option->rect; switch (control) { case CC_ToolButton: - if (const QStyleOptionToolButton *toolbutton = qstyleoption_cast<const QStyleOptionToolButton *>(option)) { + if (const auto toolbutton = qstyleoption_cast<const QStyleOptionToolButton *>(option)) { bool reverse = option->direction == Qt::RightToLeft; bool drawborder = (widget && widget->property("showborder").toBool()); @@ -946,7 +946,7 @@ void ManhattanStyle::drawComplexControl(ComplexControl control, const QStyleOpti break; case CC_ComboBox: - if (const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(option)) { + if (const auto cb = qstyleoption_cast<const QStyleOptionComboBox *>(option)) { painter->save(); bool isEmpty = cb->currentText.isEmpty() && cb->currentIcon.isNull(); bool reverse = option->direction == Qt::RightToLeft; diff --git a/src/plugins/coreplugin/menubarfilter.cpp b/src/plugins/coreplugin/menubarfilter.cpp index 6a82d8676e..69c178ae94 100644 --- a/src/plugins/coreplugin/menubarfilter.cpp +++ b/src/plugins/coreplugin/menubarfilter.cpp @@ -28,6 +28,8 @@ #include "actionmanager/actioncontainer.h" #include "actionmanager/actionmanager.h" #include "coreconstants.h" +#include "icore.h" +#include "locator/locatormanager.h" #include <utils/algorithm.h> #include <utils/qtcassert.h> @@ -38,6 +40,13 @@ #include <QRegularExpression> #include <QTimer> +QT_BEGIN_NAMESPACE +uint qHash(const QPointer<QAction> &p, uint seed) +{ + return qHash(p.data(), seed); +} +QT_END_NAMESPACE + using namespace Core::Internal; using namespace Core; @@ -46,6 +55,10 @@ MenuBarFilter::MenuBarFilter() setId("Actions from the menu"); setDisplayName(tr("Actions from the Menu")); setShortcutString("t"); + connect(ICore::instance(), &ICore::contextAboutToChange, this, [this] { + if (LocatorManager::locatorHasFocus()) + updateEnabledActionCache(); + }); } static const QList<QAction *> menuBarActions() @@ -59,17 +72,8 @@ QList<LocatorFilterEntry> MenuBarFilter::matchesFor(QFutureInterface<LocatorFilt const QString &entry) { Q_UNUSED(future); - static const QString separators = ". >/"; - static const QRegularExpression seperatorRegExp(QString("[%1]").arg(separators)); - QList<LocatorFilterEntry> entries; - QString normalized = entry; - normalized.replace(seperatorRegExp, separators.at(0)); - const QStringList entryPath = normalized.split(separators.at(0), QString::SkipEmptyParts); - QVector<const QMenu *> processedMenus; - for (QAction* action : menuBarActions()) - entries << matchesForAction(action, entryPath, QStringList(), processedMenus); - - return entries; + Q_UNUSED(entry); + return std::move(m_entries); } void MenuBarFilter::accept(LocatorFilterEntry selection, QString *newText, @@ -97,7 +101,7 @@ QList<LocatorFilterEntry> MenuBarFilter::matchesForAction(QAction *action, QVector<const QMenu *> &processedMenus) { QList<LocatorFilterEntry> entries; - if (!action->isEnabled()) + if (!m_enabledActions.contains(action)) return entries; const QString text = Utils::stripAccelerator(action->text()); if (QMenu *menu = action->menu()) { @@ -158,9 +162,36 @@ static void requestMenuUpdate(const QAction* action) } } +void MenuBarFilter::updateEnabledActionCache() +{ + m_enabledActions.clear(); + QList<QAction *> queue = menuBarActions(); + for (QAction *action : qAsConst(queue)) + requestMenuUpdate(action); + while (!queue.isEmpty()) { + QAction *action = queue.takeFirst(); + if (action->isEnabled()) { + m_enabledActions.insert(action); + if (QMenu *menu = action->menu()) { + if (menu->isEnabled()) + queue.append(menu->actions()); + } + } + } +} + void Core::Internal::MenuBarFilter::prepareSearch(const QString &entry) { Q_UNUSED(entry); - for (const QAction *action : menuBarActions()) + static const QString separators = ". >/"; + static const QRegularExpression seperatorRegExp(QString("[%1]").arg(separators)); + QString normalized = entry; + normalized.replace(seperatorRegExp, separators.at(0)); + const QStringList entryPath = normalized.split(separators.at(0), QString::SkipEmptyParts); + m_entries.clear(); + QVector<const QMenu *> processedMenus; + for (QAction* action : menuBarActions()) { requestMenuUpdate(action); + m_entries << matchesForAction(action, entryPath, QStringList(), processedMenus); + } } diff --git a/src/plugins/coreplugin/menubarfilter.h b/src/plugins/coreplugin/menubarfilter.h index c7b137e6a9..39633aa6f1 100644 --- a/src/plugins/coreplugin/menubarfilter.h +++ b/src/plugins/coreplugin/menubarfilter.h @@ -27,6 +27,10 @@ #include <coreplugin/locator/ilocatorfilter.h> +#include <QAction> +#include <QPointer> +#include <QSet> + QT_BEGIN_NAMESPACE class QAction; class QMenu; @@ -52,7 +56,10 @@ private: const QStringList &entryPath, const QStringList &path, QVector<const QMenu *> &processedMenus); + void updateEnabledActionCache(); + QList<LocatorFilterEntry> m_entries; + QSet<QPointer<QAction>> m_enabledActions; }; } // namespace Internal diff --git a/src/plugins/coreplugin/messagemanager.cpp b/src/plugins/coreplugin/messagemanager.cpp index f8d2b97506..c4bf4269a4 100644 --- a/src/plugins/coreplugin/messagemanager.cpp +++ b/src/plugins/coreplugin/messagemanager.cpp @@ -30,8 +30,8 @@ using namespace Core; -static MessageManager *m_instance = 0; -Internal::MessageOutputWindow *m_messageOutputWindow = 0; +static MessageManager *m_instance = nullptr; +Internal::MessageOutputWindow *m_messageOutputWindow = nullptr; MessageManager *MessageManager::instance() { @@ -54,7 +54,7 @@ void MessageManager::showOutputPane(Core::MessageManager::PrintToOutputPaneFlags MessageManager::MessageManager() { m_instance = this; - m_messageOutputWindow = 0; + m_messageOutputWindow = nullptr; qRegisterMetaType<MessageManager::PrintToOutputPaneFlags>(); } @@ -64,7 +64,7 @@ MessageManager::~MessageManager() ExtensionSystem::PluginManager::removeObject(m_messageOutputWindow); delete m_messageOutputWindow; } - m_instance = 0; + m_instance = nullptr; } void MessageManager::init() diff --git a/src/plugins/coreplugin/messageoutputwindow.cpp b/src/plugins/coreplugin/messageoutputwindow.cpp index 3675b23685..35a1bd50be 100644 --- a/src/plugins/coreplugin/messageoutputwindow.cpp +++ b/src/plugins/coreplugin/messageoutputwindow.cpp @@ -46,7 +46,7 @@ MessageOutputWindow::MessageOutputWindow() QColor activeHighlightedText = p.color(QPalette::Active, QPalette::HighlightedText); p.setColor(QPalette::HighlightedText, activeHighlightedText); m_widget->setPalette(p); - Aggregation::Aggregate *agg = new Aggregation::Aggregate; + auto agg = new Aggregation::Aggregate; agg->add(m_widget); agg->add(new BaseTextFind(m_widget)); } diff --git a/src/plugins/coreplugin/mimetypemagicdialog.cpp b/src/plugins/coreplugin/mimetypemagicdialog.cpp index 7968560562..5c1566d022 100644 --- a/src/plugins/coreplugin/mimetypemagicdialog.cpp +++ b/src/plugins/coreplugin/mimetypemagicdialog.cpp @@ -45,10 +45,7 @@ static Utils::Internal::MimeMagicRule::Type typeValue(int i) } MimeTypeMagicDialog::MimeTypeMagicDialog(QWidget *parent) : - QDialog(parent), - m_customRangeStart(0), - m_customRangeEnd(0), - m_customPriority(50) + QDialog(parent) { ui.setupUi(this); setWindowTitle(tr("Add Magic Header")); diff --git a/src/plugins/coreplugin/mimetypemagicdialog.h b/src/plugins/coreplugin/mimetypemagicdialog.h index 5f5bf8bfe6..f2140b28f6 100644 --- a/src/plugins/coreplugin/mimetypemagicdialog.h +++ b/src/plugins/coreplugin/mimetypemagicdialog.h @@ -36,8 +36,7 @@ class MagicData { public: MagicData() - : m_rule(Utils::Internal::MimeMagicRule::String, QByteArray(" "), 0, 0), - m_priority(0) + : m_rule(Utils::Internal::MimeMagicRule::String, QByteArray(" "), 0, 0) { } @@ -53,14 +52,14 @@ public: static QByteArray normalizedMask(const Utils::Internal::MimeMagicRule &rule); Utils::Internal::MimeMagicRule m_rule; - int m_priority; + int m_priority = 0; }; class MimeTypeMagicDialog : public QDialog { Q_DECLARE_TR_FUNCTIONS(Core::Internal::MimeTypeMagicDialog) public: - explicit MimeTypeMagicDialog(QWidget *parent = 0); + explicit MimeTypeMagicDialog(QWidget *parent = nullptr); void setMagicData(const MagicData &data); MagicData magicData() const; @@ -69,12 +68,12 @@ private: void setToRecommendedValues(); void applyRecommended(bool checked); void validateAccept(); - Utils::Internal::MimeMagicRule createRule(QString *errorMessage = 0) const; + Utils::Internal::MimeMagicRule createRule(QString *errorMessage = nullptr) const; Ui::MimeTypeMagicDialog ui; - int m_customRangeStart; - int m_customRangeEnd; - int m_customPriority; + int m_customRangeStart = 0; + int m_customRangeEnd = 0; + int m_customPriority = 50; }; } // Internal diff --git a/src/plugins/coreplugin/mimetypesettings.cpp b/src/plugins/coreplugin/mimetypesettings.cpp index 2e4272ab87..a5750d13c7 100644 --- a/src/plugins/coreplugin/mimetypesettings.cpp +++ b/src/plugins/coreplugin/mimetypesettings.cpp @@ -30,6 +30,7 @@ #include "ui_mimetypesettingspage.h" #include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/ieditorfactory.h> +#include <coreplugin/editormanager/ieditorfactory_p.h> #include <coreplugin/editormanager/iexternaleditor.h> #include <utils/algorithm.h> @@ -48,6 +49,7 @@ #include <QScopedPointer> #include <QSet> #include <QStringList> +#include <QStyledItemDelegate> #include <QSortFilterProxyModel> static const char kModifiedMimeTypesFile[] = "/mimetypes/modifiedmimetypes.xml"; @@ -66,6 +68,18 @@ static const char matchMaskAttributeC[] = "mask"; namespace Core { namespace Internal { +class MimeEditorDelegate : public QStyledItemDelegate +{ +public: + QWidget *createEditor(QWidget *parent, + const QStyleOptionViewItem &option, + const QModelIndex &index) const final; + void setEditorData(QWidget *editor, const QModelIndex &index) const final; + void setModelData(QWidget *editor, + QAbstractItemModel *model, + const QModelIndex &index) const final; +}; + class UserMimeType { public: @@ -81,20 +95,30 @@ class MimeTypeSettingsModel : public QAbstractTableModel Q_OBJECT public: - MimeTypeSettingsModel(QObject *parent = 0) + enum class Role { + DefaultHandler = Qt::UserRole + }; + + MimeTypeSettingsModel(QObject *parent = nullptr) : QAbstractTableModel(parent) {} - virtual ~MimeTypeSettingsModel() {} int rowCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; QVariant data(const QModelIndex &modelIndex, int role = Qt::DisplayRole) const override; + bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) final; + Qt::ItemFlags flags(const QModelIndex &index) const final; void load(); + QList<IEditorFactory *> handlersForMimeType(const Utils::MimeType &mimeType) const; + IEditorFactory *defaultHandlerForMimeType(const Utils::MimeType &mimeType) const; + void resetUserDefaults(); + QList<Utils::MimeType> m_mimeTypes; - QHash<QString, QString> m_handlersByMimeType; + mutable QHash<Utils::MimeType, QList<IEditorFactory *>> m_handlersByMimeType; + QHash<Utils::MimeType, IEditorFactory *> m_userDefault; }; int MimeTypeSettingsModel::rowCount(const QModelIndex &) const @@ -125,39 +149,89 @@ QVariant MimeTypeSettingsModel::data(const QModelIndex &modelIndex, int role) co const int column = modelIndex.column(); if (role == Qt::DisplayRole) { - const QString &type = m_mimeTypes.at(modelIndex.row()).name(); - if (column == 0) - return type; - else - return m_handlersByMimeType.value(type); + const Utils::MimeType &type = m_mimeTypes.at(modelIndex.row()); + if (column == 0) { + return type.name(); + } else { + IEditorFactory *defaultHandler = defaultHandlerForMimeType(type); + return defaultHandler ? defaultHandler->displayName() : QString(); + } + } else if (role == Qt::EditRole) { + return qVariantFromValue(handlersForMimeType(m_mimeTypes.at(modelIndex.row()))); + } else if (role == int(Role::DefaultHandler)) { + return qVariantFromValue(defaultHandlerForMimeType(m_mimeTypes.at(modelIndex.row()))); + } else if (role == Qt::FontRole) { + if (column == 1) { + const Utils::MimeType &type = m_mimeTypes.at(modelIndex.row()); + if (m_userDefault.contains(type)) { + QFont font = QGuiApplication::font(); + font.setItalic(true); + return font; + } + } + return QVariant(); } return QVariant(); } +bool MimeTypeSettingsModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + if (role != int(Role::DefaultHandler) || index.column() != 1) + return false; + auto factory = value.value<IEditorFactory *>(); + QTC_ASSERT(factory, return false); + const int row = index.row(); + QTC_ASSERT(row >= 0 && row < m_mimeTypes.size(), return false); + const Utils::MimeType mimeType = m_mimeTypes.at(row); + const QList<IEditorFactory *> handlers = handlersForMimeType(mimeType); + QTC_ASSERT(handlers.contains(factory), return false); + if (handlers.first() == factory) // selection is the default anyhow + m_userDefault.remove(mimeType); + else + m_userDefault.insert(mimeType, factory); + emit dataChanged(index, index); + return true; +} + +Qt::ItemFlags MimeTypeSettingsModel::flags(const QModelIndex &index) const +{ + if (index.column() == 0 || handlersForMimeType(m_mimeTypes.at(index.row())).size() < 2) + return QAbstractTableModel::flags(index); + return QAbstractTableModel::flags(index) | Qt::ItemIsEditable; +} + void MimeTypeSettingsModel::load() { beginResetModel(); m_mimeTypes = Utils::allMimeTypes(); + m_userDefault = Core::Internal::userPreferredEditorFactories(); Utils::sort(m_mimeTypes, [](const Utils::MimeType &a, const Utils::MimeType &b) { return a.name().compare(b.name(), Qt::CaseInsensitive) < 0; }); + m_handlersByMimeType.clear(); + endResetModel(); +} - foreach (const Utils::MimeType &mimeType, m_mimeTypes) { - QString value; - const QList<IEditorFactory *> factories = - EditorManager::editorFactories(mimeType); - if (!factories.isEmpty()) { - value = factories.front()->displayName(); - } else { - const QList<IExternalEditor *> externalEditors = - EditorManager::externalEditors(mimeType); - if (!externalEditors.isEmpty()) - value = externalEditors.front()->displayName(); - else - value = tr("Undefined"); - } - m_handlersByMimeType.insert(mimeType.name(), value); - } +QList<IEditorFactory *> MimeTypeSettingsModel::handlersForMimeType( + const Utils::MimeType &mimeType) const +{ + if (!m_handlersByMimeType.contains(mimeType)) + m_handlersByMimeType.insert(mimeType, IEditorFactory::defaultEditorFactories(mimeType)); + return m_handlersByMimeType.value(mimeType); +} + +IEditorFactory *MimeTypeSettingsModel::defaultHandlerForMimeType(const Utils::MimeType &mimeType) const +{ + if (m_userDefault.contains(mimeType)) + return m_userDefault.value(mimeType); + const QList<IEditorFactory *> handlers = handlersForMimeType(mimeType); + return handlers.isEmpty() ? nullptr : handlers.first(); +} + +void MimeTypeSettingsModel::resetUserDefaults() +{ + beginResetModel(); + m_userDefault.clear(); endResetModel(); } @@ -168,7 +242,7 @@ class MimeTypeSettingsPrivate : public QObject public: MimeTypeSettingsPrivate(); - virtual ~MimeTypeSettingsPrivate(); + ~MimeTypeSettingsPrivate() override; void configureUi(QWidget *w); @@ -190,7 +264,7 @@ private: static void writeUserModifiedMimeTypes(); public: - typedef QHash<QString, UserMimeType> UserMimeTypeHash; // name -> mime type + using UserMimeTypeHash = QHash<QString, UserMimeType>; // name -> mime type static const QChar kSemiColon; static UserMimeTypeHash readUserModifiedMimeTypes(); static void applyUserModifiedMimeTypes(const UserMimeTypeHash &mimeTypes); @@ -202,6 +276,7 @@ public: QString m_filterPattern; Ui::MimeTypeSettingsPage m_ui; QPointer<QWidget> m_widget; + MimeEditorDelegate m_delegate; }; const QChar MimeTypeSettingsPrivate::kSemiColon(QLatin1Char(';')); @@ -218,8 +293,7 @@ MimeTypeSettingsPrivate::MimeTypeSettingsPrivate() this, &MimeTypeSettingsPrivate::writeUserModifiedMimeTypes); } -MimeTypeSettingsPrivate::~MimeTypeSettingsPrivate() -{} +MimeTypeSettingsPrivate::~MimeTypeSettingsPrivate() = default; void MimeTypeSettingsPrivate::configureUi(QWidget *w) { @@ -230,6 +304,7 @@ void MimeTypeSettingsPrivate::configureUi(QWidget *w) connect(m_ui.filterLineEdit, &QLineEdit::textChanged, this, &MimeTypeSettingsPrivate::setFilterPattern); m_ui.mimeTypesTreeView->setModel(m_filterModel); + m_ui.mimeTypesTreeView->setItemDelegate(&m_delegate); new Utils::HeaderViewStretcher(m_ui.mimeTypesTreeView->header(), 1); @@ -248,6 +323,8 @@ void MimeTypeSettingsPrivate::configureUi(QWidget *w) this, &MimeTypeSettingsPrivate::editMagicHeader); connect(m_ui.resetButton, &QPushButton::clicked, this, &MimeTypeSettingsPrivate::resetMimeTypes); + connect(m_ui.resetHandlersButton, &QPushButton::clicked, + m_model, &MimeTypeSettingsModel::resetUserDefaults); connect(m_ui.magicHeadersTreeWidget, &QTreeWidget::itemSelectionChanged, this, &MimeTypeSettingsPrivate::updatePatternEditAndMagicButtons); @@ -315,7 +392,7 @@ void MimeTypeSettingsPrivate::addMagicHeaderRow(const MagicData &data) void MimeTypeSettingsPrivate::editMagicHeaderRowData(const int row, const MagicData &data) { - QTreeWidgetItem *item = new QTreeWidgetItem; + auto item = new QTreeWidgetItem; item->setText(0, QString::fromUtf8(data.m_rule.value())); item->setText(1, QString::fromLatin1(Utils::Internal::MimeMagicRule::typeName(data.m_rule.type()))); item->setText(2, QString::fromLatin1("%1:%2").arg(data.m_rule.startPos()).arg(data.m_rule.endPos())); @@ -581,6 +658,7 @@ QWidget *MimeTypeSettings::widget() void MimeTypeSettings::apply() { MimeTypeSettingsPrivate::applyUserModifiedMimeTypes(d->m_pendingModifiedMimeTypes); + Core::Internal::setUserPreferredEditorFactories(d->m_model->m_userDefault); d->m_pendingModifiedMimeTypes.clear(); d->m_model->load(); } @@ -598,6 +676,39 @@ void MimeTypeSettings::restoreSettings() MimeTypeSettingsPrivate::applyUserModifiedMimeTypes(mimetypes); } +QWidget *MimeEditorDelegate::createEditor(QWidget *parent, + const QStyleOptionViewItem &option, + const QModelIndex &index) const +{ + Q_UNUSED(option) + Q_UNUSED(index) + return new QComboBox(parent); +} + +void MimeEditorDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const +{ + auto box = static_cast<QComboBox *>(editor); + const auto factories = index.model()->data(index, Qt::EditRole).value<QList<IEditorFactory *>>(); + for (IEditorFactory *factory : factories) + box->addItem(factory->displayName(), qVariantFromValue(factory)); + int currentIndex = factories.indexOf( + index.model() + ->data(index, int(MimeTypeSettingsModel::Role::DefaultHandler)) + .value<IEditorFactory *>()); + if (QTC_GUARD(currentIndex != -1)) + box->setCurrentIndex(currentIndex); +} + +void MimeEditorDelegate::setModelData(QWidget *editor, + QAbstractItemModel *model, + const QModelIndex &index) const +{ + auto box = static_cast<QComboBox *>(editor); + model->setData(index, + box->currentData(Qt::UserRole), + int(MimeTypeSettingsModel::Role::DefaultHandler)); +} + } // Internal } // Core diff --git a/src/plugins/coreplugin/mimetypesettings.h b/src/plugins/coreplugin/mimetypesettings.h index 8153ecbb1b..3d9059bbfe 100644 --- a/src/plugins/coreplugin/mimetypesettings.h +++ b/src/plugins/coreplugin/mimetypesettings.h @@ -37,12 +37,12 @@ class MimeTypeSettings : public IOptionsPage Q_OBJECT public: - MimeTypeSettings(QObject *parent = 0); - virtual ~MimeTypeSettings(); + MimeTypeSettings(QObject *parent = nullptr); + ~MimeTypeSettings() override; - virtual QWidget *widget(); - virtual void apply(); - virtual void finish(); + QWidget *widget() override; + void apply() override; + void finish() override; static void restoreSettings(); private: diff --git a/src/plugins/coreplugin/mimetypesettingspage.ui b/src/plugins/coreplugin/mimetypesettingspage.ui index 8d1afd9bbe..e3d5731b2f 100644 --- a/src/plugins/coreplugin/mimetypesettingspage.ui +++ b/src/plugins/coreplugin/mimetypesettingspage.ui @@ -27,24 +27,7 @@ <string>Registered MIME Types</string> </property> <layout class="QGridLayout" name="gridLayout"> - <item row="0" column="0" colspan="2"> - <widget class="QLineEdit" name="filterLineEdit"> - <property name="placeholderText"> - <string>Filter</string> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QPushButton" name="resetButton"> - <property name="toolTip"> - <string>Reset all to default.</string> - </property> - <property name="text"> - <string>Reset All</string> - </property> - </widget> - </item> - <item row="2" column="1"> + <item row="2" column="2"> <spacer name="horizontalSpacer"> <property name="orientation"> <enum>Qt::Horizontal</enum> @@ -57,8 +40,18 @@ </property> </spacer> </item> - <item row="1" column="0" colspan="2"> + <item row="0" column="0" colspan="3"> + <widget class="QLineEdit" name="filterLineEdit"> + <property name="placeholderText"> + <string>Filter</string> + </property> + </widget> + </item> + <item row="1" column="0" colspan="3"> <widget class="QTreeView" name="mimeTypesTreeView"> + <property name="editTriggers"> + <set>QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked</set> + </property> <property name="rootIsDecorated"> <bool>false</bool> </property> @@ -67,6 +60,23 @@ </property> </widget> </item> + <item row="2" column="0"> + <widget class="QPushButton" name="resetButton"> + <property name="toolTip"> + <string>Reset all to default.</string> + </property> + <property name="text"> + <string>Reset MIME Types</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QPushButton" name="resetHandlersButton"> + <property name="text"> + <string>Reset Handlers</string> + </property> + </widget> + </item> </layout> </widget> <widget class="QGroupBox" name="detailsGroupBox"> diff --git a/src/plugins/coreplugin/minisplitter.cpp b/src/plugins/coreplugin/minisplitter.cpp index 64ee062ca1..6bac3ffdfc 100644 --- a/src/plugins/coreplugin/minisplitter.cpp +++ b/src/plugins/coreplugin/minisplitter.cpp @@ -46,8 +46,8 @@ public: setAttribute(Qt::WA_MouseNoMask, true); } protected: - void resizeEvent(QResizeEvent *event); - void paintEvent(QPaintEvent *event); + void resizeEvent(QResizeEvent *event) override; + void paintEvent(QPaintEvent *event) override; private: bool m_lightColored; diff --git a/src/plugins/coreplugin/modemanager.cpp b/src/plugins/coreplugin/modemanager.cpp index cab2458037..be69338372 100644 --- a/src/plugins/coreplugin/modemanager.cpp +++ b/src/plugins/coreplugin/modemanager.cpp @@ -80,7 +80,7 @@ struct ModeManagerPrivate }; static ModeManagerPrivate *d; -static ModeManager *m_instance = 0; +static ModeManager *m_instance = nullptr; static int indexOf(Id id) { @@ -121,11 +121,11 @@ ModeManager::ModeManager(Internal::MainWindow *mainWindow, ModeManager::~ModeManager() { delete d; - d = 0; - m_instance = 0; + d = nullptr; + m_instance = nullptr; } -Id ModeManager::currentMode() +Id ModeManager::currentModeId() { int currentIndex = d->m_modeStack->currentIndex(); if (currentIndex < 0) @@ -138,7 +138,7 @@ static IMode *findMode(Id id) const int index = indexOf(id); if (index >= 0) return d->m_modes.at(index); - return 0; + return nullptr; } void ModeManager::activateMode(Id id) @@ -222,7 +222,7 @@ void ModeManagerPrivate::enabledStateChanged(IMode *mode) d->m_modeStack->setTabEnabled(index, mode->isEnabled()); // Make sure we leave any disabled mode to prevent possible crashes: - if (mode->id() == ModeManager::currentMode() && !mode->isEnabled()) { + if (mode->id() == ModeManager::currentModeId() && !mode->isEnabled()) { // This assumes that there is always at least one enabled mode. for (int i = 0; i < d->m_modes.count(); ++i) { if (d->m_modes.at(i) != mode && @@ -298,7 +298,7 @@ void ModeManager::currentTabChanged(int index) void ModeManager::setFocusToCurrentMode() { - IMode *mode = findMode(currentMode()); + IMode *mode = findMode(currentModeId()); QTC_ASSERT(mode, return); QWidget *widget = mode->widget(); if (widget) { @@ -336,4 +336,10 @@ ModeManager *ModeManager::instance() return m_instance; } +IMode *ModeManager::currentMode() +{ + const int currentIndex = d->m_modeStack->currentIndex(); + return currentIndex < 0 ? nullptr : d->m_modes.at(currentIndex); +} + } // namespace Core diff --git a/src/plugins/coreplugin/modemanager.h b/src/plugins/coreplugin/modemanager.h index 66ff7af7fc..889731b49e 100644 --- a/src/plugins/coreplugin/modemanager.h +++ b/src/plugins/coreplugin/modemanager.h @@ -54,7 +54,8 @@ public: static ModeManager *instance(); - static Id currentMode(); + static IMode *currentMode(); + static Id currentModeId(); static void addAction(QAction *action, int priority); static void addProjectSelector(QAction *action); diff --git a/src/plugins/coreplugin/navigationsubwidget.cpp b/src/plugins/coreplugin/navigationsubwidget.cpp index 0ed1a4ca22..c8aed179c5 100644 --- a/src/plugins/coreplugin/navigationsubwidget.cpp +++ b/src/plugins/coreplugin/navigationsubwidget.cpp @@ -60,17 +60,17 @@ NavigationSubWidget::NavigationSubWidget(NavigationWidget *parentWidget, int pos m_navigationComboBox->setFocusPolicy(Qt::TabFocus); m_navigationComboBox->setMinimumContentsLength(0); m_navigationComboBox->setModel(parentWidget->factoryModel()); - m_navigationWidget = 0; - m_navigationWidgetFactory = 0; + m_navigationWidget = nullptr; + m_navigationWidgetFactory = nullptr; m_toolBar = new Utils::StyledBar(this); - QHBoxLayout *toolBarLayout = new QHBoxLayout; + auto toolBarLayout = new QHBoxLayout; toolBarLayout->setMargin(0); toolBarLayout->setSpacing(0); m_toolBar->setLayout(toolBarLayout); toolBarLayout->addWidget(m_navigationComboBox); - QToolButton *splitAction = new QToolButton(); + auto splitAction = new QToolButton(); splitAction->setIcon(Utils::Icons::SPLIT_HORIZONTAL_TOOLBAR.icon()); splitAction->setToolTip(tr("Split")); splitAction->setPopupMode(QToolButton::InstantPopup); @@ -86,7 +86,7 @@ NavigationSubWidget::NavigationSubWidget(NavigationWidget *parentWidget, int pos toolBarLayout->addWidget(splitAction); toolBarLayout->addWidget(m_closeButton); - QVBoxLayout *lay = new QVBoxLayout(); + auto lay = new QVBoxLayout(); lay->setMargin(0); lay->setSpacing(0); setLayout(lay); @@ -103,9 +103,7 @@ NavigationSubWidget::NavigationSubWidget(NavigationWidget *parentWidget, int pos comboBoxIndexChanged(factoryIndex); } -NavigationSubWidget::~NavigationSubWidget() -{ -} +NavigationSubWidget::~NavigationSubWidget() = default; void NavigationSubWidget::comboBoxIndexChanged(int factoryIndex) { @@ -118,8 +116,8 @@ void NavigationSubWidget::comboBoxIndexChanged(int factoryIndex) // Remove old Widget delete m_navigationWidget; - m_navigationWidget = 0; - m_navigationWidgetFactory = 0; + m_navigationWidget = nullptr; + m_navigationWidgetFactory = nullptr; if (factoryIndex == -1) return; @@ -132,7 +130,7 @@ void NavigationSubWidget::comboBoxIndexChanged(int factoryIndex) // Add Toolbutton m_additionalToolBarWidgets = n.dockToolBarWidgets; - QHBoxLayout *layout = qobject_cast<QHBoxLayout *>(m_toolBar->layout()); + auto layout = qobject_cast<QHBoxLayout *>(m_toolBar->layout()); foreach (QToolButton *w, m_additionalToolBarWidgets) { layout->insertWidget(layout->count()-2, w); } @@ -193,7 +191,7 @@ Core::Command *NavigationSubWidget::command(const QString &title) const QHash<Id, Command *>::const_iterator r = commandMap.find(Id::fromString(title)); if (r != commandMap.end()) return r.value(); - return 0; + return nullptr; } void NavigationSubWidget::setCloseIcon(const QIcon &icon) diff --git a/src/plugins/coreplugin/navigationsubwidget.h b/src/plugins/coreplugin/navigationsubwidget.h index a1906a8a21..39339c4db1 100644 --- a/src/plugins/coreplugin/navigationsubwidget.h +++ b/src/plugins/coreplugin/navigationsubwidget.h @@ -48,7 +48,7 @@ class NavigationSubWidget : public QWidget Q_OBJECT public: NavigationSubWidget(NavigationWidget *parentWidget, int position, int factoryIndex); - virtual ~NavigationSubWidget(); + ~NavigationSubWidget() override; INavigationWidgetFactory *factory(); @@ -95,10 +95,10 @@ class CommandComboBox : public QComboBox Q_OBJECT public: - explicit CommandComboBox(QWidget *parent = 0); + explicit CommandComboBox(QWidget *parent = nullptr); protected: - bool event(QEvent *event); + bool event(QEvent *event) override; private: virtual const Command *command(const QString &text) const = 0; @@ -114,7 +114,7 @@ public: m_navSubWidget(navSubWidget) {} private: - virtual const Command *command(const QString &text) const + const Command *command(const QString &text) const override { return m_navSubWidget->command(text); } NavigationSubWidget *m_navSubWidget; diff --git a/src/plugins/coreplugin/navigationwidget.cpp b/src/plugins/coreplugin/navigationwidget.cpp index ff9c6cc581..f223cfa777 100644 --- a/src/plugins/coreplugin/navigationwidget.cpp +++ b/src/plugins/coreplugin/navigationwidget.cpp @@ -87,7 +87,7 @@ NavigationWidgetPlaceHolder::~NavigationWidgetPlaceHolder() void NavigationWidgetPlaceHolder::applyStoredSize() { - QSplitter *splitter = qobject_cast<QSplitter *>(parentWidget()); + auto splitter = qobject_cast<QSplitter *>(parentWidget()); if (splitter) { // A splitter we need to resize the splitter sizes QList<int> sizes = splitter->sizes(); @@ -332,7 +332,7 @@ Internal::NavigationSubWidget *NavigationWidget::insertSubItem(int position, int if (!d->m_subWidgets.isEmpty()) // Make all icons the bottom icon d->m_subWidgets.at(0)->setCloseIcon(Utils::Icons::CLOSE_SPLIT_BOTTOM.icon()); - Internal::NavigationSubWidget *nsw = new Internal::NavigationSubWidget(this, position, factoryIndex); + auto nsw = new Internal::NavigationSubWidget(this, position, factoryIndex); connect(nsw, &Internal::NavigationSubWidget::splitMe, this, &NavigationWidget::splitSubWidget); connect(nsw, &Internal::NavigationSubWidget::closeMe, this, &NavigationWidget::closeSubWidget); connect(nsw, &Internal::NavigationSubWidget::factoryIndexChanged, @@ -371,7 +371,7 @@ QWidget *NavigationWidget::activateSubWidget(Id factoryId, int preferredPosition void NavigationWidget::splitSubWidget(int factoryIndex) { - Internal::NavigationSubWidget *original = qobject_cast<Internal::NavigationSubWidget *>(sender()); + auto original = qobject_cast<Internal::NavigationSubWidget *>(sender()); int pos = indexOf(original) + 1; insertSubItem(pos, factoryIndex); } @@ -379,7 +379,7 @@ void NavigationWidget::splitSubWidget(int factoryIndex) void NavigationWidget::closeSubWidget() { if (d->m_subWidgets.count() != 1) { - Internal::NavigationSubWidget *subWidget = qobject_cast<Internal::NavigationSubWidget *>(sender()); + auto subWidget = qobject_cast<Internal::NavigationSubWidget *>(sender()); subWidget->saveSettings(); int position = d->m_subWidgets.indexOf(subWidget); @@ -543,7 +543,7 @@ QString NavigationWidget::settingsKey(const QString &key) const void NavigationWidget::onSubWidgetFactoryIndexChanged(int factoryIndex) { Q_UNUSED(factoryIndex); - Internal::NavigationSubWidget *subWidget = qobject_cast<Internal::NavigationSubWidget *>(sender()); + auto subWidget = qobject_cast<Internal::NavigationSubWidget *>(sender()); QTC_ASSERT(subWidget, return); Id factoryId = subWidget->factory()->id(); NavigationWidgetPrivate::updateActivationsMap(factoryId, {d->m_side, subWidget->position()}); diff --git a/src/plugins/coreplugin/opendocumentstreeview.cpp b/src/plugins/coreplugin/opendocumentstreeview.cpp index 13290846a3..7861199bdd 100644 --- a/src/plugins/coreplugin/opendocumentstreeview.cpp +++ b/src/plugins/coreplugin/opendocumentstreeview.cpp @@ -38,20 +38,19 @@ namespace Internal { class OpenDocumentsDelegate : public QStyledItemDelegate { public: - explicit OpenDocumentsDelegate(QObject *parent = 0); + explicit OpenDocumentsDelegate(QObject *parent = nullptr); void setCloseButtonVisible(bool visible); void handlePressed(const QModelIndex &index); void paint(QPainter *painter, const QStyleOptionViewItem &option, - const QModelIndex &index) const; + const QModelIndex &index) const override; mutable QModelIndex pressedIndex; - bool closeButtonVisible; + bool closeButtonVisible = true; }; OpenDocumentsDelegate::OpenDocumentsDelegate(QObject *parent) - : QStyledItemDelegate(parent), - closeButtonVisible(true) + : QStyledItemDelegate(parent) { } @@ -141,7 +140,7 @@ bool OpenDocumentsTreeView::eventFilter(QObject *obj, QEvent *event) { if (obj == this && event->type() == QEvent::KeyPress && currentIndex().isValid()) { - QKeyEvent *ke = static_cast<QKeyEvent*>(event); + auto ke = static_cast<QKeyEvent*>(event); if ((ke->key() == Qt::Key_Delete || ke->key() == Qt::Key_Backspace) && ke->modifiers() == 0) { @@ -149,7 +148,7 @@ bool OpenDocumentsTreeView::eventFilter(QObject *obj, QEvent *event) } } else if (obj == viewport() && event->type() == QEvent::MouseButtonRelease) { - QMouseEvent * me = static_cast<QMouseEvent*>(event); + auto me = static_cast<QMouseEvent*>(event); if (me->button() == Qt::MiddleButton && me->modifiers() == Qt::NoModifier) { QModelIndex index = indexAt(me->pos()); diff --git a/src/plugins/coreplugin/outputpane.cpp b/src/plugins/coreplugin/outputpane.cpp index 6ac11d9780..b6d118d6b6 100644 --- a/src/plugins/coreplugin/outputpane.cpp +++ b/src/plugins/coreplugin/outputpane.cpp @@ -51,7 +51,7 @@ OutputPanePlaceHolderPrivate::OutputPanePlaceHolderPrivate(Id mode, QSplitter *p { } -OutputPanePlaceHolder *OutputPanePlaceHolderPrivate::m_current = 0; +OutputPanePlaceHolder *OutputPanePlaceHolderPrivate::m_current = nullptr; OutputPanePlaceHolder::OutputPanePlaceHolder(Id mode, QSplitter *parent) : QWidget(parent), d(new OutputPanePlaceHolderPrivate(mode, parent)) @@ -68,14 +68,14 @@ OutputPanePlaceHolder::OutputPanePlaceHolder(Id mode, QSplitter *parent) this, &OutputPanePlaceHolder::currentModeChanged); // if this is part of a lazily created mode widget, // we need to check if this is the current placeholder - currentModeChanged(ModeManager::currentMode()); + currentModeChanged(ModeManager::currentModeId()); } OutputPanePlaceHolder::~OutputPanePlaceHolder() { if (d->m_current == this) { if (Internal::OutputPaneManager *om = Internal::OutputPaneManager::instance()) { - om->setParent(0); + om->setParent(nullptr); om->hide(); } OutputPanePlaceHolderPrivate::m_current = nullptr; @@ -86,12 +86,12 @@ OutputPanePlaceHolder::~OutputPanePlaceHolder() void OutputPanePlaceHolder::currentModeChanged(Id mode) { if (d->m_current == this) { - d->m_current = 0; + d->m_current = nullptr; if (d->m_initialized) Internal::OutputPaneManager::setOutputPaneHeightSetting(d->m_nonMaximizedSize); Internal::OutputPaneManager *om = Internal::OutputPaneManager::instance(); om->hide(); - om->setParent(0); + om->setParent(nullptr); om->updateStatusButtons(false); } if (d->m_mode == mode) { diff --git a/src/plugins/coreplugin/outputpanemanager.cpp b/src/plugins/coreplugin/outputpanemanager.cpp index 7262decedf..00e1c9699e 100644 --- a/src/plugins/coreplugin/outputpanemanager.cpp +++ b/src/plugins/coreplugin/outputpanemanager.cpp @@ -118,7 +118,7 @@ static int numberAreaWidth() // OutputPaneManager //// -static OutputPaneManager *m_instance = 0; +static OutputPaneManager *m_instance = nullptr; void OutputPaneManager::create() { @@ -128,7 +128,7 @@ void OutputPaneManager::create() void OutputPaneManager::destroy() { delete m_instance; - m_instance = 0; + m_instance = nullptr; } OutputPaneManager *OutputPaneManager::instance() @@ -174,15 +174,11 @@ OutputPaneManager::OutputPaneManager(QWidget *parent) : m_titleLabel(new QLabel), m_manageButton(new OutputPaneManageButton), m_closeButton(new QToolButton), - m_minMaxAction(0), m_minMaxButton(new QToolButton), - m_nextAction(0), - m_prevAction(0), m_outputWidgetPane(new QStackedWidget), m_opToolBarWidgets(new QStackedWidget), m_minimizeIcon(Utils::Icons::ARROW_DOWN.icon()), - m_maximizeIcon(Utils::Icons::ARROW_UP.icon()), - m_outputPaneHeightSetting(0) + m_maximizeIcon(Utils::Icons::ARROW_UP.icon()) { setWindowTitle(tr("Output")); @@ -212,11 +208,11 @@ OutputPaneManager::OutputPaneManager(QWidget *parent) : connect(ICore::instance(), &ICore::saveSettingsRequested, this, &OutputPaneManager::saveSettings); - QVBoxLayout *mainlayout = new QVBoxLayout; + auto mainlayout = new QVBoxLayout; mainlayout->setSpacing(0); mainlayout->setMargin(0); m_toolBar = new StyledBar; - QHBoxLayout *toolLayout = new QHBoxLayout(m_toolBar); + auto toolLayout = new QHBoxLayout(m_toolBar); toolLayout->setMargin(0); toolLayout->setSpacing(0); toolLayout->addWidget(m_titleLabel); @@ -317,7 +313,7 @@ OutputPaneManager::OutputPaneManager(QWidget *parent) : }); QWidget *toolButtonsContainer = new QWidget(m_opToolBarWidgets); - QHBoxLayout *toolButtonsLayout = new QHBoxLayout; + auto toolButtonsLayout = new QHBoxLayout; toolButtonsLayout->setMargin(0); toolButtonsLayout->setSpacing(0); foreach (QWidget *toolButton, outPane->toolBarWidgets()) @@ -369,9 +365,7 @@ OutputPaneManager::OutputPaneManager(QWidget *parent) : readSettings(); } -OutputPaneManager::~OutputPaneManager() -{ -} +OutputPaneManager::~OutputPaneManager() = default; void OutputPaneManager::shortcutTriggered(int idx) { @@ -691,7 +685,7 @@ void OutputPaneToggleButton::paintEvent(QPaintEvent*) if (c != Theme::BackgroundColorDark) p.fillRect(rect(), creatorTheme()->color(c)); } else { - const QImage *image = 0; + const QImage *image = nullptr; if (isDown()) { static const QImage pressed( StyleHelper::dpiSpecificImageFile(":/utils/images/panel_button_pressed.png")); diff --git a/src/plugins/coreplugin/outputpanemanager.h b/src/plugins/coreplugin/outputpanemanager.h index 5570ceeaa8..80ff8dad40 100644 --- a/src/plugins/coreplugin/outputpanemanager.h +++ b/src/plugins/coreplugin/outputpanemanager.h @@ -89,28 +89,27 @@ private: void buttonTriggered(int idx); void readSettings(); - QLabel *m_titleLabel; - OutputPaneManageButton *m_manageButton; - QAction *m_clearAction; - QToolButton *m_clearButton; - QToolButton *m_closeButton; - - QAction *m_minMaxAction; - QToolButton *m_minMaxButton; - - QAction *m_nextAction; - QAction *m_prevAction; - QToolButton *m_prevToolButton; - QToolButton *m_nextToolButton; - QWidget *m_toolBar; - - QStackedWidget *m_outputWidgetPane; - QStackedWidget *m_opToolBarWidgets; - QWidget *m_buttonsWidget; + QLabel *m_titleLabel = nullptr; + OutputPaneManageButton *m_manageButton = nullptr; + QAction *m_clearAction = nullptr; + QToolButton *m_clearButton = nullptr; + QToolButton *m_closeButton = nullptr; + + QAction *m_minMaxAction = nullptr; + QToolButton *m_minMaxButton = nullptr; + + QAction *m_nextAction = nullptr; + QAction *m_prevAction = nullptr; + QToolButton *m_prevToolButton = nullptr; + QToolButton *m_nextToolButton = nullptr; + QWidget *m_toolBar = nullptr; + + QStackedWidget *m_outputWidgetPane = nullptr; + QStackedWidget *m_opToolBarWidgets = nullptr; + QWidget *m_buttonsWidget = nullptr; QIcon m_minimizeIcon; QIcon m_maximizeIcon; - bool m_maximized; - int m_outputPaneHeightSetting; + int m_outputPaneHeightSetting = 0; }; class BadgeLabel diff --git a/src/plugins/coreplugin/outputwindow.cpp b/src/plugins/coreplugin/outputwindow.cpp index 2d69b09e54..690f10d506 100644 --- a/src/plugins/coreplugin/outputwindow.cpp +++ b/src/plugins/coreplugin/outputwindow.cpp @@ -87,12 +87,12 @@ OutputWindow::OutputWindow(Context context, QWidget *parent) d->outputWindowContext->setWidget(this); ICore::addContextObject(d->outputWindowContext); - QAction *undoAction = new QAction(this); - QAction *redoAction = new QAction(this); - QAction *cutAction = new QAction(this); - QAction *copyAction = new QAction(this); - QAction *pasteAction = new QAction(this); - QAction *selectAllAction = new QAction(this); + auto undoAction = new QAction(this); + auto redoAction = new QAction(this); + auto cutAction = new QAction(this); + auto copyAction = new QAction(this); + auto pasteAction = new QAction(this); + auto selectAllAction = new QAction(this); ActionManager::registerAction(undoAction, Constants::UNDO, context); ActionManager::registerAction(redoAction, Constants::REDO, context); diff --git a/src/plugins/coreplugin/plugindialog.cpp b/src/plugins/coreplugin/plugindialog.cpp index f3db85bccc..9163e1a2af 100644 --- a/src/plugins/coreplugin/plugindialog.cpp +++ b/src/plugins/coreplugin/plugindialog.cpp @@ -53,7 +53,7 @@ PluginDialog::PluginDialog(QWidget *parent) { setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); - QVBoxLayout *vl = new QVBoxLayout(this); + auto vl = new QVBoxLayout(this); auto filterLayout = new QHBoxLayout; vl->addLayout(filterLayout); @@ -85,7 +85,7 @@ PluginDialog::PluginDialog(QWidget *parent) if (!s_isRestartRequired) m_restartRequired->setVisible(false); - QHBoxLayout *hl = new QHBoxLayout; + auto hl = new QHBoxLayout; hl->addWidget(m_detailsButton); hl->addWidget(m_errorDetailsButton); hl->addSpacing(10); @@ -144,9 +144,9 @@ void PluginDialog::openDetails(ExtensionSystem::PluginSpec *spec) return; QDialog dialog(this); dialog.setWindowTitle(tr("Plugin Details of %1").arg(spec->name())); - QVBoxLayout *layout = new QVBoxLayout; + auto layout = new QVBoxLayout; dialog.setLayout(layout); - ExtensionSystem::PluginDetailsView *details = new ExtensionSystem::PluginDetailsView(&dialog); + auto details = new ExtensionSystem::PluginDetailsView(&dialog); layout->addWidget(details); details->update(spec); QDialogButtonBox *buttons = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, &dialog); @@ -164,9 +164,9 @@ void PluginDialog::openErrorDetails() return; QDialog dialog(this); dialog.setWindowTitle(tr("Plugin Errors of %1").arg(spec->name())); - QVBoxLayout *layout = new QVBoxLayout; + auto layout = new QVBoxLayout; dialog.setLayout(layout); - ExtensionSystem::PluginErrorView *errors = new ExtensionSystem::PluginErrorView(&dialog); + auto errors = new ExtensionSystem::PluginErrorView(&dialog); layout->addWidget(errors); errors->update(spec); QDialogButtonBox *buttons = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, &dialog); diff --git a/src/plugins/coreplugin/progressmanager/futureprogress.cpp b/src/plugins/coreplugin/progressmanager/futureprogress.cpp index b06670c656..d7eeec9ff4 100644 --- a/src/plugins/coreplugin/progressmanager/futureprogress.cpp +++ b/src/plugins/coreplugin/progressmanager/futureprogress.cpp @@ -74,8 +74,8 @@ public: }; FutureProgressPrivate::FutureProgressPrivate(FutureProgress *q) : - m_progress(new Internal::ProgressBar), m_widget(0), m_widgetLayout(new QHBoxLayout), - m_statusBarWidget(0), + m_progress(new Internal::ProgressBar), m_widget(nullptr), m_widgetLayout(new QHBoxLayout), + m_statusBarWidget(nullptr), m_keep(FutureProgress::HideOnFinish), m_waitingForUserInteraction(false), m_q(q), m_fadeStarting(false), m_isFading(false) { @@ -124,7 +124,7 @@ FutureProgressPrivate::FutureProgressPrivate(FutureProgress *q) : FutureProgress::FutureProgress(QWidget *parent) : QWidget(parent), d(new FutureProgressPrivate(this)) { - QVBoxLayout *layout = new QVBoxLayout; + auto layout = new QVBoxLayout; setLayout(layout); layout->addWidget(d->m_progress); layout->setMargin(0); @@ -370,11 +370,11 @@ void FutureProgressPrivate::fadeAway() { m_isFading = true; - QGraphicsOpacityEffect *opacityEffect = new QGraphicsOpacityEffect; + auto opacityEffect = new QGraphicsOpacityEffect; opacityEffect->setOpacity(.999); m_q->setGraphicsEffect(opacityEffect); - QSequentialAnimationGroup *group = new QSequentialAnimationGroup(this); + auto group = new QSequentialAnimationGroup(this); QPropertyAnimation *animation = new QPropertyAnimation(opacityEffect, "opacity"); animation->setDuration(StyleHelper::progressFadeAnimationDuration); animation->setEndValue(0.); diff --git a/src/plugins/coreplugin/progressmanager/progressbar.h b/src/plugins/coreplugin/progressmanager/progressbar.h index 148813092a..9ff599adbb 100644 --- a/src/plugins/coreplugin/progressmanager/progressbar.h +++ b/src/plugins/coreplugin/progressmanager/progressbar.h @@ -38,7 +38,7 @@ class ProgressBar : public QWidget Q_PROPERTY(float cancelButtonFader READ cancelButtonFader WRITE setCancelButtonFader) public: - explicit ProgressBar(QWidget *parent = 0); + explicit ProgressBar(QWidget *parent = nullptr); QString title() const; void setTitle(const QString &title); @@ -50,9 +50,9 @@ public: bool isCancelEnabled() const; void setError(bool on); bool hasError() const; - QSize sizeHint() const; - void paintEvent(QPaintEvent *); - void mouseMoveEvent(QMouseEvent *); + QSize sizeHint() const override; + void paintEvent(QPaintEvent *) override; + void mouseMoveEvent(QMouseEvent *) override; int minimum() const { return m_minimum; } int maximum() const { return m_maximum; } int value() const { return m_value; } @@ -63,13 +63,13 @@ public: void setFinished(bool b); float cancelButtonFader() { return m_cancelButtonFader; } void setCancelButtonFader(float value) { update(); m_cancelButtonFader= value;} - bool event(QEvent *); + bool event(QEvent *) override; signals: void clicked(); protected: - void mousePressEvent(QMouseEvent *event); + void mousePressEvent(QMouseEvent *event) override; private: QFont titleFont() const; diff --git a/src/plugins/coreplugin/progressmanager/progressmanager.cpp b/src/plugins/coreplugin/progressmanager/progressmanager.cpp index 039cd76dd8..06c825ae80 100644 --- a/src/plugins/coreplugin/progressmanager/progressmanager.cpp +++ b/src/plugins/coreplugin/progressmanager/progressmanager.cpp @@ -263,14 +263,10 @@ using namespace Utils; Sent when all tasks of a \a type have finished. */ -static ProgressManagerPrivate *m_instance = 0; +static ProgressManagerPrivate *m_instance = nullptr; ProgressManagerPrivate::ProgressManagerPrivate() - : m_applicationTask(0), - m_currentStatusDetailsWidget(0), - m_opacityEffect(new QGraphicsOpacityEffect(this)), - m_progressViewPinned(false), - m_hovered(false) + : m_opacityEffect(new QGraphicsOpacityEffect(this)) { m_opacityEffect->setOpacity(.999); m_instance = this; @@ -288,7 +284,7 @@ ProgressManagerPrivate::~ProgressManagerPrivate() StatusBarManager::destroyStatusBarWidget(m_statusBarWidget); m_statusBarWidget = nullptr; cleanup(); - m_instance = 0; + m_instance = nullptr; } void ProgressManagerPrivate::readSettings() @@ -304,7 +300,7 @@ void ProgressManagerPrivate::init() readSettings(); m_statusBarWidget = new QWidget; - QHBoxLayout *layout = new QHBoxLayout(m_statusBarWidget); + auto layout = new QHBoxLayout(m_statusBarWidget); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); m_statusBarWidget->setLayout(layout); @@ -322,7 +318,7 @@ void ProgressManagerPrivate::init() m_summaryProgressBar->setCancelEnabled(false); m_summaryProgressLayout->addWidget(m_summaryProgressBar); layout->addWidget(m_summaryProgressWidget); - ToggleButton *toggleButton = new ToggleButton(m_statusBarWidget); + auto toggleButton = new ToggleButton(m_statusBarWidget); layout->addWidget(toggleButton); m_statusBarWidget->installEventFilter(this); StatusBarManager::addStatusBarWidget(m_statusBarWidget, StatusBarManager::RightCorner); @@ -381,7 +377,7 @@ bool ProgressManagerPrivate::eventFilter(QObject *obj, QEvent *event) updateVisibilityWithDelay(); } else if (obj == m_statusBarWidget && event->type() == QEvent::MouseButtonPress && !m_taskList.isEmpty()) { - QMouseEvent *me = static_cast<QMouseEvent *>(event); + auto me = static_cast<QMouseEvent *>(event); if (me->button() == Qt::LeftButton && !me->modifiers()) { FutureProgress *progress = m_currentStatusDetailsProgress; if (!progress) @@ -415,7 +411,7 @@ FutureProgress *ProgressManagerPrivate::doAddTask(const QFuture<void> &future, c Id type, ProgressFlags flags) { // watch - QFutureWatcher<void> *watcher = new QFutureWatcher<void>(); + auto watcher = new QFutureWatcher<void>(); m_runningTasks.insert(watcher, type); connect(watcher, &QFutureWatcherBase::progressRangeChanged, this, &ProgressManagerPrivate::updateSummaryProgressBar); @@ -442,7 +438,7 @@ FutureProgress *ProgressManagerPrivate::doAddTask(const QFuture<void> &future, c removeOldTasks(type); if (m_taskList.size() == 10) removeOneOldTask(); - FutureProgress *progress = new FutureProgress; + auto progress = new FutureProgress; progress->setTitle(title); progress->setFuture(future); @@ -475,7 +471,7 @@ void ProgressManagerPrivate::taskFinished() { QObject *taskObject = sender(); QTC_ASSERT(taskObject, return); - QFutureWatcher<void> *task = static_cast<QFutureWatcher<void> *>(taskObject); + auto task = static_cast<QFutureWatcher<void> *>(taskObject); if (m_applicationTask == task) disconnectApplicationTask(); Id type = m_runningTasks.value(task); @@ -494,7 +490,7 @@ void ProgressManagerPrivate::disconnectApplicationTask() disconnect(m_applicationTask, &QFutureWatcherBase::progressValueChanged, this, &ProgressManagerPrivate::setApplicationProgressValue); setApplicationProgressVisible(false); - m_applicationTask = 0; + m_applicationTask = nullptr; } void ProgressManagerPrivate::updateSummaryProgressBar() @@ -566,7 +562,7 @@ bool ProgressManagerPrivate::isLastFading() const void ProgressManagerPrivate::slotRemoveTask() { - FutureProgress *progress = qobject_cast<FutureProgress *>(sender()); + auto progress = qobject_cast<FutureProgress *>(sender()); QTC_ASSERT(progress, return); Id type = progress->type(); removeTask(progress); @@ -655,7 +651,7 @@ void ProgressManagerPrivate::updateVisibilityWithDelay() void ProgressManagerPrivate::updateStatusDetailsWidget() { - QWidget *candidateWidget = 0; + QWidget *candidateWidget = nullptr; // get newest progress with a status bar widget QList<FutureProgress *>::iterator i = m_taskList.end(); while (i != m_taskList.begin()) { @@ -727,13 +723,9 @@ void ToggleButton::paintEvent(QPaintEvent *event) } -ProgressManager::ProgressManager() -{ -} +ProgressManager::ProgressManager() = default; -ProgressManager::~ProgressManager() -{ -} +ProgressManager::~ProgressManager() = default; ProgressManager *ProgressManager::instance() { @@ -781,8 +773,7 @@ ProgressTimer::ProgressTimer(const QFutureInterfaceBase &futureInterface, QObject *parent) : QObject(parent), m_futureInterface(futureInterface), - m_expectedTime(expectedSeconds), - m_currentTime(0) + m_expectedTime(expectedSeconds) { m_futureInterface.setProgressRange(0, 100); m_futureInterface.setProgressValue(0); diff --git a/src/plugins/coreplugin/progressmanager/progressmanager.h b/src/plugins/coreplugin/progressmanager/progressmanager.h index efc2d57705..d7b581ae42 100644 --- a/src/plugins/coreplugin/progressmanager/progressmanager.h +++ b/src/plugins/coreplugin/progressmanager/progressmanager.h @@ -82,7 +82,7 @@ private: QFutureInterfaceBase m_futureInterface; int m_expectedTime; - int m_currentTime; + int m_currentTime = 0; QTimer *m_timer; }; diff --git a/src/plugins/coreplugin/progressmanager/progressmanager_p.h b/src/plugins/coreplugin/progressmanager/progressmanager_p.h index 7680b81a35..85bf378159 100644 --- a/src/plugins/coreplugin/progressmanager/progressmanager_p.h +++ b/src/plugins/coreplugin/progressmanager/progressmanager_p.h @@ -96,18 +96,18 @@ private: QPointer<ProgressView> m_progressView; QList<FutureProgress *> m_taskList; QMap<QFutureWatcher<void> *, Id> m_runningTasks; - QFutureWatcher<void> *m_applicationTask; + QFutureWatcher<void> *m_applicationTask = nullptr; StatusBarWidget *m_statusBarWidgetContainer; QWidget *m_statusBarWidget; QWidget *m_summaryProgressWidget; QHBoxLayout *m_summaryProgressLayout; - QWidget *m_currentStatusDetailsWidget; + QWidget *m_currentStatusDetailsWidget = nullptr; QPointer<FutureProgress> m_currentStatusDetailsProgress; ProgressBar *m_summaryProgressBar; QGraphicsOpacityEffect *m_opacityEffect; QPointer<QPropertyAnimation> m_opacityAnimation; - bool m_progressViewPinned; - bool m_hovered; + bool m_progressViewPinned = false; + bool m_hovered = false; }; class ToggleButton : public QToolButton diff --git a/src/plugins/coreplugin/progressmanager/progressmanager_win.cpp b/src/plugins/coreplugin/progressmanager/progressmanager_win.cpp index 5286ce007d..9102626863 100644 --- a/src/plugins/coreplugin/progressmanager/progressmanager_win.cpp +++ b/src/plugins/coreplugin/progressmanager/progressmanager_win.cpp @@ -49,7 +49,7 @@ namespace { int total = 0; - ITaskbarList3* pITask = 0; + ITaskbarList3* pITask = nullptr; } QT_BEGIN_NAMESPACE @@ -62,12 +62,12 @@ static inline QWindow *windowOfWidget(const QWidget *widget) return window; if (QWidget *topLevel = widget->nativeParentWidget()) return topLevel->windowHandle(); - return 0; + return nullptr; } static inline HWND hwndOfWidget(const QWidget *w) { - void *result = 0; + void *result = nullptr; if (QWindow *window = windowOfWidget(w)) result = QGuiApplication::platformNativeInterface()->nativeResourceForWindow("handle", window); return static_cast<HWND>(result); @@ -81,7 +81,7 @@ void Core::Internal::ProgressManagerPrivate::initInternal() IID_ITaskbarList3,(LPVOID*) &pITask); if (FAILED(hRes)) { - pITask = 0; + pITask = nullptr; CoUninitialize(); return; } diff --git a/src/plugins/coreplugin/progressmanager/progressview.cpp b/src/plugins/coreplugin/progressmanager/progressview.cpp index 1369c22982..9694e5a467 100644 --- a/src/plugins/coreplugin/progressmanager/progressview.cpp +++ b/src/plugins/coreplugin/progressmanager/progressview.cpp @@ -32,7 +32,7 @@ using namespace Core; using namespace Core::Internal; ProgressView::ProgressView(QWidget *parent) - : QWidget(parent), m_referenceWidget(nullptr), m_hovered(false) + : QWidget(parent) { m_layout = new QVBoxLayout; setLayout(m_layout); @@ -42,9 +42,7 @@ ProgressView::ProgressView(QWidget *parent) setWindowTitle(tr("Processes")); } -ProgressView::~ProgressView() -{ -} +ProgressView::~ProgressView() = default; void ProgressView::addProgressWidget(QWidget *widget) { diff --git a/src/plugins/coreplugin/progressmanager/progressview.h b/src/plugins/coreplugin/progressmanager/progressview.h index 4d619998a5..fe78c265c8 100644 --- a/src/plugins/coreplugin/progressmanager/progressview.h +++ b/src/plugins/coreplugin/progressmanager/progressview.h @@ -64,8 +64,8 @@ private: void reposition(); QVBoxLayout *m_layout; - QWidget *m_referenceWidget; - bool m_hovered; + QWidget *m_referenceWidget = nullptr; + bool m_hovered = false; }; } // namespace Internal diff --git a/src/plugins/coreplugin/reaper.cpp b/src/plugins/coreplugin/reaper.cpp index 907542928b..ff89b7d5e1 100644 --- a/src/plugins/coreplugin/reaper.cpp +++ b/src/plugins/coreplugin/reaper.cpp @@ -40,7 +40,7 @@ static ReaperPrivate *d = nullptr; namespace { void killProcess(QProcess *process) { - if (Utils::QtcProcess *qtcProcess = qobject_cast<Utils::QtcProcess*>(process)) + if (auto qtcProcess = qobject_cast<Utils::QtcProcess*>(process)) qtcProcess->kill(); else process->kill(); @@ -48,7 +48,7 @@ void killProcess(QProcess *process) void terminateProcess(QProcess *process) { - if (Utils::QtcProcess *qtcProcess = qobject_cast<Utils::QtcProcess*>(process)) + if (auto qtcProcess = qobject_cast<Utils::QtcProcess*>(process)) qtcProcess->terminate(); else process->terminate(); diff --git a/src/plugins/coreplugin/rightpane.cpp b/src/plugins/coreplugin/rightpane.cpp index 4c139cb284..e786051d04 100644 --- a/src/plugins/coreplugin/rightpane.cpp +++ b/src/plugins/coreplugin/rightpane.cpp @@ -38,7 +38,7 @@ using namespace Core; using namespace Core::Internal; -RightPanePlaceHolder *RightPanePlaceHolder::m_current = 0; +RightPanePlaceHolder *RightPanePlaceHolder::m_current = nullptr; RightPanePlaceHolder* RightPanePlaceHolder::current() { @@ -57,7 +57,7 @@ RightPanePlaceHolder::RightPanePlaceHolder(Id mode, QWidget *parent) RightPanePlaceHolder::~RightPanePlaceHolder() { if (m_current == this) { - RightPaneWidget::instance()->setParent(0); + RightPaneWidget::instance()->setParent(nullptr); RightPaneWidget::instance()->hide(); } } @@ -65,7 +65,7 @@ RightPanePlaceHolder::~RightPanePlaceHolder() void RightPanePlaceHolder::applyStoredSize(int width) { if (width) { - QSplitter *splitter = qobject_cast<QSplitter *>(parentWidget()); + auto splitter = qobject_cast<QSplitter *>(parentWidget()); if (splitter) { // A splitter we need to resize the splitter sizes QList<int> sizes = splitter->sizes(); @@ -95,8 +95,8 @@ void RightPanePlaceHolder::applyStoredSize(int width) void RightPanePlaceHolder::currentModeChanged(Id mode) { if (m_current == this) { - m_current = 0; - RightPaneWidget::instance()->setParent(0); + m_current = nullptr; + RightPaneWidget::instance()->setParent(nullptr); RightPaneWidget::instance()->hide(); } if (m_mode == mode) { @@ -117,14 +117,13 @@ void RightPanePlaceHolder::currentModeChanged(Id mode) ///// -RightPaneWidget *RightPaneWidget::m_instance = 0; +RightPaneWidget *RightPaneWidget::m_instance = nullptr; RightPaneWidget::RightPaneWidget() - : m_shown(true), m_width(0) { m_instance = this; - QVBoxLayout *layout = new QVBoxLayout; + auto layout = new QVBoxLayout; layout->setMargin(0); setLayout(layout); } @@ -132,7 +131,7 @@ RightPaneWidget::RightPaneWidget() RightPaneWidget::~RightPaneWidget() { clearWidget(); - m_instance = 0; + m_instance = nullptr; } RightPaneWidget *RightPaneWidget::instance() @@ -207,7 +206,7 @@ void RightPaneWidget::clearWidget() { if (m_widget) { m_widget->hide(); - m_widget->setParent(0); - m_widget = 0; + m_widget->setParent(nullptr); + m_widget = nullptr; } } diff --git a/src/plugins/coreplugin/rightpane.h b/src/plugins/coreplugin/rightpane.h index 905d37d4d4..14026a03e0 100644 --- a/src/plugins/coreplugin/rightpane.h +++ b/src/plugins/coreplugin/rightpane.h @@ -80,8 +80,8 @@ protected: private: void clearWidget(); - bool m_shown; - int m_width; + bool m_shown = true; + int m_width = 0; QPointer<QWidget> m_widget; static RightPaneWidget *m_instance; }; diff --git a/src/plugins/coreplugin/settingsdatabase.cpp b/src/plugins/coreplugin/settingsdatabase.cpp index 7c272c6720..9b5054fa57 100644 --- a/src/plugins/coreplugin/settingsdatabase.cpp +++ b/src/plugins/coreplugin/settingsdatabase.cpp @@ -57,7 +57,7 @@ enum { debug_settings = 0 }; namespace Core { namespace Internal { -typedef QMap<QString, QVariant> SettingsMap; +using SettingsMap = QMap<QString, QVariant>; class SettingsDatabasePrivate { diff --git a/src/plugins/coreplugin/sidebar.cpp b/src/plugins/coreplugin/sidebar.cpp index 36e34f482f..a5466a597e 100644 --- a/src/plugins/coreplugin/sidebar.cpp +++ b/src/plugins/coreplugin/sidebar.cpp @@ -68,7 +68,7 @@ QList<QToolButton *> SideBarItem::createToolBarWidgets() } struct SideBarPrivate { - SideBarPrivate() :m_closeWhenEmpty(false) {} + SideBarPrivate() = default; QList<Internal::SideBarWidget*> m_widgets; QMap<QString, QPointer<SideBarItem> > m_itemMap; @@ -77,7 +77,7 @@ struct SideBarPrivate { QStringList m_unavailableItemIds; QStringList m_defaultVisible; QMap<QString, Core::Command*> m_shortcutMap; - bool m_closeWhenEmpty; + bool m_closeWhenEmpty = false; }; SideBar::SideBar(QList<SideBarItem*> itemList, @@ -143,10 +143,8 @@ void SideBar::setCloseWhenEmpty(bool value) void SideBar::makeItemAvailable(SideBarItem *item) { - typedef QMap<QString, QPointer<SideBarItem> >::const_iterator Iterator; - - const Iterator cend = d->m_itemMap.constEnd(); - for (Iterator it = d->m_itemMap.constBegin(); it != cend ; ++it) { + auto cend = d->m_itemMap.constEnd(); + for (auto it = d->m_itemMap.constBegin(); it != cend ; ++it) { if (it.value().data() == item) { d->m_availableItemIds.append(it.key()); d->m_availableItemTitles.append(it.value().data()->title()); @@ -193,7 +191,7 @@ SideBarItem *SideBar::item(const QString &id) emit availableItemsChanged(); return d->m_itemMap.value(id).data(); } - return 0; + return nullptr; } Internal::SideBarWidget *SideBar::insertSideBarWidget(int position, const QString &id) @@ -201,7 +199,7 @@ Internal::SideBarWidget *SideBar::insertSideBarWidget(int position, const QStrin if (!d->m_widgets.isEmpty()) d->m_widgets.at(0)->setCloseIcon(Utils::Icons::CLOSE_SPLIT_BOTTOM.icon()); - Internal::SideBarWidget *item = new Internal::SideBarWidget(this, id); + auto item = new Internal::SideBarWidget(this, id); connect(item, &Internal::SideBarWidget::splitMe, this, &SideBar::splitSubWidget); connect(item, &Internal::SideBarWidget::closeMe, this, &SideBar::closeSubWidget); connect(item, &Internal::SideBarWidget::currentWidgetChanged, this, &SideBar::updateWidgets); @@ -225,7 +223,7 @@ void SideBar::removeSideBarWidget(Internal::SideBarWidget *widget) void SideBar::splitSubWidget() { - Internal::SideBarWidget *original = qobject_cast<Internal::SideBarWidget*>(sender()); + auto original = qobject_cast<Internal::SideBarWidget*>(sender()); int pos = indexOf(original) + 1; insertSideBarWidget(pos); updateWidgets(); @@ -234,7 +232,7 @@ void SideBar::splitSubWidget() void SideBar::closeSubWidget() { if (d->m_widgets.count() != 1) { - Internal::SideBarWidget *widget = qobject_cast<Internal::SideBarWidget*>(sender()); + auto widget = qobject_cast<Internal::SideBarWidget*>(sender()); if (!widget) return; removeSideBarWidget(widget); diff --git a/src/plugins/coreplugin/sidebarwidget.cpp b/src/plugins/coreplugin/sidebarwidget.cpp index 7982214a37..daad4cf813 100644 --- a/src/plugins/coreplugin/sidebarwidget.cpp +++ b/src/plugins/coreplugin/sidebarwidget.cpp @@ -48,15 +48,14 @@ public: explicit SideBarComboBox(SideBarWidget *sideBarWidget) : m_sideBarWidget(sideBarWidget) {} private: - virtual const Command *command(const QString &text) const + const Command *command(const QString &text) const override { return m_sideBarWidget->command(text); } SideBarWidget *m_sideBarWidget; }; SideBarWidget::SideBarWidget(SideBar *sideBar, const QString &id) - : m_currentItem(0) - , m_sideBar(sideBar) + : m_sideBar(sideBar) { m_comboBox = new SideBarComboBox(this); m_comboBox->setMinimumContentsLength(15); @@ -81,7 +80,7 @@ SideBarWidget::SideBarWidget(SideBar *sideBar, const QString &id) connect(m_closeAction, &QAction::triggered, this, &SideBarWidget::closeMe); m_toolbar->addAction(m_closeAction); - QVBoxLayout *lay = new QVBoxLayout(); + auto lay = new QVBoxLayout(); lay->setMargin(0); lay->setSpacing(0); setLayout(lay); @@ -104,9 +103,7 @@ SideBarWidget::SideBarWidget(SideBar *sideBar, const QString &id) this, &SideBarWidget::setCurrentIndex); } -SideBarWidget::~SideBarWidget() -{ -} +SideBarWidget::~SideBarWidget() = default; QString SideBarWidget::currentItemTitle() const { @@ -176,14 +173,14 @@ void SideBarWidget::removeCurrentItem() QWidget *w = m_currentItem->widget(); w->hide(); layout()->removeWidget(w); - w->setParent(0); + w->setParent(nullptr); m_sideBar->makeItemAvailable(m_currentItem); // Delete custom toolbar widgets qDeleteAll(m_addedToolBarActions); m_addedToolBarActions.clear(); - m_currentItem = 0; + m_currentItem = nullptr; } void SideBarWidget::setCurrentIndex(int) @@ -197,12 +194,12 @@ Command *SideBarWidget::command(const QString &title) const { const QString id = m_sideBar->idForTitle(title); if (id.isEmpty()) - return 0; + return nullptr; const QMap<QString, Command*> shortcutMap = m_sideBar->shortcutMap(); QMap<QString, Command*>::const_iterator r = shortcutMap.find(id); if (r != shortcutMap.end()) return r.value(); - return 0; + return nullptr; } void SideBarWidget::setCloseIcon(const QIcon &icon) diff --git a/src/plugins/coreplugin/sidebarwidget.h b/src/plugins/coreplugin/sidebarwidget.h index e6db3c2200..86d59102e4 100644 --- a/src/plugins/coreplugin/sidebarwidget.h +++ b/src/plugins/coreplugin/sidebarwidget.h @@ -45,7 +45,7 @@ class SideBarWidget : public QWidget Q_OBJECT public: explicit SideBarWidget(SideBar *sideBar, const QString &title); - virtual ~SideBarWidget(); + ~SideBarWidget() override; QString currentItemId() const; QString currentItemTitle() const; @@ -66,13 +66,13 @@ signals: private: void setCurrentIndex(int); - SideBarComboBox *m_comboBox; - SideBarItem *m_currentItem; - QToolBar *m_toolbar; - QAction *m_splitAction; - QAction *m_closeAction; + SideBarComboBox *m_comboBox = nullptr; + SideBarItem *m_currentItem = nullptr; + QToolBar *m_toolbar = nullptr; + QAction *m_splitAction = nullptr; + QAction *m_closeAction = nullptr; QList<QAction *> m_addedToolBarActions; - SideBar *m_sideBar; + SideBar *m_sideBar = nullptr; }; } // namespace Internal diff --git a/src/plugins/coreplugin/statusbarmanager.cpp b/src/plugins/coreplugin/statusbarmanager.cpp index c653928ad8..e71e745077 100644 --- a/src/plugins/coreplugin/statusbarmanager.cpp +++ b/src/plugins/coreplugin/statusbarmanager.cpp @@ -25,8 +25,10 @@ #include "statusbarmanager.h" +#include "imode.h" #include "mainwindow.h" #include "minisplitter.h" +#include "modemanager.h" #include <utils/qtcassert.h> @@ -45,6 +47,17 @@ static QPointer<QSplitter> m_splitter; static QList<QPointer<QWidget>> m_statusBarWidgets; static QList<QPointer<IContext>> m_contexts; +/*! + Context that always returns the context of the active's mode widget (if available). +*/ +class StatusBarContext : public IContext +{ +public: + StatusBarContext(QObject *parent); + + Context context() const final; +}; + static QWidget *createWidget(QWidget *parent) { QWidget *w = new QWidget(parent); @@ -85,6 +98,10 @@ static void createStatusBarManager() bar->insertPermanentWidget(1, rightCornerWidget); m_statusBarWidgets.append(rightCornerWidget); + auto context = new StatusBarContext(bar); + context->setWidget(bar); + ICore::addContextObject(context); + QObject::connect(ICore::instance(), &ICore::saveSettingsRequested, [] { QSettings *s = ICore::settings(); s->beginGroup(QLatin1String(kSettingsGroup)); @@ -152,4 +169,20 @@ void StatusBarManager::restoreSettings() m_splitter->setSizes(QList<int>() << leftSplitWidth << (sum - leftSplitWidth)); } +StatusBarContext::StatusBarContext(QObject *parent) + : IContext(parent) +{ +} + +Context StatusBarContext::context() const +{ + IMode *currentMode = ModeManager::currentMode(); + QWidget *modeWidget = currentMode ? currentMode->widget() : nullptr; + if (modeWidget) { + if (IContext *context = ICore::contextObject(modeWidget)) + return context->context(); + } + return Context(); +} + } // Core diff --git a/src/plugins/coreplugin/styleanimator.cpp b/src/plugins/coreplugin/styleanimator.cpp index 8843251f7c..03fe40dfbd 100644 --- a/src/plugins/coreplugin/styleanimator.cpp +++ b/src/plugins/coreplugin/styleanimator.cpp @@ -32,7 +32,7 @@ Animation * StyleAnimator::widgetAnimation(const QWidget *widget) const { if (!widget) - return 0; + return nullptr; return Utils::findOrDefault(animations, Utils::equal(&Animation::widget, widget)); } diff --git a/src/plugins/coreplugin/styleanimator.h b/src/plugins/coreplugin/styleanimator.h index 020c00edef..b29dade9fb 100644 --- a/src/plugins/coreplugin/styleanimator.h +++ b/src/plugins/coreplugin/styleanimator.h @@ -42,8 +42,8 @@ class Animation { public : - Animation() : m_running(true) { } - virtual ~Animation() { } + Animation() = default; + virtual ~Animation() = default; QWidget * widget() const { return m_widget; } bool running() const { return m_running; } const QTime &startTime() const { return m_startTime; } @@ -59,21 +59,21 @@ protected: QImage m_primaryImage; QImage m_secondaryImage; QImage m_tempImage; - bool m_running; + bool m_running = true; }; // Handles state transition animations class Transition : public Animation { public : - Transition() : Animation(), m_duration(100) {} - virtual ~Transition() {} + Transition() = default; + ~Transition() override = default; void setDuration(int duration) { m_duration = duration; } void setStartImage(const QImage &image) { m_primaryImage = image; } void setEndImage(const QImage &image) { m_secondaryImage = image; } - virtual void paint(QPainter *painter, const QStyleOption *option); + void paint(QPainter *painter, const QStyleOption *option) override; int duration() const { return m_duration; } - int m_duration; //set time in ms to complete a state transition + int m_duration = 100; //set time in ms to complete a state transition }; class StyleAnimator : public QObject @@ -81,9 +81,9 @@ class StyleAnimator : public QObject Q_OBJECT public: - StyleAnimator(QObject *parent = 0) : QObject(parent) {} + StyleAnimator(QObject *parent = nullptr) : QObject(parent) {} - void timerEvent(QTimerEvent *); + void timerEvent(QTimerEvent *) override; void startAnimation(Animation *); void stopAnimation(const QWidget *); Animation* widgetAnimation(const QWidget *) const; diff --git a/src/plugins/coreplugin/systemsettings.cpp b/src/plugins/coreplugin/systemsettings.cpp index dd88478ed8..0f65161b66 100644 --- a/src/plugins/coreplugin/systemsettings.cpp +++ b/src/plugins/coreplugin/systemsettings.cpp @@ -50,7 +50,7 @@ namespace Core { namespace Internal { SystemSettings::SystemSettings() - : m_page(nullptr), m_dialog(0) + : m_page(nullptr), m_dialog(nullptr) { setId(Constants::SETTINGS_ID_SYSTEM); setDisplayName(tr("System")); @@ -187,7 +187,7 @@ void SystemSettings::finish() { delete m_widget; delete m_page; - m_page = 0; + m_page = nullptr; } void SystemSettings::resetTerminal() diff --git a/src/plugins/coreplugin/systemsettings.h b/src/plugins/coreplugin/systemsettings.h index a4b99be557..dbf7e09a1d 100644 --- a/src/plugins/coreplugin/systemsettings.h +++ b/src/plugins/coreplugin/systemsettings.h @@ -44,9 +44,9 @@ class SystemSettings : public IOptionsPage public: SystemSettings(); - QWidget *widget(); - void apply(); - void finish(); + QWidget *widget() override; + void apply() override; + void finish() override; private: void showHelpForFileBrowser(); diff --git a/src/plugins/coreplugin/textdocument.h b/src/plugins/coreplugin/textdocument.h index cc695c1c1f..9b498124aa 100644 --- a/src/plugins/coreplugin/textdocument.h +++ b/src/plugins/coreplugin/textdocument.h @@ -38,7 +38,7 @@ class CORE_EXPORT BaseTextDocument : public IDocument Q_OBJECT public: - typedef Utils::TextFileFormat::ReadResult ReadResult; + using ReadResult = Utils::TextFileFormat::ReadResult; explicit BaseTextDocument(QObject *parent = nullptr); ~BaseTextDocument() override; diff --git a/src/plugins/coreplugin/themechooser.cpp b/src/plugins/coreplugin/themechooser.cpp index 18f0a4040b..7fedfea06f 100644 --- a/src/plugins/coreplugin/themechooser.cpp +++ b/src/plugins/coreplugin/themechooser.cpp @@ -79,7 +79,7 @@ QString ThemeEntry::filePath() const class ThemeListModel : public QAbstractListModel { public: - ThemeListModel(QObject *parent = 0): + ThemeListModel(QObject *parent = nullptr): QAbstractListModel(parent) { } @@ -135,7 +135,7 @@ ThemeChooserPrivate::ThemeChooserPrivate(QWidget *widget) : m_themeListModel(new ThemeListModel) , m_themeComboBox(new QComboBox) { - QHBoxLayout *layout = new QHBoxLayout(widget); + auto layout = new QHBoxLayout(widget); layout->addWidget(m_themeComboBox); auto overriddenLabel = new QLabel; overriddenLabel->setText(ThemeChooser::tr("Current theme: %1") diff --git a/src/plugins/coreplugin/toolsettings.cpp b/src/plugins/coreplugin/toolsettings.cpp index 0e3904e825..857d154125 100644 --- a/src/plugins/coreplugin/toolsettings.cpp +++ b/src/plugins/coreplugin/toolsettings.cpp @@ -130,7 +130,7 @@ void ToolSettings::apply() it.next(); QList<ExternalTool *> items; foreach (ExternalTool *tool, it.value()) { - ExternalTool *toolToAdd = 0; + ExternalTool *toolToAdd = nullptr; if (ExternalTool *originalTool = originalTools.take(tool->id())) { // check if it has different category and is custom tool if (tool->displayCategory() != it.key() && !tool->preset()) diff --git a/src/plugins/coreplugin/toolsettings.h b/src/plugins/coreplugin/toolsettings.h index 8ce3a8d8ba..28972bc213 100644 --- a/src/plugins/coreplugin/toolsettings.h +++ b/src/plugins/coreplugin/toolsettings.h @@ -39,11 +39,11 @@ class ToolSettings : public IOptionsPage Q_OBJECT public: - explicit ToolSettings(QObject *parent = 0); + explicit ToolSettings(QObject *parent = nullptr); - QWidget *widget(); - void apply(); - void finish(); + QWidget *widget() override; + void apply() override; + void finish() override; private: QPointer<ExternalToolConfig> m_widget; diff --git a/src/plugins/coreplugin/variablechooser.cpp b/src/plugins/coreplugin/variablechooser.cpp index 186a74d6a3..f2e0edef02 100644 --- a/src/plugins/coreplugin/variablechooser.cpp +++ b/src/plugins/coreplugin/variablechooser.cpp @@ -72,9 +72,9 @@ public: new HeaderViewStretcher(header(), 0); } - void contextMenuEvent(QContextMenuEvent *ev); + void contextMenuEvent(QContextMenuEvent *ev) override; - void currentChanged(const QModelIndex ¤t, const QModelIndex &previous); + void currentChanged(const QModelIndex ¤t, const QModelIndex &previous) override; private: VariableChooserPrivate *m_target; @@ -146,12 +146,9 @@ public: class VariableGroupItem : public TreeItem { public: - VariableGroupItem() - : m_chooser(0), m_populated(false) - { - } + VariableGroupItem() = default; - QVariant data(int column, int role) const + QVariant data(int column, int role) const override { if (role == Qt::DisplayRole || role == Qt::EditRole) { if (column == 0) @@ -162,12 +159,12 @@ public: return QVariant(); } - bool canFetchMore() const + bool canFetchMore() const override { return !m_populated; } - void fetchMore() + void fetchMore() override { if (MacroExpander *expander = m_provider()) populateGroup(expander); @@ -177,15 +174,15 @@ public: void populateGroup(MacroExpander *expander); public: - VariableChooserPrivate *m_chooser; // Not owned. - bool m_populated; + VariableChooserPrivate *m_chooser = nullptr; // Not owned. + bool m_populated = false; MacroExpanderProvider m_provider; }; class VariableItem : public TypedTreeItem<TreeItem, VariableGroupItem> { public: - VariableItem() {} + VariableItem() = default; Qt::ItemFlags flags(int) const override { @@ -231,8 +228,8 @@ void VariableTreeView::contextMenuEvent(QContextMenuEvent *ev) QString expandedText = index.data(ExpandedTextRole).toString(); QMenu menu; - QAction *insertUnexpandedAction = 0; - QAction *insertExpandedAction = 0; + QAction *insertUnexpandedAction = nullptr; + QAction *insertExpandedAction = nullptr; if (unexpandedText.isEmpty()) { insertUnexpandedAction = menu.addAction(VariableChooser::tr("Insert Unexpanded Value")); @@ -265,13 +262,13 @@ void VariableTreeView::currentChanged(const QModelIndex ¤t, const QModelIn VariableChooserPrivate::VariableChooserPrivate(VariableChooser *parent) : q(parent), - m_lineEdit(0), - m_textEdit(0), - m_plainTextEdit(0), - m_iconButton(0), - m_variableFilter(0), - m_variableTree(0), - m_variableDescription(0) + m_lineEdit(nullptr), + m_textEdit(nullptr), + m_plainTextEdit(nullptr), + m_iconButton(nullptr), + m_variableFilter(nullptr), + m_variableTree(nullptr), + m_variableDescription(nullptr) { m_defaultDescription = VariableChooser::tr("Select a variable to insert."); @@ -295,7 +292,7 @@ VariableChooserPrivate::VariableChooserPrivate(VariableChooser *parent) m_variableDescription->setAttribute(Qt::WA_MacSmallSize); m_variableDescription->setTextInteractionFlags(Qt::TextBrowserInteraction); - QVBoxLayout *verticalLayout = new QVBoxLayout(q); + auto verticalLayout = new QVBoxLayout(q); verticalLayout->setContentsMargins(3, 3, 3, 12); verticalLayout->addWidget(m_variableFilter); verticalLayout->addWidget(m_variableTree); @@ -307,7 +304,7 @@ VariableChooserPrivate::VariableChooserPrivate(VariableChooser *parent) this, &VariableChooserPrivate::handleItemActivated); connect(qobject_cast<QApplication *>(qApp), &QApplication::focusChanged, this, &VariableChooserPrivate::updateCurrentEditor); - updateCurrentEditor(0, QApplication::focusWidget()); + updateCurrentEditor(nullptr, QApplication::focusWidget()); } void VariableGroupItem::populateGroup(MacroExpander *expander) @@ -489,18 +486,18 @@ void VariableChooserPrivate::updateCurrentEditor(QWidget *old, QWidget *widget) QLineEdit *previousLineEdit = m_lineEdit; QWidget *previousWidget = currentWidget(); - m_lineEdit = 0; - m_textEdit = 0; - m_plainTextEdit = 0; - QWidget *chooser = widget->property(kVariableSupportProperty).value<QWidget *>(); + m_lineEdit = nullptr; + m_textEdit = nullptr; + m_plainTextEdit = nullptr; + auto chooser = widget->property(kVariableSupportProperty).value<QWidget *>(); m_currentVariableName = widget->property(kVariableNameProperty).toByteArray(); bool supportsVariables = chooser == q; - if (QLineEdit *lineEdit = qobject_cast<QLineEdit *>(widget)) - m_lineEdit = (supportsVariables ? lineEdit : 0); - else if (QTextEdit *textEdit = qobject_cast<QTextEdit *>(widget)) - m_textEdit = (supportsVariables ? textEdit : 0); - else if (QPlainTextEdit *plainTextEdit = qobject_cast<QPlainTextEdit *>(widget)) - m_plainTextEdit = (supportsVariables ? plainTextEdit : 0); + if (auto lineEdit = qobject_cast<QLineEdit *>(widget)) + m_lineEdit = (supportsVariables ? lineEdit : nullptr); + else if (auto textEdit = qobject_cast<QTextEdit *>(widget)) + m_textEdit = (supportsVariables ? textEdit : nullptr); + else if (auto plainTextEdit = qobject_cast<QPlainTextEdit *>(widget)) + m_plainTextEdit = (supportsVariables ? plainTextEdit : nullptr); QWidget *current = currentWidget(); if (current != previousWidget) { @@ -510,7 +507,7 @@ void VariableChooserPrivate::updateCurrentEditor(QWidget *old, QWidget *widget) previousLineEdit->setTextMargins(0, 0, 0, 0); if (m_iconButton) { m_iconButton->hide(); - m_iconButton->setParent(0); + m_iconButton->setParent(nullptr); } if (current) { current->installEventFilter(q); // escape key handling and geometry changes @@ -608,7 +605,7 @@ static bool handleEscapePressed(QKeyEvent *ke, QWidget *widget) bool VariableChooser::event(QEvent *ev) { if (ev->type() == QEvent::KeyPress || ev->type() == QEvent::ShortcutOverride) { - QKeyEvent *ke = static_cast<QKeyEvent *>(ev); + auto ke = static_cast<QKeyEvent *>(ev); if (handleEscapePressed(ke, this)) return true; } @@ -623,7 +620,7 @@ bool VariableChooser::eventFilter(QObject *obj, QEvent *event) if (obj != d->currentWidget()) return false; if ((event->type() == QEvent::KeyPress || event->type() == QEvent::ShortcutOverride) && isVisible()) { - QKeyEvent *ke = static_cast<QKeyEvent *>(event); + auto ke = static_cast<QKeyEvent *>(event); return handleEscapePressed(ke, this); } else if (event->type() == QEvent::Resize) { d->updateButtonGeometry(); diff --git a/src/plugins/coreplugin/vcsmanager.cpp b/src/plugins/coreplugin/vcsmanager.cpp index e83f110ea5..fc9388aa1e 100644 --- a/src/plugins/coreplugin/vcsmanager.cpp +++ b/src/plugins/coreplugin/vcsmanager.cpp @@ -211,8 +211,8 @@ void VcsManager::resetVersionControlForDirectory(const QString &inputDirectory) IVersionControl* VcsManager::findVersionControlForDirectory(const QString &inputDirectory, QString *topLevelDirectory) { - typedef QPair<QString, IVersionControl *> StringVersionControlPair; - typedef QList<StringVersionControlPair> StringVersionControlPairs; + using StringVersionControlPair = QPair<QString, IVersionControl *>; + using StringVersionControlPairs = QList<StringVersionControlPair>; if (inputDirectory.isEmpty()) { if (topLevelDirectory) topLevelDirectory->clear(); @@ -441,7 +441,7 @@ void VcsManager::clearVersionControlCache() void VcsManager::handleConfigurationChanges() { d->m_cachedAdditionalToolsPathsDirty = true; - IVersionControl *vcs = qobject_cast<IVersionControl *>(sender()); + auto vcs = qobject_cast<IVersionControl *>(sender()); if (vcs) emit configurationChanged(vcs); } @@ -462,7 +462,7 @@ namespace Internal { const char ID_VCS_A[] = "A"; const char ID_VCS_B[] = "B"; -typedef QHash<QString, QString> FileHash; +using FileHash = QHash<QString, QString>; static FileHash makeHash(const QStringList &list) { diff --git a/src/plugins/coreplugin/vcsmanager.h b/src/plugins/coreplugin/vcsmanager.h index 2015fc0f48..9971e9ac99 100644 --- a/src/plugins/coreplugin/vcsmanager.h +++ b/src/plugins/coreplugin/vcsmanager.h @@ -59,7 +59,7 @@ public: template <typename T, typename... Args> static T *registerVersionControl(Args&&... args) { - T *vc = new T(std::forward<Args>(args)...); + auto vc = new T(std::forward<Args>(args)...); addVersionControl(vc); return vc; } diff --git a/src/plugins/coreplugin/versiondialog.cpp b/src/plugins/coreplugin/versiondialog.cpp index 06962971ea..045bc60da3 100644 --- a/src/plugins/coreplugin/versiondialog.cpp +++ b/src/plugins/coreplugin/versiondialog.cpp @@ -53,7 +53,7 @@ VersionDialog::VersionDialog(QWidget *parent) setWindowTitle(tr("About %1").arg(Core::Constants::IDE_DISPLAY_NAME)); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); - QGridLayout *layout = new QGridLayout(this); + auto layout = new QGridLayout(this); layout->setSizeConstraint(QLayout::SetFixedSize); QString ideRev; @@ -112,7 +112,7 @@ VersionDialog::VersionDialog(QWidget *parent) bool VersionDialog::event(QEvent *event) { if (event->type() == QEvent::ShortcutOverride) { - QKeyEvent *ke = static_cast<QKeyEvent *>(event); + auto ke = static_cast<QKeyEvent *>(event); if (ke->key() == Qt::Key_Escape && !ke->modifiers()) { ke->accept(); return true; diff --git a/src/plugins/coreplugin/versiondialog.h b/src/plugins/coreplugin/versiondialog.h index 52efab01fe..fe7f003e88 100644 --- a/src/plugins/coreplugin/versiondialog.h +++ b/src/plugins/coreplugin/versiondialog.h @@ -40,7 +40,7 @@ class VersionDialog : public QDialog public: explicit VersionDialog(QWidget *parent); - bool event(QEvent *event); + bool event(QEvent *event) override; }; diff --git a/src/plugins/coreplugin/windowsupport.cpp b/src/plugins/coreplugin/windowsupport.cpp index 5d2ab1c9fa..6ce31bc8a4 100644 --- a/src/plugins/coreplugin/windowsupport.cpp +++ b/src/plugins/coreplugin/windowsupport.cpp @@ -45,7 +45,7 @@ namespace Core { namespace Internal { -QMenu *WindowList::m_dockMenu = 0; +QMenu *WindowList::m_dockMenu = nullptr; QList<QWidget *> WindowList::m_windows; QList<QAction *> WindowList::m_windowActions; QList<Id> WindowList::m_windowActionIds; diff --git a/src/plugins/coreplugin/windowsupport.h b/src/plugins/coreplugin/windowsupport.h index 6dc13914bf..1e9d27139a 100644 --- a/src/plugins/coreplugin/windowsupport.h +++ b/src/plugins/coreplugin/windowsupport.h @@ -61,12 +61,12 @@ class WindowSupport : public QObject Q_OBJECT public: WindowSupport(QWidget *window, const Context &context); - ~WindowSupport(); + ~WindowSupport() override; void setCloseActionEnabled(bool enabled); protected: - bool eventFilter(QObject *obj, QEvent *event); + bool eventFilter(QObject *obj, QEvent *event) override; private: void toggleFullScreen(); diff --git a/src/plugins/cppeditor/cppincludehierarchy.cpp b/src/plugins/cppeditor/cppincludehierarchy.cpp index 22bebf3daf..27a8cca993 100644 --- a/src/plugins/cppeditor/cppincludehierarchy.cpp +++ b/src/plugins/cppeditor/cppincludehierarchy.cpp @@ -42,7 +42,7 @@ #include <cplusplus/CppDocument.h> -#include <utils/annotateditemdelegate.h> +#include <utils/delegates.h> #include <utils/dropsupport.h> #include <utils/fileutils.h> #include <utils/navigationtreeview.h> diff --git a/src/plugins/cppeditor/cpptypehierarchy.cpp b/src/plugins/cppeditor/cpptypehierarchy.cpp index ad581602f0..1b9d51851a 100644 --- a/src/plugins/cppeditor/cpptypehierarchy.cpp +++ b/src/plugins/cppeditor/cpptypehierarchy.cpp @@ -34,7 +34,7 @@ #include <coreplugin/editormanager/editormanager.h> #include <cpptools/cppelementevaluator.h> #include <utils/algorithm.h> -#include <utils/annotateditemdelegate.h> +#include <utils/delegates.h> #include <utils/navigationtreeview.h> #include <utils/dropsupport.h> diff --git a/src/plugins/cppeditor/cppuseselectionsupdater.cpp b/src/plugins/cppeditor/cppuseselectionsupdater.cpp index da7a7a1d92..fc6123b94b 100644 --- a/src/plugins/cppeditor/cppuseselectionsupdater.cpp +++ b/src/plugins/cppeditor/cppuseselectionsupdater.cpp @@ -43,7 +43,6 @@ namespace Internal { CppUseSelectionsUpdater::CppUseSelectionsUpdater(TextEditor::TextEditorWidget *editorWidget) : m_editorWidget(editorWidget) - , m_runnerRevision(-1) { m_timer.setSingleShot(true); m_timer.setInterval(updateUseSelectionsInternalInMs); diff --git a/src/plugins/cppeditor/resourcepreviewhoverhandler.cpp b/src/plugins/cppeditor/resourcepreviewhoverhandler.cpp index a657fcd6bc..a454361d30 100644 --- a/src/plugins/cppeditor/resourcepreviewhoverhandler.cpp +++ b/src/plugins/cppeditor/resourcepreviewhoverhandler.cpp @@ -200,14 +200,12 @@ QString ResourcePreviewHoverHandler::makeTooltip() const QString ret; const Utils::MimeType mimeType = Utils::mimeTypeForFile(m_resPath); - if (mimeType.isValid()) { - if (mimeType.name().startsWith("image", Qt::CaseInsensitive)) - ret += QString("<img src=\"file:///%1\" /><br/>").arg(m_resPath); + if (mimeType.name().startsWith("image", Qt::CaseInsensitive)) + ret += QString("<img src=\"file:///%1\" /><br/>").arg(m_resPath); - ret += QString("<a href=\"file:///%1\">%2</a>") - .arg(m_resPath) - .arg(QDir::toNativeSeparators(m_resPath)); - } + ret += QString("<a href=\"file:///%1\">%2</a>") + .arg(m_resPath) + .arg(QDir::toNativeSeparators(m_resPath)); return ret; } diff --git a/src/plugins/cpptools/builtincursorinfo.cpp b/src/plugins/cpptools/builtincursorinfo.cpp index 17f40c7d26..4522af15a9 100644 --- a/src/plugins/cpptools/builtincursorinfo.cpp +++ b/src/plugins/cpptools/builtincursorinfo.cpp @@ -123,7 +123,7 @@ public: } protected: - virtual bool preVisit(AST *ast) + bool preVisit(AST *ast) override { if (m_functionDefinition) return false; diff --git a/src/plugins/cpptools/compileroptionsbuilder.cpp b/src/plugins/cpptools/compileroptionsbuilder.cpp index e16a424f3b..aeb60a0f28 100644 --- a/src/plugins/cpptools/compileroptionsbuilder.cpp +++ b/src/plugins/cpptools/compileroptionsbuilder.cpp @@ -28,8 +28,8 @@ #include <coreplugin/icore.h> #include <coreplugin/vcsmanager.h> -#include <projectexplorer/project.h> #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/project.h> #include <utils/fileutils.h> #include <utils/qtcassert.h> @@ -39,14 +39,10 @@ namespace CppTools { -static constexpr char SYSTEM_INCLUDE_PREFIX[] = "-isystem"; - CompilerOptionsBuilder::CompilerOptionsBuilder(const ProjectPart &projectPart, - const QString &clangVersion, - const QString &clangResourceDirectory) - : m_projectPart(projectPart) - , m_clangVersion(clangVersion) - , m_clangResourceDirectory(clangResourceDirectory) + UseSystemHeader useSystemHeader) + : m_projectPart(projectPart), + m_useSystemHeader(useSystemHeader) { } @@ -59,10 +55,12 @@ QStringList CompilerOptionsBuilder::build(CppTools::ProjectFile::Kind fileKind, return QStringList();); } + add("-c"); + addWordWidth(); addTargetTriple(); addExtraCodeModelFlags(); - addLanguageOption(fileKind); + updateLanguageOption(fileKind); addOptionsForLanguage(/*checkForBorlandExtensions*/ true); enableExceptions(); @@ -83,6 +81,67 @@ QStringList CompilerOptionsBuilder::build(CppTools::ProjectFile::Kind fileKind, return options(); } +static QStringList createLanguageOptionGcc(ProjectFile::Kind fileKind, bool objcExt) +{ + QStringList opts; + + switch (fileKind) { + case ProjectFile::Unclassified: + case ProjectFile::Unsupported: + break; + case ProjectFile::CHeader: + if (objcExt) + opts += QLatin1String("objective-c-header"); + else + opts += QLatin1String("c-header"); + break; + + case ProjectFile::CXXHeader: + default: + if (!objcExt) { + opts += QLatin1String("c++-header"); + break; + } + Q_FALLTHROUGH(); + case ProjectFile::ObjCHeader: + case ProjectFile::ObjCXXHeader: + opts += QLatin1String("objective-c++-header"); + break; + + case ProjectFile::CSource: + if (!objcExt) { + opts += QLatin1String("c"); + break; + } + Q_FALLTHROUGH(); + case ProjectFile::ObjCSource: + opts += QLatin1String("objective-c"); + break; + + case ProjectFile::CXXSource: + if (!objcExt) { + opts += QLatin1String("c++"); + break; + } + Q_FALLTHROUGH(); + case ProjectFile::ObjCXXSource: + opts += QLatin1String("objective-c++"); + break; + + case ProjectFile::OpenCLSource: + opts += QLatin1String("cl"); + break; + case ProjectFile::CudaSource: + opts += QLatin1String("cuda"); + break; + } + + if (!opts.isEmpty()) + opts.prepend(QLatin1String("-x")); + + return opts; +} + QStringList CompilerOptionsBuilder::options() const { return m_options; @@ -132,7 +191,6 @@ void CompilerOptionsBuilder::enableExceptions() void CompilerOptionsBuilder::addHeaderPathOptions() { typedef ProjectPartHeaderPath HeaderPath; - const QString defaultPrefix = includeDirOption(); QStringList result; @@ -152,7 +210,7 @@ void CompilerOptionsBuilder::addHeaderPathOptions() default: // This shouldn't happen, but let's be nice..: // intentional fall-through: case HeaderPath::IncludePath: - prefix = defaultPrefix; + prefix = includeDirOptionForPath(headerPath.path); break; } @@ -203,72 +261,20 @@ void CompilerOptionsBuilder::addMacros(const ProjectExplorer::Macros ¯os) m_options.append(result); } -static QStringList createLanguageOptionGcc(ProjectFile::Kind fileKind, bool objcExt) -{ - QStringList opts; - - switch (fileKind) { - case ProjectFile::Unclassified: - case ProjectFile::Unsupported: - break; - case ProjectFile::CHeader: - if (objcExt) - opts += QLatin1String("objective-c-header"); - else - opts += QLatin1String("c-header"); - break; - - case ProjectFile::CXXHeader: - default: - if (!objcExt) { - opts += QLatin1String("c++-header"); - break; - } - Q_FALLTHROUGH(); - case ProjectFile::ObjCHeader: - case ProjectFile::ObjCXXHeader: - opts += QLatin1String("objective-c++-header"); - break; - - case ProjectFile::CSource: - if (!objcExt) { - opts += QLatin1String("c"); - break; - } - Q_FALLTHROUGH(); - case ProjectFile::ObjCSource: - opts += QLatin1String("objective-c"); - break; - - case ProjectFile::CXXSource: - if (!objcExt) { - opts += QLatin1String("c++"); - break; - } - Q_FALLTHROUGH(); - case ProjectFile::ObjCXXSource: - opts += QLatin1String("objective-c++"); - break; - - case ProjectFile::OpenCLSource: - opts += QLatin1String("cl"); - break; - case ProjectFile::CudaSource: - opts += QLatin1String("cuda"); - break; - } - - if (!opts.isEmpty()) - opts.prepend(QLatin1String("-x")); - - return opts; -} - -void CompilerOptionsBuilder::addLanguageOption(ProjectFile::Kind fileKind) +void CompilerOptionsBuilder::updateLanguageOption(ProjectFile::Kind fileKind) { const bool objcExt = m_projectPart.languageExtensions & ProjectPart::ObjectiveCExtensions; const QStringList options = createLanguageOptionGcc(fileKind, objcExt); - m_options.append(options); + if (options.isEmpty()) + return; + + QTC_ASSERT(options.size() == 2, return;); + int langOptIndex = m_options.indexOf("-x"); + if (langOptIndex == -1) { + m_options.append(options); + } else { + m_options[langOptIndex + 1] = options[1]; + } } void CompilerOptionsBuilder::addOptionsForLanguage(bool checkForBorlandExtensions) @@ -419,9 +425,14 @@ void CompilerOptionsBuilder::addDefineFunctionMacrosMsvc() addMacros({{"__FUNCSIG__", "\"\""}, {"__FUNCTION__", "\"\""}, {"__FUNCDNAME__", "\"\""}}); } -QString CompilerOptionsBuilder::includeDirOption() const +QString CompilerOptionsBuilder::includeDirOptionForPath(const QString &path) const { - return QLatin1String("-I"); + if (m_useSystemHeader == UseSystemHeader::No + || path.startsWith(m_projectPart.project->rootProjectDirectory().toString())) { + return QString("-I"); + } else { + return QString("-isystem"); + } } QByteArray CompilerOptionsBuilder::macroOption(const ProjectExplorer::Macro ¯o) const @@ -500,21 +511,9 @@ bool CompilerOptionsBuilder::excludeHeaderPath(const QString &headerPath) const void CompilerOptionsBuilder::addPredefinedHeaderPathsOptions() { - add("-nostdinc"); - add("-nostdlibinc"); - // In case of MSVC we need builtin clang defines to correctly handle clang includes if (m_projectPart.toolchainType != ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID) add("-undef"); - - addClangIncludeFolder(); -} - -void CompilerOptionsBuilder::addClangIncludeFolder() -{ - QTC_CHECK(!m_clangVersion.isEmpty()); - add(includeDirOption()); - add(clangIncludeDirectory(m_clangVersion, m_clangResourceDirectory)); } void CompilerOptionsBuilder::addProjectConfigFileInclude() @@ -525,32 +524,6 @@ void CompilerOptionsBuilder::addProjectConfigFileInclude() } } -static QString creatorLibexecPath() -{ -#ifndef UNIT_TESTS - return Core::ICore::instance()->libexecPath(); -#else - return QString(); -#endif -} - -QString clangIncludeDirectory(const QString &clangVersion, const QString &clangResourceDirectory) -{ - QDir dir(creatorLibexecPath() + "/clang" + clangIncludePath(clangVersion)); - if (!dir.exists() || !QFileInfo(dir, "stdint.h").exists()) - dir = QDir(clangResourceDirectory); - return QDir::toNativeSeparators(dir.canonicalPath()); -} - -QString clangExecutable(const QString &clangBinDirectory) -{ - const QString hostExeSuffix(QTC_HOST_EXE_SUFFIX); - QFileInfo executable(creatorLibexecPath() + "/clang/bin/clang" + hostExeSuffix); - if (!executable.exists()) - executable = QFileInfo(clangBinDirectory + "/clang" + hostExeSuffix); - return QDir::toNativeSeparators(executable.canonicalFilePath()); -} - void CompilerOptionsBuilder::undefineClangVersionMacrosForMsvc() { if (m_projectPart.toolchainType == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID) { diff --git a/src/plugins/cpptools/compileroptionsbuilder.h b/src/plugins/cpptools/compileroptionsbuilder.h index 87dc46ff26..75241dd023 100644 --- a/src/plugins/cpptools/compileroptionsbuilder.h +++ b/src/plugins/cpptools/compileroptionsbuilder.h @@ -31,6 +31,12 @@ namespace CppTools { +enum class UseSystemHeader +{ + Yes, + No +}; + class CPPTOOLS_EXPORT CompilerOptionsBuilder { public: @@ -40,16 +46,15 @@ public: }; CompilerOptionsBuilder(const ProjectPart &projectPart, - const QString &clangVersion = QString(), - const QString &clangResourceDirectory = QString()); + UseSystemHeader useSystemHeader = UseSystemHeader::No); virtual ~CompilerOptionsBuilder() {} virtual void addTargetTriple(); virtual void addExtraCodeModelFlags(); virtual void enableExceptions(); virtual void addPredefinedHeaderPathsOptions(); - virtual void addLanguageOption(ProjectFile::Kind fileKind); virtual void addOptionsForLanguage(bool checkForBorlandExtensions = true); + virtual void updateLanguageOption(ProjectFile::Kind fileKind); virtual void addExtraOptions() {} @@ -82,30 +87,16 @@ protected: virtual QString defineOption() const; virtual QString undefineOption() const; virtual QString includeOption() const; - virtual QString includeDirOption() const; - + QString includeDirOptionForPath(const QString &path) const; const ProjectPart m_projectPart; private: QByteArray macroOption(const ProjectExplorer::Macro ¯o) const; QByteArray toDefineOption(const ProjectExplorer::Macro ¯o) const; QString defineDirectiveToDefineOption(const ProjectExplorer::Macro &marco) const; - void addClangIncludeFolder(); QStringList m_options; - QString m_clangVersion; - QString m_clangResourceDirectory; + UseSystemHeader m_useSystemHeader; }; -QString CPPTOOLS_EXPORT clangExecutable(const QString &clangBinDirectory); - -QString CPPTOOLS_EXPORT clangIncludeDirectory(const QString &clangVersion, - const QString &clangResourceDirectory); - -template<class T> -T clangIncludePath(const T &clangVersion) -{ - return "/lib/clang/" + clangVersion + "/include"; -} - } // namespace CppTools diff --git a/src/plugins/cpptools/cppchecksymbols.cpp b/src/plugins/cpptools/cppchecksymbols.cpp index 83b6bfab9d..ab2adc104f 100644 --- a/src/plugins/cpptools/cppchecksymbols.cpp +++ b/src/plugins/cpptools/cppchecksymbols.cpp @@ -161,29 +161,29 @@ protected: } // nothing to do - virtual bool visit(UsingNamespaceDirective *) { return true; } - virtual bool visit(UsingDeclaration *) { return true; } - virtual bool visit(Argument *) { return true; } - virtual bool visit(BaseClass *) { return true; } + bool visit(UsingNamespaceDirective *) override { return true; } + bool visit(UsingDeclaration *) override { return true; } + bool visit(Argument *) override { return true; } + bool visit(BaseClass *) override { return true; } - virtual bool visit(Function *symbol) + bool visit(Function *symbol) override { addFunction(symbol->name()); return true; } - virtual bool visit(Block *) + bool visit(Block *) override { return true; } - virtual bool visit(NamespaceAlias *symbol) + bool visit(NamespaceAlias *symbol) override { addType(symbol->name()); return true; } - virtual bool visit(Declaration *symbol) + bool visit(Declaration *symbol) override { if (symbol->enclosingEnum() != 0) addStatic(symbol->name()); @@ -199,66 +199,66 @@ protected: return true; } - virtual bool visit(TypenameArgument *symbol) + bool visit(TypenameArgument *symbol) override { addType(symbol->name()); return true; } - virtual bool visit(Enum *symbol) + bool visit(Enum *symbol) override { addType(symbol->name()); return true; } - virtual bool visit(Namespace *symbol) + bool visit(Namespace *symbol) override { addType(symbol->name()); return true; } - virtual bool visit(Template *) + bool visit(Template *) override { return true; } - virtual bool visit(Class *symbol) + bool visit(Class *symbol) override { addType(symbol->name()); return true; } - virtual bool visit(ForwardClassDeclaration *symbol) + bool visit(ForwardClassDeclaration *symbol) override { addType(symbol->name()); return true; } // Objective-C - virtual bool visit(ObjCBaseClass *) { return true; } - virtual bool visit(ObjCBaseProtocol *) { return true; } - virtual bool visit(ObjCPropertyDeclaration *) { return true; } - virtual bool visit(ObjCMethod *) { return true; } + bool visit(ObjCBaseClass *) override { return true; } + bool visit(ObjCBaseProtocol *) override { return true; } + bool visit(ObjCPropertyDeclaration *) override { return true; } + bool visit(ObjCMethod *) override { return true; } - virtual bool visit(ObjCClass *symbol) + bool visit(ObjCClass *symbol) override { addType(symbol->name()); return true; } - virtual bool visit(ObjCForwardClassDeclaration *symbol) + bool visit(ObjCForwardClassDeclaration *symbol) override { addType(symbol->name()); return true; } - virtual bool visit(ObjCProtocol *symbol) + bool visit(ObjCProtocol *symbol) override { addType(symbol->name()); return true; } - virtual bool visit(ObjCForwardProtocolDeclaration *symbol) + bool visit(ObjCForwardProtocolDeclaration *symbol) override { addType(symbol->name()); return true; diff --git a/src/plugins/cpptools/cppcompletionassist.cpp b/src/plugins/cpptools/cppcompletionassist.cpp index 078d695f85..1bb445589c 100644 --- a/src/plugins/cpptools/cppcompletionassist.cpp +++ b/src/plugins/cpptools/cppcompletionassist.cpp @@ -1837,7 +1837,7 @@ bool InternalCppCompletionAssistProcessor::completeQtMethodClassName( return false; const LookupContext &context = m_model->m_typeOfExpression->context(); - const QIcon classIcon = Icons::iconForType(Icons::ClassIconType); + const QIcon classIcon = Utils::CodeModelIcon::iconForType(Utils::CodeModelIcon::Class); Overview overview; foreach (const LookupItem &lookupItem, results) { diff --git a/src/plugins/cpptools/cpplocalsymbols.cpp b/src/plugins/cpptools/cpplocalsymbols.cpp index 629c234886..49dd63f700 100644 --- a/src/plugins/cpptools/cpplocalsymbols.cpp +++ b/src/plugins/cpptools/cpplocalsymbols.cpp @@ -116,17 +116,17 @@ protected: return true; } - virtual bool visit(CaptureAST *ast) + bool visit(CaptureAST *ast) override { return checkLocalUse(ast->identifier, ast->firstToken()); } - virtual bool visit(IdExpressionAST *ast) + bool visit(IdExpressionAST *ast) override { return checkLocalUse(ast->name, ast->firstToken()); } - virtual bool visit(SizeofExpressionAST *ast) + bool visit(SizeofExpressionAST *ast) override { if (ast->expression && ast->expression->asTypeId()) { TypeIdAST *typeId = ast->expression->asTypeId(); @@ -141,7 +141,7 @@ protected: return true; } - virtual bool visit(CastExpressionAST *ast) + bool visit(CastExpressionAST *ast) override { if (ast->expression && ast->expression->asUnaryExpression()) { TypeIdAST *typeId = ast->type_id->asTypeId(); @@ -158,137 +158,137 @@ protected: return true; } - virtual bool visit(FunctionDefinitionAST *ast) + bool visit(FunctionDefinitionAST *ast) override { if (ast->symbol) enterScope(ast->symbol); return true; } - virtual void endVisit(FunctionDefinitionAST *ast) + void endVisit(FunctionDefinitionAST *ast) override { if (ast->symbol) _scopeStack.removeLast(); } - virtual bool visit(LambdaExpressionAST *ast) + bool visit(LambdaExpressionAST *ast) override { if (ast->lambda_declarator && ast->lambda_declarator->symbol) enterScope(ast->lambda_declarator->symbol); return true; } - virtual void endVisit(LambdaExpressionAST *ast) + void endVisit(LambdaExpressionAST *ast) override { if (ast->lambda_declarator && ast->lambda_declarator->symbol) _scopeStack.removeLast(); } - virtual bool visit(CompoundStatementAST *ast) + bool visit(CompoundStatementAST *ast) override { if (ast->symbol) enterScope(ast->symbol); return true; } - virtual void endVisit(CompoundStatementAST *ast) + void endVisit(CompoundStatementAST *ast) override { if (ast->symbol) _scopeStack.removeLast(); } - virtual bool visit(IfStatementAST *ast) + bool visit(IfStatementAST *ast) override { if (ast->symbol) enterScope(ast->symbol); return true; } - virtual void endVisit(IfStatementAST *ast) + void endVisit(IfStatementAST *ast) override { if (ast->symbol) _scopeStack.removeLast(); } - virtual bool visit(WhileStatementAST *ast) + bool visit(WhileStatementAST *ast) override { if (ast->symbol) enterScope(ast->symbol); return true; } - virtual void endVisit(WhileStatementAST *ast) + void endVisit(WhileStatementAST *ast) override { if (ast->symbol) _scopeStack.removeLast(); } - virtual bool visit(ForStatementAST *ast) + bool visit(ForStatementAST *ast) override { if (ast->symbol) enterScope(ast->symbol); return true; } - virtual void endVisit(ForStatementAST *ast) + void endVisit(ForStatementAST *ast) override { if (ast->symbol) _scopeStack.removeLast(); } - virtual bool visit(ForeachStatementAST *ast) + bool visit(ForeachStatementAST *ast) override { if (ast->symbol) enterScope(ast->symbol); return true; } - virtual void endVisit(ForeachStatementAST *ast) + void endVisit(ForeachStatementAST *ast) override { if (ast->symbol) _scopeStack.removeLast(); } - virtual bool visit(RangeBasedForStatementAST *ast) + bool visit(RangeBasedForStatementAST *ast) override { if (ast->symbol) enterScope(ast->symbol); return true; } - virtual void endVisit(RangeBasedForStatementAST *ast) + void endVisit(RangeBasedForStatementAST *ast) override { if (ast->symbol) _scopeStack.removeLast(); } - virtual bool visit(SwitchStatementAST *ast) + bool visit(SwitchStatementAST *ast) override { if (ast->symbol) enterScope(ast->symbol); return true; } - virtual void endVisit(SwitchStatementAST *ast) + void endVisit(SwitchStatementAST *ast) override { if (ast->symbol) _scopeStack.removeLast(); } - virtual bool visit(CatchClauseAST *ast) + bool visit(CatchClauseAST *ast) override { if (ast->symbol) enterScope(ast->symbol); return true; } - virtual void endVisit(CatchClauseAST *ast) + void endVisit(CatchClauseAST *ast) override { if (ast->symbol) _scopeStack.removeLast(); } - virtual bool visit(ExpressionOrDeclarationStatementAST *ast) + bool visit(ExpressionOrDeclarationStatementAST *ast) override { accept(ast->declaration); return false; diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index 3934837970..2eacfdef5c 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -986,9 +986,10 @@ void CppModelManager::watchForCanceledProjectIndexer(const QVector<QFuture<void> continue; QFutureWatcher<void> *watcher = new QFutureWatcher<void>(); - connect(watcher, &QFutureWatcher<void>::canceled, this, [this, project]() { + connect(watcher, &QFutureWatcher<void>::canceled, this, [this, project, watcher]() { if (d->m_projectToIndexerCanceled.contains(project)) // Project not yet removed d->m_projectToIndexerCanceled.insert(project, true); + watcher->deleteLater(); }); connect(watcher, &QFutureWatcher<void>::finished, this, [watcher]() { watcher->deleteLater(); diff --git a/src/plugins/cpptools/cppprojectfile.cpp b/src/plugins/cpptools/cppprojectfile.cpp index 2df1a287c7..e01d3726c9 100644 --- a/src/plugins/cpptools/cppprojectfile.cpp +++ b/src/plugins/cpptools/cppprojectfile.cpp @@ -51,8 +51,6 @@ ProjectFile::Kind ProjectFile::classify(const QString &filePath) return AmbiguousHeader; const Utils::MimeType mimeType = Utils::mimeTypeForFile(filePath); - if (!mimeType.isValid()) - return Unsupported; const QString mt = mimeType.name(); if (mt == QLatin1String(CppTools::Constants::C_SOURCE_MIMETYPE)) return CSource; diff --git a/src/plugins/cpptools/cpprefactoringchanges.cpp b/src/plugins/cpptools/cpprefactoringchanges.cpp index 3f11348013..c554c9d9f0 100644 --- a/src/plugins/cpptools/cpprefactoringchanges.cpp +++ b/src/plugins/cpptools/cpprefactoringchanges.cpp @@ -49,9 +49,9 @@ public: , m_workingCopy(m_modelManager->workingCopy()) {} - virtual void indentSelection(const QTextCursor &selection, - const QString &fileName, - const TextEditor::TextDocument *textDocument) const + void indentSelection(const QTextCursor &selection, + const QString &fileName, + const TextEditor::TextDocument *textDocument) const override { const TextEditor::TabSettings &tabSettings = ProjectExplorer::actualTabSettings(fileName, textDocument); @@ -60,9 +60,9 @@ public: indenter.indent(selection.document(), selection, QChar::Null, tabSettings); } - virtual void reindentSelection(const QTextCursor &selection, - const QString &fileName, - const TextEditor::TextDocument *textDocument) const + void reindentSelection(const QTextCursor &selection, + const QString &fileName, + const TextEditor::TextDocument *textDocument) const override { const TextEditor::TabSettings &tabSettings = ProjectExplorer::actualTabSettings(fileName, textDocument); @@ -71,7 +71,7 @@ public: indenter.reindent(selection.document(), selection, tabSettings); } - virtual void fileChanged(const QString &fileName) + void fileChanged(const QString &fileName) override { m_modelManager->updateSourceFiles(QSet<QString>() << fileName); } diff --git a/src/plugins/cpptools/stringtable.cpp b/src/plugins/cpptools/stringtable.cpp index d9d806d239..25be4d035c 100644 --- a/src/plugins/cpptools/stringtable.cpp +++ b/src/plugins/cpptools/stringtable.cpp @@ -58,7 +58,7 @@ public: public: GCRunner(StringTablePrivate &stringTable): m_stringTable(stringTable) {} - virtual void run() { m_stringTable.GC(); } + void run() override { m_stringTable.GC(); } } m_gcRunner; mutable QMutex m_lock; diff --git a/src/plugins/cpptools/symbolfinder.cpp b/src/plugins/cpptools/symbolfinder.cpp index b5bace9901..763fe42dcd 100644 --- a/src/plugins/cpptools/symbolfinder.cpp +++ b/src/plugins/cpptools/symbolfinder.cpp @@ -64,7 +64,7 @@ public: using SymbolVisitor::visit; - virtual bool visit(Function *fun) + bool visit(Function *fun) override { if (_oper) { if (const Name *name = fun->unqualifiedName()) { @@ -79,7 +79,7 @@ public: return false; } - virtual bool visit(Block *) + bool visit(Block *) override { return false; } diff --git a/src/plugins/cpptools/typehierarchybuilder.cpp b/src/plugins/cpptools/typehierarchybuilder.cpp index 34c09466c4..b44517e14c 100644 --- a/src/plugins/cpptools/typehierarchybuilder.cpp +++ b/src/plugins/cpptools/typehierarchybuilder.cpp @@ -49,7 +49,7 @@ public: void execute(const CPlusPlus::Document::Ptr &doc, const CPlusPlus::Snapshot &snapshot); - virtual bool visit(CPlusPlus::Class *); + bool visit(CPlusPlus::Class *) override; const QList<CPlusPlus::Symbol *> &derived() { return _derived; } const QStringList otherBases() { return _otherBases; } diff --git a/src/plugins/debugger/analyzer/analyzermanager.h b/src/plugins/debugger/analyzer/analyzermanager.h index cafcbf7661..20c7e741c4 100644 --- a/src/plugins/debugger/analyzer/analyzermanager.h +++ b/src/plugins/debugger/analyzer/analyzermanager.h @@ -62,9 +62,9 @@ DEBUGGER_EXPORT bool wantRunTool(ToolMode toolMode, const QString &toolName); DEBUGGER_EXPORT void showCannotStartDialog(const QString &toolName); // Register a tool for a given start mode. -DEBUGGER_EXPORT void registerPerspective(const QByteArray &perspectiveId, const Utils::Perspective *perspective); +DEBUGGER_EXPORT void registerPerspective(Utils::Perspective *perspective); +DEBUGGER_EXPORT void destroyDynamicPerspective(const QByteArray &perspectiveId); DEBUGGER_EXPORT void setPerspectiveEnabled(const QByteArray &perspectiveId, bool enable); -DEBUGGER_EXPORT void registerToolbar(const QByteArray &perspectiveId, const Utils::ToolbarDescription &desc); DEBUGGER_EXPORT void enableMainWindow(bool on); DEBUGGER_EXPORT QWidget *mainWindow(); diff --git a/src/plugins/debugger/analyzer/analyzerrunconfigwidget.cpp b/src/plugins/debugger/analyzer/analyzerrunconfigwidget.cpp index 1468b0e250..19dcc53bc2 100644 --- a/src/plugins/debugger/analyzer/analyzerrunconfigwidget.cpp +++ b/src/plugins/debugger/analyzer/analyzerrunconfigwidget.cpp @@ -43,8 +43,8 @@ AnalyzerRunConfigWidget::AnalyzerRunConfigWidget(ProjectExplorer::IRunConfigurat m_aspect = aspect; m_config = aspect->projectSettings(); - QWidget *globalSetting = new QWidget; - QHBoxLayout *globalSettingLayout = new QHBoxLayout(globalSetting); + auto globalSetting = new QWidget; + auto globalSettingLayout = new QHBoxLayout(globalSetting); globalSettingLayout->setContentsMargins(0, 0, 0, 0); m_settingsCombo = new QComboBox(globalSetting); @@ -65,7 +65,7 @@ AnalyzerRunConfigWidget::AnalyzerRunConfigWidget(ProjectExplorer::IRunConfigurat QWidget *innerPane = new QWidget; m_configWidget = m_config->createConfigWidget(innerPane); - QVBoxLayout *layout = new QVBoxLayout(innerPane); + auto layout = new QVBoxLayout(innerPane); layout->setContentsMargins(0, 0, 0, 0); layout->addWidget(globalSetting); layout->addWidget(m_configWidget); @@ -73,7 +73,7 @@ AnalyzerRunConfigWidget::AnalyzerRunConfigWidget(ProjectExplorer::IRunConfigurat m_details = new Utils::DetailsWidget; m_details->setWidget(innerPane); - QVBoxLayout *outerLayout = new QVBoxLayout(this); + auto outerLayout = new QVBoxLayout(this); outerLayout->addWidget(m_details); outerLayout->setContentsMargins(0, 0, 0, 0); diff --git a/src/plugins/debugger/analyzer/analyzerutils.cpp b/src/plugins/debugger/analyzer/analyzerutils.cpp index 21146372ec..96fb4ef9e5 100644 --- a/src/plugins/debugger/analyzer/analyzerutils.cpp +++ b/src/plugins/debugger/analyzer/analyzerutils.cpp @@ -58,7 +58,7 @@ CPlusPlus::Symbol *AnalyzerUtils::findSymbolUnderCursor() { TextEditor::TextEditorWidget *widget = TextEditor::TextEditorWidget::currentTextEditorWidget(); if (!widget) - return 0; + return nullptr; QTextCursor tc = widget->textCursor(); int line = 0; @@ -68,7 +68,7 @@ CPlusPlus::Symbol *AnalyzerUtils::findSymbolUnderCursor() const CPlusPlus::Snapshot &snapshot = CppTools::CppModelManager::instance()->snapshot(); CPlusPlus::Document::Ptr doc = snapshot.document(widget->textDocument()->filePath()); - QTC_ASSERT(doc, return 0); + QTC_ASSERT(doc, return nullptr); // fetch the expression's code CPlusPlus::ExpressionUnderCursor expressionUnderCursor(doc->languageFeatures()); @@ -80,7 +80,7 @@ CPlusPlus::Symbol *AnalyzerUtils::findSymbolUnderCursor() typeOfExpression.init(doc, snapshot); const QList<CPlusPlus::LookupItem> &lookupItems = typeOfExpression(expression.toUtf8(), scope); if (lookupItems.isEmpty()) - return 0; + return nullptr; const CPlusPlus::LookupItem &lookupItem = lookupItems.first(); // ### TODO: select best candidate. return lookupItem.declaration(); diff --git a/src/plugins/debugger/analyzer/detailederrorview.cpp b/src/plugins/debugger/analyzer/detailederrorview.cpp index 85ea430f34..0d7fdc1732 100644 --- a/src/plugins/debugger/analyzer/detailederrorview.cpp +++ b/src/plugins/debugger/analyzer/detailederrorview.cpp @@ -72,9 +72,7 @@ DetailedErrorView::DetailedErrorView(QWidget *parent) : addAction(m_copyAction); } -DetailedErrorView::~DetailedErrorView() -{ -} +DetailedErrorView::~DetailedErrorView() = default; void DetailedErrorView::contextMenuEvent(QContextMenuEvent *e) { diff --git a/src/plugins/debugger/analyzer/diagnosticlocation.cpp b/src/plugins/debugger/analyzer/diagnosticlocation.cpp index e5f6c8ee49..095101d6ca 100644 --- a/src/plugins/debugger/analyzer/diagnosticlocation.cpp +++ b/src/plugins/debugger/analyzer/diagnosticlocation.cpp @@ -27,9 +27,7 @@ namespace Debugger { -DiagnosticLocation::DiagnosticLocation() : line(0), column(0) -{ -} +DiagnosticLocation::DiagnosticLocation() = default; DiagnosticLocation::DiagnosticLocation(const QString &filePath, int line, int column) : filePath(filePath), line(line), column(column) diff --git a/src/plugins/debugger/analyzer/diagnosticlocation.h b/src/plugins/debugger/analyzer/diagnosticlocation.h index 31f9036f44..5bf95bff74 100644 --- a/src/plugins/debugger/analyzer/diagnosticlocation.h +++ b/src/plugins/debugger/analyzer/diagnosticlocation.h @@ -44,8 +44,8 @@ public: QString filePath; // Both values start at 1. - int line; - int column; + int line = 0; + int column = 0; }; DEBUGGER_EXPORT bool operator==(const DiagnosticLocation &first, const DiagnosticLocation &second); diff --git a/src/plugins/debugger/analyzer/startremotedialog.cpp b/src/plugins/debugger/analyzer/startremotedialog.cpp index 9f2ce7f53b..efee140a95 100644 --- a/src/plugins/debugger/analyzer/startremotedialog.cpp +++ b/src/plugins/debugger/analyzer/startremotedialog.cpp @@ -74,14 +74,14 @@ StartRemoteDialog::StartRemoteDialog(QWidget *parent) d->buttonBox->setOrientation(Qt::Horizontal); d->buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok); - QFormLayout *formLayout = new QFormLayout; + auto formLayout = new QFormLayout; formLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); formLayout->addRow(tr("Kit:"), d->kitChooser); formLayout->addRow(tr("Executable:"), d->executable); formLayout->addRow(tr("Arguments:"), d->arguments); formLayout->addRow(tr("Working directory:"), d->workingDirectory); - QVBoxLayout *verticalLayout = new QVBoxLayout(this); + auto verticalLayout = new QVBoxLayout(this); verticalLayout->addLayout(formLayout); verticalLayout->addWidget(d->buttonBox); diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp index 1ee95f4ab6..d926159ff6 100644 --- a/src/plugins/debugger/breakhandler.cpp +++ b/src/plugins/debugger/breakhandler.cpp @@ -107,9 +107,9 @@ class BreakpointItem : public QObject, public TypedTreeItem<LocationItem> Q_DECLARE_TR_FUNCTIONS(Debugger::Internal::BreakHandler) public: - ~BreakpointItem(); + ~BreakpointItem() override; - QVariant data(int column, int role) const; + QVariant data(int column, int role) const override; QIcon icon() const; @@ -168,28 +168,28 @@ public: setIcon(b->icon()); } - void removedFromEditor() + void removedFromEditor() override { if (m_bp) m_bp->removeBreakpoint(); } - void updateLineNumber(int lineNumber) + void updateLineNumber(int lineNumber) override { TextMark::updateLineNumber(lineNumber); m_bp->updateLineNumberFromMarker(lineNumber); } - void updateFileName(const FileName &fileName) + void updateFileName(const FileName &fileName) override { TextMark::updateFileName(fileName); m_bp->updateFileNameFromMarker(fileName.toString()); } - bool isDraggable() const { return true; } - void dragToLine(int line) { m_bp->changeLineNumberFromMarker(line); } - bool isClickable() const { return true; } - void clicked() { m_bp->removeBreakpoint(); } + bool isDraggable() const override { return true; } + void dragToLine(int line) override { m_bp->changeLineNumberFromMarker(line); } + bool isClickable() const override { return true; } + void clicked() override { m_bp->removeBreakpoint(); } public: BreakpointItem *m_bp; @@ -269,7 +269,7 @@ static QString typeToString(BreakpointType type) class LeftElideDelegate : public QStyledItemDelegate { public: - LeftElideDelegate() {} + LeftElideDelegate() = default; void paint(QPainter *pain, const QStyleOptionViewItem &option, const QModelIndex &index) const override { @@ -283,8 +283,8 @@ class SmallTextEdit : public QTextEdit { public: explicit SmallTextEdit(QWidget *parent) : QTextEdit(parent) {} - QSize sizeHint() const { return QSize(QTextEdit::sizeHint().width(), 100); } - QSize minimumSizeHint() const { return sizeHint(); } + QSize sizeHint() const override { return QSize(QTextEdit::sizeHint().width(), 100); } + QSize minimumSizeHint() const override { return sizeHint(); } }; /////////////////////////////////////////////////////////////////////// @@ -669,7 +669,7 @@ void BreakpointDialog::getParts(unsigned partsMask, BreakpointParameters *data) data->functionName = m_lineEditFunction->text(); if (partsMask & AddressPart) - data->address = m_lineEditAddress->text().toULongLong(0, 0); + data->address = m_lineEditAddress->text().toULongLong(nullptr, 0); if (partsMask & ExpressionPart) data->expression = m_lineEditExpression->text(); @@ -1064,9 +1064,9 @@ void BreakHandler::saveBreakpoints() void BreakHandler::loadBreakpoints() { - QVariant value = sessionValue("Breakpoints"); - QList<QVariant> list = value.toList(); - foreach (const QVariant &var, list) { + const QVariant value = sessionValue("Breakpoints"); + const QList<QVariant> list = value.toList(); + for (const QVariant &var : list) { const QMap<QString, QVariant> map = var.toMap(); BreakpointParameters params(BreakpointByFileAndLine); QVariant v = map.value("filename"); @@ -1137,7 +1137,7 @@ Breakpoint BreakHandler::findBreakpointByIndex(const QModelIndex &index) const Breakpoints BreakHandler::findBreakpointsByIndex(const QList<QModelIndex> &list) const { QSet<Breakpoint> ids; - foreach (const QModelIndex &index, list) { + for (const QModelIndex &index : list) { if (Breakpoint b = findBreakpointByIndex(index)) ids.insert(b); } @@ -1378,7 +1378,7 @@ QIcon Breakpoint::icon() const { return b ? b->icon() : QIcon(); } DebuggerEngine *Breakpoint::engine() const { - return b ? b->m_engine : 0; + return b ? b->m_engine : nullptr; } const BreakpointResponse &Breakpoint::response() const @@ -1610,7 +1610,7 @@ void Breakpoint::notifyBreakpointReleased() b->removeChildren(); //QTC_ASSERT(b->m_state == BreakpointChangeProceeding, qDebug() << b->m_state); b->m_state = BreakpointNew; - b->m_engine = 0; + b->m_engine = nullptr; b->m_response = BreakpointResponse(); b->destroyMarker(); b->updateMarker(); @@ -1673,7 +1673,7 @@ void BreakHandler::appendBreakpointInternal(const BreakpointParameters ¶ms) return; } - BreakpointItem *b = new BreakpointItem(this); + auto b = new BreakpointItem(this); b->m_params = params; b->updateMarker(); rootItem()->appendChild(b); @@ -1830,19 +1830,19 @@ void BreakHandler::changeLineNumberFromMarkerHelper(BreakpointModelId id) appendBreakpoint(params); } -Breakpoints BreakHandler::allBreakpoints() const +const Breakpoints BreakHandler::allBreakpoints() const { Breakpoints items; forItemsAtLevel<1>([&items](BreakpointItem *b) { items.append(Breakpoint(b)); }); return items; } -Breakpoints BreakHandler::unclaimedBreakpoints() const +const Breakpoints BreakHandler::unclaimedBreakpoints() const { - return engineBreakpoints(0); + return engineBreakpoints(nullptr); } -Breakpoints BreakHandler::engineBreakpoints(DebuggerEngine *engine) const +const Breakpoints BreakHandler::engineBreakpoints(DebuggerEngine *engine) const { Breakpoints items; forItemsAtLevel<1>([&items, engine](BreakpointItem *b) { @@ -1930,7 +1930,7 @@ bool BreakHandler::setData(const QModelIndex &idx, const QVariant &value, int ro const bool isEnabled = items.isEmpty() || items.at(0).isEnabled(); setBreakpointsEnabled(items, !isEnabled); // FIXME -// foreach (const QModelIndex &id, selectedIds) +// for (const QModelIndex &id : selectedIds) // update(id); return true; } @@ -2069,7 +2069,7 @@ bool BreakHandler::contextMenuEvent(const ItemViewEvent &ev) void BreakHandler::setBreakpointsEnabled(const Breakpoints &bps, bool enabled) { - foreach (Breakpoint b, bps) + for (Breakpoint b : bps) b.setEnabled(enabled); } @@ -2088,7 +2088,7 @@ void BreakHandler::deleteAllBreakpoints() void BreakHandler::deleteBreakpoints(const Breakpoints &bps) { - foreach (Breakpoint bp, bps) + for (Breakpoint bp : bps) bp.removeBreakpoint(); } @@ -2141,7 +2141,7 @@ void BreakHandler::editBreakpoints(const Breakpoints &bps, QWidget *parent) const int newIgnoreCount = dialog.ignoreCount(); const int newThreadSpec = dialog.threadSpec(); - foreach (Breakpoint bp, bps) { + for (Breakpoint bp : bps) { if (bp) { bp.setCondition(newCondition); bp.setIgnoreCount(newIgnoreCount); @@ -2161,7 +2161,7 @@ void BreakHandler::editBreakpoints(const Breakpoints &bps, QWidget *parent) static int currentId = 0; BreakpointItem::BreakpointItem(BreakHandler *handler) - : m_handler(handler), m_id(++currentId), m_state(BreakpointNew), m_engine(0), m_marker(0) + : m_handler(handler), m_id(++currentId), m_state(BreakpointNew), m_engine(nullptr), m_marker(nullptr) {} BreakpointItem::~BreakpointItem() @@ -2173,8 +2173,8 @@ void BreakpointItem::destroyMarker() { if (m_marker) { BreakpointMarker *m = m_marker; - m->m_bp = 0; - m_marker = 0; + m->m_bp = nullptr; + m_marker = nullptr; delete m; } } diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h index e31fc81fa1..09461ba081 100644 --- a/src/plugins/debugger/breakhandler.h +++ b/src/plugins/debugger/breakhandler.h @@ -50,10 +50,10 @@ class Breakpoint Q_DECLARE_TR_FUNCTIONS(Debugger::Internal::BreakHandler) public: - Breakpoint() {} + Breakpoint() = default; bool isValid() const; - operator const void *() const { return isValid() ? this : 0; } + operator const void *() const { return isValid() ? this : nullptr; } bool operator!() const { return !isValid(); } uint hash() const; @@ -157,7 +157,7 @@ private: inline uint qHash(const Debugger::Internal::Breakpoint &b) { return b.hash(); } -typedef QList<Breakpoint> Breakpoints; +using Breakpoints = QList<Breakpoint>; using BreakModel = Utils::TreeModel<Utils::TypedTreeItem<BreakpointItem>, BreakpointItem, LocationItem>; @@ -177,9 +177,9 @@ public: void appendBreakpoint(const BreakpointParameters &data); void handleAlienBreakpoint(const BreakpointResponse &response, DebuggerEngine *engine); - Breakpoints allBreakpoints() const; - Breakpoints engineBreakpoints(DebuggerEngine *engine) const; - Breakpoints unclaimedBreakpoints() const; + const Breakpoints allBreakpoints() const; + const Breakpoints engineBreakpoints(DebuggerEngine *engine) const; + const Breakpoints unclaimedBreakpoints() const; QStringList engineBreakpointPaths(DebuggerEngine *engine) const; // Find a breakpoint matching approximately the data in needle. diff --git a/src/plugins/debugger/breakpoint.cpp b/src/plugins/debugger/breakpoint.cpp index 448cbb7df5..be1287d1d5 100644 --- a/src/plugins/debugger/breakpoint.cpp +++ b/src/plugins/debugger/breakpoint.cpp @@ -228,8 +228,8 @@ bool BreakpointParameters::isCppBreakpoint() const if (qmlExtensionString.isEmpty()) qmlExtensionString = ".qml;.js"; - auto qmlFileExtensions = qmlExtensionString.splitRef(QLatin1Char(';'), QString::SkipEmptyParts); - foreach (QStringRef extension, qmlFileExtensions) { + const auto qmlFileExtensions = qmlExtensionString.splitRef(';', QString::SkipEmptyParts); + for (QStringRef extension : qmlFileExtensions) { if (fileName.endsWith(extension, Qt::CaseInsensitive)) return false; } diff --git a/src/plugins/debugger/breakpoint.h b/src/plugins/debugger/breakpoint.h index d186b1a3b7..45c9a11205 100644 --- a/src/plugins/debugger/breakpoint.h +++ b/src/plugins/debugger/breakpoint.h @@ -40,13 +40,13 @@ namespace Internal { class BreakpointIdBase { public: - BreakpointIdBase() : m_majorPart(0), m_minorPart(0) {} + BreakpointIdBase() = default; bool isValid() const { return m_majorPart != 0; } bool isMajor() const { return m_majorPart != 0 && m_minorPart == 0; } bool isMinor() const { return m_majorPart != 0 && m_minorPart != 0; } bool operator!() const { return !isValid(); } - operator const void*() const { return isValid() ? this : 0; } + operator const void*() const { return isValid() ? this : nullptr; } quint32 toInternalId() const { return m_majorPart | (m_minorPart << 16); } QString toString() const; bool operator==(const BreakpointIdBase &id) const @@ -55,8 +55,8 @@ public: quint16 minorPart() const { return m_minorPart; } protected: - quint16 m_majorPart; - quint16 m_minorPart; + quint16 m_majorPart = 0; + quint16 m_minorPart = 0; }; class BreakpointModelId : public BreakpointIdBase diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index f64dd94d64..55dbc5c8fb 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -75,11 +75,10 @@ #include <cctype> -enum { debug = 0 }; -enum { debugLocals = 0 }; -enum { debugSourceMapping = 0 }; -enum { debugWatches = 0 }; -enum { debugBreakpoints = 0 }; +constexpr bool debug = false; +constexpr bool debugLocals = false; +constexpr bool debugSourceMapping = false; +constexpr bool debugBreakpoints = false; #define CB(callback) [this](const DebuggerResponse &r) { callback(r); } @@ -152,40 +151,11 @@ namespace Internal { static const char localsPrefixC[] = "local."; -struct MemoryViewCookie -{ - explicit MemoryViewCookie(MemoryAgent *a = nullptr, quint64 addr = 0, quint64 l = 0) - : agent(a), address(addr), length(l) - {} - - MemoryAgent *agent; - quint64 address; - quint64 length; -}; - -struct MemoryChangeCookie -{ - explicit MemoryChangeCookie(quint64 addr = 0, const QByteArray &d = QByteArray()) : - address(addr), data(d) {} - - quint64 address; - QByteArray data; -}; - -} // namespace Internal -} // namespace Debugger - -Q_DECLARE_METATYPE(Debugger::Internal::MemoryViewCookie) -Q_DECLARE_METATYPE(Debugger::Internal::MemoryChangeCookie) - -namespace Debugger { -namespace Internal { - // Base data structure for command queue entries with callback class CdbCommand { public: - CdbCommand() {} + CdbCommand() = default; CdbCommand(CdbEngine::CommandHandler h) : handler(h) {} CdbEngine::CommandHandler handler; @@ -243,17 +213,19 @@ CdbEngine::CdbEngine() : this, &CdbEngine::readyReadStandardOut); connect(action(UseDebuggingHelpers), &SavedAction::valueChanged, this, &CdbEngine::updateLocals); + + if (action(UseCodeModel)->isChecked()) + m_codeModelSnapshot = CppTools::CppModelManager::instance()->snapshot(); } void CdbEngine::init() { m_effectiveStartMode = NoStartMode; m_accessible = false; - m_specialStopMode = NoSpecialStop; + m_stopMode = NoStopRequested; m_nextCommandToken = 0; m_currentBuiltinResponseToken = -1; - m_operateByInstructionPending = action(OperateByInstruction)->isChecked(); - m_operateByInstruction = true; // Default CDB setting + m_operateByInstruction = true; m_hasDebuggee = false; m_sourceStepInto = false; m_watchPointX = m_watchPointY = 0; @@ -268,7 +240,7 @@ void CdbEngine::init() m_pendingBreakpointMap.clear(); m_insertSubBreakpointMap.clear(); m_pendingSubBreakpointMap.clear(); - m_customSpecialStopData.clear(); + m_interrupCallbacks.clear(); m_symbolAddressCache.clear(); m_coreStopReason.reset(); @@ -295,25 +267,12 @@ void CdbEngine::init() QTC_ASSERT(m_process.state() != QProcess::Running, SynchronousProcess::stopProcess(m_process)); } -CdbEngine::~CdbEngine() -{ -} +CdbEngine::~CdbEngine() = default; void CdbEngine::operateByInstructionTriggered(bool operateByInstruction) { - // To be set next time session becomes accessible - m_operateByInstructionPending = operateByInstruction; - if (state() == InferiorStopOk) - syncOperateByInstruction(operateByInstruction); -} - -void CdbEngine::syncOperateByInstruction(bool operateByInstruction) -{ - if (debug) - qDebug("syncOperateByInstruction current: %d new %d", m_operateByInstruction, operateByInstruction); if (m_operateByInstruction == operateByInstruction) return; - QTC_ASSERT(m_accessible, return); m_operateByInstruction = operateByInstruction; runCommand({QLatin1String(m_operateByInstruction ? "l-t" : "l+t"), NoFlags}); runCommand({QLatin1String(m_operateByInstruction ? "l-s" : "l+s"), NoFlags}); @@ -410,7 +369,7 @@ void CdbEngine::setupEngine() sp.inferior.commandLineArguments.clear(); sp.attachPID = ProcessHandle(terminal()->applicationPid()); sp.startMode = AttachExternal; - sp.inferior.runMode = ApplicationLauncher::Gui; // Force no terminal. + sp.useTerminal = false; // Force no terminal. showMessage(QString("Attaching to %1...").arg(sp.attachPID.pid()), LogMisc); } else { m_effectiveStartMode = sp.startMode; @@ -459,7 +418,7 @@ void CdbEngine::setupEngine() // register idle (debuggee stop) notification << "-c" << ".idle_cmd " + m_extensionCommandPrefix + "idle"; - if (sp.inferior.runMode == ApplicationLauncher::Console) // Separate console + if (sp.useTerminal) // Separate console arguments << "-2"; if (boolSetting(IgnoreFirstChanceAccessViolation)) arguments << "-x"; @@ -527,8 +486,7 @@ void CdbEngine::setupEngine() // Make sure that QTestLib uses OutputDebugString for logging. const QString qtLoggingToConsoleKey = QStringLiteral("QT_LOGGING_TO_CONSOLE"); - if (sp.inferior.runMode != ApplicationLauncher::Console - && !inferiorEnvironment.hasKey(qtLoggingToConsoleKey)) + if (!sp.useTerminal && !inferiorEnvironment.hasKey(qtLoggingToConsoleKey)) inferiorEnvironment.set(qtLoggingToConsoleKey, QString(QLatin1Char('0'))); m_process.setEnvironment(mergeEnvironment(inferiorEnvironment.toStringList(), @@ -565,6 +523,7 @@ void CdbEngine::handleInitialSessionIdle() const DebuggerRunParameters &rp = runParameters(); if (!rp.commandsAfterConnect.isEmpty()) runCommand({rp.commandsAfterConnect, NoFlags}); + operateByInstructionTriggered(action(OperateByInstruction)->isChecked()); // QmlCppEngine expects the QML engine to be connected before any breakpoints are hit // (attemptBreakpointSynchronization() will be directly called then) attemptBreakpointSynchronization(); @@ -580,10 +539,12 @@ void CdbEngine::handleInitialSessionIdle() runCommand({"sxn 0x4000001f", NoFlags}); // Do not break on WowX86 exceptions. runCommand({"sxn ibp", NoFlags}); // Do not break on initial breakpoints. runCommand({".asm source_line", NoFlags}); // Source line in assembly - runCommand({m_extensionCommandPrefix + "setparameter maxStringLength=" - + action(MaximalStringLength)->value().toString() - + " maxStackDepth=" - + action(MaximalStackDepth)->value().toString(), NoFlags}); + runCommand({m_extensionCommandPrefix + + "setparameter maxStringLength=" + action(MaximalStringLength)->value().toString() + + " maxStackDepth=" + action(MaximalStackDepth)->value().toString() + + " firstChance=" + (action(FirstChanceExceptionTaskEntry)->value().toBool() ? "1" : "0") + + " secondChance=" + (action(SecondChanceExceptionTaskEntry)->value().toBool() ? "1" : "0") + , NoFlags}); if (boolSetting(CdbUsePythonDumper)) runCommand({"print(sys.version)", ScriptCommand, CB(setupScripting)}); @@ -643,7 +604,7 @@ void CdbEngine::runEngine() qDebug("runEngine"); const QStringList breakEvents = stringListSetting(CdbBreakEvents); - foreach (const QString &breakEvent, breakEvents) + for (const QString &breakEvent : breakEvents) runCommand({"sxe " + breakEvent, NoFlags}); // Break functions: each function must be fully qualified, // else the debugger will slow down considerably. @@ -863,14 +824,7 @@ void CdbEngine::interruptInferior() notifyInferiorRunOk(); return; } - doInterruptInferior(NoSpecialStop); -} - -void CdbEngine::doInterruptInferiorCustomSpecialStop(const QVariant &v) -{ - if (m_specialStopMode == NoSpecialStop) - doInterruptInferior(CustomSpecialStop); - m_customSpecialStopData.push_back(v); + doInterruptInferior(); } void CdbEngine::handleDoInterruptInferior(const QString &errorMessage) @@ -885,11 +839,20 @@ void CdbEngine::handleDoInterruptInferior(const QString &errorMessage) m_signalOperation.clear(); } -void CdbEngine::doInterruptInferior(SpecialStopMode sm) +void CdbEngine::doInterruptInferior(const InterruptCallback &callback) { - showMessage(QString("Interrupting process %1...").arg(inferiorPid()), LogMisc); + if (callback) { + m_interrupCallbacks.push_back(callback); + if (!m_initialSessionIdleHandled) + return; + if (m_stopMode == NoStopRequested) + m_stopMode = Callback; + } else { + m_stopMode = Interrupt; + } - QTC_ASSERT(!m_signalOperation, notifyInferiorStopFailed(); return;); + showMessage(QString("Interrupting process %1...").arg(inferiorPid()), LogMisc); + QTC_ASSERT(!m_signalOperation, notifyInferiorStopFailed(); return); if (DebuggerRunTool *rt = runTool()) { IDevice::ConstPtr device = rt->device(); if (!device) @@ -897,7 +860,6 @@ void CdbEngine::doInterruptInferior(SpecialStopMode sm) if (device) m_signalOperation = device->signalOperation(); } - m_specialStopMode = sm; QTC_ASSERT(m_signalOperation, notifyInferiorStopFailed(); return;); connect(m_signalOperation.data(), &DeviceProcessSignalOperation::finished, this, &CdbEngine::handleDoInterruptInferior); @@ -985,7 +947,7 @@ void CdbEngine::handleJumpToLineAddressResolution(const DebuggerResponse &respon if (apPos != -1) answer.remove(apPos, 1); bool ok; - const quint64 address = answer.toLongLong(&ok, 16); + const quint64 address = answer.toULongLong(&ok, 16); if (ok && address) { jumpToAddress(address); gotoLocation(Location(context.fileName, context.lineNumber)); @@ -994,7 +956,7 @@ void CdbEngine::handleJumpToLineAddressResolution(const DebuggerResponse &respon static inline bool isAsciiWord(const QString &s) { - foreach (const QChar &c, s) { + for (const QChar &c : s) { if (!c.isLetterOrNumber() || c.toLatin1() == 0) return false; } @@ -1063,9 +1025,12 @@ void CdbEngine::runCommand(const DebuggerCommand &dbgCmd) { QString cmd = dbgCmd.function + dbgCmd.argsToString(); if (!m_accessible) { - const QString msg = QString("Attempt to issue command \"%1\" to non-accessible session (%2)") + doInterruptInferior([this, dbgCmd](){ + runCommand(dbgCmd); + }); + const QString msg = QString("Attempt to issue command \"%1\" to non-accessible session (%2)... interrupting") .arg(cmd, stateName(state())); - showMessage(msg, LogError); + showMessage(msg, LogMisc); return; } @@ -1106,7 +1071,7 @@ void CdbEngine::runCommand(const DebuggerCommand &dbgCmd) elapsedLogTime(), qPrintable(dbgCmd.function), qPrintable(stateName(state())), m_commandForToken.size()); } - if (debug > 1) { + if (debug) { qDebug("CdbEngine::postCommand: resulting command '%s'\n", qPrintable(fullCmd)); } showMessage(cmd, LogInput); @@ -1165,10 +1130,9 @@ void CdbEngine::doUpdateLocals(const UpdateParameters &updateParameters) cmd.arg("displaystringlimit", action(DisplayStringLimit)->value().toString()); if (boolSetting(UseCodeModel)) { - QStringList uninitializedVariables; - getUninitializedVariables(Internal::cppCodeModelSnapshot(), - frame.function, frame.file, frame.line, &uninitializedVariables); - cmd.arg("uninitialized", uninitializedVariables); + QStringList variables = getUninitializedVariables(m_codeModelSnapshot, + frame.function, frame.file, frame.line); + cmd.arg("uninitialized", variables); } cmd.callback = [this](const DebuggerResponse &response) { @@ -1215,7 +1179,7 @@ void CdbEngine::doUpdateLocals(const UpdateParameters &updateParameters) if (!expanded.isEmpty()) { str << blankSeparator << "-e "; int i = 0; - foreach (const QString &e, expanded) { + for (const QString &e : expanded) { if (i++) str << ','; str << e; @@ -1236,13 +1200,12 @@ void CdbEngine::doUpdateLocals(const UpdateParameters &updateParameters) // Uninitialized variables if desired. Quote as safeguard against shadowed // variables in case of errors in uninitializedVariables(). if (boolSetting(UseCodeModel)) { - QStringList uninitializedVariables; - getUninitializedVariables(Internal::cppCodeModelSnapshot(), - frame.function, frame.file, frame.line, &uninitializedVariables); - if (!uninitializedVariables.isEmpty()) { + const QStringList variables = getUninitializedVariables(m_codeModelSnapshot, + frame.function, frame.file, frame.line); + if (!variables.isEmpty()) { str << blankSeparator << "-u \""; int i = 0; - foreach (const QString &u, uninitializedVariables) { + for (const QString &u : variables) { if (i++) str << ','; str << localsPrefixC << u; @@ -1493,34 +1456,26 @@ void CdbEngine::handleResolveSymbolHelper(const QList<quint64> &addresses, Disas } } -void CdbEngine::fetchMemory(MemoryAgent *agent, quint64 addr, quint64 length) +void CdbEngine::fetchMemory(MemoryAgent *agent, quint64 address, quint64 length) { if (debug) - qDebug("CdbEngine::fetchMemory %llu bytes from 0x%llx", length, addr); - const MemoryViewCookie cookie(agent, addr, length); - if (m_accessible) - postFetchMemory(cookie); - else - doInterruptInferiorCustomSpecialStop(qVariantFromValue(cookie)); -} - -void CdbEngine::postFetchMemory(const MemoryViewCookie &cookie) -{ + qDebug("CdbEngine::fetchMemory %llu bytes from 0x%llx", length, address); DebuggerCommand cmd("memory", ExtensionCommand); QString args; StringInputStream str(args); - str << cookie.address << ' ' << cookie.length; + str << address << ' ' << length; cmd.args = args; - cmd.callback = [this, cookie](const DebuggerResponse &response) { - if (!cookie.agent) + cmd.callback = [this, agent = QPointer<MemoryAgent>(agent), address, length] + (const DebuggerResponse &response) { + if (!agent) return; if (response.resultClass == ResultDone) { const QByteArray data = QByteArray::fromHex(response.data.data().toUtf8()); - if (unsigned(data.size()) == cookie.length) - cookie.agent->addData(cookie.address, data); + if (unsigned(data.size()) == length) + agent->addData(address, data); } else { showMessage(response.data["msg"].data(), LogWarning); - cookie.agent->addData(cookie.address, QByteArray(int(cookie.length), char())); + agent->addData(address, QByteArray(int(length), char())); } }; runCommand(cmd); @@ -1529,12 +1484,7 @@ void CdbEngine::postFetchMemory(const MemoryViewCookie &cookie) void CdbEngine::changeMemory(MemoryAgent *, quint64 addr, const QByteArray &data) { QTC_ASSERT(!data.isEmpty(), return); - if (!m_accessible) { - const MemoryChangeCookie cookie(addr, data); - doInterruptInferiorCustomSpecialStop(qVariantFromValue(cookie)); - } else { - runCommand({cdbWriteMemoryCommand(addr, data), NoFlags}); - } + runCommand({cdbWriteMemoryCommand(addr, data), NoFlags}); } void CdbEngine::reloadModules() @@ -1593,8 +1543,8 @@ void CdbEngine::handleModules(const DebuggerResponse &response) Module module; module.moduleName = gdbmiModule["name"].data(); module.modulePath = gdbmiModule["image"].data(); - module.startAddress = gdbmiModule["start"].data().toULongLong(0, 0); - module.endAddress = gdbmiModule["end"].data().toULongLong(0, 0); + module.startAddress = gdbmiModule["start"].data().toULongLong(nullptr, 0); + module.endAddress = gdbmiModule["end"].data().toULongLong(nullptr, 0); if (gdbmiModule["deferred"].type() == GdbMi::Invalid) module.symbolsRead = Module::ReadOk; handler->updateModule(module); @@ -1821,6 +1771,8 @@ unsigned CdbEngine::examineStopReason(const GdbMi &stopReason, return rc; } if (reason == "exception") { + if (m_stopMode == Callback) + rc |= StopIgnoreContinue; WinException exception; exception.fromGdbMI(stopReason); QString description = exception.toString(); @@ -1863,6 +1815,7 @@ void CdbEngine::processStop(const GdbMi &stopReason, bool conditionalBreakPointT ThreadId forcedThreadId; const unsigned stopFlags = examineStopReason(stopReason, &message, &exceptionBoxMessage, conditionalBreakPointTriggered); + m_stopMode = NoStopRequested; // Do the non-blocking log reporting if (stopFlags & StopReportLog) showMessage(message, LogMisc); @@ -1946,7 +1899,7 @@ void CdbEngine::handleBreakInsert(const DebuggerResponse &response, const Breakp const QStringList reply = response.data.data().split('\n'); if (reply.isEmpty()) return; - foreach (const QString &line, reply) + for (const QString &line : reply) showMessage(line); if (!reply.last().startsWith("Ambiguous symbol error") && (reply.length() < 2 || !reply.at(reply.length() - 2).startsWith("Ambiguous symbol error"))) { @@ -1967,7 +1920,7 @@ void CdbEngine::handleBreakInsert(const DebuggerResponse &response, const Breakp return; Breakpoint bp = breakHandler()->breakpointById(bpId); // add break point for every match - int subBreakPointID = 0; + quint16 subBreakPointID = 0; for (auto line = reply.constBegin(), end = reply.constEnd(); line != end; ++line) { if (!line->startsWith("Matched: ")) continue; @@ -2050,9 +2003,9 @@ void CdbEngine::handleSessionAccessible(unsigned long cdbExState) return; if (debug) - qDebug("CdbEngine::handleSessionAccessible %dms in state '%s'/'%s', special mode %d", + qDebug("CdbEngine::handleSessionAccessible %dms in state '%s'/'%s'", elapsedLogTime(), cdbStatusName(cdbExState), - qPrintable(stateName(state())), m_specialStopMode); + qPrintable(stateName(state()))); switch (s) { case EngineShutdownRequested: @@ -2075,9 +2028,9 @@ void CdbEngine::handleSessionInaccessible(unsigned long cdbExState) return; if (debug) - qDebug("CdbEngine::handleSessionInaccessible %dms in state '%s', '%s', special mode %d", + qDebug("CdbEngine::handleSessionInaccessible %dms in state '%s', '%s'", elapsedLogTime(), cdbStatusName(cdbExState), - qPrintable(stateName(state())), m_specialStopMode); + qPrintable(stateName(state()))); switch (state()) { case EngineSetupRequested: @@ -2114,37 +2067,13 @@ void CdbEngine::handleSessionIdle(const QString &message) return; if (debug) - qDebug("CdbEngine::handleSessionIdle %dms '%s' in state '%s', special mode %d", + qDebug("CdbEngine::handleSessionIdle %dms '%s' in state '%s'", elapsedLogTime(), qPrintable(message), - qPrintable(stateName(state())), m_specialStopMode); - - // Switch source level debugging - syncOperateByInstruction(m_operateByInstructionPending); - - // Engine-special stop reasons: Breakpoints and setup - const SpecialStopMode specialStopMode = m_specialStopMode; - - m_specialStopMode = NoSpecialStop; + qPrintable(stateName(state()))); - switch (specialStopMode) { - case SpecialStopSynchronizeBreakpoints: - if (debug) - qDebug("attemptBreakpointSynchronization in special stop"); - attemptBreakpointSynchronization(); - doContinueInferior(); - return; - case SpecialStopGetWidgetAt: - postWidgetAtCommand(); - return; - case CustomSpecialStop: - foreach (const QVariant &data, m_customSpecialStopData) - handleCustomSpecialStop(data); - m_customSpecialStopData.clear(); - doContinueInferior(); - return; - case NoSpecialStop: - break; - } + for (const InterruptCallback &callback : m_interrupCallbacks) + callback(); + m_interrupCallbacks.clear(); if (!m_initialSessionIdleHandled) { // Temporary stop at beginning handleInitialSessionIdle(); @@ -2163,11 +2092,11 @@ void CdbEngine::handleSessionIdle(const QString &message) void CdbEngine::handleExtensionMessage(char t, int token, const QString &what, const QString &message) { - if (debug > 1) { + if (debug) { QDebug nospace = qDebug().nospace(); nospace << "handleExtensionMessage " << t << ' ' << token << ' ' << what << ' ' << stateName(state()); - if (t == 'N' || debug > 1) + if (t == 'N' || debug) nospace << ' ' << message; else nospace << ' ' << message.size() << " bytes"; @@ -2268,12 +2197,11 @@ void CdbEngine::handleExtensionMessage(char t, int token, const QString &what, c if (!isDebuggerWinException(exception.exceptionCode)) { const Task::TaskType type = isFatalWinException(exception.exceptionCode) ? Task::Error : Task::Warning; - const FileName fileName = exception.file.isEmpty() - ? FileName() : FileName::fromUserInput(exception.file); + const FileName fileName = FileName::fromUserInput(exception.file); const QString taskEntry = tr("Debugger encountered an exception: %1").arg( exception.toString(false).trimmed()); TaskHub::addTask(type, taskEntry, - Debugger::Constants::TASK_CATEGORY_DEBUGGER_RUNTIME, + Constants::TASK_CATEGORY_DEBUGGER_RUNTIME, fileName, exception.lineNumber); } return; @@ -2331,7 +2259,7 @@ void CdbEngine::parseOutputLine(QString line) static const QString creatorExtPrefix = "<qtcreatorcdbext>|"; if (line.startsWith(creatorExtPrefix)) { // "<qtcreatorcdbext>|type_char|token|remainingChunks|serviceName|message" - const char type = line.at(creatorExtPrefix.size()).unicode(); + const char type = char(line.at(creatorExtPrefix.size()).unicode()); // integer token const int tokenPos = creatorExtPrefix.size() + 2; const int tokenEndPos = line.indexOf('|', tokenPos); @@ -2360,7 +2288,7 @@ void CdbEngine::parseOutputLine(QString line) int token = 0; bool isStartToken = false; const bool isCommandToken = checkCommandToken(m_tokenPrefix, line, &token, &isStartToken); - if (debug > 1) + if (debug) qDebug("Reading CDB stdout '%s',\n isCommand=%d, token=%d, isStart=%d", qPrintable(line), isCommandToken, token, isStartToken); @@ -2467,7 +2395,7 @@ static QByteArray multiBreakpointCommand(const char *cmdC, const Breakpoints &bp { QByteArray cmd(cmdC); ByteArrayInputStream str(cmd); - foreach (const BreakpointData *bp, bps) + for (const BreakpointData *bp : bps) str << ' ' << bp->bpNumber; return cmd; } @@ -2569,7 +2497,7 @@ void CdbEngine::attemptBreakpointSynchronization() // Check if there is anything to be done at all. BreakHandler *handler = breakHandler(); // Take ownership of the breakpoint. Requests insertion. TODO: Cpp only? - foreach (Breakpoint bp, handler->unclaimedBreakpoints()) + for (Breakpoint bp : handler->unclaimedBreakpoints()) if (acceptsBreakpoint(bp)) bp.setEngine(this); @@ -2577,7 +2505,7 @@ void CdbEngine::attemptBreakpointSynchronization() bool changed = !m_insertSubBreakpointMap.isEmpty(); const Breakpoints bps = handler->engineBreakpoints(this); if (!changed) { - foreach (Breakpoint bp, bps) { + for (Breakpoint bp : bps) { switch (bp.state()) { case BreakpointInsertRequested: case BreakpointRemoveRequested: @@ -2604,18 +2532,12 @@ void CdbEngine::attemptBreakpointSynchronization() if (!changed) return; - if (!m_accessible) { - // No nested calls. - if (m_specialStopMode != SpecialStopSynchronizeBreakpoints) - doInterruptInferior(SpecialStopSynchronizeBreakpoints); - return; - } // Add/Change breakpoints and store pending ones in map, since // Breakhandler::setResponse() on pending breakpoints clears the pending flag. // handleBreakPoints will the complete that information and set it on the break handler. bool addedChanged = false; QScopedPointer<BreakpointCorrectionContext> lineCorrection; - foreach (Breakpoint bp, bps) { + for (Breakpoint bp : bps) { BreakpointParameters parameters = bp.parameters(); BreakpointModelId id = bp.id(); const auto handleBreakInsertCB = [this, id](const DebuggerResponse &r) { handleBreakInsert(r, id); }; @@ -2634,9 +2556,10 @@ void CdbEngine::attemptBreakpointSynchronization() && parameters.type == BreakpointByFileAndLine && boolSetting(CdbBreakPointCorrection)) { if (lineCorrection.isNull()) - lineCorrection.reset(new BreakpointCorrectionContext(Internal::cppCodeModelSnapshot(), + lineCorrection.reset(new BreakpointCorrectionContext(m_codeModelSnapshot, CppTools::CppModelManager::instance()->workingCopy())); - response.lineNumber = lineCorrection->fixLineNumber(parameters.fileName, parameters.lineNumber); + response.lineNumber = int(lineCorrection->fixLineNumber( + parameters.fileName, unsigned(parameters.lineNumber))); QString cmd = cdbAddBreakpointCommand(response, m_sourcePathMappings, id, false); runCommand({cmd, BuiltinCommand, handleBreakInsertCB}); } else { @@ -2763,7 +2686,7 @@ static StackFrames parseFrames(const GdbMi &gdbmi, bool *incomplete = nullptr) frame.function = frameMi["function"].data(); frame.module = frameMi["from"].data(); frame.context = frameMi["context"].data(); - frame.address = frameMi["address"].data().toULongLong(0, 16); + frame.address = frameMi["address"].data().toULongLong(nullptr, 16); rc.push_back(frame); } return rc; @@ -2967,7 +2890,7 @@ void CdbEngine::handleWidgetAt(const DebuggerResponse &response) break; } // 0x000 -> nothing found - if (!watchExp.mid(sepPos + 1).toULongLong(0, 0)) { + if (!watchExp.mid(sepPos + 1).toULongLong(nullptr, 0)) { message = QString("No widget could be found at %1, %2.").arg(m_watchPointX).arg(m_watchPointY); break; } @@ -3076,44 +2999,11 @@ void CdbEngine::watchPoint(const QPoint &p) { m_watchPointX = p.x(); m_watchPointY = p.y(); - switch (state()) { - case InferiorStopOk: - postWidgetAtCommand(); - break; - case InferiorRunOk: - // "Select Widget to Watch" from a running application is currently not - // supported. It could be implemented via SpecialStopGetWidgetAt-mode, - // but requires some work as not to confuse the engine by state-change notifications - // emitted by the debuggee function call. - showMessage(tr("\"Select Widget to Watch\": Please stop the application first."), LogWarning); - break; - default: - showMessage(tr("\"Select Widget to Watch\": Not supported in state \"%1\"."). - arg(stateName(state())), LogWarning); - break; - } -} - -void CdbEngine::postWidgetAtCommand() -{ DebuggerCommand cmd("widgetat", ExtensionCommand); - cmd.args = QString("%1 %2").arg(m_watchPointX, m_watchPointY); + cmd.args = QString("%1 %2").arg(p.x(), p.y()); runCommand(cmd); } -void CdbEngine::handleCustomSpecialStop(const QVariant &v) -{ - if (v.canConvert<MemoryChangeCookie>()) { - const MemoryChangeCookie changeData = qvariant_cast<MemoryChangeCookie>(v); - runCommand({cdbWriteMemoryCommand(changeData.address, changeData.data), NoFlags}); - return; - } - if (v.canConvert<MemoryViewCookie>()) { - postFetchMemory(qvariant_cast<MemoryViewCookie>(v)); - return; - } -} - } // namespace Internal } // namespace Debugger diff --git a/src/plugins/debugger/cdb/cdbengine.h b/src/plugins/debugger/cdb/cdbengine.h index d569dee25e..2ef4c3c876 100644 --- a/src/plugins/debugger/cdb/cdbengine.h +++ b/src/plugins/debugger/cdb/cdbengine.h @@ -28,6 +28,8 @@ #include <debugger/debuggerengine.h> #include <debugger/breakhandler.h> +#include <cplusplus/CppDocument.h> + #include <projectexplorer/devicesupport/idevice.h> #include <QTime> @@ -44,8 +46,8 @@ class CdbEngine : public DebuggerEngine Q_OBJECT public: - typedef QSharedPointer<CdbCommand> CdbCommandPtr; - typedef std::function<void(const DebuggerResponse &)> CommandHandler; + using CdbCommandPtr = QSharedPointer<CdbCommand>; + using CommandHandler = std::function<void (const DebuggerResponse &)>; explicit CdbEngine(); ~CdbEngine() override; @@ -117,8 +119,8 @@ private: void handleDoInterruptInferior(const QString &errorMessage); - typedef QHash<BreakpointModelId, BreakpointResponse> PendingBreakPointMap; - typedef QPair<QString, QString> SourcePathMapping; + using PendingBreakPointMap = QHash<BreakpointModelId, BreakpointResponse>; + using SourcePathMapping = QPair<QString, QString>; struct NormalizedSourceFileName // Struct for caching mapped/normalized source files. { NormalizedSourceFileName(const QString &fn = QString(), bool e = false) : fileName(fn), exists(e) {} @@ -127,13 +129,12 @@ private: bool exists; }; - enum SpecialStopMode - { - NoSpecialStop, - SpecialStopSynchronizeBreakpoints, - SpecialStopGetWidgetAt, - CustomSpecialStop // Associated with m_specialStopData, handleCustomSpecialStop() + enum StopMode { + NoStopRequested, + Interrupt, + Callback }; + enum ParseStackResultFlags // Flags returned by parseStackTrace { ParseStackStepInto = 1, // Need to execute a step, hit on a call frame in "Step into" @@ -158,16 +159,12 @@ private: void handleSessionAccessible(unsigned long cdbExState); void handleSessionInaccessible(unsigned long cdbExState); void handleSessionIdle(const QString &message); - void doInterruptInferior(SpecialStopMode sm); - void doInterruptInferiorCustomSpecialStop(const QVariant &v); + using InterruptCallback = std::function<void()>; + void doInterruptInferior(const InterruptCallback &cb = InterruptCallback()); void doContinueInferior(); void parseOutputLine(QString line); bool isCdbProcessRunning() const { return m_process.state() != QProcess::NotRunning; } bool canInterruptInferior() const; - void syncOperateByInstruction(bool operateByInstruction); - void postWidgetAtCommand(); - void handleCustomSpecialStop(const QVariant &v); - void postFetchMemory(const MemoryViewCookie &c); inline void postDisassemblerCommand(quint64 address, DisassemblerAgent *agent); void postDisassemblerCommand(quint64 address, quint64 endAddress, DisassemblerAgent *agent); @@ -213,7 +210,7 @@ private: QByteArray m_outputBuffer; //! Debugger accessible (expecting commands) bool m_accessible = false; - SpecialStopMode m_specialStopMode = NoSpecialStop; + StopMode m_stopMode = NoStopRequested; ProjectExplorer::DeviceProcessSignalOperation::Ptr m_signalOperation; int m_nextCommandToken = 0; QHash<int, DebuggerCommand> m_commandForToken; @@ -221,7 +218,6 @@ private: int m_currentBuiltinResponseToken = -1; QMap<QString, NormalizedSourceFileName> m_normalizedFileCache; const QString m_extensionCommandPrefix; //!< Library name used as prefix - bool m_operateByInstructionPending = true; //!< Creator operate by instruction action changed. bool m_operateByInstruction = true; // Default CDB setting. bool m_hasDebuggee = false; enum Wow64State { @@ -243,11 +239,12 @@ private: QHash<QString, QString> m_fileNameModuleHash; QMultiHash<QString, quint64> m_symbolAddressCache; bool m_ignoreCdbOutput = false; - QVariantList m_customSpecialStopData; + QList<InterruptCallback> m_interrupCallbacks; QList<SourcePathMapping> m_sourcePathMappings; QScopedPointer<GdbMi> m_coreStopReason; int m_pythonVersion = 0; // 0xMMmmpp MM = major; mm = minor; pp = patch bool m_initialSessionIdleHandled = false; + mutable CPlusPlus::Snapshot m_codeModelSnapshot; }; } // namespace Internal diff --git a/src/plugins/debugger/cdb/cdboptionspage.cpp b/src/plugins/debugger/cdb/cdboptionspage.cpp index 0496d12bbb..9dacfe34ec 100644 --- a/src/plugins/debugger/cdb/cdboptionspage.cpp +++ b/src/plugins/debugger/cdb/cdboptionspage.cpp @@ -77,14 +77,14 @@ CdbBreakEventWidget::CdbBreakEventWidget(QWidget *parent) : QWidget(parent) { // 1 column with checkboxes only, // further columns with checkbox + parameter - QHBoxLayout *mainLayout = new QHBoxLayout; + auto mainLayout = new QHBoxLayout; mainLayout->setMargin(0); - QVBoxLayout *leftLayout = new QVBoxLayout; + auto leftLayout = new QVBoxLayout; QFormLayout *parameterLayout = nullptr; mainLayout->addLayout(leftLayout); const size_t eventCount = sizeof(eventDescriptions) / sizeof(EventsDescription); for (size_t e = 0; e < eventCount; e++) { - QCheckBox *cb = new QCheckBox(tr(eventDescriptions[e].description)); + auto cb = new QCheckBox(tr(eventDescriptions[e].description)); QLineEdit *le = nullptr; if (eventDescriptions[e].hasParameter) { if (!parameterLayout) { @@ -95,7 +95,7 @@ CdbBreakEventWidget::CdbBreakEventWidget(QWidget *parent) : QWidget(parent) le = new QLineEdit; parameterLayout->addRow(cb, le); if (parameterLayout->count() >= 6) // New column - parameterLayout = 0; + parameterLayout = nullptr; } else { leftLayout->addWidget(cb); } @@ -119,8 +119,8 @@ void CdbBreakEventWidget::setBreakEvents(const QStringList &l) { clear(); // Split the list of ("eh", "out:MyOutput") - foreach (const QString &evt, l) { - const int colonPos = evt.indexOf(QLatin1Char(':')); + for (const QString &evt : l) { + const int colonPos = evt.indexOf(':'); const QString abbrev = colonPos != -1 ? evt.mid(0, colonPos) : evt; const int index = indexOfEvent(abbrev); if (index != -1) @@ -168,7 +168,7 @@ CdbOptionsPageWidget::CdbOptionsPageWidget(QWidget *parent) m_ui.startupFormLayout->setContentsMargins(margins); - QVBoxLayout *eventLayout = new QVBoxLayout; + auto eventLayout = new QVBoxLayout; eventLayout->setContentsMargins(margins); eventLayout->addWidget(m_breakEventWidget); m_ui.eventGroupBox->setLayout(eventLayout); @@ -183,6 +183,8 @@ CdbOptionsPageWidget::CdbOptionsPageWidget(QWidget *parent) group.insert(action(UseCdbConsole), m_ui.consoleCheckBox); group.insert(action(CdbBreakPointCorrection), m_ui.breakpointCorrectionCheckBox); group.insert(action(CdbUsePythonDumper), m_ui.usePythonDumper); + group.insert(action(FirstChanceExceptionTaskEntry), m_ui.firstChance); + group.insert(action(SecondChanceExceptionTaskEntry), m_ui.secondChance); group.insert(action(IgnoreFirstChanceAccessViolation), m_ui.ignoreFirstChanceAccessViolationCheckBox); @@ -203,9 +205,7 @@ CdbOptionsPage::CdbOptionsPage() setCategory(Debugger::Constants::DEBUGGER_SETTINGS_CATEGORY); } -CdbOptionsPage::~CdbOptionsPage() -{ -} +CdbOptionsPage::~CdbOptionsPage() = default; QWidget *CdbOptionsPage::widget() { @@ -248,19 +248,19 @@ public: CdbPathsPageWidget::CdbPathsPageWidget(QWidget *parent) : QWidget(parent) { - QVBoxLayout *layout = new QVBoxLayout(this); + auto layout = new QVBoxLayout(this); QString title = tr("Symbol Paths"); - QGroupBox* gbSymbolPath = new QGroupBox(this); + auto gbSymbolPath = new QGroupBox(this); gbSymbolPath->setTitle(title); - QVBoxLayout *gbSymbolPathLayout = new QVBoxLayout(gbSymbolPath); + auto gbSymbolPathLayout = new QVBoxLayout(gbSymbolPath); m_symbolPathListEditor = new CdbSymbolPathListEditor(gbSymbolPath); gbSymbolPathLayout->addWidget(m_symbolPathListEditor); title = tr("Source Paths"); - QGroupBox* gbSourcePath = new QGroupBox(this); + auto gbSourcePath = new QGroupBox(this); gbSourcePath->setTitle(title); - QVBoxLayout *gbSourcePathLayout = new QVBoxLayout(gbSourcePath); + auto gbSourcePathLayout = new QVBoxLayout(gbSourcePath); m_sourcePathListEditor = new Utils::PathListEditor(gbSourcePath); gbSourcePathLayout->addWidget(m_sourcePathListEditor); @@ -272,16 +272,14 @@ CdbPathsPageWidget::CdbPathsPageWidget(QWidget *parent) : } CdbPathsPage::CdbPathsPage() - : m_widget(0) + : m_widget(nullptr) { setId("F.Debugger.Cdb"); setDisplayName(tr("CDB Paths")); setCategory(Debugger::Constants::DEBUGGER_SETTINGS_CATEGORY); } -CdbPathsPage::~CdbPathsPage() -{ -} +CdbPathsPage::~CdbPathsPage() = default; QWidget *CdbPathsPage::widget() { diff --git a/src/plugins/debugger/cdb/cdboptionspage.h b/src/plugins/debugger/cdb/cdboptionspage.h index 8d2de5b344..9411672175 100644 --- a/src/plugins/debugger/cdb/cdboptionspage.h +++ b/src/plugins/debugger/cdb/cdboptionspage.h @@ -92,12 +92,12 @@ class CdbOptionsPage : public Core::IOptionsPage public: explicit CdbOptionsPage(); - virtual ~CdbOptionsPage(); + ~CdbOptionsPage() override; // IOptionsPage - QWidget *widget(); - void apply(); - void finish(); + QWidget *widget() override; + void apply() override; + void finish() override; static const char *crtDbgReport; @@ -112,14 +112,14 @@ class CdbPathsPage : public Core::IOptionsPage public: explicit CdbPathsPage(); - virtual ~CdbPathsPage(); + ~CdbPathsPage() override; static CdbPathsPage *instance(); // IOptionsPage - QWidget *widget(); - void apply(); - void finish(); + QWidget *widget() override; + void apply() override; + void finish() override; private: QPointer<CdbPathsPageWidget> m_widget; diff --git a/src/plugins/debugger/cdb/cdboptionspagewidget.ui b/src/plugins/debugger/cdb/cdboptionspagewidget.ui index 38f434688c..e6d5646dea 100644 --- a/src/plugins/debugger/cdb/cdboptionspagewidget.ui +++ b/src/plugins/debugger/cdb/cdboptionspagewidget.ui @@ -104,6 +104,35 @@ </layout> </item> <item> + <widget class="QGroupBox" name="exceptions"> + <property name="title"> + <string>Task Entries for Exceptions </string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QCheckBox" name="firstChance"> + <property name="text"> + <string>First chance exceptions</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="secondChance"> + <property name="text"> + <string>Second chance exceptions</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> diff --git a/src/plugins/debugger/cdb/cdbparsehelpers.cpp b/src/plugins/debugger/cdb/cdbparsehelpers.cpp index 8c96dc6c80..fccd1c0086 100644 --- a/src/plugins/debugger/cdb/cdbparsehelpers.cpp +++ b/src/plugins/debugger/cdb/cdbparsehelpers.cpp @@ -55,11 +55,11 @@ QString cdbSourcePathMapping(QString fileName, const QList<QPair<QString, QString> > &sourcePathMapping, SourcePathMode mode) { - typedef QPair<QString, QString> SourcePathMapping; + using SourcePathMapping = QPair<QString, QString>; if (fileName.isEmpty() || sourcePathMapping.isEmpty()) return fileName; - foreach (const SourcePathMapping &m, sourcePathMapping) { + for (const SourcePathMapping &m : sourcePathMapping) { const QString &source = mode == DebuggerToSource ? m.first : m.second; const int sourceSize = source.size(); // Map parts of the path and ensure a slash follows. @@ -286,7 +286,7 @@ void parseBreakPoint(const GdbMi &gdbmi, BreakpointResponse *r, r->fileName = sourceFileName.data(); const GdbMi lineNumber = gdbmi["srcline"]; if (lineNumber.isValid()) - r->lineNumber = lineNumber.data().toULongLong(0, 0); + r->lineNumber = lineNumber.data().toULongLong(nullptr, 0); } if (expression) { const GdbMi expressionG = gdbmi["expression"]; @@ -295,7 +295,7 @@ void parseBreakPoint(const GdbMi &gdbmi, BreakpointResponse *r, } const GdbMi addressG = gdbmi["address"]; if (addressG.isValid()) - r->address = addressG.data().toULongLong(0, 0); + r->address = addressG.data().toULongLong(nullptr, 0); if (gdbmiChildToInt(gdbmi, "passcount", &(r->ignoreCount))) r->ignoreCount--; gdbmiChildToInt(gdbmi, "thread", &(r->threadSpec)); @@ -347,11 +347,7 @@ QString debugByteArray(const QByteArray &a) return rc; } -WinException::WinException() : - exceptionCode(0), exceptionFlags(0), exceptionAddress(0), - info1(0),info2(0), firstChance(false), lineNumber(0) -{ -} +WinException::WinException() = default; void WinException::fromGdbMI(const GdbMi &gdbmi) { @@ -448,7 +444,7 @@ bool parseCdbDisassemblerFunctionLine(const QString &l, const int offsetPos = l.indexOf(QLatin1String("+0x")); if (offsetPos > 0) { *currentFunction = l.left(offsetPos); - *functionOffset = l.mid(offsetPos + 3, functionEnd - offsetPos - 3).trimmed().toULongLong(0, 16); + *functionOffset = l.mid(offsetPos + 3, functionEnd - offsetPos - 3).trimmed().toULongLong(nullptr, 16); } else { // No offset, directly at beginning. *currentFunction = l.left(functionEnd); *functionOffset = 0; diff --git a/src/plugins/debugger/cdb/cdbparsehelpers.h b/src/plugins/debugger/cdb/cdbparsehelpers.h index d9c906fa94..f9973c4de8 100644 --- a/src/plugins/debugger/cdb/cdbparsehelpers.h +++ b/src/plugins/debugger/cdb/cdbparsehelpers.h @@ -82,14 +82,14 @@ struct WinException void fromGdbMI(const GdbMi &); QString toString(bool includeLocation = false) const; - unsigned exceptionCode; - unsigned exceptionFlags; - quint64 exceptionAddress; - quint64 info1; - quint64 info2; - bool firstChance; + unsigned exceptionCode = 0; + unsigned exceptionFlags = 0; + quint64 exceptionAddress = 0; + quint64 info1 = 0; + quint64 info2 = 0; + bool firstChance = false; QString file; - int lineNumber; + int lineNumber = 0; QString function; }; diff --git a/src/plugins/debugger/cdb/stringinputstream.cpp b/src/plugins/debugger/cdb/stringinputstream.cpp index a76f7183fc..980c9c5581 100644 --- a/src/plugins/debugger/cdb/stringinputstream.cpp +++ b/src/plugins/debugger/cdb/stringinputstream.cpp @@ -31,7 +31,7 @@ namespace Debugger { namespace Internal { StringInputStream::StringInputStream(QString &str) : - m_target(str), m_integerBase(10), m_hexPrefix(false), m_width(0) + m_target(str) { } diff --git a/src/plugins/debugger/cdb/stringinputstream.h b/src/plugins/debugger/cdb/stringinputstream.h index 0ee46094b1..61c78c7a0a 100644 --- a/src/plugins/debugger/cdb/stringinputstream.h +++ b/src/plugins/debugger/cdb/stringinputstream.h @@ -35,7 +35,7 @@ class StringInputStream Q_DISABLE_COPY(StringInputStream) public: - typedef void (ModifierFunc)(StringInputStream &s); + using ModifierFunc = void (StringInputStream &); explicit StringInputStream(QString &str); @@ -62,9 +62,9 @@ private: template <class IntType> void appendInt(IntType i); QString &m_target; - int m_integerBase; - bool m_hexPrefix; - int m_width; + int m_integerBase = 10; + bool m_hexPrefix = false; + int m_width = 0; }; template <class IntType> diff --git a/src/plugins/debugger/commonoptionspage.cpp b/src/plugins/debugger/commonoptionspage.cpp index 81c64118d3..2514df2c10 100644 --- a/src/plugins/debugger/commonoptionspage.cpp +++ b/src/plugins/debugger/commonoptionspage.cpp @@ -223,21 +223,21 @@ QWidget *CommonOptionsPage::widget() checkBoxKeepEditorStationaryWhileStepping); m_group.insert(action(FontSizeFollowsEditor), checkBoxFontSizeFollowsEditor); - m_group.insert(action(AutoDerefPointers), 0); - m_group.insert(action(UseToolTipsInLocalsView), 0); - m_group.insert(action(AlwaysAdjustColumnWidths), 0); - m_group.insert(action(UseToolTipsInBreakpointsView), 0); - m_group.insert(action(UseToolTipsInStackView), 0); - m_group.insert(action(UseAddressInBreakpointsView), 0); - m_group.insert(action(UseAddressInStackView), 0); + m_group.insert(action(AutoDerefPointers), nullptr); + m_group.insert(action(UseToolTipsInLocalsView), nullptr); + m_group.insert(action(AlwaysAdjustColumnWidths), nullptr); + m_group.insert(action(UseToolTipsInBreakpointsView), nullptr); + m_group.insert(action(UseToolTipsInStackView), nullptr); + m_group.insert(action(UseAddressInBreakpointsView), nullptr); + m_group.insert(action(UseAddressInStackView), nullptr); m_group.insert(action(MaximalStackDepth), spinBoxMaximalStackDepth); - m_group.insert(action(ShowStdNamespace), 0); - m_group.insert(action(ShowQtNamespace), 0); - m_group.insert(action(ShowQObjectNames), 0); - m_group.insert(action(SortStructMembers), 0); - m_group.insert(action(LogTimeStamps), 0); - m_group.insert(action(BreakOnThrow), 0); - m_group.insert(action(BreakOnCatch), 0); + m_group.insert(action(ShowStdNamespace), nullptr); + m_group.insert(action(ShowQtNamespace), nullptr); + m_group.insert(action(ShowQObjectNames), nullptr); + m_group.insert(action(SortStructMembers), nullptr); + m_group.insert(action(LogTimeStamps), nullptr); + m_group.insert(action(BreakOnThrow), nullptr); + m_group.insert(action(BreakOnCatch), nullptr); if (HostOsInfo::isWindowsHost()) { SavedAction *registerAction = action(RegisterForPostMortem); m_group.insert(registerAction, checkBoxRegisterForPostMortem); diff --git a/src/plugins/debugger/console/console.cpp b/src/plugins/debugger/console/console.cpp index 31a16f8d73..9391d9f05f 100644 --- a/src/plugins/debugger/console/console.cpp +++ b/src/plugins/debugger/console/console.cpp @@ -63,7 +63,7 @@ Console::Console() m_consoleWidget->setWindowTitle(displayName()); m_consoleWidget->setEnabled(true); - QVBoxLayout *vbox = new QVBoxLayout(m_consoleWidget); + auto vbox = new QVBoxLayout(m_consoleWidget); vbox->setMargin(0); vbox->setSpacing(0); @@ -92,7 +92,7 @@ Console::Console() itemDelegate, &ConsoleItemDelegate::currentChanged); m_consoleView->setItemDelegate(itemDelegate); - Aggregation::Aggregate *aggregate = new Aggregation::Aggregate(); + auto aggregate = new Aggregation::Aggregate(); aggregate->add(m_consoleView); aggregate->add(new Core::ItemViewFind(m_consoleView)); @@ -189,7 +189,7 @@ bool Console::canFocus() const bool Console::hasFocus() const { - for (QWidget *widget = m_consoleWidget->window()->focusWidget(); widget != 0; + for (QWidget *widget = m_consoleWidget->window()->focusWidget(); widget != nullptr; widget = widget->parentWidget()) { if (widget == m_consoleWidget) return true; diff --git a/src/plugins/debugger/console/console.h b/src/plugins/debugger/console/console.h index d95a56601a..c46add0a86 100644 --- a/src/plugins/debugger/console/console.h +++ b/src/plugins/debugger/console/console.h @@ -43,7 +43,7 @@ namespace Utils { class SavedAction; } namespace Debugger { namespace Internal { -typedef std::function<void(QString)> ScriptEvaluator; +using ScriptEvaluator = std::function<void (QString)>; class ConsoleItemModel; class ConsoleView; diff --git a/src/plugins/debugger/console/consoleedit.h b/src/plugins/debugger/console/consoleedit.h index b27348f6d9..44ef4bd112 100644 --- a/src/plugins/debugger/console/consoleedit.h +++ b/src/plugins/debugger/console/consoleedit.h @@ -41,8 +41,8 @@ public: QString getCurrentScript() const; protected: - void keyPressEvent(QKeyEvent *e); - void focusOutEvent(QFocusEvent *e); + void keyPressEvent(QKeyEvent *e) override; + void focusOutEvent(QFocusEvent *e) override; signals: void editingFinished(); diff --git a/src/plugins/debugger/console/consoleitem.cpp b/src/plugins/debugger/console/consoleitem.cpp index 4bf0253594..d22e14d6b4 100644 --- a/src/plugins/debugger/console/consoleitem.cpp +++ b/src/plugins/debugger/console/consoleitem.cpp @@ -44,7 +44,7 @@ ConsoleItem::ConsoleItem(ItemType itemType, const QString &expression, const QSt ConsoleItem::ConsoleItem(ConsoleItem::ItemType itemType, const QString &expression, std::function<void(ConsoleItem *)> doFetch) : - m_itemType(itemType), m_text(addZeroWidthSpace(expression)), m_line(-1), m_doFetch(doFetch) + m_itemType(itemType), m_text(addZeroWidthSpace(expression)), m_doFetch(doFetch) {} ConsoleItem::ItemType ConsoleItem::itemType() const @@ -144,7 +144,7 @@ void ConsoleItem::fetchMore() } for (TreeItem *child : *this) { - ConsoleItem *item = static_cast<ConsoleItem *>(child); + auto item = static_cast<ConsoleItem*>(child); if (item->m_doFetch) { item->m_doFetch(item); item->m_doFetch = m_doFetch; diff --git a/src/plugins/debugger/console/consoleitem.h b/src/plugins/debugger/console/consoleitem.h index e6402228bc..5e6b5a4d77 100644 --- a/src/plugins/debugger/console/consoleitem.h +++ b/src/plugins/debugger/console/consoleitem.h @@ -75,7 +75,7 @@ private: ItemType m_itemType; QString m_text; QString m_file; - int m_line; + int m_line = -1; std::function<void(ConsoleItem *)> m_doFetch; }; diff --git a/src/plugins/debugger/console/consoleitemdelegate.cpp b/src/plugins/debugger/console/consoleitemdelegate.cpp index 4fdb01b036..5a4f0becaf 100644 --- a/src/plugins/debugger/console/consoleitemdelegate.cpp +++ b/src/plugins/debugger/console/consoleitemdelegate.cpp @@ -57,8 +57,7 @@ ConsoleItemDelegate::ConsoleItemDelegate(ConsoleItemModel *model, QObject *paren m_expandIcon(Utils::Icons::EXPAND.icon()), m_collapseIcon(Utils::Icons::COLLAPSE.icon()), m_prompt(Utils::Icon({{QLatin1String(":/utils/images/next.png"), - Utils::Theme::TextColorNormal}}, Utils::Icon::Tint).icon()), - m_cachedHeight(0) + Utils::Theme::TextColorNormal}}, Utils::Icon::Tint).icon()) { } @@ -124,7 +123,7 @@ void ConsoleItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &o bool(opt.state & QStyle::State_Selected)); // Calculate positions - const QTreeView *view = qobject_cast<const QTreeView *>(opt.widget); + const auto view = qobject_cast<const QTreeView*>(opt.widget); int level = 0; QModelIndex idx(index); while (idx.parent() != QModelIndex()) { @@ -219,7 +218,7 @@ QSize ConsoleItemDelegate::sizeHint(const QStyleOptionViewItem &option, QStyleOptionViewItem opt = option; initStyleOption(&opt, index); - const QTreeView *view = qobject_cast<const QTreeView *>(opt.widget); + const auto view = qobject_cast<const QTreeView*>(opt.widget); int level = 0; QModelIndex idx(index); while (idx.parent() != QModelIndex()) { @@ -268,7 +267,7 @@ QWidget *ConsoleItemDelegate::createEditor(QWidget *parent, const QModelIndex &index) const { - ConsoleEdit *editor = new ConsoleEdit(index, parent); + auto editor = new ConsoleEdit(index, parent); // Make the background transparent so that the prompt shines through editor->setStyleSheet(QLatin1String("QTextEdit {" "margin-left: 24px;" @@ -286,7 +285,7 @@ QWidget *ConsoleItemDelegate::createEditor(QWidget *parent, void ConsoleItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { - ConsoleEdit *edtr = qobject_cast<ConsoleEdit *>(editor); + auto edtr = qobject_cast<ConsoleEdit*>(editor); edtr->insertPlainText(index.data(ConsoleItem::ExpressionRole).toString()); } @@ -294,7 +293,7 @@ void ConsoleItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { - ConsoleEdit *edtr = qobject_cast<ConsoleEdit *>(editor); + auto edtr = qobject_cast<ConsoleEdit*>(editor); model->setData(index, edtr->getCurrentScript(), ConsoleItem::ExpressionRole); model->setData(index, ConsoleItem::InputType, ConsoleItem::TypeRole); } diff --git a/src/plugins/debugger/console/consoleitemdelegate.h b/src/plugins/debugger/console/consoleitemdelegate.h index 87896a89c2..3b40666743 100644 --- a/src/plugins/debugger/console/consoleitemdelegate.h +++ b/src/plugins/debugger/console/consoleitemdelegate.h @@ -48,16 +48,17 @@ public: protected: void paint(QPainter *painter, const QStyleOptionViewItem &option, - const QModelIndex &index) const; + const QModelIndex &index) const override; QSize sizeHint(const QStyleOptionViewItem &option, - const QModelIndex &index) const; + const QModelIndex &index) const override; QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, - const QModelIndex &index) const; - void setEditorData(QWidget *editor, const QModelIndex &index) const; - void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; + const QModelIndex &index) const override; + void setEditorData(QWidget *editor, const QModelIndex &index) const override; + void setModelData(QWidget *editor, QAbstractItemModel *model, + const QModelIndex &index) const override; void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, - const QModelIndex &index) const; + const QModelIndex &index) const override; private: qreal layoutText(QTextLayout &tl, int width, bool *success = nullptr) const; @@ -70,7 +71,7 @@ private: const QIcon m_expandIcon; const QIcon m_collapseIcon; const QIcon m_prompt; - mutable int m_cachedHeight; + mutable int m_cachedHeight = 0; mutable QFont m_cachedFont; }; @@ -95,8 +96,6 @@ public: m_width(rect.width()), m_top(rect.top()), m_bottom(rect.bottom()), - m_maxFileLength(0), - m_maxLineLength(0), m_showTaskIconArea(showTaskIconArea), m_showExpandableIconArea(showExpandableIconArea) { diff --git a/src/plugins/debugger/console/consoleitemmodel.cpp b/src/plugins/debugger/console/consoleitemmodel.cpp index ea36932f30..383a0e7b64 100644 --- a/src/plugins/debugger/console/consoleitemmodel.cpp +++ b/src/plugins/debugger/console/consoleitemmodel.cpp @@ -38,8 +38,7 @@ namespace Internal { /////////////////////////////////////////////////////////////////////// ConsoleItemModel::ConsoleItemModel(QObject *parent) : - Utils::TreeModel<>(new ConsoleItem, parent), - m_maxSizeOfFileName(0), m_canFetchMore(false) + Utils::TreeModel<>(new ConsoleItem, parent) { clear(); } diff --git a/src/plugins/debugger/console/consoleitemmodel.h b/src/plugins/debugger/console/consoleitemmodel.h index 5aaab0335c..921b5d1cc9 100644 --- a/src/plugins/debugger/console/consoleitemmodel.h +++ b/src/plugins/debugger/console/consoleitemmodel.h @@ -60,8 +60,8 @@ signals: void selectEditableRow(const QModelIndex &index, QItemSelectionModel::SelectionFlags flags); private: - int m_maxSizeOfFileName; - bool m_canFetchMore; + int m_maxSizeOfFileName = 0; + bool m_canFetchMore = false; }; } // Internal diff --git a/src/plugins/debugger/console/consoleproxymodel.h b/src/plugins/debugger/console/consoleproxymodel.h index d75114d3e6..c97c4f10cf 100644 --- a/src/plugins/debugger/console/consoleproxymodel.h +++ b/src/plugins/debugger/console/consoleproxymodel.h @@ -52,7 +52,8 @@ signals: QItemSelectionModel::SelectionFlags command); protected: - bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const; + bool filterAcceptsRow(int source_row, + const QModelIndex &source_parent) const override; private: QFlags<ConsoleItem::ItemType> m_filter; diff --git a/src/plugins/debugger/console/consoleview.cpp b/src/plugins/debugger/console/consoleview.cpp index 50a8a838f9..2891e1aa0b 100644 --- a/src/plugins/debugger/console/consoleview.cpp +++ b/src/plugins/debugger/console/consoleview.cpp @@ -110,7 +110,7 @@ ConsoleView::ConsoleView(ConsoleItemModel *model, QWidget *parent) : baseName = QLatin1String("fusion"); // Qt5 } } - ConsoleViewStyle *style = new ConsoleViewStyle(baseName); + auto style = new ConsoleViewStyle(baseName); setStyle(style); style->setParent(this); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); @@ -180,18 +180,18 @@ void ConsoleView::contextMenuEvent(QContextMenuEvent *event) QModelIndex itemIndex = indexAt(event->pos()); QMenu menu; - QAction *copy = new QAction(tr("&Copy"), this); + auto copy = new QAction(tr("&Copy"), this); copy->setEnabled(itemIndex.isValid()); menu.addAction(copy); - QAction *show = new QAction(tr("&Show in Editor"), this); + auto show = new QAction(tr("&Show in Editor"), this); show->setEnabled(canShowItemInTextEditor(itemIndex)); menu.addAction(show); menu.addSeparator(); - QAction *clear = new QAction(tr("C&lear"), this); + auto clear = new QAction(tr("C&lear"), this); menu.addAction(clear); QAction *a = menu.exec(event->globalPos()); - if (a == 0) + if (a == nullptr) return; if (a == copy) { @@ -199,8 +199,8 @@ void ConsoleView::contextMenuEvent(QContextMenuEvent *event) } else if (a == show) { onRowActivated(itemIndex); } else if (a == clear) { - QAbstractProxyModel *proxyModel = qobject_cast<QAbstractProxyModel *>(model()); - ConsoleItemModel *handler = qobject_cast<ConsoleItemModel *>( + auto proxyModel = qobject_cast<QAbstractProxyModel*>(model()); + auto handler = qobject_cast<ConsoleItemModel*>( proxyModel->sourceModel()); handler->clear(); } diff --git a/src/plugins/debugger/console/consoleview.h b/src/plugins/debugger/console/consoleview.h index 493e65a252..9e3f2013bb 100644 --- a/src/plugins/debugger/console/consoleview.h +++ b/src/plugins/debugger/console/consoleview.h @@ -44,12 +44,12 @@ public: void populateFileFinder(); protected: - void mousePressEvent(QMouseEvent *event); - void resizeEvent(QResizeEvent *e); + void mousePressEvent(QMouseEvent *event) override; + void resizeEvent(QResizeEvent *e) override; void drawBranches(QPainter *painter, const QRect &rect, - const QModelIndex &index) const; - void contextMenuEvent(QContextMenuEvent *event); - void focusInEvent(QFocusEvent *event); + const QModelIndex &index) const override; + void contextMenuEvent(QContextMenuEvent *event) override; + void focusInEvent(QFocusEvent *event) override; private: void onRowActivated(const QModelIndex &index); diff --git a/src/plugins/debugger/debuggeractions.cpp b/src/plugins/debugger/debuggeractions.cpp index 791985588c..d148fc9202 100644 --- a/src/plugins/debugger/debuggeractions.cpp +++ b/src/plugins/debugger/debuggeractions.cpp @@ -234,6 +234,18 @@ DebuggerSettings::DebuggerSettings() item = new SavedAction(this); item->setCheckable(true); + item->setDefaultValue(true); + item->setSettingsKey(cdbSettingsGroup, QLatin1String("FirstChanceExceptionTaskEntry")); + insertItem(FirstChanceExceptionTaskEntry, item); + + item = new SavedAction(this); + item->setCheckable(true); + item->setDefaultValue(true); + item->setSettingsKey(cdbSettingsGroup, QLatin1String("SecondChanceExceptionTaskEntry")); + insertItem(SecondChanceExceptionTaskEntry, item); + + item = new SavedAction(this); + item->setCheckable(true); item->setDefaultValue(false); item->setSettingsKey(cdbSettingsGroup, QLatin1String("IgnoreFirstChanceAccessViolation")); insertItem(IgnoreFirstChanceAccessViolation, item); @@ -677,7 +689,7 @@ void DebuggerSettings::writeSettings() const SavedAction *DebuggerSettings::item(int code) const { - QTC_ASSERT(m_items.value(code, 0), qDebug() << "CODE: " << code; return 0); + QTC_ASSERT(m_items.value(code, 0), qDebug() << "CODE: " << code; return nullptr); return m_items.value(code, 0); } diff --git a/src/plugins/debugger/debuggeractions.h b/src/plugins/debugger/debuggeractions.h index 60ee01ff0d..15f2e73d99 100644 --- a/src/plugins/debugger/debuggeractions.h +++ b/src/plugins/debugger/debuggeractions.h @@ -36,8 +36,8 @@ namespace Utils { class SavedAction; } namespace Debugger { namespace Internal { -typedef QMap<QString, QString> SourcePathMap; -typedef QVector<QPair<QRegExp, QString> > SourcePathRegExpMap; +using SourcePathMap = QMap<QString, QString>; +using SourcePathRegExpMap = QVector<QPair<QRegExp, QString> >; // Global debugger options that are not stored as saved action. class GlobalDebuggerOptions @@ -117,6 +117,8 @@ enum DebuggerActionCode UseCdbConsole, CdbBreakPointCorrection, CdbUsePythonDumper, + FirstChanceExceptionTaskEntry, + SecondChanceExceptionTaskEntry, IgnoreFirstChanceAccessViolation, // Gdb diff --git a/src/plugins/debugger/debuggercore.h b/src/plugins/debugger/debuggercore.h index 57f9476bf8..c9eb7c0f7e 100644 --- a/src/plugins/debugger/debuggercore.h +++ b/src/plugins/debugger/debuggercore.h @@ -67,7 +67,6 @@ enum TestCases // Some convenience. void updateState(DebuggerRunTool *runTool); void updateLocalsWindow(bool showReturn); -const CPlusPlus::Snapshot &cppCodeModelSnapshot(); bool hasSnapshots(); void openTextEditor(const QString &titlePattern, const QString &contents); @@ -77,7 +76,7 @@ void showMessage(const QString &msg, int channel, int timeout = -1); bool isReverseDebugging(); void runControlStarted(DebuggerRunTool *runTool); void runControlFinished(DebuggerRunTool *runTool); -void displayDebugger(DebuggerRunTool *runTool, bool updateEngine); +void displayDebugger(DebuggerRunTool *runTool); void synchronizeBreakpoints(); void saveModeToRestore(); diff --git a/src/plugins/debugger/debuggerdialogs.cpp b/src/plugins/debugger/debuggerdialogs.cpp index c7934e6839..eda3d3ce47 100644 --- a/src/plugins/debugger/debuggerdialogs.cpp +++ b/src/plugins/debugger/debuggerdialogs.cpp @@ -148,6 +148,7 @@ public: QString serverAddress; Runnable runnable; bool breakAtMain = false; + bool runInTerminal = false; QString serverStartScript; QString debugInfoLocation; }; @@ -159,7 +160,7 @@ bool StartApplicationParameters::equals(const StartApplicationParameters &rhs) c && runnable.commandLineArguments == rhs.runnable.commandLineArguments && runnable.workingDirectory == rhs.runnable.workingDirectory && breakAtMain == rhs.breakAtMain - && runnable.runMode == rhs.runnable.runMode + && runInTerminal == rhs.runInTerminal && serverStartScript == rhs.serverStartScript && kitId == rhs.kitId && debugInfoLocation == rhs.debugInfoLocation @@ -195,7 +196,7 @@ void StartApplicationParameters::toSettings(QSettings *settings) const settings->setValue("LastExternalExecutableArguments", runnable.commandLineArguments); settings->setValue("LastExternalWorkingDirectory", runnable.workingDirectory); settings->setValue("LastExternalBreakAtMain", breakAtMain); - settings->setValue("LastExternalRunInTerminal", runnable.runMode == ApplicationLauncher::Console); + settings->setValue("LastExternalRunInTerminal", runInTerminal); settings->setValue("LastServerStartScript", serverStartScript); settings->setValue("LastDebugInfoLocation", debugInfoLocation); } @@ -209,8 +210,7 @@ void StartApplicationParameters::fromSettings(const QSettings *settings) runnable.commandLineArguments = settings->value("LastExternalExecutableArguments").toString(); runnable.workingDirectory = settings->value("LastExternalWorkingDirectory").toString(); breakAtMain = settings->value("LastExternalBreakAtMain").toBool(); - runnable.runMode = settings->value("LastExternalRunInTerminal").toBool() - ? ApplicationLauncher::Console : ApplicationLauncher::Gui; + runInTerminal = settings->value("LastExternalRunInTerminal").toBool(); serverStartScript = settings->value("LastServerStartScript").toString(); debugInfoLocation = settings->value("LastDebugInfoLocation").toString(); } @@ -469,8 +469,7 @@ StartApplicationParameters StartApplicationDialog::parameters() const result.runnable.commandLineArguments = d->arguments->text(); result.runnable.workingDirectory = d->workingDirectory->path(); result.breakAtMain = d->breakAtMainCheckBox->isChecked(); - result.runnable.runMode = d->runInTerminalCheckBox->isChecked() - ? ApplicationLauncher::Console : ApplicationLauncher::Gui; + result.runInTerminal = d->runInTerminalCheckBox->isChecked(); return result; } @@ -484,7 +483,7 @@ void StartApplicationDialog::setParameters(const StartApplicationParameters &p) d->debuginfoPathChooser->setPath(p.debugInfoLocation); d->arguments->setText(p.runnable.commandLineArguments); d->workingDirectory->setPath(p.runnable.workingDirectory); - d->runInTerminalCheckBox->setChecked(p.runnable.runMode == ApplicationLauncher::Console); + d->runInTerminalCheckBox->setChecked(p.runInTerminal); d->breakAtMainCheckBox->setChecked(p.breakAtMain); updateState(); } @@ -586,7 +585,7 @@ static QString cdbRemoteHelp() } StartRemoteCdbDialog::StartRemoteCdbDialog(QWidget *parent) : - QDialog(parent), m_okButton(0), m_lineEdit(new QLineEdit) + QDialog(parent), m_lineEdit(new QLineEdit) { setWindowTitle(tr("Start a CDB Remote Session")); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); @@ -631,9 +630,7 @@ void StartRemoteCdbDialog::accept() QDialog::accept(); } -StartRemoteCdbDialog::~StartRemoteCdbDialog() -{ -} +StartRemoteCdbDialog::~StartRemoteCdbDialog() = default; void StartRemoteCdbDialog::textChanged(const QString &t) { @@ -699,7 +696,7 @@ void AddressDialog::setAddress(quint64 a) quint64 AddressDialog::address() const { - return m_lineEdit->text().toULongLong(0, 16); + return m_lineEdit->text().toULongLong(nullptr, 16); } void AddressDialog::accept() @@ -821,7 +818,7 @@ public: { m_layout = new QGridLayout; m_layout->setColumnStretch(0, 2); - QVBoxLayout *vboxLayout = new QVBoxLayout; + auto vboxLayout = new QVBoxLayout; vboxLayout->addLayout(m_layout); vboxLayout->addItem(new QSpacerItem(1, 1, QSizePolicy::Ignored, QSizePolicy::MinimumExpanding)); @@ -833,10 +830,10 @@ public: { const int row = m_layout->rowCount(); int column = 0; - QButtonGroup *group = new QButtonGroup(this); + auto group = new QButtonGroup(this); m_layout->addWidget(new QLabel(type), row, column++); for (int i = -1; i != typeFormats.size(); ++i) { - QRadioButton *choice = new QRadioButton(this); + auto choice = new QRadioButton(this); choice->setText(i == -1 ? TypeFormatsDialog::tr("Reset") : WatchHandler::nameForFormat(typeFormats.at(i))); m_layout->addWidget(choice, row, column++); @@ -859,7 +856,7 @@ public: buttonBox = new QDialogButtonBox(q); buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok); - QVBoxLayout *layout = new QVBoxLayout(q); + auto layout = new QVBoxLayout(q); layout->addWidget(tabs); layout->addWidget(buttonBox); q->setLayout(layout); @@ -867,9 +864,9 @@ public: void addPage(const QString &name) { - TypeFormatsDialogPage *page = new TypeFormatsDialogPage; + auto page = new TypeFormatsDialogPage; pages.append(page); - QScrollArea *scroller = new QScrollArea; + auto scroller = new QScrollArea; scroller->setWidgetResizable(true); scroller->setWidget(page); scroller->setFrameStyle(QFrame::NoFrame); diff --git a/src/plugins/debugger/debuggerdialogs.h b/src/plugins/debugger/debuggerdialogs.h index ef0c2e1bc4..4cec4143a6 100644 --- a/src/plugins/debugger/debuggerdialogs.h +++ b/src/plugins/debugger/debuggerdialogs.h @@ -120,7 +120,7 @@ private: void textChanged(const QString &); void accept() override; - QPushButton *m_okButton; + QPushButton *m_okButton = nullptr; QLineEdit *m_lineEdit; }; diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index 7befc65ae2..c0618ee818 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -979,7 +979,7 @@ void DebuggerEngine::setState(DebuggerState state, bool forced) if (state == DebuggerFinished) { // Give up ownership on claimed breakpoints. - foreach (Breakpoint bp, breakHandler()->engineBreakpoints(this)) + for (Breakpoint bp : breakHandler()->engineBreakpoints(this)) bp.notifyBreakpointReleased(); DebuggerToolTipManager::deregisterEngine(this); d->m_memoryAgents.handleDebuggerFinished(); @@ -1002,12 +1002,12 @@ void DebuggerEngine::updateViews() bool DebuggerEngine::isSlaveEngine() const { - return d->m_masterEngine != 0; + return d->m_masterEngine != nullptr; } bool DebuggerEngine::isMasterEngine() const { - return d->m_masterEngine == 0; + return d->m_masterEngine == nullptr; } void DebuggerEngine::setMasterEngine(DebuggerEngine *masterEngine) @@ -1160,21 +1160,6 @@ void DebuggerEngine::quitDebugger() } } -void DebuggerEngine::abortDebugger() -{ - if (!isDying()) { - // Be friendly the first time. This will change targetState(). - showMessage("ABORTING DEBUGGER. FIRST TIME."); - quitDebugger(); - } else { - // We already tried. Try harder. - showMessage("ABORTING DEBUGGER. SECOND TIME."); - abortDebuggerProcess(); - if (d->m_runTool && d->m_runTool->runControl()) - d->m_runTool->runControl()->initiateFinish(); - } -} - void DebuggerEngine::requestInterruptInferior() { QTC_CHECK(isMasterEngine()); @@ -1288,11 +1273,6 @@ void DebuggerEngine::addOptionPages(QList<IOptionsPage*> *) const { } -bool DebuggerEngine::isSynchronous() const -{ - return false; -} - QString DebuggerEngine::qtNamespace() const { return d->m_qtNamespace; @@ -1336,7 +1316,7 @@ void DebuggerEngine::attemptBreakpointSynchronization() BreakHandler *handler = breakHandler(); - foreach (Breakpoint bp, handler->unclaimedBreakpoints()) { + for (Breakpoint bp : handler->unclaimedBreakpoints()) { // Take ownership of the breakpoint. Requests insertion. if (acceptsBreakpoint(bp)) { showMessage(QString("TAKING OWNERSHIP OF BREAKPOINT %1 IN STATE %2") @@ -1349,7 +1329,7 @@ void DebuggerEngine::attemptBreakpointSynchronization() } bool done = true; - foreach (Breakpoint bp, handler->engineBreakpoints(this)) { + for (Breakpoint bp : handler->engineBreakpoints(this)) { switch (bp.state()) { case BreakpointNew: // Should not happen once claimed. @@ -1555,7 +1535,7 @@ void DebuggerEngine::updateMemoryViews() void DebuggerEngine::openDisassemblerView(const Location &location) { - DisassemblerAgent *agent = new DisassemblerAgent(this); + auto agent = new DisassemblerAgent(this); agent->setLocation(location); } @@ -1609,8 +1589,8 @@ void DebuggerRunParameters::validateExecutable() } Utils::ElfReader reader(symbolFile); - Utils::ElfData elfData = reader.readHeaders(); - QString error = reader.errorString(); + const ElfData elfData = reader.readHeaders(); + const QString error = reader.errorString(); Internal::showMessage("EXAMINING " + symbolFile, LogDebug); QByteArray msg = "ELF SECTIONS: "; @@ -1629,7 +1609,7 @@ void DebuggerRunParameters::validateExecutable() }; QSet<QByteArray> seen; - foreach (const Utils::ElfSectionHeader &header, elfData.sectionHeaders) { + for (const ElfSectionHeader &header : elfData.sectionHeaders) { msg.append(header.name); msg.append(' '); if (interesting.contains(header.name)) @@ -1825,9 +1805,16 @@ bool DebuggerEngine::isNativeMixedActiveFrame() const return frame.language == QmlLanguage; } +bool DebuggerRunParameters::isCppDebugging() const +{ + return cppEngineType == CdbEngineType + || cppEngineType == GdbEngineType + || cppEngineType == LldbEngineType; +} + bool DebuggerRunParameters::isNativeMixedDebugging() const { - return nativeMixedEnabled && isCppDebugging && isQmlDebugging; + return nativeMixedEnabled && isCppDebugging() && isQmlDebugging; } } // namespace Internal diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h index 2f384ef7a6..37d4f10a10 100644 --- a/src/plugins/debugger/debuggerengine.h +++ b/src/plugins/debugger/debuggerengine.h @@ -129,10 +129,10 @@ public: DebuggerEngineType cppEngineType = NoEngineType; - bool isCppDebugging = true; bool isQmlDebugging = false; bool breakOnMain = false; bool multiProcess = false; // Whether to set detach-on-fork off. + bool useTerminal = false; ProjectExplorer::Runnable debugger; QString overrideStartScript; // Used in attach to core and remote debugging @@ -155,6 +155,7 @@ public: bool nativeMixedEnabled = false; + bool isCppDebugging() const; bool isNativeMixedDebugging() const; void validateExecutable(); @@ -186,7 +187,7 @@ public: class Location { public: - Location() {} + Location() = default; Location(quint64 address) { m_address = address; } Location(const QString &file) { m_fileName = file; } Location(const QString &file, int line, bool marker = true) @@ -269,6 +270,7 @@ public: virtual void selectWatchData(const QString &iname); virtual void prepareForRestart() {} + virtual void abortDebuggerProcess() {} // second attempt virtual void watchPoint(const QPoint &pnt); virtual void runCommand(const DebuggerCommand &cmd); @@ -299,7 +301,6 @@ public: virtual bool hasCapability(unsigned cap) const = 0; virtual void debugLastCommand() {} - virtual bool isSynchronous() const; virtual QString qtNamespace() const; void setQtNamespace(const QString &ns); @@ -360,14 +361,12 @@ public: virtual void gotoLocation(const Internal::Location &location); virtual void quitDebugger(); // called when pressing the stop button - void abortDebugger(); // called from the debug menu action - void updateViews(); bool isSlaveEngine() const; bool isMasterEngine() const; DebuggerEngine *masterEngine(); virtual DebuggerEngine *activeEngine() { return this; } - virtual DebuggerEngine *cppEngine() { return 0; } + virtual DebuggerEngine *cppEngine() { return nullptr; } virtual bool canDisplayTooltip() const; @@ -444,8 +443,6 @@ protected: virtual void frameUp(); virtual void frameDown(); - virtual void abortDebuggerProcess() {} // second attempt - virtual void doUpdateLocals(const UpdateParameters ¶ms); void setMasterEngine(DebuggerEngine *masterEngine); diff --git a/src/plugins/debugger/debuggeritem.cpp b/src/plugins/debugger/debuggeritem.cpp index 2885719ee2..9d06e9e1e3 100644 --- a/src/plugins/debugger/debuggeritem.cpp +++ b/src/plugins/debugger/debuggeritem.cpp @@ -68,17 +68,11 @@ namespace Debugger { // DebuggerItem // -------------------------------------------------------------------------- -DebuggerItem::DebuggerItem() -{ - m_engineType = NoEngineType; - m_isAutoDetected = false; -} +DebuggerItem::DebuggerItem() = default; DebuggerItem::DebuggerItem(const QVariant &id) { m_id = id; - m_engineType = NoEngineType; - m_isAutoDetected = false; } DebuggerItem::DebuggerItem(const QVariantMap &data) @@ -95,7 +89,7 @@ DebuggerItem::DebuggerItem(const QVariantMap &data) m_lastModified = data.value(QLatin1String(DEBUGGER_INFORMATION_LASTMODIFIED)).toDateTime(); foreach (const QString &a, data.value(QLatin1String(DEBUGGER_INFORMATION_ABIS)).toStringList()) { - Abi abi(a); + Abi abi = Abi::fromString(a); if (!abi.isNull()) m_abis.append(abi); } @@ -212,7 +206,7 @@ QString DebuggerItem::engineTypeName() const QStringList DebuggerItem::abiNames() const { QStringList list; - foreach (const Abi &abi, m_abis) + for (const Abi &abi : m_abis) list.append(abi.toString()); return list; } @@ -368,7 +362,7 @@ static DebuggerItem::MatchLevel matchSingle(const Abi &debuggerAbi, const Abi &t DebuggerItem::MatchLevel DebuggerItem::matchTarget(const Abi &targetAbi) const { MatchLevel bestMatch = DoesNotMatch; - foreach (const Abi &debuggerAbi, m_abis) { + for (const Abi &debuggerAbi : m_abis) { MatchLevel currentMatch = matchSingle(debuggerAbi, targetAbi, m_engineType); if (currentMatch > bestMatch) bestMatch = currentMatch; diff --git a/src/plugins/debugger/debuggeritem.h b/src/plugins/debugger/debuggeritem.h index 7dbdf5949d..e93d30e8b7 100644 --- a/src/plugins/debugger/debuggeritem.h +++ b/src/plugins/debugger/debuggeritem.h @@ -84,7 +84,7 @@ public: QString autoDetectionSource() const { return m_autoDetectionSource; } void setAutoDetectionSource(const QString &autoDetectionSource); - QList<ProjectExplorer::Abi> abis() const { return m_abis; } + const QList<ProjectExplorer::Abi> &abis() const { return m_abis; } void setAbis(const QList<ProjectExplorer::Abi> &abis); void setAbi(const ProjectExplorer::Abi &abi); @@ -111,10 +111,10 @@ private: QVariant m_id; QString m_unexpandedDisplayName; - DebuggerEngineType m_engineType; + DebuggerEngineType m_engineType = NoEngineType; Utils::FileName m_command; Utils::FileName m_workingDirectory; - bool m_isAutoDetected; + bool m_isAutoDetected = false; QString m_autoDetectionSource; QString m_version; QList<ProjectExplorer::Abi> m_abis; diff --git a/src/plugins/debugger/debuggeritemmanager.cpp b/src/plugins/debugger/debuggeritemmanager.cpp index 4021f6baf3..9877ce2f92 100644 --- a/src/plugins/debugger/debuggeritemmanager.cpp +++ b/src/plugins/debugger/debuggeritemmanager.cpp @@ -144,7 +144,7 @@ public: : m_item(item), m_orig(item), m_added(changed), m_changed(changed) {} - QVariant data(int column, int role) const + QVariant data(int column, int role) const override { switch (role) { case Qt::DisplayRole: @@ -327,7 +327,7 @@ DebuggerItemConfigWidget::DebuggerItemConfigWidget() m_abis = new QLineEdit(this); m_abis->setEnabled(false); - QFormLayout *formLayout = new QFormLayout(this); + auto formLayout = new QFormLayout(this); formLayout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow); formLayout->addRow(new QLabel(tr("Name:")), m_displayNameLineEdit); formLayout->addRow(m_cdbLabel); @@ -356,7 +356,7 @@ DebuggerItem DebuggerItemConfigWidget::item() const foreach (const QString &a, m_abis->text().split(QRegExp(QLatin1String("[^A-Za-z0-9-_]+")))) { if (a.isNull()) continue; - abiList << a; + abiList << Abi::fromString(a); } item.setAbis(abiList); item.setVersion(m_versionLabel->text()); @@ -620,7 +620,7 @@ void DebuggerOptionsPage::apply() void DebuggerOptionsPage::finish() { delete m_configWidget; - m_configWidget = 0; + m_configWidget = nullptr; d->m_model->cancel(); } @@ -968,7 +968,7 @@ DebuggerItemManager::~DebuggerItemManager() delete d; } -QList<DebuggerItem> DebuggerItemManager::debuggers() +const QList<DebuggerItem> DebuggerItemManager::debuggers() { QList<DebuggerItem> result; forAllDebuggers([&result](const DebuggerItem &item) { result.append(item); }); diff --git a/src/plugins/debugger/debuggeritemmanager.h b/src/plugins/debugger/debuggeritemmanager.h index 2b37d33485..ec2d74c928 100644 --- a/src/plugins/debugger/debuggeritemmanager.h +++ b/src/plugins/debugger/debuggeritemmanager.h @@ -47,7 +47,7 @@ public: DebuggerItemManager(); ~DebuggerItemManager() override; - static QList<DebuggerItem> debuggers(); + static const QList<DebuggerItem> debuggers(); static QVariant registerDebugger(const DebuggerItem &item); static void deregisterDebugger(const QVariant &id); diff --git a/src/plugins/debugger/debuggerkitconfigwidget.cpp b/src/plugins/debugger/debuggerkitconfigwidget.cpp index 34f68fe6f1..241770c437 100644 --- a/src/plugins/debugger/debuggerkitconfigwidget.cpp +++ b/src/plugins/debugger/debuggerkitconfigwidget.cpp @@ -64,8 +64,7 @@ namespace Internal { // ----------------------------------------------------------------------- DebuggerKitConfigWidget::DebuggerKitConfigWidget(Kit *workingCopy, const KitInformation *ki) - : KitConfigWidget(workingCopy, ki), - m_ignoreChanges(false) + : KitConfigWidget(workingCopy, ki) { m_comboBox = new QComboBox; m_comboBox->setEnabled(true); @@ -108,7 +107,7 @@ void DebuggerKitConfigWidget::refresh() m_comboBox->clear(); m_comboBox->setToolTip(toolTip()); m_comboBox->addItem(tr("None"), QString()); - foreach (const DebuggerItem &item, DebuggerItemManager::debuggers()) + for (const DebuggerItem &item : DebuggerItemManager::debuggers()) m_comboBox->addItem(item.displayName(), item.id()); const DebuggerItem *item = DebuggerKitInformation::debugger(m_kit); diff --git a/src/plugins/debugger/debuggerkitconfigwidget.h b/src/plugins/debugger/debuggerkitconfigwidget.h index 9fbe1f124d..e424481bef 100644 --- a/src/plugins/debugger/debuggerkitconfigwidget.h +++ b/src/plugins/debugger/debuggerkitconfigwidget.h @@ -72,7 +72,7 @@ private: void updateComboBox(const QVariant &id); bool m_isReadOnly; - bool m_ignoreChanges; + bool m_ignoreChanges = false; QComboBox *m_comboBox; QPushButton *m_manageButton; }; diff --git a/src/plugins/debugger/debuggerkitinformation.cpp b/src/plugins/debugger/debuggerkitinformation.cpp index 6ac69858c4..c3b41bcd4b 100644 --- a/src/plugins/debugger/debuggerkitinformation.cpp +++ b/src/plugins/debugger/debuggerkitinformation.cpp @@ -61,8 +61,8 @@ QVariant DebuggerKitInformation::defaultValue(const Kit *k) const const Abi toolChainAbi = ToolChainKitInformation::targetAbi(k); const Utils::FileNameList paths = Environment::systemEnvironment().path(); QVariant nextBestFit; - foreach (const DebuggerItem &item, DebuggerItemManager::debuggers()) { - foreach (const Abi targetAbi, item.abis()) { + for (const DebuggerItem &item : DebuggerItemManager::debuggers()) { + for (const Abi &targetAbi : item.abis()) { if (targetAbi.isCompatibleWith(toolChainAbi)) { if (paths.contains(item.command())) return item.id(); // prefer debuggers found in PATH over those found elsewhere @@ -104,7 +104,7 @@ void DebuggerKitInformation::setup(Kit *k) DebuggerItem bestItem; DebuggerItem::MatchLevel bestLevel = DebuggerItem::DoesNotMatch; const Environment systemEnvironment = Environment::systemEnvironment(); - foreach (const DebuggerItem &item, DebuggerItemManager::debuggers()) { + for (const DebuggerItem &item : DebuggerItemManager::debuggers()) { DebuggerItem::MatchLevel level = DebuggerItem::DoesNotMatch; if (rawId.isNull()) { diff --git a/src/plugins/debugger/debuggermainwindow.cpp b/src/plugins/debugger/debuggermainwindow.cpp index 0c87b00a13..c2ae3fa0dd 100644 --- a/src/plugins/debugger/debuggermainwindow.cpp +++ b/src/plugins/debugger/debuggermainwindow.cpp @@ -41,6 +41,7 @@ #include <projectexplorer/projectexplorericons.h> +#include <utils/algorithm.h> #include <utils/styledbar.h> #include <utils/qtcassert.h> #include <utils/proxyaction.h> @@ -65,7 +66,6 @@ const char LAST_PERSPECTIVE_KEY[] = "LastPerspective"; DebuggerMainWindow::DebuggerMainWindow() { - m_controlsStackWidget = new QStackedWidget; m_centralWidgetStack = new QStackedWidget; m_statusLabel = new Utils::StatusLabel; m_editorPlaceHolder = new EditorManagerPlaceHolder; @@ -73,7 +73,9 @@ DebuggerMainWindow::DebuggerMainWindow() m_perspectiveChooser = new QComboBox; m_perspectiveChooser->setObjectName(QLatin1String("PerspectiveChooser")); connect(m_perspectiveChooser, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), - this, [this](int item) { restorePerspective(m_perspectiveChooser->itemData(item).toByteArray()); }); + this, [this](int item) { + restorePerspective(findPerspective(m_perspectiveChooser->itemData(item).toByteArray())); + }); setDockNestingEnabled(true); setDockActionsVisible(false); @@ -85,8 +87,10 @@ DebuggerMainWindow::DebuggerMainWindow() DebuggerMainWindow::~DebuggerMainWindow() { + savePerspectiveHelper(m_currentPerspective); + delete m_editorPlaceHolder; - m_editorPlaceHolder = 0; + m_editorPlaceHolder = nullptr; // As we have to setParent(0) on dock widget that are not selected, // we keep track of all and make sure we don't leak any foreach (QDockWidget *dock, m_dockForDockId) { @@ -94,17 +98,25 @@ DebuggerMainWindow::~DebuggerMainWindow() delete dock; } - foreach (const Perspective *perspective, m_perspectiveForPerspectiveId) + foreach (const Perspective *perspective, m_perspectives) delete perspective; } -void DebuggerMainWindow::registerPerspective(const QByteArray &perspectiveId, const Perspective *perspective) +void DebuggerMainWindow::registerPerspective(Perspective *perspective) +{ + m_perspectives.append(perspective); + QByteArray parentPerspective = perspective->parentPerspective(); + // Add "main" perspectives to the chooser. + if (parentPerspective.isEmpty()) { + m_perspectiveChooser->addItem(perspective->name(), perspective->m_id); + increaseChooserWidthIfNecessary(perspective->name()); + } +} + +void DebuggerMainWindow::increaseChooserWidthIfNecessary(const QString &visibleName) { - m_perspectiveForPerspectiveId.insert(perspectiveId, perspective); - m_perspectiveChooser->addItem(perspective->name(), perspectiveId); - // adjust width if necessary const int oldWidth = m_perspectiveChooser->width(); - const int contentWidth = m_perspectiveChooser->fontMetrics().width(perspective->name()); + const int contentWidth = m_perspectiveChooser->fontMetrics().width(visibleName); QStyleOptionComboBox option; option.initFrom(m_perspectiveChooser); const QSize sz(contentWidth, 1); @@ -114,10 +126,22 @@ void DebuggerMainWindow::registerPerspective(const QByteArray &perspectiveId, co m_perspectiveChooser->setFixedWidth(width); } -void DebuggerMainWindow::registerToolbar(const QByteArray &perspectiveId, QWidget *widget) +void DebuggerMainWindow::destroyDynamicPerspective(Perspective *perspective) { - m_toolbarForPerspectiveId.insert(perspectiveId, widget); - m_controlsStackWidget->addWidget(widget); + QTC_ASSERT(perspective, return); + savePerspectiveHelper(perspective); + + m_perspectives.removeAll(perspective); + // Dynamic perspectives are currently not visible in the chooser. + // This might change in the future, make sure we notice. + const int idx = indexInChooser(perspective); + QTC_ASSERT(idx == -1, m_perspectiveChooser->removeItem(idx)); + QByteArray parentPerspective = perspective->parentPerspective(); + delete perspective; + // All dynamic perspectives currently have a static parent perspective. + // This might change in the future, make sure we notice. + QTC_CHECK(!parentPerspective.isEmpty()); + restorePerspective(findPerspective(parentPerspective)); } void DebuggerMainWindow::showStatusMessage(const QString &message, int timeoutMS) @@ -125,11 +149,6 @@ void DebuggerMainWindow::showStatusMessage(const QString &message, int timeoutMS m_statusLabel->showStatusMessage(message, timeoutMS); } -QDockWidget *DebuggerMainWindow::dockWidget(const QByteArray &dockId) const -{ - return m_dockForDockId.value(dockId); -} - void DebuggerMainWindow::raiseDock(const QByteArray &dockId) { QDockWidget *dock = m_dockForDockId.value(dockId); @@ -140,11 +159,16 @@ void DebuggerMainWindow::raiseDock(const QByteArray &dockId) dock->raise(); } +QByteArray DebuggerMainWindow::currentPerspective() const +{ + return m_currentPerspective ? m_currentPerspective->m_id : QByteArray(); +} + void DebuggerMainWindow::onModeChanged(Core::Id mode) { if (mode == Debugger::Constants::MODE_DEBUG) { setDockActionsVisible(true); - restorePerspective({}); + restorePerspective(nullptr); } else { setDockActionsVisible(false); @@ -158,7 +182,8 @@ void DebuggerMainWindow::onModeChanged(Core::Id mode) void DebuggerMainWindow::setPerspectiveEnabled(const QByteArray &perspectiveId, bool enabled) { - const int index = m_perspectiveChooser->findData(perspectiveId); + Perspective *perspective = findPerspective(perspectiveId); + const int index = indexInChooser(perspective); QTC_ASSERT(index != -1, return); auto model = qobject_cast<QStandardItemModel*>(m_perspectiveChooser->model()); QTC_ASSERT(model, return); @@ -166,18 +191,28 @@ void DebuggerMainWindow::setPerspectiveEnabled(const QByteArray &perspectiveId, item->setFlags(enabled ? item->flags() | Qt::ItemIsEnabled : item->flags() & ~Qt::ItemIsEnabled ); } +Perspective *DebuggerMainWindow::findPerspective(const QByteArray &perspectiveId) const +{ + return Utils::findOr(m_perspectives, nullptr, [&](Perspective *perspective) { + return perspective->m_id == perspectiveId; + }); +} + void DebuggerMainWindow::resetCurrentPerspective() { - loadPerspectiveHelper(m_currentPerspectiveId, false); + loadPerspectiveHelper(m_currentPerspective, false); } -void DebuggerMainWindow::restorePerspective(const QByteArray &perspectiveId) +int DebuggerMainWindow::indexInChooser(Perspective *perspective) const { - loadPerspectiveHelper(perspectiveId, true); + return perspective ? m_perspectiveChooser->findData(perspective->m_id) : -1; +} - int index = m_perspectiveChooser->findData(perspectiveId); - if (index == -1) - index = m_perspectiveChooser->findData(m_currentPerspectiveId); +void DebuggerMainWindow::restorePerspective(Perspective *perspective) +{ + loadPerspectiveHelper(perspective, true); + + const int index = indexInChooser(m_currentPerspective); if (index != -1) m_perspectiveChooser->setCurrentIndex(index); } @@ -191,13 +226,19 @@ void DebuggerMainWindow::finalizeSetup() closeButton->setIcon(Utils::Icons::CLOSE_SPLIT_BOTTOM.icon()); closeButton->setToolTip(tr("Leave Debug Mode")); + auto toolbuttonBox = new QWidget; + m_toolbuttonBoxLayout = new QHBoxLayout(toolbuttonBox); + m_toolbuttonBoxLayout->setMargin(0); + m_toolbuttonBoxLayout->setSpacing(0); + auto toolbar = new Utils::StyledBar; toolbar->setProperty("topBorder", true); auto hbox = new QHBoxLayout(toolbar); hbox->setMargin(0); hbox->setSpacing(0); hbox->addWidget(m_perspectiveChooser); - hbox->addWidget(m_controlsStackWidget); + hbox->addWidget(toolbuttonBox); + hbox->addStretch(3); hbox->addWidget(m_statusLabel); hbox->addStretch(1); hbox->addWidget(new Utils::StyledSeparator); @@ -301,68 +342,95 @@ QWidget *createModeWindow(const Core::Id &mode, DebuggerMainWindow *mainWindow) return splitter; } -void DebuggerMainWindow::loadPerspectiveHelper(const QByteArray &perspectiveId, bool fromStoredSettings) +void DebuggerMainWindow::loadPerspectiveHelper(Perspective *perspective, bool fromStoredSettings) { // Clean up old perspective. - if (!m_currentPerspectiveId.isEmpty()) { - saveCurrentPerspective(); - foreach (QDockWidget *dockWidget, m_dockForDockId) { - QTC_ASSERT(dockWidget, continue); - dockWidget->setFloating(false); - removeDockWidget(dockWidget); - dockWidget->hide(); - // Prevent saveState storing the data of the wrong children. - dockWidget->setParent(0); + if (m_currentPerspective) { + savePerspectiveHelper(m_currentPerspective); + for (QDockWidget *dock : m_dockForDockId) { + QTC_ASSERT(dock, continue); + dock->setParent(nullptr); + dock->widget()->setParent(nullptr); + ActionManager::unregisterAction(dock->toggleViewAction(), + Id("Dock.").withSuffix(dock->objectName())); + delete dock; } + m_dockForDockId.clear(); - ICore::removeAdditionalContext(Context(Id::fromName(m_currentPerspectiveId))); - const Perspective *perspective = m_perspectiveForPerspectiveId.value(m_currentPerspectiveId); - QWidget *central = perspective ? perspective->centralWidget() : nullptr; + ICore::removeAdditionalContext(Context(Id::fromName(m_currentPerspective->m_id))); + QWidget *central = m_currentPerspective->centralWidget(); m_centralWidgetStack->removeWidget(central ? central : m_editorPlaceHolder); - } - m_currentPerspectiveId = perspectiveId; + // Detach potentially re-used widgets to prevent deletion. + for (const Perspective::ToolbarOperation &op : m_currentPerspective->m_toolbarOperations) { + if (op.widget) + op.widget->setParent(nullptr); + if (op.toolbutton) + op.toolbutton->setParent(nullptr); + if (op.separator) + op.separator->setParent(nullptr); + } + + while (QLayoutItem *item = m_toolbuttonBoxLayout->takeAt(0)) + delete item; + } - if (m_currentPerspectiveId.isEmpty()) { + if (perspective) { + m_currentPerspective = perspective; + } else { const QSettings *settings = ICore::settings(); - m_currentPerspectiveId = settings->value(QLatin1String(LAST_PERSPECTIVE_KEY)).toByteArray(); - if (m_currentPerspectiveId.isEmpty()) - m_currentPerspectiveId = Debugger::Constants::CppPerspectiveId; + m_currentPerspective = findPerspective(settings->value(QLatin1String(LAST_PERSPECTIVE_KEY)).toByteArray()); + if (!m_currentPerspective) + m_currentPerspective = findPerspective(Debugger::Constants::CppPerspectiveId); + if (!m_currentPerspective && !m_perspectives.isEmpty()) + m_currentPerspective = m_perspectives.first(); } + QTC_ASSERT(m_currentPerspective, return); + + ICore::addAdditionalContext(Context(Id::fromName(m_currentPerspective->m_id))); - ICore::addAdditionalContext(Context(Id::fromName(m_currentPerspectiveId))); + m_currentPerspective->aboutToActivate(); - QTC_ASSERT(m_perspectiveForPerspectiveId.contains(m_currentPerspectiveId), return); - const Perspective *perspective = m_perspectiveForPerspectiveId.value(m_currentPerspectiveId); - perspective->aboutToActivate(); - for (const Perspective::Operation &operation : perspective->operations()) { - QDockWidget *dock = m_dockForDockId.value(operation.dockId); + for (const Perspective::ToolbarOperation &op : m_currentPerspective->m_toolbarOperations) { + if (op.widget) + m_toolbuttonBoxLayout->addWidget(op.widget); + if (op.toolbutton) + m_toolbuttonBoxLayout->addWidget(op.toolbutton); + if (op.separator) + m_toolbuttonBoxLayout->addWidget(op.separator); + } + + for (const Perspective::Operation &op : m_currentPerspective->m_operations) { + QTC_ASSERT(op.widget, continue); + const QByteArray dockId = op.widget->objectName().toUtf8(); + QDockWidget *dock = m_dockForDockId.value(dockId); if (!dock) { - QTC_CHECK(!operation.widget->objectName().isEmpty()); - dock = registerDockWidget(operation.dockId, operation.widget); + QTC_CHECK(!dockId.isEmpty()); + dock = addDockForWidget(op.widget); + m_dockForDockId[dockId] = dock; QAction *toggleViewAction = dock->toggleViewAction(); toggleViewAction->setText(dock->windowTitle()); Command *cmd = ActionManager::registerAction(toggleViewAction, Id("Dock.").withSuffix(dock->objectName()), - Context(Id::fromName(m_currentPerspectiveId))); + Context(Id::fromName(m_currentPerspective->m_id))); cmd->setAttribute(Command::CA_Hide); ActionManager::actionContainer(Core::Constants::M_WINDOW_VIEWS)->addAction(cmd); } // Restore parent/child relation, so that the widget hierarchy is clear. dock->setParent(this); - if (operation.operationType == Perspective::Raise) { + if (op.operationType == Perspective::Raise) { dock->raise(); continue; } - addDockWidget(operation.area, dock); - QDockWidget *anchor = m_dockForDockId.value(operation.anchorDockId); - if (!anchor && operation.area == Qt::BottomDockWidgetArea) + addDockWidget(op.area, dock); + QDockWidget *anchor = m_dockForDockId.value(op.anchorDockId); + if (!anchor && op.area == Qt::BottomDockWidgetArea) anchor = m_toolbarDock; if (anchor) { - switch (operation.operationType) { + switch (op.operationType) { case Perspective::AddToTab: tabifyDockWidget(anchor, dock); break; @@ -376,7 +444,7 @@ void DebuggerMainWindow::loadPerspectiveHelper(const QByteArray &perspectiveId, break; } } - if (!operation.visibleByDefault) + if (!op.visibleByDefault) dock->hide(); else dock->show(); @@ -384,7 +452,7 @@ void DebuggerMainWindow::loadPerspectiveHelper(const QByteArray &perspectiveId, if (fromStoredSettings) { QSettings *settings = ICore::settings(); - settings->beginGroup(QString::fromLatin1(m_currentPerspectiveId)); + settings->beginGroup(QString::fromLatin1(m_currentPerspective->m_id)); if (settings->value(QLatin1String("ToolSettingsSaved"), false).toBool()) restoreSettings(settings); settings->endGroup(); @@ -393,50 +461,50 @@ void DebuggerMainWindow::loadPerspectiveHelper(const QByteArray &perspectiveId, showCentralWidgetAction()->setChecked(true); } - QWidget *central = perspective->centralWidget(); + QWidget *central = m_currentPerspective->centralWidget(); m_centralWidgetStack->addWidget(central ? central : m_editorPlaceHolder); showCentralWidgetAction()->setText(central ? central->windowTitle() : tr("Editor")); - QTC_CHECK(m_toolbarForPerspectiveId.contains(m_currentPerspectiveId)); - m_controlsStackWidget->setCurrentWidget(m_toolbarForPerspectiveId.value(m_currentPerspectiveId)); m_statusLabel->clear(); } -void DebuggerMainWindow::saveCurrentPerspective() +void DebuggerMainWindow::savePerspectiveHelper(const Perspective *perspective) { - if (m_currentPerspectiveId.isEmpty()) + if (!perspective) return; QSettings *settings = ICore::settings(); - settings->beginGroup(QString::fromLatin1(m_currentPerspectiveId)); + settings->beginGroup(QString::fromLatin1(perspective->m_id)); saveSettings(settings); settings->setValue(QLatin1String("ToolSettingsSaved"), true); settings->endGroup(); - settings->setValue(QLatin1String(LAST_PERSPECTIVE_KEY), m_currentPerspectiveId); + settings->setValue(QLatin1String(LAST_PERSPECTIVE_KEY), perspective->m_id); } -QDockWidget *DebuggerMainWindow::registerDockWidget(const QByteArray &dockId, QWidget *widget) +// Perspective + +Perspective::Perspective(const QByteArray &id, const QString &name) + : m_id(id), m_name(name) { - QTC_ASSERT(!widget->objectName().isEmpty(), return 0); - QDockWidget *dockWidget = addDockForWidget(widget); - m_dockForDockId[dockId] = dockWidget; - return dockWidget; } Perspective::~Perspective() { - foreach (const Operation &operation, m_operations) - delete operation.widget; - delete m_centralWidget; + for (const ToolbarOperation &op : m_toolbarOperations) { + // op.widget and op.actions are owned by the plugins + delete op.toolbutton; + delete op.separator; + } } -QString Perspective::name() const +void Perspective::setCentralWidget(QWidget *centralWidget) { - return m_name; + QTC_ASSERT(m_centralWidget == nullptr, return); + m_centralWidget = centralWidget; } -void Perspective::setName(const QString &name) +QString Perspective::name() const { - m_name = name; + return m_name; } void Perspective::setAboutToActivateCallback(const Perspective::Callback &cb) @@ -450,43 +518,63 @@ void Perspective::aboutToActivate() const m_aboutToActivateCallback(); } -QList<QWidget *> ToolbarDescription::widgets() const +QByteArray Perspective::parentPerspective() const { - return m_widgets; + return m_parentPerspective; } -void ToolbarDescription::addAction(QAction *action, const QIcon &toolbarIcon) +void Perspective::setParentPerspective(const QByteArray &parentPerspective) { - auto button = new QToolButton; - button->setDefaultAction(toolbarIcon.isNull() - ? action : ProxyAction::proxyActionWithIcon(action, toolbarIcon)); - m_widgets.append(button); + m_parentPerspective = parentPerspective; } -void ToolbarDescription::addWidget(QWidget *widget) +QToolButton *Perspective::addToolbarAction(QAction *action, const QIcon &toolbarIcon) { - m_widgets.append(widget); + ToolbarOperation op; + op.action = action; + op.icon = toolbarIcon; + op.toolbutton = new QToolButton; + // QStyle::polish is called before it is added to the toolbar, explicitly make it a panel widget + op.toolbutton->setProperty("panelwidget", true); + op.toolbutton->setDefaultAction(toolbarIcon.isNull() + ? action : ProxyAction::proxyActionWithIcon(action, toolbarIcon)); + m_toolbarOperations.append(op); + + return op.toolbutton; } -Perspective::Operation::Operation(const QByteArray &dockId, QWidget *widget, const QByteArray &anchorDockId, - Perspective::OperationType splitType, bool visibleByDefault, - Qt::DockWidgetArea area) - : dockId(dockId), widget(widget), anchorDockId(anchorDockId), - operationType(splitType), visibleByDefault(visibleByDefault), area(area) -{} +void Perspective::addToolbarWidget(QWidget *widget) +{ + ToolbarOperation op; + op.widget = widget; + // QStyle::polish is called before it is added to the toolbar, explicitly make it a panel widget + op.widget->setProperty("panelwidget", true); + m_toolbarOperations.append(op); +} + +void Perspective::addToolbarSeparator() +{ + ToolbarOperation op; + op.separator = new StyledSeparator; + m_toolbarOperations.append(op); +} -Perspective::Perspective(const QString &name, const QVector<Operation> &splits, - QWidget *centralWidget) - : m_name(name), m_operations(splits), m_centralWidget(centralWidget) +QWidget *Perspective::centralWidget() const { - for (const Operation &split : splits) - m_docks.append(split.dockId); + return m_centralWidget; } -void Perspective::addOperation(const Operation &operation) +void Perspective::addWindow(QWidget *widget, OperationType type, QWidget *anchorWidget, + bool visibleByDefault, Qt::DockWidgetArea area) { - m_docks.append(operation.dockId); - m_operations.append(operation); + Operation op; + op.widget = widget; + if (anchorWidget) + op.anchorDockId = anchorWidget->objectName().toUtf8(); + op.operationType = type; + op.visibleByDefault = visibleByDefault; + op.area = area; + m_operations.append(op); } } // Utils diff --git a/src/plugins/debugger/debuggermainwindow.h b/src/plugins/debugger/debuggermainwindow.h index 08970aaead..30e646ccea 100644 --- a/src/plugins/debugger/debuggermainwindow.h +++ b/src/plugins/debugger/debuggermainwindow.h @@ -30,6 +30,7 @@ #include <utils/fancymainwindow.h> #include <utils/statuslabel.h> +#include <QHBoxLayout> #include <QPointer> #include <QSet> @@ -37,6 +38,7 @@ QT_BEGIN_NAMESPACE class QComboBox; +class QToolButton; class QStackedWidget; QT_END_NAMESPACE @@ -49,67 +51,64 @@ class DEBUGGER_EXPORT Perspective public: enum OperationType { SplitVertical, SplitHorizontal, AddToTab, Raise }; - class DEBUGGER_EXPORT Operation - { - public: - Operation() = default; - Operation(const QByteArray &dockId, QWidget *widget, - const QByteArray &anchorDockId, - OperationType operationType, - bool visibleByDefault = true, - Qt::DockWidgetArea area = Qt::BottomDockWidgetArea); - - QByteArray dockId; - QPointer<QWidget> widget; - QByteArray anchorDockId; - OperationType operationType = Raise; - bool visibleByDefault = true; - Qt::DockWidgetArea area = Qt::BottomDockWidgetArea; - }; - - Perspective() = default; - // Takes ownership of \a centralWidget and all dock widgets in \a operations. - Perspective(const QString &name, const QVector<Operation> &operations, - QWidget *centralWidget = nullptr); + explicit Perspective(const QByteArray &id, const QString &name); ~Perspective(); - void addOperation(const Operation &operation); + void setCentralWidget(QWidget *centralWidget); + void addWindow(QWidget *widget, + OperationType op, + QWidget *anchorWidget, + bool visibleByDefault = true, + Qt::DockWidgetArea area = Qt::BottomDockWidgetArea); - QVector<Operation> operations() const { return m_operations; } - QVector<QByteArray> docks() const { return m_docks; } - QWidget *centralWidget() const { return m_centralWidget; } + QToolButton *addToolbarAction(QAction *action, const QIcon &toolbarIcon = QIcon()); + void addToolbarWidget(QWidget *widget); + void addToolbarSeparator(); + + QWidget *centralWidget() const; QString name() const; - void setName(const QString &name); using Callback = std::function<void()>; void setAboutToActivateCallback(const Callback &cb); void aboutToActivate() const; + QByteArray parentPerspective() const; + void setParentPerspective(const QByteArray &parentPerspective); + private: Perspective(const Perspective &) = delete; void operator=(const Perspective &) = delete; + friend class DebuggerMainWindow; + class PerspectivePrivate *d = nullptr; + class Operation + { + public: + QPointer<QWidget> widget; + QByteArray anchorDockId; + OperationType operationType = Raise; + bool visibleByDefault = true; + Qt::DockWidgetArea area = Qt::BottomDockWidgetArea; + }; + + class ToolbarOperation + { + public: + QPointer<QWidget> widget; // Owned by plugin if present + QPointer<QAction> action; // Owned by plugin if present + QPointer<QToolButton> toolbutton; // Owned here in case action is used + QPointer<QWidget> separator; + QIcon icon; + }; + + const QByteArray m_id; QString m_name; - QVector<QByteArray> m_docks; + QByteArray m_parentPerspective; QVector<Operation> m_operations; QPointer<QWidget> m_centralWidget; Callback m_aboutToActivateCallback; -}; - -class DEBUGGER_EXPORT ToolbarDescription -{ -public: - ToolbarDescription() = default; - ToolbarDescription(const QList<QWidget *> &widgets) : m_widgets(widgets) {} - - QList<QWidget *> widgets() const; - - void addAction(QAction *action, const QIcon &toolbarIcon = QIcon()); - void addWidget(QWidget *widget); - -private: - QList<QWidget *> m_widgets; + QVector<ToolbarOperation> m_toolbarOperations; }; class DEBUGGER_EXPORT DebuggerMainWindow : public FancyMainWindow @@ -120,42 +119,43 @@ public: DebuggerMainWindow(); ~DebuggerMainWindow() override; - void registerPerspective(const QByteArray &perspectiveId, const Perspective *perspective); - void registerToolbar(const QByteArray &perspectiveId, QWidget *widget); + void registerPerspective(Perspective *perspective); + void destroyDynamicPerspective(Perspective *perspective); - void saveCurrentPerspective(); void resetCurrentPerspective(); - void restorePerspective(const QByteArray &perspectiveId); + void restorePerspective(Perspective *perspective); void finalizeSetup(); void showStatusMessage(const QString &message, int timeoutMS); - QDockWidget *dockWidget(const QByteArray &dockId) const; void raiseDock(const QByteArray &dockId); - QByteArray currentPerspective() const { return m_currentPerspectiveId; } + QByteArray currentPerspective() const; QStackedWidget *centralWidgetStack() const { return m_centralWidgetStack; } void onModeChanged(Core::Id mode); void setPerspectiveEnabled(const QByteArray &perspectiveId, bool enabled); -private: - void closeEvent(QCloseEvent *) final { saveCurrentPerspective(); } - - QDockWidget *registerDockWidget(const QByteArray &dockId, QWidget *widget); - void loadPerspectiveHelper(const QByteArray &perspectiveId, bool fromStoredSettings = true); + Perspective *findPerspective(const QByteArray &perspectiveId) const; - QByteArray m_currentPerspectiveId; - QComboBox *m_perspectiveChooser; - QStackedWidget *m_controlsStackWidget; - QStackedWidget *m_centralWidgetStack; - QWidget *m_editorPlaceHolder; - Utils::StatusLabel *m_statusLabel; +private: + void closeEvent(QCloseEvent *) final { savePerspectiveHelper(m_currentPerspective); } + + void loadPerspectiveHelper(Perspective *perspective, bool fromStoredSettings = true); + void savePerspectiveHelper(const Perspective *perspective); + void increaseChooserWidthIfNecessary(const QString &visibleName); + int indexInChooser(Perspective *perspective) const; + + Perspective *m_currentPerspective = nullptr; + QComboBox *m_perspectiveChooser = nullptr; + QHBoxLayout *m_toolbuttonBoxLayout = nullptr; + QStackedWidget *m_centralWidgetStack = nullptr; + QWidget *m_editorPlaceHolder = nullptr; + Utils::StatusLabel *m_statusLabel = nullptr; QDockWidget *m_toolbarDock = nullptr; QHash<QByteArray, QDockWidget *> m_dockForDockId; - QHash<QByteArray, QWidget *> m_toolbarForPerspectiveId; - QHash<QByteArray, const Perspective *> m_perspectiveForPerspectiveId; + QList<Perspective *> m_perspectives; }; DEBUGGER_EXPORT QWidget *createModeWindow(const Core::Id &mode, DebuggerMainWindow *mainWindow); diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 8f0c663a99..3c94e2339b 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -88,7 +88,6 @@ #include <cppeditor/cppeditorconstants.h> #include <qmljseditor/qmljseditorconstants.h> -#include <cpptools/cppmodelmanager.h> #include <projectexplorer/buildconfiguration.h> #include <projectexplorer/buildmanager.h> @@ -469,8 +468,8 @@ QAction *addCheckableAction(QMenu *menu, const QString &display, bool on, bool c class DummyEngine : public DebuggerEngine { public: - DummyEngine() {} - ~DummyEngine() override {} + DummyEngine() = default; + ~DummyEngine() override = default; void setupEngine() override {} void runEngine() override {} @@ -487,7 +486,7 @@ bool DummyEngine::hasCapability(unsigned cap) const // This can only be a first approximation of what to expect when running. Project *project = ProjectTree::currentProject(); if (!project) - return 0; + return false; Target *target = project->activeTarget(); QTC_ASSERT(target, return 0); RunConfiguration *activeRc = target->activeRunConfiguration(); @@ -633,7 +632,7 @@ class DebuggerPluginPrivate : public QObject public: explicit DebuggerPluginPrivate(DebuggerPlugin *plugin); - ~DebuggerPluginPrivate(); + ~DebuggerPluginPrivate() override; bool initialize(const QStringList &arguments, QString *errorMessage); void extensionsInitialized(); @@ -641,14 +640,14 @@ public: void doShutdown(); void connectEngine(DebuggerRunTool *runTool); - void disconnectEngine() { connectEngine(0); } + void disconnectEngine() { connectEngine(nullptr); } DebuggerEngine *dummyEngine(); void setThreadBoxContents(const QStringList &list, int index) { QSignalBlocker blocker(m_threadBox); m_threadBox->clear(); - foreach (const QString &item, list) + for (const QString &item : list) m_threadBox->addItem(item); m_threadBox->setCurrentIndex(index); } @@ -746,7 +745,7 @@ public: void runControlFinished(DebuggerRunTool *runTool); void remoteCommand(const QStringList &options); - void displayDebugger(DebuggerRunTool *runTool, bool updateEngine = true); + void displayDebugger(DebuggerRunTool *runTool); void dumpLog(); void cleanupViews(); @@ -784,8 +783,8 @@ public: void handleAbort() { - currentEngine()->resetLocation(); - currentEngine()->abortDebugger(); + if (dd->m_currentRunTool) + dd->m_currentRunTool->abortDebugger(); } void handleReset() @@ -1023,25 +1022,25 @@ public: BaseTreeView *m_stackView = nullptr; BaseTreeView *m_threadsView = nullptr; - QWidget *m_breakWindow = nullptr; BreakHandler *m_breakHandler = nullptr; - QWidget *m_returnWindow = nullptr; - QWidget *m_localsWindow = nullptr; - QWidget *m_watchersWindow = nullptr; - QWidget *m_inspectorWindow = nullptr; - QWidget *m_registerWindow = nullptr; - QWidget *m_modulesWindow = nullptr; - QWidget *m_snapshotWindow = nullptr; - QWidget *m_sourceFilesWindow = nullptr; - QWidget *m_stackWindow = nullptr; - QWidget *m_threadsWindow = nullptr; - LogWindow *m_logWindow = nullptr; - LocalsAndInspectorWindow *m_localsAndInspectorWindow = nullptr; + + QPointer<QWidget> m_returnWindow; + QPointer<QWidget> m_localsWindow; + QPointer<QWidget> m_watchersWindow; + QPointer<QWidget> m_inspectorWindow; + QPointer<LocalsAndInspectorWindow> m_localsAndInspectorWindow; + QPointer<QWidget> m_breakWindow; + QPointer<QWidget> m_registerWindow; + QPointer<QWidget> m_modulesWindow; + QPointer<QWidget> m_snapshotWindow; + QPointer<QWidget> m_sourceFilesWindow; + QPointer<QWidget> m_stackWindow; + QPointer<QWidget> m_threadsWindow; + QPointer<LogWindow> m_logWindow; bool m_busy = false; QString m_lastPermanentStatusMessage; - mutable CPlusPlus::Snapshot m_codeModelSnapshot; DebuggerPlugin *m_plugin = nullptr; SnapshotHandler *m_snapshotHandler = nullptr; @@ -1090,6 +1089,20 @@ DebuggerPluginPrivate::~DebuggerPluginPrivate() delete m_breakHandler; m_breakHandler = nullptr; + + delete m_returnWindow; + delete m_localsWindow; + delete m_watchersWindow; + delete m_inspectorWindow; + delete m_localsAndInspectorWindow; + delete m_breakWindow; + delete m_registerWindow; + delete m_modulesWindow; + delete m_snapshotWindow; + delete m_sourceFilesWindow; + delete m_stackWindow; + delete m_threadsWindow; + delete m_logWindow; } DebuggerEngine *DebuggerPluginPrivate::dummyEngine() @@ -1157,7 +1170,7 @@ bool DebuggerPluginPrivate::parseArgument(QStringList::const_iterator &it, bool useTerminal = false; if (!pid) { - foreach (const QString &arg, args) { + for (const QString &arg : args) { const QString key = arg.section('=', 0, 0); const QString val = arg.section('=', 1, 1); if (val.isEmpty()) { @@ -1343,8 +1356,8 @@ bool DebuggerPluginPrivate::initialize(const QStringList &arguments, this, [this](bool on) { m_breakView->setColumnHidden(BreakpointAddressColumn, !on); }); m_breakView->setSettings(settings, "Debugger.BreakWindow"); m_breakView->setModel(m_breakHandler->model()); - m_breakWindow = addSearch(m_breakView, tr("&Breakpoints"), DOCKWIDGET_BREAK); m_breakView->setRootIsDecorated(true); + m_breakWindow = addSearch(m_breakView, tr("&Breakpoints"), DOCKWIDGET_BREAK); m_modulesView = new BaseTreeView; m_modulesView->setSortingEnabled(true); @@ -1488,8 +1501,8 @@ bool DebuggerPluginPrivate::initialize(const QStringList &arguments, ActionContainer *debugMenu = ActionManager::actionContainer(PE::M_DEBUG); - m_localsAndInspectorWindow = new LocalsAndInspectorWindow( - m_localsWindow, m_inspectorWindow, m_returnWindow); + m_localsAndInspectorWindow = new LocalsAndInspectorWindow + (m_localsWindow, m_inspectorWindow, m_returnWindow); m_localsAndInspectorWindow->setObjectName(DOCKWIDGET_LOCALS_AND_INSPECTOR); m_localsAndInspectorWindow->setWindowTitle(m_localsWindow->windowTitle()); @@ -1796,35 +1809,18 @@ bool DebuggerPluginPrivate::initialize(const QStringList &arguments, connect(action(SettingsDialog), &QAction::triggered, [] { ICore::showOptionsDialog(DEBUGGER_COMMON_SETTINGS_ID); }); - // Toolbar - ToolbarDescription toolbar; - toolbar.addAction(m_visibleStartAction); - toolbar.addAction(ActionManager::command(Constants::STOP)->action(), Icons::DEBUG_EXIT_SMALL_TOOLBAR.icon()); - toolbar.addAction(ActionManager::command(Constants::NEXT)->action(), Icons::STEP_OVER_TOOLBAR.icon()); - toolbar.addAction(ActionManager::command(Constants::STEP)->action(), Icons::STEP_INTO_TOOLBAR.icon()); - toolbar.addAction(ActionManager::command(Constants::STEPOUT)->action(), Icons::STEP_OUT_TOOLBAR.icon()); - toolbar.addAction(ActionManager::command(Constants::RESET)->action(), Icons::RESTART_TOOLBAR.icon()); - toolbar.addAction(ActionManager::command(Constants::OPERATE_BY_INSTRUCTION)->action()); - if (isReverseDebuggingEnabled()) { m_reverseToolButton = new QToolButton; m_reverseToolButton->setDefaultAction(m_reverseDirectionAction); - toolbar.addWidget(m_reverseToolButton); } - toolbar.addWidget(new StyledSeparator); - m_threadLabel = new QLabel(tr("Threads:")); - toolbar.addWidget(m_threadLabel); m_threadBox = new QComboBox; m_threadBox->setSizeAdjustPolicy(QComboBox::AdjustToContents); connect(m_threadBox, static_cast<void(QComboBox::*)(int)>(&QComboBox::activated), this, &DebuggerPluginPrivate::selectThread); - toolbar.addWidget(m_threadBox); -// toolbar.addSpacerItem(new QSpacerItem(4, 0)); - // ToolbarDescription qmlToolbar // qmlToolbar.addAction(qmlUpdateOnSaveDummyAction); // qmlToolbar.addAction(qmlShowAppOnTopDummyAction, Icons::APP_ON_TOP_TOOLBAR.icon()); @@ -1832,28 +1828,37 @@ bool DebuggerPluginPrivate::initialize(const QStringList &arguments, // qmlToolbar.addAction(qmlSelectDummyAction, Icons::SELECT_TOOLBAR.icon()); // qmlToolbar.addWidget(new StyledSeparator); - auto createBasePerspective = [this] { return new Perspective({}, { - {DOCKWIDGET_STACK, m_stackWindow, {}, Perspective::SplitVertical}, - {DOCKWIDGET_BREAK, m_breakWindow, DOCKWIDGET_STACK, Perspective::SplitHorizontal}, - {DOCKWIDGET_THREADS, m_threadsWindow, DOCKWIDGET_BREAK, Perspective::AddToTab, false}, - {DOCKWIDGET_MODULES, m_modulesWindow, DOCKWIDGET_THREADS, Perspective::AddToTab, false}, - {DOCKWIDGET_SOURCE_FILES, m_sourceFilesWindow, DOCKWIDGET_MODULES, Perspective::AddToTab, false}, - {DOCKWIDGET_SNAPSHOTS, m_snapshotWindow, DOCKWIDGET_SOURCE_FILES, Perspective::AddToTab, false}, - {DOCKWIDGET_LOCALS_AND_INSPECTOR, m_localsAndInspectorWindow, {}, Perspective::AddToTab, true, - Qt::RightDockWidgetArea}, - {DOCKWIDGET_WATCHERS, m_watchersWindow, DOCKWIDGET_LOCALS_AND_INSPECTOR, Perspective::AddToTab, true, - Qt::RightDockWidgetArea}, - {DOCKWIDGET_OUTPUT, m_logWindow, {}, Perspective::AddToTab, false, Qt::TopDockWidgetArea}, - {DOCKWIDGET_BREAK, 0, {}, Perspective::Raise} - }); }; - - Perspective *cppPerspective = createBasePerspective(); - cppPerspective->setName(tr("Debugger")); - cppPerspective->addOperation({DOCKWIDGET_REGISTER, m_registerWindow, DOCKWIDGET_SNAPSHOTS, - Perspective::AddToTab, false}); - - Debugger::registerToolbar(CppPerspectiveId, toolbar); - Debugger::registerPerspective(CppPerspectiveId, cppPerspective); + auto perspective = new Perspective("Debugger", tr("Debugger")); + perspective->addWindow(m_stackWindow, Perspective::SplitVertical, nullptr); + perspective->addWindow(m_breakWindow, Perspective::SplitHorizontal, m_stackWindow); + perspective->addWindow(m_threadsWindow, Perspective::AddToTab, m_breakWindow, false); + perspective->addWindow(m_modulesWindow, Perspective::AddToTab, m_threadsWindow, false); + perspective->addWindow(m_sourceFilesWindow, Perspective::AddToTab, m_modulesWindow, false); + perspective->addWindow(m_snapshotWindow, Perspective::AddToTab, m_sourceFilesWindow, false); + perspective->addWindow(m_localsAndInspectorWindow, Perspective::AddToTab, nullptr, true, + Qt::RightDockWidgetArea); + perspective->addWindow(m_watchersWindow, Perspective::AddToTab, m_localsAndInspectorWindow, true, + Qt::RightDockWidgetArea); + perspective->addWindow(m_logWindow, Perspective::AddToTab, nullptr, false, Qt::TopDockWidgetArea); + perspective->addWindow(m_breakWindow, Perspective::Raise, nullptr); + perspective->addWindow(m_registerWindow, Perspective::AddToTab, m_snapshotWindow, false); + + perspective->addToolbarAction(m_visibleStartAction); + perspective->addToolbarAction(ActionManager::command(Constants::STOP)->action(), Icons::DEBUG_EXIT_SMALL_TOOLBAR.icon()); + perspective->addToolbarAction(ActionManager::command(Constants::NEXT)->action(), Icons::STEP_OVER_TOOLBAR.icon()); + perspective->addToolbarAction(ActionManager::command(Constants::STEP)->action(), Icons::STEP_INTO_TOOLBAR.icon()); + perspective->addToolbarAction(ActionManager::command(Constants::STEPOUT)->action(), Icons::STEP_OUT_TOOLBAR.icon()); + perspective->addToolbarAction(ActionManager::command(Constants::RESET)->action(), Icons::RESTART_TOOLBAR.icon()); + perspective->addToolbarAction(ActionManager::command(Constants::OPERATE_BY_INSTRUCTION)->action()); + + if (isReverseDebuggingEnabled()) + perspective->addToolbarWidget(m_reverseToolButton); + + perspective->addToolbarSeparator(); + perspective->addToolbarWidget(m_threadLabel); + perspective->addToolbarWidget(m_threadBox); + + Debugger::registerPerspective(perspective); // Perspective *qmlPerspective = createBasePerspective(); // qmlPerspective->setName(tr("QML Debugger")); @@ -1867,7 +1872,7 @@ bool DebuggerPluginPrivate::initialize(const QStringList &arguments, this, &DebuggerPluginPrivate::enableReverseDebuggingTriggered); setInitialState(); - connectEngine(0); + connectEngine(nullptr); connect(SessionManager::instance(), &SessionManager::startupProjectChanged, this, &DebuggerPluginPrivate::onCurrentProjectChanged); @@ -2068,12 +2073,12 @@ void DebuggerPluginPrivate::attachToUnstartedApplicationDialog() RunControl *DebuggerPluginPrivate::attachToRunningProcess(Kit *kit, DeviceProcessItem process, bool contAfterAttach) { - QTC_ASSERT(kit, return 0); + QTC_ASSERT(kit, return nullptr); IDevice::ConstPtr device = DeviceKitInformation::device(kit); - QTC_ASSERT(device, return 0); + QTC_ASSERT(device, return nullptr); if (process.pid == 0) { AsynchronousMessageBox::warning(tr("Warning"), tr("Cannot attach to process with PID 0")); - return 0; + return nullptr; } const Abi tcAbi = ToolChainKitInformation::targetAbi(kit); @@ -2084,13 +2089,13 @@ RunControl *DebuggerPluginPrivate::attachToRunningProcess(Kit *kit, tr("The process %1 is already under the control of a debugger.\n" "%2 cannot attach to it.").arg(process.pid) .arg(Core::Constants::IDE_DISPLAY_NAME)); - return 0; + return nullptr; } if (device->type() != PE::DESKTOP_DEVICE_TYPE) { AsynchronousMessageBox::warning(tr("Not a Desktop Device Type"), tr("It is only possible to attach to a locally running process.")); - return 0; + return nullptr; } auto runControl = new RunControl(nullptr, ProjectExplorer::Constants::DEBUG_RUN_MODE); @@ -2210,8 +2215,8 @@ void DebuggerPluginPrivate::editorOpened(IEditor *editor) void DebuggerPluginPrivate::updateBreakMenuItem(IEditor *editor) { - BaseTextEditor *textEditor = qobject_cast<BaseTextEditor *>(editor); - m_breakAction->setEnabled(textEditor != 0); + auto textEditor = qobject_cast<BaseTextEditor *>(editor); + m_breakAction->setEnabled(textEditor != nullptr); } void DebuggerPluginPrivate::requestContextMenu(TextEditorWidget *widget, @@ -2378,7 +2383,7 @@ void DebuggerPluginPrivate::requestMark(TextEditorWidget *widget, int lineNumber } // If updateEngine is set, the engine will update its threads/modules and so forth. -void DebuggerPluginPrivate::displayDebugger(DebuggerRunTool *runTool, bool updateEngine) +void DebuggerPluginPrivate::displayDebugger(DebuggerRunTool *runTool) { QTC_ASSERT(runTool, return); DebuggerEngine *engine = runTool ? runTool->engine() : dummyEngine(); @@ -2386,8 +2391,7 @@ void DebuggerPluginPrivate::displayDebugger(DebuggerRunTool *runTool, bool updat disconnectEngine(); connectEngine(runTool); - if (updateEngine) - engine->updateAll(); + engine->updateAll(); engine->updateViews(); } @@ -2607,7 +2611,6 @@ void DebuggerPluginPrivate::updateState(DebuggerRunTool *runTool) m_debugWithoutDeployAction->setEnabled(canRun); setProxyAction(m_visibleStartAction, Id(Constants::DEBUG)); m_hiddenStopAction->setAction(m_undisturbableAction); - m_codeModelSnapshot = CPlusPlus::Snapshot(); setBusyCursor(false); cleanupViews(); } else if (state == InferiorUnrunnable) { @@ -2747,7 +2750,7 @@ void DebuggerPluginPrivate::dumpLog() /*! Activates the previous mode when the current mode is the debug mode. */ void DebuggerPluginPrivate::activatePreviousMode() { - if (ModeManager::currentMode() == MODE_DEBUG && m_previousMode.isValid()) { + if (ModeManager::currentModeId() == MODE_DEBUG && m_previousMode.isValid()) { // If stopping the application also makes Qt Creator active (as the // "previously active application"), doing the switch synchronously // leads to funny effects with floating dock widgets @@ -2802,22 +2805,15 @@ void DebuggerPluginPrivate::aboutToShutdown() m_shutdownTimer.setInterval(0); m_shutdownTimer.setSingleShot(true); connect(&m_shutdownTimer, &QTimer::timeout, this, &DebuggerPluginPrivate::doShutdown); - if (DebuggerEngine *engine = currentEngine()) { - if (engine->state() != Debugger::DebuggerNotReady) { - engine->abortDebugger(); + if (dd->m_currentRunTool) { + if (dd->m_currentRunTool->engine()->state() != Debugger::DebuggerNotReady) { + dd->m_currentRunTool->abortDebugger(); m_shutdownTimer.setInterval(3000); } } m_shutdownTimer.start(); } -const CPlusPlus::Snapshot &cppCodeModelSnapshot() -{ - if (dd->m_codeModelSnapshot.isEmpty() && action(UseCodeModel)->isChecked()) - dd->m_codeModelSnapshot = CppTools::CppModelManager::instance()->snapshot(); - return dd->m_codeModelSnapshot; -} - void setSessionValue(const QByteArray &key, const QVariant &value) { SessionManager::setValue(QString::fromUtf8(key), value); @@ -2864,21 +2860,8 @@ void DebuggerPluginPrivate::showMessage(const QString &msg, int channel, int tim static void createNewDock(QWidget *widget) { -// m_mainWindow->registerDockWidget(dockId, widget); - -// QDockWidget *dockWidget = qobject_cast<QDockWidget *>(widget->parentWidget()); -// //dockWidget->installEventFilter(&m_resizeEventFilter); - -// QAction *toggleViewAction = dockWidget->toggleViewAction(); -// Command *cmd = ActionManager::registerAction(toggleViewAction, -// Id("Debugger.").withSuffix(widget->objectName())); -// cmd->setAttribute(Command::CA_Hide); -// dd->createDockWidget(Core::Id::fromString(widget->objectName()), widget); -// QDockWidget *dockWidget = qobject_cast<QDockWidget *>(widget->parentWidget()); -// QDockWidget *dockWidget = Debugger::registerDockWidget(Id::fromString(widget->objectName()), widget); - QDockWidget *dockWidget = new QDockWidget; + auto dockWidget = new QDockWidget; dockWidget->setWidget(widget); - dockWidget->setWindowTitle(widget->windowTitle()); dockWidget->setFeatures(QDockWidget::DockWidgetClosable); dockWidget->show(); @@ -2892,7 +2875,7 @@ static QString formatStartParameters(const DebuggerRunTool *debugger) str << "Start parameters: '" << sp.displayName << "' mode: " << sp.startMode << "\nABI: " << sp.toolChainAbi.toString() << '\n'; str << "Languages: "; - if (sp.isCppDebugging) + if (sp.isCppDebugging()) str << "c++ "; if (sp.isQmlDebugging) str << "qml"; @@ -3073,7 +3056,7 @@ BreakHandler *breakHandler() void showModuleSymbols(const QString &moduleName, const Symbols &symbols) { - QTreeWidget *w = new QTreeWidget; + auto w = new QTreeWidget; w->setUniformRowHeights(true); w->setColumnCount(5); w->setRootIsDecorated(false); @@ -3088,8 +3071,8 @@ void showModuleSymbols(const QString &moduleName, const Symbols &symbols) header.append(DebuggerPlugin::tr("Name")); w->setHeaderLabels(header); w->setWindowTitle(DebuggerPlugin::tr("Symbols in \"%1\"").arg(moduleName)); - foreach (const Symbol &s, symbols) { - QTreeWidgetItem *it = new QTreeWidgetItem; + for (const Symbol &s : symbols) { + auto it = new QTreeWidgetItem; it->setData(0, Qt::DisplayRole, s.name); it->setData(1, Qt::DisplayRole, s.address); it->setData(2, Qt::DisplayRole, s.state); @@ -3102,7 +3085,7 @@ void showModuleSymbols(const QString &moduleName, const Symbols &symbols) void showModuleSections(const QString &moduleName, const Sections §ions) { - QTreeWidget *w = new QTreeWidget; + auto w = new QTreeWidget; w->setUniformRowHeights(true); w->setColumnCount(5); w->setRootIsDecorated(false); @@ -3117,8 +3100,8 @@ void showModuleSections(const QString &moduleName, const Sections §ions) header.append(DebuggerPlugin::tr("Flags")); w->setHeaderLabels(header); w->setWindowTitle(DebuggerPlugin::tr("Sections in \"%1\"").arg(moduleName)); - foreach (const Section &s, sections) { - QTreeWidgetItem *it = new QTreeWidgetItem; + for (const Section &s : sections) { + auto it = new QTreeWidgetItem; it->setData(0, Qt::DisplayRole, s.name); it->setData(1, Qt::DisplayRole, s.from); it->setData(2, Qt::DisplayRole, s.to); @@ -3133,13 +3116,13 @@ void DebuggerPluginPrivate::doShutdown() { m_shutdownTimer.stop(); delete m_mainWindow; - m_mainWindow = 0; + m_mainWindow = nullptr; delete m_modeWindow; - m_modeWindow = 0; + m_modeWindow = nullptr; delete m_mode; - m_mode = 0; + m_mode = nullptr; emit m_plugin->asynchronousShutdownFinished(); } @@ -3192,9 +3175,9 @@ void runControlFinished(DebuggerRunTool *runTool) dd->runControlFinished(runTool); } -void displayDebugger(DebuggerRunTool *runTool, bool updateEngine) +void displayDebugger(DebuggerRunTool *runTool) { - dd->displayDebugger(runTool, updateEngine); + dd->displayDebugger(runTool); } void synchronizeBreakpoints() @@ -3258,7 +3241,7 @@ QSharedPointer<Internal::GlobalDebuggerOptions> globalDebuggerOptions() is DebuggerCore, implemented in DebuggerPluginPrivate. */ -static DebuggerPlugin *m_instance = 0; +static DebuggerPlugin *m_instance = nullptr; DebuggerPlugin::DebuggerPlugin() { @@ -3269,8 +3252,8 @@ DebuggerPlugin::DebuggerPlugin() DebuggerPlugin::~DebuggerPlugin() { delete dd; - dd = 0; - m_instance = 0; + dd = nullptr; + m_instance = nullptr; } DebuggerPlugin *DebuggerPlugin::instance() @@ -3295,7 +3278,7 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess mstart->addSeparator(Constants::G_GENERAL); mstart->addSeparator(Constants::G_SPECIAL); - KitManager::registerKitInformation(new DebuggerKitInformation); + KitManager::registerKitInformation<DebuggerKitInformation>(); // Task integration. //: Category under which Analyzer tasks are listed in Issues view @@ -3318,7 +3301,7 @@ QObject *DebuggerPlugin::remoteCommand(const QStringList &options, Q_UNUSED(workingDirectory); Q_UNUSED(list); dd->remoteCommand(options); - return 0; + return nullptr; } void DebuggerPlugin::extensionsInitialized() @@ -3369,7 +3352,7 @@ void DebuggerPluginPrivate::updateActiveLanguages() // Id perspective = (languages & QmlLanguage) && !(languages & CppLanguage) // ? QmlPerspectiveId : CppPerspectiveId; // m_mainWindow->restorePerspective(perspective); - if (rp.isCppDebugging) + if (rp.isCppDebugging()) ICore::addAdditionalContext(Context(C_CPPDEBUGGER)); else ICore::removeAdditionalContext(Context(C_CPPDEBUGGER)); @@ -3399,7 +3382,7 @@ void DebuggerPluginPrivate::onModeChanged(Id mode) void saveModeToRestore() { - dd->m_previousMode = ModeManager::currentMode(); + dd->m_previousMode = ModeManager::currentModeId(); } } // namespace Internal @@ -3429,7 +3412,7 @@ static BuildConfiguration::BuildType startupBuildType() void showCannotStartDialog(const QString &text) { - QMessageBox *errorDialog = new QMessageBox(ICore::mainWindow()); + auto errorDialog = new QMessageBox(ICore::mainWindow()); errorDialog->setAttribute(Qt::WA_DeleteOnClose); errorDialog->setIcon(QMessageBox::Warning); errorDialog->setWindowTitle(text); @@ -3503,21 +3486,6 @@ bool wantRunTool(ToolMode toolMode, const QString &toolName) return true; } -void registerToolbar(const QByteArray &perspectiveId, const ToolbarDescription &desc) -{ - auto toolbar = new QWidget; - toolbar->setObjectName(QString::fromLatin1(perspectiveId + ".Toolbar")); - auto hbox = new QHBoxLayout(toolbar); - hbox->setMargin(0); - hbox->setSpacing(0); - for (QWidget *widget : desc.widgets()) - hbox->addWidget(widget); - hbox->addStretch(); - toolbar->setLayout(hbox); - - dd->m_mainWindow->registerToolbar(perspectiveId, toolbar); -} - QAction *createStartAction() { auto action = new QAction(DebuggerMainWindow::tr("Start"), DebuggerPlugin::instance()); @@ -3534,9 +3502,9 @@ QAction *createStopAction() return action; } -void registerPerspective(const QByteArray &perspectiveId, const Perspective *perspective) +void registerPerspective(Perspective *perspective) { - dd->m_mainWindow->registerPerspective(perspectiveId, perspective); + dd->m_mainWindow->registerPerspective(perspective); } void setPerspectiveEnabled(const QByteArray &perspectiveId, bool enabled) @@ -3546,7 +3514,7 @@ void setPerspectiveEnabled(const QByteArray &perspectiveId, bool enabled) void selectPerspective(const QByteArray &perspectiveId) { - if (ModeManager::currentMode() == MODE_DEBUG + if (ModeManager::currentModeId() == MODE_DEBUG && dd->m_mainWindow->currentPerspective() == perspectiveId) { return; } @@ -3555,7 +3523,7 @@ void selectPerspective(const QByteArray &perspectiveId) if (perspectiveId.isEmpty()) return; ModeManager::activateMode(MODE_DEBUG); - dd->m_mainWindow->restorePerspective(perspectiveId); + dd->m_mainWindow->restorePerspective(dd->m_mainWindow->findPerspective(perspectiveId)); } QByteArray currentPerspective() @@ -3595,7 +3563,7 @@ class DebuggerUnitTests : public QObject Q_OBJECT public: - DebuggerUnitTests() {} + DebuggerUnitTests() = default; private slots: void initTestCase(); @@ -3608,7 +3576,7 @@ private slots: void testStateMachine(); private: - CppTools::Tests::TemporaryCopiedDir *m_tmpDir = 0; + CppTools::Tests::TemporaryCopiedDir *m_tmpDir = nullptr; }; void DebuggerUnitTests::initTestCase() @@ -3773,16 +3741,16 @@ void DebuggerUnitTests::testDebuggerMatching() QFETCH(QString, target); QFETCH(int, result); - DebuggerItem::MatchLevel expectedLevel = static_cast<DebuggerItem::MatchLevel>(result); + auto expectedLevel = static_cast<DebuggerItem::MatchLevel>(result); QList<Abi> debuggerAbis; foreach (const QString &abi, debugger) - debuggerAbis << Abi(abi); + debuggerAbis << Abi::fromString(abi); DebuggerItem item; item.setAbis(debuggerAbis); - DebuggerItem::MatchLevel level = item.matchTarget(Abi(target)); + DebuggerItem::MatchLevel level = item.matchTarget(Abi::fromString(target)); if (level == DebuggerItem::MatchesPerfectly) level = DebuggerItem::MatchesWell; diff --git a/src/plugins/debugger/debuggerprotocol.cpp b/src/plugins/debugger/debuggerprotocol.cpp index b0d3e3787e..b74770afa8 100644 --- a/src/plugins/debugger/debuggerprotocol.cpp +++ b/src/plugins/debugger/debuggerprotocol.cpp @@ -384,7 +384,7 @@ qulonglong GdbMi::toAddress() const ba.chop(1); if (ba.startsWith('*') || ba.startsWith('@')) ba = ba.mid(1); - return ba.toULongLong(0, 0); + return ba.toULongLong(nullptr, 0); } Utils::ProcessHandle GdbMi::toProcessHandle() const @@ -448,7 +448,7 @@ void extractGdbVersion(const QString &msg, QString build; bool inClean = true; bool inParenthesis = false; - foreach (QChar c, msg) { + for (QChar c : msg) { if (inClean && !cleaned.isEmpty() && c != dot && (c.isPunct() || c.isSpace())) inClean = false; if (ignoreParenthesisContent) { @@ -574,13 +574,13 @@ QString decodeData(const QString &ba, const QString &encoding) if (encoding == "empty") return QCoreApplication::translate("Debugger::Internal::WatchHandler", "<empty>"); if (encoding == "minimumitemcount") - return QCoreApplication::translate("Debugger::Internal::WatchHandler", "<at least %n items>", 0, ba.toInt()); + return QCoreApplication::translate("Debugger::Internal::WatchHandler", "<at least %n items>", nullptr, ba.toInt()); if (encoding == "undefined") return QLatin1String("Undefined"); if (encoding == "null") return QLatin1String("Null"); if (encoding == "itemcount") - return QCoreApplication::translate("Debugger::Internal::WatchHandler", "<%n items>", 0, ba.toInt()); + return QCoreApplication::translate("Debugger::Internal::WatchHandler", "<%n items>", nullptr, ba.toInt()); if (encoding == "notaccessible") return QCoreApplication::translate("Debugger::Internal::WatchHandler", "<not accessible>"); if (encoding == "optimizedout") diff --git a/src/plugins/debugger/debuggerprotocol.h b/src/plugins/debugger/debuggerprotocol.h index 634934ec96..68fefbacea 100644 --- a/src/plugins/debugger/debuggerprotocol.h +++ b/src/plugins/debugger/debuggerprotocol.h @@ -45,9 +45,9 @@ class DebuggerResponse; class DebuggerCommand { public: - typedef std::function<void(const DebuggerResponse &)> Callback; + using Callback = std::function<void (const DebuggerResponse &)>; - DebuggerCommand() {} + DebuggerCommand() = default; DebuggerCommand(const QString &f) : function(f) {} DebuggerCommand(const QString &f, const QJsonValue &a) : function(f), args(a) {} DebuggerCommand(const QString &f, int fl) : function(f), flags(fl) {} @@ -109,7 +109,7 @@ private: class DebuggerCommandSequence { public: - DebuggerCommandSequence() {} + DebuggerCommandSequence() = default; bool isEmpty() const { return m_commands.isEmpty(); } bool wantContinue() const { return m_continue; } const QList<DebuggerCommand> &commands() const { return m_commands; } @@ -127,7 +127,7 @@ public: class GdbMi { public: - GdbMi() : m_type(Invalid) {} + GdbMi() = default; QString m_name; QString m_data; @@ -135,7 +135,7 @@ public: enum Type { Invalid, Const, Tuple, List }; - Type m_type; + Type m_type = Invalid; Type type() const { return m_type; } const QString &name() const { return m_name; } @@ -189,12 +189,12 @@ enum ResultClass class DebuggerResponse { public: - DebuggerResponse() : token(-1), resultClass(ResultUnknown) {} + DebuggerResponse() = default; QString toString() const; static QString stringFromResultClass(ResultClass resultClass); - int token; - ResultClass resultClass; + int token = -1; + ResultClass resultClass = ResultUnknown; GdbMi data; QString logStreamOutput; QString consoleStreamOutput; @@ -224,7 +224,7 @@ public: DateTimeInternal, }; - DebuggerEncoding() {} + DebuggerEncoding() = default; explicit DebuggerEncoding(const QString &data); QString toString() const; diff --git a/src/plugins/debugger/debuggerrunconfigurationaspect.cpp b/src/plugins/debugger/debuggerrunconfigurationaspect.cpp index 58263c97bb..32f242814b 100644 --- a/src/plugins/debugger/debuggerrunconfigurationaspect.cpp +++ b/src/plugins/debugger/debuggerrunconfigurationaspect.cpp @@ -69,9 +69,9 @@ class DebuggerRunConfigWidget : public RunConfigWidget public: explicit DebuggerRunConfigWidget(DebuggerRunConfigurationAspect *aspect); - QString displayName() const { return tr("Debugger Settings"); } + QString displayName() const override { return tr("Debugger Settings"); } - void showEvent(QShowEvent *event); + void showEvent(QShowEvent *event) override; void update(); void useCppDebuggerClicked(bool on); diff --git a/src/plugins/debugger/debuggerruncontrol.cpp b/src/plugins/debugger/debuggerruncontrol.cpp index cd004f9a84..6c66f7eead 100644 --- a/src/plugins/debugger/debuggerruncontrol.cpp +++ b/src/plugins/debugger/debuggerruncontrol.cpp @@ -264,7 +264,6 @@ void DebuggerRunTool::setStartMode(DebuggerStartMode startMode) { if (startMode == AttachToQmlServer) { m_runParameters.startMode = AttachToRemoteProcess; - m_runParameters.isCppDebugging = false; m_runParameters.cppEngineType = NoEngineType; m_runParameters.isQmlDebugging = true; m_runParameters.closeMode = KillAtClose; @@ -436,7 +435,6 @@ void DebuggerRunTool::setOverrideStartScript(const QString &script) void DebuggerRunTool::setInferior(const Runnable &runnable) { m_runParameters.inferior = runnable; - setUseTerminal(m_runParameters.inferior.runMode == ApplicationLauncher::Console); } void DebuggerRunTool::setInferiorExecutable(const QString &executable) @@ -521,7 +519,7 @@ void DebuggerRunTool::start() setQmlServer(d->portsGatherer->qmlServer()); if (d->addQmlServerInferiorCommandLineArgumentIfNeeded && m_runParameters.isQmlDebugging - && m_runParameters.isCppDebugging) { + && m_runParameters.isCppDebugging()) { using namespace QmlDebug; int qmlServerPort = m_runParameters.qmlServer.port(); QTC_ASSERT(qmlServerPort > 0, reportFailure(); return); @@ -564,7 +562,8 @@ void DebuggerRunTool::start() DebuggerEngine *cppEngine = nullptr; if (!m_engine) { - switch (m_runParameters.cppEngineType) { + if (m_runParameters.isCppDebugging()) { + switch (m_runParameters.cppEngineType) { case GdbEngineType: cppEngine = createGdbEngine(); break; @@ -584,11 +583,12 @@ void DebuggerRunTool::start() default: if (!m_runParameters.isQmlDebugging) { reportFailure(DebuggerPlugin::tr("Unable to create a debugging engine. " - "Please select a Debugger Setting from the Run page of the project mode.")); + "Please select a Debugger Setting from the Run page of the project mode.")); return; } // Can happen for pure Qml. break; + } } if (m_runParameters.isQmlDebugging) { @@ -610,7 +610,7 @@ void DebuggerRunTool::start() if (m_runParameters.startMode == StartInternal) { QStringList unhandledIds; - foreach (Breakpoint bp, breakHandler()->allBreakpoints()) { + for (const Breakpoint &bp : breakHandler()->allBreakpoints()) { if (bp.isEnabled() && !m_engine->acceptsBreakpoint(bp)) unhandledIds.append(bp.id().toString()); } @@ -652,7 +652,7 @@ const DebuggerRunParameters &DebuggerRunTool::runParameters() const bool DebuggerRunTool::isCppDebugging() const { - return m_runParameters.isCppDebugging; + return m_runParameters.isCppDebugging(); } bool DebuggerRunTool::isQmlDebugging() const @@ -702,7 +702,18 @@ void DebuggerRunTool::quitDebugger() void DebuggerRunTool::abortDebugger() { - m_engine->abortDebugger(); + m_engine->resetLocation(); + if (!m_isDying) { + // Be friendly the first time. This will change targetState(). + showMessage("ABORTING DEBUGGER. FIRST TIME."); + quitDebugger(); + } else { + // We already tried. Try harder. + showMessage("ABORTING DEBUGGER. SECOND TIME."); + m_engine->abortDebuggerProcess(); + if (runControl()) + runControl()->initiateFinish(); + } } bool DebuggerRunTool::fixupParameters() @@ -717,7 +728,7 @@ bool DebuggerRunTool::fixupParameters() rp.debugger.environment.set(var, rp.inferior.environment.value(var)); // validate debugger if C++ debugging is enabled - if (rp.isCppDebugging && !rp.validationErrors.isEmpty()) { + if (rp.isCppDebugging() && !rp.validationErrors.isEmpty()) { reportFailure(rp.validationErrors.join('\n')); return false; } @@ -753,7 +764,7 @@ bool DebuggerRunTool::fixupParameters() if (rp.isQmlDebugging) { QmlDebug::QmlDebugServicesPreset service; - if (rp.isCppDebugging) { + if (rp.isCppDebugging()) { if (rp.nativeMixedEnabled) { service = QmlDebug::QmlNativeDebuggerServices; } else { @@ -763,7 +774,7 @@ bool DebuggerRunTool::fixupParameters() service = QmlDebug::QmlDebuggerServices; } if (rp.startMode != AttachExternal && rp.startMode != AttachCrashedExternal) { - QString qmlarg = rp.isCppDebugging && rp.nativeMixedEnabled + QString qmlarg = rp.isCppDebugging() && rp.nativeMixedEnabled ? QmlDebug::qmlDebugNativeArguments(service, false) : QmlDebug::qmlDebugTcpArguments(service, Port(rp.qmlServer.port())); QtcProcess::addArg(&rp.inferior.commandLineArguments, qmlarg); @@ -796,7 +807,7 @@ bool DebuggerRunTool::fixupParameters() if (rp.isNativeMixedDebugging()) rp.inferior.environment.set("QV4_FORCE_INTERPRETER", "1"); - if (rp.isCppDebugging && !rp.skipExecutableValidation) + if (rp.isCppDebugging() && !rp.skipExecutableValidation) rp.validateExecutable(); return true; @@ -829,6 +840,8 @@ DebuggerRunTool::DebuggerRunTool(RunControl *runControl, Kit *kit, bool allowTer m_runParameters.displayName = runConfig->displayName(); if (auto symbolsAspect = runConfig->extraAspect<SymbolFileAspect>()) m_runParameters.symbolFile = symbolsAspect->value(); + if (auto terminalAspect = runConfig->extraAspect<TerminalAspect>()) + m_runParameters.useTerminal = terminalAspect->useTerminal(); } if (runConfig && !kit) @@ -843,19 +856,19 @@ DebuggerRunTool::DebuggerRunTool(RunControl *runControl, Kit *kit, bool allowTer m_runParameters.qtPackageSourceLocation = qtVersion->qtPackageSourcePath().toString(); if (auto aspect = runConfig ? runConfig->extraAspect<DebuggerRunConfigurationAspect>() : nullptr) { - m_runParameters.isCppDebugging = aspect->useCppDebugger(); + if (aspect->useCppDebugger()) + m_runParameters.cppEngineType = DebuggerKitInformation::engineType(kit); m_runParameters.isQmlDebugging = aspect->useQmlDebugger(); m_runParameters.multiProcess = aspect->useMultiProcess(); - } - - if (m_runParameters.isCppDebugging) + } else if (m_runParameters.isCppDebugging()) { m_runParameters.cppEngineType = DebuggerKitInformation::engineType(kit); + } m_runParameters.inferior = runnable(); // Normalize to work around QTBUG-17529 (QtDeclarative fails with 'File name case mismatch'...) m_runParameters.inferior.workingDirectory = FileUtils::normalizePathName(m_runParameters.inferior.workingDirectory); - setUseTerminal(allowTerminal && m_runParameters.inferior.runMode == ApplicationLauncher::Console); + setUseTerminal(allowTerminal && m_runParameters.useTerminal); const QByteArray envBinary = qgetenv("QTC_DEBUGGER_PATH"); if (!envBinary.isEmpty()) @@ -921,7 +934,7 @@ DebuggerRunTool::~DebuggerRunTool() disconnect(); if (m_engine) { DebuggerEngine *engine = m_engine; - m_engine = 0; + m_engine = nullptr; engine->disconnect(); delete engine; } @@ -964,9 +977,7 @@ GdbServerPortsGatherer::GdbServerPortsGatherer(RunControl *runControl) m_device = runControl->device(); } -GdbServerPortsGatherer::~GdbServerPortsGatherer() -{ -} +GdbServerPortsGatherer::~GdbServerPortsGatherer() = default; Port GdbServerPortsGatherer::gdbServerPort() const { @@ -1005,9 +1016,7 @@ GdbServerRunner::GdbServerRunner(RunControl *runControl, GdbServerPortsGatherer addStartDependency(m_portsGatherer); } -GdbServerRunner::~GdbServerRunner() -{ -} +GdbServerRunner::~GdbServerRunner() = default; void GdbServerRunner::setRunnable(const Runnable &runnable) { diff --git a/src/plugins/debugger/debuggersourcepathmappingwidget.cpp b/src/plugins/debugger/debuggersourcepathmappingwidget.cpp index 14d0da759a..906610547c 100644 --- a/src/plugins/debugger/debuggersourcepathmappingwidget.cpp +++ b/src/plugins/debugger/debuggersourcepathmappingwidget.cpp @@ -50,8 +50,8 @@ enum { SourceColumn, TargetColumn, ColumnCount }; namespace Debugger { namespace Internal { -typedef QPair<QString, QString> Mapping; -typedef DebuggerSourcePathMappingWidget::SourcePathMap SourcePathMap; +using Mapping = QPair<QString, QString>; +using SourcePathMap = DebuggerSourcePathMappingWidget::SourcePathMap; // Qt's various build paths for unpatched versions. QStringList qtBuildPaths() @@ -166,9 +166,9 @@ void SourcePathMappingModel::setSourcePathMap(const SourcePathMap &m) void SourcePathMappingModel::addRawMapping(const QString &source, const QString &target) { QList<QStandardItem *> items; - QStandardItem *sourceItem = new QStandardItem(source); + auto sourceItem = new QStandardItem(source); sourceItem->setFlags(Qt::ItemIsEnabled|Qt::ItemIsSelectable); - QStandardItem *targetItem = new QStandardItem(target); + auto targetItem = new QStandardItem(target); targetItem->setFlags(Qt::ItemIsEnabled|Qt::ItemIsSelectable); items << sourceItem << targetItem; appendRow(items); diff --git a/src/plugins/debugger/debuggersourcepathmappingwidget.h b/src/plugins/debugger/debuggersourcepathmappingwidget.h index 4a4cabb294..5d6624bb6d 100644 --- a/src/plugins/debugger/debuggersourcepathmappingwidget.h +++ b/src/plugins/debugger/debuggersourcepathmappingwidget.h @@ -50,7 +50,7 @@ class DebuggerSourcePathMappingWidget : public QGroupBox Q_OBJECT public: - typedef QMap<QString, QString> SourcePathMap; + using SourcePathMap = QMap<QString, QString>; explicit DebuggerSourcePathMappingWidget(QWidget *parent = nullptr); diff --git a/src/plugins/debugger/debuggertooltipmanager.cpp b/src/plugins/debugger/debuggertooltipmanager.cpp index 7aea2ce128..7ef8d4b8c9 100644 --- a/src/plugins/debugger/debuggertooltipmanager.cpp +++ b/src/plugins/debugger/debuggertooltipmanager.cpp @@ -139,9 +139,9 @@ public: : m_target(target), m_moveStartPos(-1, -1), active(false) {} - void mousePressEvent(QMouseEvent *event); - void mouseReleaseEvent(QMouseEvent *event); - void mouseMoveEvent(QMouseEvent *event); + void mousePressEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; + void mouseMoveEvent(QMouseEvent *event) override; public: QWidget *m_target; @@ -192,13 +192,13 @@ void DraggableLabel::mouseMoveEvent(QMouseEvent * event) class ToolTipWatchItem : public TreeItem { public: - ToolTipWatchItem() : expandable(false) {} + ToolTipWatchItem() = default; ToolTipWatchItem(TreeItem *item); - bool hasChildren() const { return expandable; } - bool canFetchMore() const { return childCount() == 0 && expandable && model(); } - void fetchMore() {} - QVariant data(int column, int role) const; + bool hasChildren() const override { return expandable; } + bool canFetchMore() const override { return childCount() == 0 && expandable && model(); } + void fetchMore() override {} + QVariant data(int column, int role) const override; public: QString name; @@ -206,7 +206,7 @@ public: QString type; QString expression; QColor valueColor; - bool expandable; + bool expandable = false; QString iname; }; @@ -257,7 +257,7 @@ public: m_expandedINames.remove(idx.data(LocalsINameRole).toString()); } - void fetchMore(const QModelIndex &idx) + void fetchMore(const QModelIndex &idx) override { if (!idx.isValid()) return; @@ -379,9 +379,9 @@ public: setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); } - QSize sizeHint() const { return m_size; } + QSize sizeHint() const override { return m_size; } - int sizeHintForColumn(int column) const + int sizeHintForColumn(int column) const override { return QTreeView::sizeHintForColumn(column); } @@ -410,19 +410,19 @@ class DebuggerToolTipWidget : public QWidget public: DebuggerToolTipWidget(); - ~DebuggerToolTipWidget() { DEBUG("DESTROY DEBUGGERTOOLTIP WIDGET"); } + ~DebuggerToolTipWidget() override { DEBUG("DESTROY DEBUGGERTOOLTIP WIDGET"); } - void closeEvent(QCloseEvent *) + void closeEvent(QCloseEvent *) override { DEBUG("CLOSE DEBUGGERTOOLTIP WIDGET"); } - void enterEvent(QEvent *) + void enterEvent(QEvent *) override { DEBUG("ENTER DEBUGGERTOOLTIP WIDGET"); } - void leaveEvent(QEvent *) + void leaveEvent(QEvent *) override { DEBUG("LEAVE DEBUGGERTOOLTIP WIDGET"); if (BaseTextEditor *editor = BaseTextEditor::currentTextEditor()) @@ -826,7 +826,7 @@ void DebuggerToolTipHolder::destroy() { if (widget) { widget->close(); - widget = 0; + widget = nullptr; } } @@ -1224,7 +1224,7 @@ static void slotTooltipOverrideRequested static void slotEditorOpened(IEditor *e) { // Move tooltip along when scrolled. - if (BaseTextEditor *textEditor = qobject_cast<BaseTextEditor *>(e)) { + if (auto textEditor = qobject_cast<BaseTextEditor *>(e)) { TextEditorWidget *widget = textEditor->editorWidget(); QObject::connect(widget->verticalScrollBar(), &QScrollBar::valueChanged, &DebuggerToolTipManager::updateVisibleToolTips); @@ -1262,7 +1262,7 @@ void DebuggerToolTipManager::leavingDebugMode() if (QWidget *topLevel = ICore::mainWindow()->topLevelWidget()) topLevel->removeEventFilter(this); foreach (IEditor *e, DocumentModel::editorsForOpenedDocuments()) { - if (BaseTextEditor *toolTipEditor = qobject_cast<BaseTextEditor *>(e)) { + if (auto toolTipEditor = qobject_cast<BaseTextEditor *>(e)) { toolTipEditor->editorWidget()->verticalScrollBar()->disconnect(this); toolTipEditor->disconnect(this); } @@ -1289,7 +1289,7 @@ bool DebuggerToolTipManager::eventFilter(QObject *o, QEvent *e) return false; switch (e->type()) { case QEvent::Move: { // Move along with parent (toplevel) - const QMoveEvent *me = static_cast<const QMoveEvent *>(e); + const auto me = static_cast<const QMoveEvent *>(e); const QPoint dist = me->pos() - me->oldPos(); purgeClosedToolTips(); foreach (DebuggerToolTipHolder *tooltip, m_tooltips) { @@ -1299,7 +1299,7 @@ bool DebuggerToolTipManager::eventFilter(QObject *o, QEvent *e) break; } case QEvent::WindowStateChange: { // Hide/Show along with parent (toplevel) - const QWindowStateChangeEvent *se = static_cast<const QWindowStateChangeEvent *>(e); + const auto se = static_cast<const QWindowStateChangeEvent *>(e); const bool wasMinimized = se->oldState() & Qt::WindowMinimized; const bool isMinimized = static_cast<const QWidget *>(o)->windowState() & Qt::WindowMinimized; if (wasMinimized ^ isMinimized) { diff --git a/src/plugins/debugger/debuggertooltipmanager.h b/src/plugins/debugger/debuggertooltipmanager.h index 44b117f8d3..db3ec2af32 100644 --- a/src/plugins/debugger/debuggertooltipmanager.h +++ b/src/plugins/debugger/debuggertooltipmanager.h @@ -67,7 +67,7 @@ public: bool isCppEditor; }; -typedef QList<DebuggerToolTipContext> DebuggerToolTipContexts; +using DebuggerToolTipContexts = QList<DebuggerToolTipContext>; class DebuggerToolTipManager : public QObject { diff --git a/src/plugins/debugger/disassembleragent.cpp b/src/plugins/debugger/disassembleragent.cpp index 6268d758bd..d79be06f57 100644 --- a/src/plugins/debugger/disassembleragent.cpp +++ b/src/plugins/debugger/disassembleragent.cpp @@ -72,8 +72,8 @@ public: setPriority(TextMark::NormalPriority); } - bool isClickable() const { return true; } - void clicked() { m_bp.removeBreakpoint(); } + bool isClickable() const override { return true; } + void clicked() override { m_bp.removeBreakpoint(); } public: Breakpoint m_bp; @@ -88,13 +88,13 @@ public: class FrameKey { public: - FrameKey() : startAddress(0), endAddress(0) {} + FrameKey() = default; inline bool matches(const Location &loc) const; QString functionName; QString fileName; - quint64 startAddress; - quint64 endAddress; + quint64 startAddress = 0; + quint64 endAddress = 0; }; bool FrameKey::matches(const Location &loc) const @@ -105,7 +105,7 @@ bool FrameKey::matches(const Location &loc) const && loc.functionName() == functionName; } -typedef QPair<FrameKey, DisassemblerLines> CacheEntry; +using CacheEntry = QPair<FrameKey, DisassemblerLines>; /////////////////////////////////////////////////////////////////////// @@ -134,7 +134,7 @@ public: }; DisassemblerAgentPrivate::DisassemblerAgentPrivate(DebuggerEngine *engine) - : document(0), + : document(nullptr), engine(engine), locationMark(engine, Utils::FileName(), 0), mimeType("text/x-qtcreator-generic-asm"), @@ -144,7 +144,7 @@ DisassemblerAgentPrivate::DisassemblerAgentPrivate(DebuggerEngine *engine) DisassemblerAgentPrivate::~DisassemblerAgentPrivate() { EditorManager::closeDocuments(QList<IDocument *>() << document); - document = 0; + document = nullptr; qDeleteAll(breakpointMarks); } @@ -183,7 +183,7 @@ DisassemblerAgent::DisassemblerAgent(DebuggerEngine *engine) DisassemblerAgent::~DisassemblerAgent() { delete d; - d = 0; + d = nullptr; } int DisassemblerAgent::indexOf(const Location &loc) const @@ -261,7 +261,7 @@ void DisassemblerAgentPrivate::configureMimeType() Utils::MimeType mtype = Utils::mimeTypeForName(mimeType); if (mtype.isValid()) { foreach (IEditor *editor, DocumentModel::editorsForDocument(document)) - if (TextEditorWidget *widget = qobject_cast<TextEditorWidget *>(editor->widget())) + if (auto widget = qobject_cast<TextEditorWidget *>(editor->widget())) widget->configureGenericHighlighter(); } else { qWarning("Assembler mimetype '%s' not found.", qPrintable(mimeType)); @@ -309,7 +309,7 @@ void DisassemblerAgent::setContentsToDocument(const DisassemblerLines &contents) Core::Constants::K_DEFAULT_TEXT_EDITOR_ID, &titlePattern); QTC_ASSERT(editor, return); - if (TextEditorWidget *widget = qobject_cast<TextEditorWidget *>(editor->widget())) { + if (auto widget = qobject_cast<TextEditorWidget *>(editor->widget())) { widget->setReadOnly(true); widget->setRequestMarkEnabled(true); } @@ -331,8 +331,8 @@ void DisassemblerAgent::setContentsToDocument(const DisassemblerLines &contents) d->document->setPreferredDisplayName(QString("Disassembler (%1)") .arg(d->location.functionName())); - Breakpoints bps = breakHandler()->engineBreakpoints(d->engine); - foreach (Breakpoint bp, bps) + const Breakpoints bps = breakHandler()->engineBreakpoints(d->engine); + for (Breakpoint bp : bps) updateBreakpointMarker(bp); updateLocationMarker(); @@ -350,7 +350,7 @@ void DisassemblerAgent::updateLocationMarker() // Center cursor. if (EditorManager::currentDocument() == d->document) - if (BaseTextEditor *textEditor = qobject_cast<BaseTextEditor *>(EditorManager::currentEditor())) + if (auto textEditor = qobject_cast<BaseTextEditor *>(EditorManager::currentEditor())) textEditor->gotoLine(lineNumber); } diff --git a/src/plugins/debugger/disassemblerlines.cpp b/src/plugins/debugger/disassemblerlines.cpp index 661d331a85..544f14f8b2 100644 --- a/src/plugins/debugger/disassemblerlines.cpp +++ b/src/plugins/debugger/disassemblerlines.cpp @@ -189,12 +189,12 @@ void DisassemblerLines::appendUnparsed(const QString &unparsed) m_lastFunction = function; } } - dl.address = address.left(pos1 - 1).toULongLong(0, 0); + dl.address = address.left(pos1 - 1).toULongLong(nullptr, 0); dl.function = m_lastFunction; dl.offset = address.mid(pos2).toUInt(); } else { // Plain data like "0x0000cd64:\tadd\tlr, pc, lr\n" - dl.address = address.toULongLong(0, 0); + dl.address = address.toULongLong(nullptr, 0); dl.function = m_lastFunction; dl.offset = 0; } @@ -218,9 +218,9 @@ QString DisassemblerLine::toString(int maxOp) const if (address) str += QString("0x%1 ").arg(address, 0, 16); if (offset) - str += QString("<+0x%2> ").arg(offset, 4, 16, QLatin1Char('0')); + str += QString("<+%1> ").arg(offset, 5); else - str += " "; + str += " "; str += QString(" %1 ").arg(bytes); str += QString(maxOp - bytes.size(), QLatin1Char(' ')); str += data; diff --git a/src/plugins/debugger/disassemblerlines.h b/src/plugins/debugger/disassemblerlines.h index ff8586d429..7cede27ac3 100644 --- a/src/plugins/debugger/disassemblerlines.h +++ b/src/plugins/debugger/disassemblerlines.h @@ -40,7 +40,7 @@ namespace Internal { class DisassemblerLine { public: - DisassemblerLine() : address(0), offset(0), lineNumber(0), hunk(0) {} + DisassemblerLine() = default; bool isAssembler() const { return address != 0; } bool isCode() const { return lineNumber != 0; } bool isComment() const { return lineNumber == 0 && address == 0; } @@ -48,21 +48,21 @@ public: void fromString(const QString &unparsed); public: - quint64 address; // (ass) Address of instruction in memory/in binary. - QString function; // (ass) Function to which current instruction belongs. - QString fileName; // (src) Source file - uint offset; // (ass) Offset of instruction in relation to current function. - uint lineNumber; // (src) Line number in source. - uint hunk; // (src) Number of hunk if source line was split - QByteArray rawData; // (ass) Raw bytes of the instruction - QString data; // (ass) Instruction text, (src) source text, (cmt) arbitrary. - QString bytes; // (ass) The instruction in raw bytes + quint64 address = 0; // (ass) Address of instruction in memory/in binary. + QString function; // (ass) Function to which current instruction belongs. + QString fileName; // (src) Source file + uint offset = 0; // (ass) Offset of instruction in relation to current function. + uint lineNumber = 0; // (src) Line number in source. + uint hunk = 0; // (src) Number of hunk if source line was split + QByteArray rawData; // (ass) Raw bytes of the instruction + QString data; // (ass) Instruction text, (src) source text, (cmt) arbitrary. + QString bytes; // (ass) The instruction in raw bytes }; class DisassemblerLines { public: - DisassemblerLines() : m_bytesLength(0) {} + DisassemblerLines() = default; bool coversAddress(quint64 address) const; void appendUnparsed(const QString &line); @@ -84,7 +84,7 @@ public: private: QString m_lastFunction; - int m_bytesLength; + int m_bytesLength = 0; QVector<DisassemblerLine> m_data; QHash<quint64, int> m_rowCache; }; diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 81af51a3cc..d16121f22c 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -192,10 +192,10 @@ static QString msgWinException(const QString &data, unsigned *exCodeIn = nullptr const int addressPos = blankPos != -1 ? data.indexOf("0x", blankPos + 1) : -1; if (addressPos < 0) return GdbEngine::tr("An exception was triggered."); - const unsigned exCode = data.mid(exCodePos, blankPos - exCodePos).toUInt(0, 0); + const unsigned exCode = data.mid(exCodePos, blankPos - exCodePos).toUInt(nullptr, 0); if (exCodeIn) *exCodeIn = exCode; - const quint64 address = data.mid(addressPos).trimmed().toULongLong(0, 0); + const quint64 address = data.mid(addressPos).trimmed().toULongLong(nullptr, 0); QString rc; QTextStream str(&rc); str << GdbEngine::tr("An exception was triggered:") << ' '; @@ -560,7 +560,7 @@ void GdbEngine::handleAsyncOutput(const QString &asyncClass, const GdbMi &result BreakHandler *handler = breakHandler(); Breakpoint bp; BreakpointResponse br; - foreach (const GdbMi &bkpt, res.children()) { + for (const GdbMi &bkpt : res.children()) { const QString nr = bkpt["number"].data(); BreakpointResponseId rid(nr); if (nr.contains('.')) { @@ -585,7 +585,7 @@ void GdbEngine::handleAsyncOutput(const QString &asyncClass, const GdbMi &result // {bkpt={number="2",type="hw watchpoint",disp="keep",enabled="y", // what="*0xbfffed48",times="0",original-location="*0xbfffed48"}} BreakHandler *handler = breakHandler(); - foreach (const GdbMi &bkpt, result.children()) { + for (const GdbMi &bkpt : result.children()) { BreakpointResponse br; br.type = BreakpointByFileAndLine; updateResponse(br, bkpt); @@ -756,7 +756,7 @@ void GdbEngine::runCommand(const DebuggerCommand &command) if (state() == InferiorRunOk) { showStatusMessage(tr("Stopping temporarily."), 1000); m_onStop.append(cmd, wantContinue); - requestInterruptInferior(); + interruptInferior(); return; } if (state() != InferiorStopOk) @@ -841,7 +841,7 @@ void GdbEngine::commandTimeout() "to a command within %n seconds. This could mean it is stuck " "in an endless loop or taking longer than expected to perform " "the operation.\nYou can choose between waiting " - "longer or aborting debugging.", 0, timeOut / 1000); + "longer or aborting debugging.", nullptr, timeOut / 1000); QMessageBox *mb = showMessageBox(QMessageBox::Critical, tr("GDB Not Responding"), msg, QMessageBox::Ok | QMessageBox::Cancel); @@ -1008,7 +1008,7 @@ void GdbEngine::handleResultRecord(DebuggerResponse *response) if (m_commandsDoneCallback && m_commandForToken.isEmpty()) { showMessage("ALL COMMANDS DONE; INVOKING CALLBACK"); CommandsDoneCallback cont = m_commandsDoneCallback; - m_commandsDoneCallback = 0; + m_commandsDoneCallback = nullptr; if (response->resultClass != ResultRunning) //only start if the thing is not already running (this->*cont)(); } else { @@ -1059,7 +1059,7 @@ void GdbEngine::handleQuerySources(const DebuggerResponse &response) // "^done,files=[{file="../../../../bin/dumper/dumper.cpp", // fullname="/data5/dev/ide/main/bin/dumper/dumper.cpp"}, GdbMi files = response.data["files"]; - foreach (const GdbMi &item, files.children()) { + for (const GdbMi &item : files.children()) { GdbMi fileName = item["file"]; if (fileName.data().endsWith("<built-in>")) continue; @@ -1408,7 +1408,7 @@ void GdbEngine::handleStop2(const GdbMi &data) const GdbMi wpt = data["wpt"]; const BreakpointResponseId rid(wpt["number"].data()); const Breakpoint bp = breakHandler()->findBreakpointByResponseId(rid); - const quint64 bpAddress = wpt["exp"].data().mid(1).toULongLong(0, 0); + const quint64 bpAddress = wpt["exp"].data().mid(1).toULongLong(nullptr, 0); QString msg; if (bp.type() == WatchpointAtExpression) msg = bp.msgWatchpointByExpressionTriggered(rid.majorPart(), bp.expression()); @@ -2086,7 +2086,7 @@ void GdbEngine::updateResponse(BreakpointResponse &response, const GdbMi &bkpt) response.enabled = true; response.pending = false; response.condition.clear(); - foreach (const GdbMi &child, bkpt.children()) { + for (const GdbMi &child : bkpt.children()) { if (child.hasName("number")) { response.id = BreakpointResponseId(child.data()); } else if (child.hasName("func")) { @@ -2141,7 +2141,7 @@ void GdbEngine::updateResponse(BreakpointResponse &response, const GdbMi &bkpt) QString what = bkpt["what"].data(); if (what.startsWith("*0x")) { response.type = WatchpointAtAddress; - response.address = what.mid(1).toULongLong(0, 0); + response.address = what.mid(1).toULongLong(nullptr, 0); } else { response.type = WatchpointAtExpression; response.expression = what; @@ -2270,7 +2270,7 @@ void GdbEngine::handleWatchInsert(const DebuggerResponse &response, Breakpoint b br.id = BreakpointResponseId(wpt["number"].data()); QString exp = wpt["exp"].data(); if (exp.startsWith('*')) - br.address = exp.mid(1).toULongLong(0, 0); + br.address = exp.mid(1).toULongLong(nullptr, 0); bp.setResponse(br); QTC_CHECK(!bp.needsChange()); bp.notifyBreakpointInsertOk(); @@ -2282,7 +2282,7 @@ void GdbEngine::handleWatchInsert(const DebuggerResponse &response, Breakpoint b const QString address = ba.mid(end + 2).trimmed(); br.id = BreakpointResponseId(ba.mid(begin, end - begin)); if (address.startsWith('*')) - br.address = address.mid(1).toULongLong(0, 0); + br.address = address.mid(1).toULongLong(nullptr, 0); bp.setResponse(br); QTC_CHECK(!bp.needsChange()); bp.notifyBreakpointInsertOk(); @@ -2319,7 +2319,7 @@ void GdbEngine::handleBkpt(const GdbMi &bkpt, Breakpoint bp) // http://permalink.gmane.org/gmane.comp.gdb.patches/83936 const GdbMi locations = bkpt["locations"]; if (locations.isValid()) { - foreach (const GdbMi &loc, locations.children()) { + for (const GdbMi &loc : locations.children()) { // A sub-breakpoint. const QString subnr = loc["number"].data(); const BreakpointResponseId subrid(subnr); @@ -2357,7 +2357,7 @@ void GdbEngine::handleBreakInsert1(const DebuggerResponse &response, Breakpoint // the "main" entry. Use the "main" entry to retrieve the // already known data from the BreakpointManager, and then // iterate over all items to update main- and sub-data. - foreach (const GdbMi &bkpt, response.data.children()) + for (const GdbMi &bkpt : response.data.children()) handleBkpt(bkpt, bp); if (bp.needsChange()) { bp.notifyBreakpointChangeAfterInsertNeeded(); @@ -2707,10 +2707,10 @@ void GdbEngine::loadSymbolsForStack() { bool needUpdate = false; const Modules &modules = modulesHandler()->modules(); - foreach (const StackFrame &frame, stackHandler()->frames()) { + for (const StackFrame &frame : stackHandler()->frames()) { if (frame.function == "??") { //qDebug() << "LOAD FOR " << frame.address; - foreach (const Module &module, modules) { + for (const Module &module : modules) { if (module.startAddress <= frame.address && frame.address < module.endAddress) { runCommand({"sharedlibrary " + dotEscape(module.modulePath)}); @@ -2903,13 +2903,13 @@ void GdbEngine::handleModulesList(const DebuggerResponse &response) // state="Y",path="/usr/lib/dyld",description="/usr/lib/dyld", // loaded_addr="0x8fe00000",slide="0x0",prefix="__dyld_"}, // shlib-info={...}... - foreach (const GdbMi &item, response.data.children()) { + for (const GdbMi &item : response.data.children()) { module.modulePath = item["path"].data(); module.moduleName = nameFromPath(module.modulePath); module.symbolsRead = (item["state"].data() == "Y") ? Module::ReadOk : Module::ReadFailed; module.startAddress = - item["loaded_addr"].data().toULongLong(0, 0); + item["loaded_addr"].data().toULongLong(nullptr, 0); module.endAddress = 0; // FIXME: End address not easily available. handler->updateModule(module); } @@ -2920,7 +2920,7 @@ void GdbEngine::handleModulesList(const DebuggerResponse &response) void GdbEngine::examineModules() { ModulesHandler *handler = modulesHandler(); - foreach (const Module &module, handler->modules()) { + for (const Module &module : handler->modules()) { if (module.elfData.symbolsType == UnknownSymbols) handler->updateModule(module); } @@ -2946,7 +2946,7 @@ void GdbEngine::reloadSourceFiles() // "^done,files=[{file="../../../../bin/dumper/dumper.cpp", // fullname="/data5/dev/ide/main/bin/dumper/dumper.cpp"}, GdbMi files = response.data["files"]; - foreach (const GdbMi &item, files.children()) { + for (const GdbMi &item : files.children()) { GdbMi fileName = item["file"]; if (fileName.data().endsWith("<built-in>")) continue; @@ -3119,7 +3119,7 @@ void GdbEngine::handleThreadNames(const DebuggerResponse &response) ThreadsHandler *handler = threadsHandler(); GdbMi names; names.fromString(response.consoleStreamOutput); - foreach (const GdbMi &name, names.children()) { + for (const GdbMi &name : names.children()) { ThreadData thread; thread.id = ThreadId(name["id"].toInt()); thread.name = decodeData(name["value"].data(), name["valueencoded"].data()); @@ -3286,7 +3286,7 @@ void GdbEngine::handleRegisterListNames(const DebuggerResponse &response) GdbMi names = response.data["register-names"]; m_registers.clear(); int gdbRegisterNumber = 0; - foreach (const GdbMi &item, names.children()) { + for (const GdbMi &item : names.children()) { if (!item.data().isEmpty()) { Register reg; reg.name = item.data(); @@ -3332,7 +3332,7 @@ void GdbEngine::handleRegisterListValues(const DebuggerResponse &response) RegisterHandler *handler = registerHandler(); // 24^done,register-values=[{number="0",value="0xf423f"},...] const GdbMi values = response.data["register-values"]; - foreach (const GdbMi &item, values.children()) { + for (const GdbMi &item : values.children()) { const int number = item["number"].toInt(); Register reg = m_registers[number]; QString data = item["value"].data(); @@ -3413,7 +3413,7 @@ void GdbEngine::assignValueInDebugger(WatchItem *item, class MemoryAgentCookie { public: - MemoryAgentCookie() {} + MemoryAgentCookie() = default; QByteArray *accumulator = nullptr; // Shared between split request. Last one cleans up. uint *pendingRequests = nullptr; // Shared between split request. Last one cleans up. @@ -3429,7 +3429,7 @@ void GdbEngine::changeMemory(MemoryAgent *agent, quint64 addr, const QByteArray { Q_UNUSED(agent) DebuggerCommand cmd("-data-write-memory 0x" + QString::number(addr, 16) + " d 1", NeedsTemporaryStop); - foreach (unsigned char c, data) + for (unsigned char c : data) cmd.function += ' ' + QString::number(uint(c)); cmd.callback = CB(handleVarAssign); runCommand(cmd); @@ -3507,7 +3507,7 @@ void GdbEngine::handleFetchMemory(const DebuggerResponse &response, MemoryAgentC class DisassemblerAgentCookie { public: - DisassemblerAgentCookie() : agent(0) {} + DisassemblerAgentCookie() : agent(nullptr) {} DisassemblerAgentCookie(DisassemblerAgent *agent_) : agent(agent_) {} public: @@ -3524,11 +3524,11 @@ void GdbEngine::fetchDisassembler(DisassemblerAgent *agent) fetchDisassemblerByCliPointMixed(agent); } -static inline QString disassemblerCommand(const Location &location, bool mixed) +static inline QString disassemblerCommand(const Location &location, bool mixed, QChar mixedFlag) { QString command = "disassemble /r"; if (mixed) - command += 'm'; + command += mixedFlag; command += ' '; if (const quint64 address = location.address()) { command += "0x"; @@ -3544,7 +3544,8 @@ static inline QString disassemblerCommand(const Location &location, bool mixed) void GdbEngine::fetchDisassemblerByCliPointMixed(const DisassemblerAgentCookie &ac) { QTC_ASSERT(ac.agent, return); - DebuggerCommand cmd(disassemblerCommand(ac.agent->location(), true), Discardable | ConsoleCommand); + DebuggerCommand cmd(disassemblerCommand(ac.agent->location(), true, mixedDisasmFlag()), + Discardable | ConsoleCommand); cmd.callback = [this, ac](const DebuggerResponse &response) { if (response.resultClass == ResultDone) if (handleCliDisassemblerResult(response.consoleStreamOutput, ac.agent)) @@ -3562,7 +3563,8 @@ void GdbEngine::fetchDisassemblerByCliRangeMixed(const DisassemblerAgentCookie & const quint64 address = ac.agent->address(); QString start = QString::number(address - 20, 16); QString end = QString::number(address + 100, 16); - DebuggerCommand cmd("disassemble /rm 0x" + start + ",0x" + end, Discardable | ConsoleCommand); + DebuggerCommand cmd("disassemble /r" + mixedDisasmFlag() + " 0x" + start + ",0x" + end, + Discardable | ConsoleCommand); cmd.callback = [this, ac](const DebuggerResponse &response) { if (response.resultClass == ResultDone) if (handleCliDisassemblerResult(response.consoleStreamOutput, ac.agent)) @@ -3596,7 +3598,7 @@ void GdbEngine::fetchDisassemblerByCliRangePlain(const DisassemblerAgentCookie & struct LineData { - LineData() {} + LineData() = default; LineData(int i, int f) : index(i), function(f) {} int index; int function; @@ -3613,7 +3615,7 @@ bool GdbEngine::handleCliDisassemblerResult(const QString &output, DisassemblerA QVector<DisassemblerLine> lines = dlines.data(); - typedef QMap<quint64, LineData> LineMap; + using LineMap = QMap<quint64, LineData>; LineMap lineMap; int currentFunction = -1; for (int i = 0, n = lines.size(); i != n; ++i) { @@ -3801,7 +3803,7 @@ void GdbEngine::setupEngine() } // Spaces just will not work. - foreach (const QString &src, rp.debugSourceLocation) { + for (const QString &src : rp.debugSourceLocation) { if (QDir(src).exists()) runCommand({"directory " + src}); else @@ -3985,7 +3987,7 @@ void GdbEngine::handleAdapterStartFailed(const QString &msg, Id settingsIdHint) void GdbEngine::prepareForRestart() { m_rerunPending = false; - m_commandsDoneCallback = 0; + m_commandsDoneCallback = nullptr; m_commandForToken.clear(); m_flagsForToken.clear(); } @@ -4005,7 +4007,7 @@ void GdbEngine::handleInferiorPrepared() if (m_commandForToken.isEmpty()) { finishInferiorSetup(); } else { - QTC_CHECK(m_commandsDoneCallback == 0); + QTC_CHECK(m_commandsDoneCallback == nullptr); m_commandsDoneCallback = &GdbEngine::finishInferiorSetup; } } @@ -4490,6 +4492,12 @@ void GdbEngine::interruptInferior2() } } +QChar GdbEngine::mixedDisasmFlag() const +{ + // /m is deprecated since 7.11, and was replaced by /s which works better with optimizations + return m_gdbVersion >= 71100 ? 's' : 'm'; +} + void GdbEngine::shutdownEngine() { if (isPlainEngine()) { @@ -4499,7 +4507,7 @@ void GdbEngine::shutdownEngine() CHECK_STATE(EngineShutdownRequested); showMessage(QString("INITIATE GDBENGINE SHUTDOWN, PROC STATE: %1").arg(m_gdbProc.state())); - m_commandsDoneCallback = 0; + m_commandsDoneCallback = nullptr; switch (m_gdbProc.state()) { case QProcess::Running: { if (runParameters().closeMode == KillAndExitMonitorAtClose) @@ -4524,19 +4532,14 @@ void GdbEngine::handleFileExecAndSymbols(const DebuggerResponse &response) CHECK_STATE(EngineSetupRequested); if (isRemoteEngine()) { - if (response.resultClass == ResultDone) { - callTargetRemote(); - } else { - QString reason = response.data["msg"].data(); - QString msg = tr("Reading debug information failed:") + '\n' + reason; - if (reason.endsWith("No such file or directory.")) { - showMessage("INFERIOR STARTUP: BINARY NOT FOUND"); + if (response.resultClass != ResultDone) { + QString msg = response.data["msg"].data(); + if (!msg.isEmpty()) { + showMessage(msg); showMessage(msg, StatusBar); - callTargetRemote(); // Proceed nevertheless. - } else { - notifyInferiorSetupFailedHelper(msg); } } + callTargetRemote(); // Proceed nevertheless. } else if (isCoreEngine()) { diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index d2ccfb8816..aa16c0c401 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -159,7 +159,7 @@ private: ////////// General Interface ////////// int m_oldestAcceptableToken = -1; int m_nonDiscardableCount = 0; - typedef void (GdbEngine::*CommandsDoneCallback)(); + using CommandsDoneCallback = void (GdbEngine::*)(); // This function is called after all previous responses have been received. CommandsDoneCallback m_commandsDoneCallback = nullptr; @@ -176,8 +176,6 @@ private: ////////// General Interface ////////// void handleStop3(); void resetCommandQueue(); - bool isSynchronous() const final { return true; } - // Gdb initialization sequence void handleShowVersion(const DebuggerResponse &response); void handleListFeatures(const DebuggerResponse &response); @@ -403,6 +401,7 @@ private: ////////// General Interface ////////// void shutdownEngine() final; void interruptInferior2(); + QChar mixedDisasmFlag() const; // Plain void handleExecRun(const DebuggerResponse &response); diff --git a/src/plugins/debugger/gdb/gdboptionspage.cpp b/src/plugins/debugger/gdb/gdboptionspage.cpp index 1c759f939b..f279f7514f 100644 --- a/src/plugins/debugger/gdb/gdboptionspage.cpp +++ b/src/plugins/debugger/gdb/gdboptionspage.cpp @@ -70,9 +70,9 @@ class GdbOptionsPage : public Core::IOptionsPage public: GdbOptionsPage(); - QWidget *widget(); - void apply(); - void finish(); + QWidget *widget() override; + void apply() override; + void finish() override; private: QPointer<GdbOptionsPageWidget> m_widget; @@ -396,9 +396,9 @@ class GdbOptionsPage2 : public Core::IOptionsPage public: GdbOptionsPage2(); - QWidget *widget(); - void apply(); - void finish(); + QWidget *widget() override; + void apply() override; + void finish() override; private: QPointer<GdbOptionsPageWidget2> m_widget; diff --git a/src/plugins/debugger/imageviewer.cpp b/src/plugins/debugger/imageviewer.cpp index bd54331c81..53f7e9728d 100644 --- a/src/plugins/debugger/imageviewer.cpp +++ b/src/plugins/debugger/imageviewer.cpp @@ -49,7 +49,7 @@ class ImageWidget : public QWidget { Q_OBJECT public: - ImageWidget() {} + ImageWidget() = default; void setImage(const QImage &image); const QImage &image() const { return m_image; } @@ -58,8 +58,8 @@ signals: void clicked(const QString &message); protected: - void paintEvent(QPaintEvent *); - void mousePressEvent(QMouseEvent *ev); + void paintEvent(QPaintEvent *) override; + void mousePressEvent(QMouseEvent *ev) override; private: QImage m_image; diff --git a/src/plugins/debugger/imageviewer.h b/src/plugins/debugger/imageviewer.h index 7ba8e739ee..2d11d70851 100644 --- a/src/plugins/debugger/imageviewer.h +++ b/src/plugins/debugger/imageviewer.h @@ -64,7 +64,7 @@ class PlotViewer : public QWidget public: explicit PlotViewer(QWidget *parent = nullptr); - typedef std::vector<double> Data; + using Data = std::vector<double>; void setData(const Data &data); void setInfo(const QString &description); diff --git a/src/plugins/debugger/lldb/lldbengine.cpp b/src/plugins/debugger/lldb/lldbengine.cpp index 9cd2e4db0a..32f0a2cbf7 100644 --- a/src/plugins/debugger/lldb/lldbengine.cpp +++ b/src/plugins/debugger/lldb/lldbengine.cpp @@ -143,7 +143,7 @@ void LldbEngine::runCommand(const DebuggerCommand &command) if (state() == InferiorRunOk) { showStatusMessage(tr("Stopping temporarily"), 1000); m_onStop.append(cmd, false); - requestInterruptInferior(); + interruptInferior(); return; } } @@ -292,7 +292,7 @@ void LldbEngine::setupEngine() cmd2.callback = [this](const DebuggerResponse &response) { bool success = response.data["success"].toInt(); if (success) { - foreach (Breakpoint bp, breakHandler()->unclaimedBreakpoints()) { + for (Breakpoint bp : breakHandler()->unclaimedBreakpoints()) { if (acceptsBreakpoint(bp)) { bp.setEngine(this); insertBreakpoint(bp); @@ -549,7 +549,7 @@ void LldbEngine::updateBreakpointData(Breakpoint bp, const GdbMi &bkpt, bool add GdbMi locations = bkpt["locations"]; const int numChild = int(locations.children().size()); if (numChild > 1) { - foreach (const GdbMi &location, locations.children()) { + for (const GdbMi &location : locations.children()) { const int locid = location["locid"].toInt(); BreakpointResponse sub; sub.id = BreakpointResponseId(rid.majorPart(), locid); @@ -605,7 +605,7 @@ void LldbEngine::reloadModules() const GdbMi &modules = response.data["modules"]; ModulesHandler *handler = modulesHandler(); handler->beginUpdateAll(); - foreach (const GdbMi &item, modules.children()) { + for (const GdbMi &item : modules.children()) { Module module; module.modulePath = item["file"].data(); module.moduleName = item["name"].data(); @@ -627,7 +627,7 @@ void LldbEngine::requestModuleSymbols(const QString &moduleName) const GdbMi &symbols = response.data["symbols"]; QString moduleName = response.data["module"].data(); Symbols syms; - foreach (const GdbMi &item, symbols.children()) { + for (const GdbMi &item : symbols.children()) { Symbol symbol; symbol.address = item["address"].data(); symbol.name = item["name"].data(); @@ -906,7 +906,7 @@ void LldbEngine::reloadRegisters() cmd.callback = [this](const DebuggerResponse &response) { RegisterHandler *handler = registerHandler(); GdbMi regs = response.data["registers"]; - foreach (const GdbMi &item, regs.children()) { + for (const GdbMi &item : regs.children()) { Register reg; reg.name = item["name"].data(); reg.value.fromString(item["value"].data(), HexadecimalFormat); @@ -944,7 +944,7 @@ void LldbEngine::fetchDisassembler(DisassemblerAgent *agent) DisassemblerLines result; QPointer<DisassemblerAgent> agent = m_disassemblerAgents.key(id); if (!agent.isNull()) { - foreach (const GdbMi &line, response.data["lines"].children()) { + for (const GdbMi &line : response.data["lines"].children()) { DisassemblerLine dl; dl.address = line["address"].toAddress(); //dl.data = line["data"].data(); diff --git a/src/plugins/debugger/lldb/lldbengine.h b/src/plugins/debugger/lldb/lldbengine.h index f52cf3dd99..55bd6b603f 100644 --- a/src/plugins/debugger/lldb/lldbengine.h +++ b/src/plugins/debugger/lldb/lldbengine.h @@ -110,7 +110,6 @@ private: void reloadDebuggingHelpers() override; void fetchDisassembler(Internal::DisassemblerAgent *) override; - bool isSynchronous() const override { return true; } void setRegisterValue(const QString &name, const QString &value) override; void fetchMemory(MemoryAgent *, quint64 addr, quint64 length) override; diff --git a/src/plugins/debugger/loadcoredialog.cpp b/src/plugins/debugger/loadcoredialog.cpp index 8a969d4667..1a2fa0af1f 100644 --- a/src/plugins/debugger/loadcoredialog.cpp +++ b/src/plugins/debugger/loadcoredialog.cpp @@ -117,7 +117,7 @@ SelectRemoteFileDialog::SelectRemoteFileDialog(QWidget *parent) m_buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); - QVBoxLayout *layout = new QVBoxLayout(this); + auto layout = new QVBoxLayout(this); layout->addWidget(m_fileSystemView); layout->addWidget(m_textBrowser); layout->addWidget(m_buttonBox); @@ -234,7 +234,7 @@ public: { State st; st.localCoreFile = p.useLocalCoreFile(); - st.validKit = (kitChooser->currentKit() != 0); + st.validKit = (kitChooser->currentKit() != nullptr); st.validLocalExecFilename = localExecFileName->isValid(); if (st.localCoreFile) diff --git a/src/plugins/debugger/loadcoredialog.h b/src/plugins/debugger/loadcoredialog.h index bce0d75e41..84cfaf677e 100644 --- a/src/plugins/debugger/loadcoredialog.h +++ b/src/plugins/debugger/loadcoredialog.h @@ -41,9 +41,9 @@ class AttachCoreDialog : public QDialog public: explicit AttachCoreDialog(QWidget *parent); - ~AttachCoreDialog(); + ~AttachCoreDialog() override; - int exec(); + int exec() override; QString localExecutableFile() const; QString localCoreFile() const; diff --git a/src/plugins/debugger/localsandexpressionswindow.cpp b/src/plugins/debugger/localsandexpressionswindow.cpp index 3d78d4abb6..6aef8c4481 100644 --- a/src/plugins/debugger/localsandexpressionswindow.cpp +++ b/src/plugins/debugger/localsandexpressionswindow.cpp @@ -37,7 +37,6 @@ enum { LocalsIndex = 0, InspectorIndex = 1 }; LocalsAndInspectorWindow::LocalsAndInspectorWindow(QWidget *locals, QWidget *inspector, QWidget *returnWidget) - : m_showLocals(false) { auto layout = new QVBoxLayout(this); layout->setMargin(0); diff --git a/src/plugins/debugger/localsandexpressionswindow.h b/src/plugins/debugger/localsandexpressionswindow.h index 45243c2b9e..7782952101 100644 --- a/src/plugins/debugger/localsandexpressionswindow.h +++ b/src/plugins/debugger/localsandexpressionswindow.h @@ -35,13 +35,13 @@ class LocalsAndInspectorWindow : public QWidget { public: LocalsAndInspectorWindow(QWidget *locals, QWidget *inspector, - QWidget *returnWidget); + QWidget *returnWidget); // TODO parent? void setShowLocals(bool showLocals); private: QTimer m_timer; - bool m_showLocals; + bool m_showLocals = false; }; } // namespace Internal diff --git a/src/plugins/debugger/logwindow.cpp b/src/plugins/debugger/logwindow.cpp index bee5c04c93..9b309bade8 100644 --- a/src/plugins/debugger/logwindow.cpp +++ b/src/plugins/debugger/logwindow.cpp @@ -72,7 +72,7 @@ public: {} private: - void highlightBlock(const QString &text) + void highlightBlock(const QString &text) override { using Utils::Theme; QTextCharFormat format; @@ -125,7 +125,7 @@ public: {} private: - void highlightBlock(const QString &text) + void highlightBlock(const QString &text) override { using Utils::Theme; Theme *theme = Utils::creatorTheme(); @@ -172,7 +172,7 @@ public: this, &DebuggerPane::reloadDebuggingHelpers); } - void contextMenuEvent(QContextMenuEvent *ev) + void contextMenuEvent(QContextMenuEvent *ev) override { QMenu *menu = createStandardContextMenu(); menu->addAction(m_clearContentsAction); @@ -254,7 +254,7 @@ signals: void commandSelected(int); private: - void keyPressEvent(QKeyEvent *ev) + void keyPressEvent(QKeyEvent *ev) override { if (ev->modifiers() == Qt::ControlModifier && ev->key() == Qt::Key_Return) emit executeLineRequested(); @@ -264,7 +264,7 @@ private: QPlainTextEdit::keyPressEvent(ev); } - void mouseDoubleClickEvent(QMouseEvent *ev) + void mouseDoubleClickEvent(QMouseEvent *ev) override { QString line = cursorForPosition(ev->pos()).block().text(); int n = 0; @@ -283,13 +283,13 @@ private: emit commandSelected(n); } - void focusInEvent(QFocusEvent *ev) + void focusInEvent(QFocusEvent *ev) override { emit statusMessageRequested(tr("Type Ctrl-<Return> to execute a line."), -1); QPlainTextEdit::focusInEvent(ev); } - void focusOutEvent(QFocusEvent *ev) + void focusOutEvent(QFocusEvent *ev) override { emit statusMessageRequested(QString(), -1); QPlainTextEdit::focusOutEvent(ev); diff --git a/src/plugins/debugger/memoryagent.h b/src/plugins/debugger/memoryagent.h index 1767d495b2..755ef9c4bb 100644 --- a/src/plugins/debugger/memoryagent.h +++ b/src/plugins/debugger/memoryagent.h @@ -42,7 +42,7 @@ class DebuggerEngine; class MemoryMarkup { public: - MemoryMarkup() {} + MemoryMarkup() = default; MemoryMarkup(quint64 address, quint64 length, QColor c, const QString &tt) : address(address), length(length), color(c), toolTip(tt) {} @@ -56,7 +56,7 @@ public: class MemoryViewSetupData { public: - MemoryViewSetupData() {} + MemoryViewSetupData() = default; quint64 startAddress = 0; QString registerName; diff --git a/src/plugins/debugger/moduleshandler.cpp b/src/plugins/debugger/moduleshandler.cpp index 7f5ea6b4ce..05bfcd96db 100644 --- a/src/plugins/debugger/moduleshandler.cpp +++ b/src/plugins/debugger/moduleshandler.cpp @@ -281,7 +281,7 @@ void ModulesHandler::removeAll() m_model->clear(); } -Modules ModulesHandler::modules() const +const Modules ModulesHandler::modules() const { Modules mods; m_model->forItemsAtLevel<1>([&mods](ModuleItem *item) { mods.append(item->module); }); diff --git a/src/plugins/debugger/moduleshandler.h b/src/plugins/debugger/moduleshandler.h index ad0ba91ae5..790d3fbe38 100644 --- a/src/plugins/debugger/moduleshandler.h +++ b/src/plugins/debugger/moduleshandler.h @@ -55,7 +55,7 @@ public: QString demangled; }; -typedef QVector<Symbol> Symbols; +using Symbols = QVector<Symbol>; ////////////////////////////////////////////////////////////////// // @@ -73,7 +73,7 @@ public: QString flags; }; -typedef QVector<Section> Sections; +using Sections = QVector<Section>; ////////////////////////////////////////////////////////////////// // @@ -84,7 +84,7 @@ typedef QVector<Section> Sections; class Module { public: - Module() : symbolsRead(UnknownReadState), startAddress(0), endAddress(0) {} + Module() = default; public: enum SymbolReadState { @@ -95,14 +95,14 @@ public: QString moduleName; QString modulePath; QString hostPath; - SymbolReadState symbolsRead; - quint64 startAddress; - quint64 endAddress; + SymbolReadState symbolsRead = UnknownReadState; + quint64 startAddress = 0; + quint64 endAddress = 0; Utils::ElfData elfData; }; -typedef QVector<Module> Modules; +using Modules = QVector<Module>; ////////////////////////////////////////////////////////////////// // @@ -129,7 +129,7 @@ public: void endUpdateAll(); void removeAll(); - Modules modules() const; + const Modules modules() const; private: ModuleItem *moduleFromPath(const QString &modulePath) const; diff --git a/src/plugins/debugger/namedemangler/globalparsestate.h b/src/plugins/debugger/namedemangler/globalparsestate.h index 9794d57f7c..2544c78d73 100644 --- a/src/plugins/debugger/namedemangler/globalparsestate.h +++ b/src/plugins/debugger/namedemangler/globalparsestate.h @@ -56,7 +56,7 @@ public: QSharedPointer<ParseTreeNode> templateParamAt(int index) const { return m_templateParams.at(index); } void addTemplateParam(const QSharedPointer<ParseTreeNode> &node) { m_templateParams << node; } private: - int m_pos; + int m_pos = 0; QByteArray m_mangledName; QList<QSharedPointer<ParseTreeNode> > m_substitutions; QList<QSharedPointer<ParseTreeNode> > m_templateParams; diff --git a/src/plugins/debugger/namedemangler/parsetreenodes.cpp b/src/plugins/debugger/namedemangler/parsetreenodes.cpp index d72212e607..556104718f 100644 --- a/src/plugins/debugger/namedemangler/parsetreenodes.cpp +++ b/src/plugins/debugger/namedemangler/parsetreenodes.cpp @@ -72,13 +72,11 @@ template<int base> static int getNonNegativeNumber(GlobalParseState *parseState) ParseTreeNode::ParseTreeNode(const ParseTreeNode &other) : m_parseState(other.m_parseState) { - foreach (const ParseTreeNode::Ptr &child, other.m_children) + for (const ParseTreeNode::Ptr &child : other.m_children) addChild(child->clone()); } -ParseTreeNode::~ParseTreeNode() -{ -} +ParseTreeNode::~ParseTreeNode() = default; ParseTreeNode::Ptr ParseTreeNode::childAt(int i, const QString &func, const QString &file, int line) const @@ -91,7 +89,7 @@ ParseTreeNode::Ptr ParseTreeNode::childAt(int i, const QString &func, const QStr QByteArray ParseTreeNode::pasteAllChildren() const { QByteArray repr; - foreach (const ParseTreeNode::Ptr &node, m_children) + for (const ParseTreeNode::Ptr &node : m_children) repr += node->toByteArray(); return repr; } @@ -101,7 +99,7 @@ void ParseTreeNode::print(int indentation) const for (int i = 0; i < indentation; ++i) std::cerr << ' '; std::cerr << description().data() << std::endl; - foreach (const ParseTreeNode::Ptr &n, m_children) + for (const ParseTreeNode::Ptr &n : m_children) n->print(indentation + 2); } @@ -155,7 +153,7 @@ QByteArray ArrayTypeNode::toByteArray() const BareFunctionTypeNode::BareFunctionTypeNode(GlobalParseState *parseState) - : ParseTreeNode(parseState), m_hasReturnType(false) + : ParseTreeNode(parseState) { } @@ -440,12 +438,7 @@ void DiscriminatorRule::parse(GlobalParseState *parseState) } -CtorDtorNameNode::CtorDtorNameNode(const CtorDtorNameNode &other) - : ParseTreeNode(other), - m_isDestructor(other.m_isDestructor), - m_representation(other.m_representation) -{ -} +CtorDtorNameNode::CtorDtorNameNode(const CtorDtorNameNode &other) = default; bool CtorDtorNameNode::mangledRepresentationStartsWith(char c) { @@ -504,14 +497,11 @@ QByteArray CtorDtorNameNode::toByteArray() const CvQualifiersNode::CvQualifiersNode(GlobalParseState *parseState) - : ParseTreeNode(parseState), m_hasConst(false), m_hasVolatile(false) + : ParseTreeNode(parseState) { } -CvQualifiersNode::CvQualifiersNode(const CvQualifiersNode &other) - : ParseTreeNode(other), m_hasConst(other.m_hasConst), m_hasVolatile(other.m_hasVolatile) -{ -} +CvQualifiersNode::CvQualifiersNode(const CvQualifiersNode &other) = default; bool CvQualifiersNode::mangledRepresentationStartsWith(char c) { @@ -601,14 +591,11 @@ QByteArray EncodingNode::toByteArray() const ExpressionNode::ExpressionNode(GlobalParseState *parseState) - : ParseTreeNode(parseState), m_type(OtherType), m_globalNamespace(false) + : ParseTreeNode(parseState), m_type(OtherType) { } -ExpressionNode::ExpressionNode(const ExpressionNode &other) - : ParseTreeNode(other), m_type(other.m_type), m_globalNamespace(other.m_globalNamespace) -{ -} +ExpressionNode::ExpressionNode(const ExpressionNode &other) = default; bool ExpressionNode::mangledRepresentationStartsWith(char c) { @@ -1000,10 +987,7 @@ QByteArray ExpressionNode::toByteArray() const } -OperatorNameNode::OperatorNameNode(const OperatorNameNode &other) - : ParseTreeNode(other), m_type(other.m_type) -{ -} +OperatorNameNode::OperatorNameNode(const OperatorNameNode &other) = default; bool OperatorNameNode::mangledRepresentationStartsWith(char c) { @@ -1253,14 +1237,11 @@ QByteArray OperatorNameNode::toByteArray() const ExprPrimaryNode::ExprPrimaryNode(GlobalParseState *parseState) - : ParseTreeNode(parseState), m_isNullPtr(false) + : ParseTreeNode(parseState) { } -ExprPrimaryNode::ExprPrimaryNode(const ExprPrimaryNode &other) - : ParseTreeNode(other), m_suffix(other.m_suffix), m_isNullPtr(other.m_isNullPtr) -{ -} +ExprPrimaryNode::ExprPrimaryNode(const ExprPrimaryNode &other) = default; bool ExprPrimaryNode::mangledRepresentationStartsWith(char c) { @@ -1353,7 +1334,7 @@ QByteArray ExprPrimaryNode::toByteArray() const FunctionTypeNode::FunctionTypeNode(GlobalParseState *parseState) - : ParseTreeNode(parseState), m_isExternC(false) + : ParseTreeNode(parseState) { } @@ -1395,16 +1376,11 @@ QByteArray FunctionTypeNode::toByteArray() const LocalNameNode::LocalNameNode(GlobalParseState *parseState) - : ParseTreeNode(parseState), m_isStringLiteral(false), m_isDefaultArg(false) + : ParseTreeNode(parseState) { } -LocalNameNode::LocalNameNode(const LocalNameNode &other) - : ParseTreeNode(other), - m_isStringLiteral(other.m_isStringLiteral), - m_isDefaultArg(other.m_isDefaultArg) -{ -} +LocalNameNode::LocalNameNode(const LocalNameNode &other) = default; bool LocalNameNode::mangledRepresentationStartsWith(char c) { @@ -1538,10 +1514,7 @@ void MangledNameRule::parse(GlobalParseState *parseState, const ParseTreeNode::P } -SourceNameNode::SourceNameNode(const SourceNameNode &other) - : ParseTreeNode(other), m_name(other.m_name) -{ -} +SourceNameNode::SourceNameNode(const SourceNameNode &other) = default; bool SourceNameNode::mangledRepresentationStartsWith(char c) { @@ -1609,14 +1582,11 @@ void UnqualifiedNameNode::parse() UnscopedNameNode::UnscopedNameNode(GlobalParseState *parseState) - : ParseTreeNode(parseState), m_inStdNamespace(false) + : ParseTreeNode(parseState) { } -UnscopedNameNode::UnscopedNameNode(const UnscopedNameNode &other) - : ParseTreeNode(other), m_inStdNamespace(other.m_inStdNamespace) -{ -} +UnscopedNameNode::UnscopedNameNode(const UnscopedNameNode &other) = default; bool UnscopedNameNode::mangledRepresentationStartsWith(char c) { @@ -1972,10 +1942,7 @@ QByteArray TemplateArgsNode::toByteArray() const } -SpecialNameNode::SpecialNameNode(const SpecialNameNode &other) - : ParseTreeNode(other), m_type(other.m_type) -{ -} +SpecialNameNode::SpecialNameNode(const SpecialNameNode &other) = default; bool SpecialNameNode::mangledRepresentationStartsWith(char c) { @@ -2063,14 +2030,11 @@ QByteArray SpecialNameNode::toByteArray() const NumberNode::NumberNode(GlobalParseState *parseState) - : ParseTreeNode(parseState), m_isNegative(false) + : ParseTreeNode(parseState) { } -NumberNode::NumberNode(const NumberNode &other) - : ParseTreeNode(other), m_isNegative(other.m_isNegative) -{ -} +NumberNode::NumberNode(const NumberNode &other) = default; bool NumberNode::mangledRepresentationStartsWith(char c) { @@ -2118,7 +2082,7 @@ template<int base> void NonNegativeNumberNode<base>::parse() numberRepr += ADVANCE(); if (numberRepr.count() == 0) throw ParseException(QString::fromLatin1("Invalid non-negative number")); - m_number = numberRepr.toULongLong(0, base); + m_number = numberRepr.toULongLong(nullptr, base); } template<int base> QByteArray NonNegativeNumberNode<base>::description() const @@ -2225,14 +2189,11 @@ void NameNode::parse() TemplateArgNode::TemplateArgNode(GlobalParseState *parseState) - : ParseTreeNode(parseState), m_isTemplateArgumentPack(false) + : ParseTreeNode(parseState) { } -TemplateArgNode::TemplateArgNode(const TemplateArgNode &other) - : ParseTreeNode(other), m_isTemplateArgumentPack(other.m_isTemplateArgumentPack) -{ -} +TemplateArgNode::TemplateArgNode(const TemplateArgNode &other) = default; bool TemplateArgNode::mangledRepresentationStartsWith(char c) { @@ -2679,8 +2640,8 @@ QByteArray TypeNode::toByteArrayQualPointerRef(const TypeNode *typeNode, QByteArray TypeNode::qualPtrRefListToByteArray(const QList<const ParseTreeNode *> &nodeList) const { QByteArray repr; - foreach (const ParseTreeNode * const n, nodeList) { - const TypeNode * const typeNode = dynamic_cast<const TypeNode *>(n); + for (const ParseTreeNode * const n : nodeList) { + const auto typeNode = dynamic_cast<const TypeNode*>(n); if (typeNode) { switch (typeNode->m_type) { case PointerType: @@ -2712,10 +2673,7 @@ QByteArray TypeNode::qualPtrRefListToByteArray(const QList<const ParseTreeNode * } -FloatValueNode::FloatValueNode(const FloatValueNode &other) - : ParseTreeNode(other), m_value(other.m_value) -{ -} +FloatValueNode::FloatValueNode(const FloatValueNode &other) = default; bool FloatValueNode::mangledRepresentationStartsWith(char c) { @@ -2975,14 +2933,11 @@ bool UnresolvedQualifierLevelRule::mangledRepresentationStartsWith(char c) BaseUnresolvedNameNode::BaseUnresolvedNameNode(GlobalParseState *parseState) - : ParseTreeNode(parseState), m_isOperator(false) + : ParseTreeNode(parseState) { } -BaseUnresolvedNameNode::BaseUnresolvedNameNode(const BaseUnresolvedNameNode &other) - : ParseTreeNode(other), m_isOperator(other.m_isOperator) -{ -} +BaseUnresolvedNameNode::BaseUnresolvedNameNode(const BaseUnresolvedNameNode &other) = default; bool BaseUnresolvedNameNode::mangledRepresentationStartsWith(char c) { @@ -3057,10 +3012,7 @@ QByteArray InitializerNode::toByteArray() const } -UnresolvedNameNode::UnresolvedNameNode(const UnresolvedNameNode &other) - : ParseTreeNode(other), m_globalNamespace(other.m_globalNamespace) -{ -} +UnresolvedNameNode::UnresolvedNameNode(const UnresolvedNameNode &other) = default; bool UnresolvedNameNode::mangledRepresentationStartsWith(char c) { diff --git a/src/plugins/debugger/namedemangler/parsetreenodes.h b/src/plugins/debugger/namedemangler/parsetreenodes.h index 29433bf91b..fb746fc271 100644 --- a/src/plugins/debugger/namedemangler/parsetreenodes.h +++ b/src/plugins/debugger/namedemangler/parsetreenodes.h @@ -33,7 +33,7 @@ namespace Internal { class ParseTreeNode { public: - typedef QSharedPointer<ParseTreeNode> Ptr; + using Ptr = QSharedPointer<ParseTreeNode>; virtual ~ParseTreeNode(); virtual QByteArray toByteArray() const = 0; @@ -76,41 +76,41 @@ public: static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: - ArrayTypeNode(const ArrayTypeNode &other) : ParseTreeNode(other) {} - ParseTreeNode::Ptr clone() const { return Ptr(new ArrayTypeNode(*this)); } + ArrayTypeNode(const ArrayTypeNode &other) = default; + ParseTreeNode::Ptr clone() const override { return Ptr(new ArrayTypeNode(*this)); } - void parse(); - QByteArray description() const { return "ArrayType"; } + void parse() override; + QByteArray description() const override { return "ArrayType"; } }; class BareFunctionTypeNode : public ParseTreeNode { public: - typedef QSharedPointer<BareFunctionTypeNode> Ptr; + using Ptr = QSharedPointer<BareFunctionTypeNode>; BareFunctionTypeNode(GlobalParseState *parseState); static bool mangledRepresentationStartsWith(char c); bool hasReturnType() const { return m_hasReturnType; } - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: BareFunctionTypeNode(const BareFunctionTypeNode &other); - ParseTreeNode::Ptr clone() const { return Ptr(new BareFunctionTypeNode(*this)); } - void parse(); - QByteArray description() const; + ParseTreeNode::Ptr clone() const override { return Ptr(new BareFunctionTypeNode(*this)); } + void parse() override; + QByteArray description() const override; - bool m_hasReturnType; + bool m_hasReturnType = false; }; class BuiltinTypeNode : public ParseTreeNode { public: - typedef QSharedPointer<BuiltinTypeNode> Ptr; + using Ptr = QSharedPointer<BuiltinTypeNode>; BuiltinTypeNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const; + QByteArray toByteArray() const override; enum Type { VoidType, WCharType, BoolType, @@ -125,11 +125,11 @@ public: private: BuiltinTypeNode(const BuiltinTypeNode &other); - ParseTreeNode::Ptr clone() const { return Ptr(new BuiltinTypeNode(*this)); } - void parse(); - QByteArray description() const; + ParseTreeNode::Ptr clone() const override { return Ptr(new BuiltinTypeNode(*this)); } + void parse() override; + QByteArray description() const override; - Type m_type; + Type m_type; // TODO: define? }; class CallOffsetRule @@ -146,26 +146,26 @@ class NvOffsetNode : public ParseTreeNode { public: NvOffsetNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - QByteArray toByteArray() const { return QByteArray(); } // TODO: How to encode this? + QByteArray toByteArray() const override { return QByteArray(); } // TODO: How to encode this? private: - NvOffsetNode(const NvOffsetNode &other) : ParseTreeNode(other) {} - ParseTreeNode::Ptr clone() const { return Ptr(new NvOffsetNode(*this)); } - void parse(); - QByteArray description() const { return "NvOffset"; } + NvOffsetNode(const NvOffsetNode &other) = default; + ParseTreeNode::Ptr clone() const override { return Ptr(new NvOffsetNode(*this)); } + void parse() override; + QByteArray description() const override { return "NvOffset"; } }; class VOffsetNode : public ParseTreeNode { public: VOffsetNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - QByteArray toByteArray() const { return QByteArray(); } // TODO: How to encode this? + QByteArray toByteArray() const override { return QByteArray(); } // TODO: How to encode this? private: - VOffsetNode(const VOffsetNode &other) : ParseTreeNode(other) {} - ParseTreeNode::Ptr clone() const { return Ptr(new VOffsetNode(*this)); } - void parse(); - QByteArray description() const { return "VOffset"; } + VOffsetNode(const VOffsetNode &other) = default; + ParseTreeNode::Ptr clone() const override { return Ptr(new VOffsetNode(*this)); } + void parse() override; + QByteArray description() const override { return "VOffset"; } }; class ClassEnumTypeRule @@ -193,34 +193,34 @@ class CtorDtorNameNode : public ParseTreeNode public: CtorDtorNameNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: CtorDtorNameNode(const CtorDtorNameNode &other); - ParseTreeNode::Ptr clone() const { return Ptr(new CtorDtorNameNode(*this)); } - void parse(); - QByteArray description() const; + ParseTreeNode::Ptr clone() const override { return Ptr(new CtorDtorNameNode(*this)); } + void parse() override; + QByteArray description() const override; - bool m_isDestructor; + bool m_isDestructor; // TODO: define? QByteArray m_representation; }; class CvQualifiersNode : public ParseTreeNode { public: - typedef QSharedPointer<CvQualifiersNode> Ptr; + using Ptr = QSharedPointer<CvQualifiersNode>; CvQualifiersNode(GlobalParseState *parseState); static bool mangledRepresentationStartsWith(char c); bool hasQualifiers() const { return m_hasConst || m_hasVolatile; } - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: CvQualifiersNode(const CvQualifiersNode &other); - ParseTreeNode::Ptr clone() const { return Ptr(new CvQualifiersNode(*this)); } - void parse(); - QByteArray description() const { return "CvQualifiers[" + toByteArray() + ']'; } + ParseTreeNode::Ptr clone() const override { return Ptr(new CvQualifiersNode(*this)); } + void parse() override; + QByteArray description() const override { return "CvQualifiers[" + toByteArray() + ']'; } - bool m_hasConst; - bool m_hasVolatile; + bool m_hasConst = false; + bool m_hasVolatile = false; }; class EncodingNode : public ParseTreeNode @@ -228,13 +228,13 @@ class EncodingNode : public ParseTreeNode public: EncodingNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: - EncodingNode(const EncodingNode &other) : ParseTreeNode(other) {} - ParseTreeNode::Ptr clone() const { return Ptr(new EncodingNode(*this)); } - void parse(); - QByteArray description() const { return "Encoding"; } + EncodingNode(const EncodingNode &other) = default; + ParseTreeNode::Ptr clone() const override { return Ptr(new EncodingNode(*this)); } + void parse() override; + QByteArray description() const override { return "Encoding"; } }; class ExpressionNode : public ParseTreeNode @@ -242,13 +242,13 @@ class ExpressionNode : public ParseTreeNode public: ExpressionNode(GlobalParseState *parseState); static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: ExpressionNode(const ExpressionNode &other); - ParseTreeNode::Ptr clone() const { return Ptr(new ExpressionNode(*this)); } - void parse(); - QByteArray description() const; + ParseTreeNode::Ptr clone() const override { return Ptr(new ExpressionNode(*this)); } + void parse() override; + QByteArray description() const override; enum Type { ConversionType, SizeofType, AlignofType, OperatorType, ParameterPackSizeType, @@ -257,14 +257,14 @@ private: StaticCastType, ConstCastType, ReinterpretCastType, MemberAccessType, PointerMemberAccessType, MemberDerefType, PackExpansionType, ThrowType, RethrowType, OtherType - } m_type; - bool m_globalNamespace; + } m_type; // TODO: define? + bool m_globalNamespace = false; }; class OperatorNameNode : public ParseTreeNode { public: - typedef QSharedPointer<OperatorNameNode> Ptr; + using Ptr = QSharedPointer<OperatorNameNode>; OperatorNameNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} static bool mangledRepresentationStartsWith(char c); @@ -282,13 +282,13 @@ public: }; Type type() const { return m_type; } - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: OperatorNameNode(const OperatorNameNode &other); - ParseTreeNode::Ptr clone() const { return Ptr(new OperatorNameNode(*this)); } - void parse(); - QByteArray description() const; + ParseTreeNode::Ptr clone() const override { return Ptr(new OperatorNameNode(*this)); } + void parse() override; + QByteArray description() const override; Type m_type = VendorType; }; @@ -299,55 +299,55 @@ public: ExprPrimaryNode(GlobalParseState *parseState); static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: ExprPrimaryNode(const ExprPrimaryNode &other); - ParseTreeNode::Ptr clone() const { return Ptr(new ExprPrimaryNode(*this)); } - void parse(); - QByteArray description() const; + ParseTreeNode::Ptr clone() const override { return Ptr(new ExprPrimaryNode(*this)); } + void parse() override; + QByteArray description() const override; QByteArray m_suffix; - bool m_isNullPtr; + bool m_isNullPtr = false; }; class FunctionTypeNode : public ParseTreeNode { public: - typedef QSharedPointer<FunctionTypeNode> Ptr; + using Ptr = QSharedPointer<FunctionTypeNode>; FunctionTypeNode(GlobalParseState *parseState); static bool mangledRepresentationStartsWith(char c); bool isExternC() const { return m_isExternC; } - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: FunctionTypeNode(const FunctionTypeNode &other); - ParseTreeNode::Ptr clone() const { return Ptr(new FunctionTypeNode(*this)); } - void parse(); - QByteArray description() const; + ParseTreeNode::Ptr clone() const override { return Ptr(new FunctionTypeNode(*this)); } + void parse() override; + QByteArray description() const override; - bool m_isExternC; + bool m_isExternC = false; }; class LocalNameNode : public ParseTreeNode { public: - typedef QSharedPointer<LocalNameNode> Ptr; + using Ptr = QSharedPointer<LocalNameNode>; LocalNameNode(GlobalParseState *parseState); static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const; + QByteArray toByteArray() const override; bool isTemplate() const; bool isConstructorOrDestructorOrConversionOperator() const; CvQualifiersNode::Ptr cvQualifiers() const; private: LocalNameNode(const LocalNameNode &other); - ParseTreeNode::Ptr clone() const { return Ptr(new LocalNameNode(*this)); } - void parse(); - QByteArray description() const; + ParseTreeNode::Ptr clone() const override { return Ptr(new LocalNameNode(*this)); } + void parse() override; + QByteArray description() const override; - bool m_isStringLiteral; - bool m_isDefaultArg; + bool m_isStringLiteral = false; + bool m_isDefaultArg = false; }; class MangledNameRule @@ -365,15 +365,15 @@ class NumberNode : public ParseTreeNode public: NumberNode(GlobalParseState *parseState); static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: NumberNode(const NumberNode &other); - ParseTreeNode::Ptr clone() const { return Ptr(new NumberNode(*this)); } - void parse(); - QByteArray description() const; + ParseTreeNode::Ptr clone() const override { return Ptr(new NumberNode(*this)); } + void parse() override; + QByteArray description() const override; - bool m_isNegative; + bool m_isNegative = false; }; class SourceNameNode : public ParseTreeNode @@ -381,13 +381,13 @@ class SourceNameNode : public ParseTreeNode public: SourceNameNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const { return m_name; } + QByteArray toByteArray() const override { return m_name; } private: SourceNameNode(const SourceNameNode &other); - ParseTreeNode::Ptr clone() const { return Ptr(new SourceNameNode(*this)); } - void parse(); - QByteArray description() const; + ParseTreeNode::Ptr clone() const override { return Ptr(new SourceNameNode(*this)); } + void parse() override; + QByteArray description() const override; QByteArray m_name; }; @@ -395,17 +395,17 @@ private: class UnqualifiedNameNode : public ParseTreeNode { public: - typedef QSharedPointer<UnqualifiedNameNode> Ptr; + using Ptr = QSharedPointer<UnqualifiedNameNode>; UnqualifiedNameNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} static bool mangledRepresentationStartsWith(char c); bool isConstructorOrDestructorOrConversionOperator() const; - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: - UnqualifiedNameNode(const UnqualifiedNameNode &other) : ParseTreeNode(other) {} - ParseTreeNode::Ptr clone() const { return Ptr(new UnqualifiedNameNode(*this)); } - void parse(); - QByteArray description() const { return "UnqualifiedName"; } + UnqualifiedNameNode(const UnqualifiedNameNode &other) = default; + ParseTreeNode::Ptr clone() const override { return Ptr(new UnqualifiedNameNode(*this)); } + void parse() override; + QByteArray description() const override { return "UnqualifiedName"; } }; class UnscopedNameNode : public ParseTreeNode @@ -414,21 +414,21 @@ public: UnscopedNameNode(GlobalParseState *parseState); static bool mangledRepresentationStartsWith(char c); bool isConstructorOrDestructorOrConversionOperator() const; - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: UnscopedNameNode(const UnscopedNameNode &other); - ParseTreeNode::Ptr clone() const { return Ptr(new UnscopedNameNode(*this)); } - void parse(); - QByteArray description() const; + ParseTreeNode::Ptr clone() const override { return Ptr(new UnscopedNameNode(*this)); } + void parse() override; + QByteArray description() const override; - bool m_inStdNamespace; + bool m_inStdNamespace = false; }; class NestedNameNode : public ParseTreeNode { public: - typedef QSharedPointer<NestedNameNode> Ptr; + using Ptr = QSharedPointer<NestedNameNode>; NestedNameNode(GlobalParseState *parseState) : ParseTreeNode(parseState ){} static bool mangledRepresentationStartsWith(char c); @@ -437,22 +437,22 @@ public: bool isConstructorOrDestructorOrConversionOperator() const; CvQualifiersNode::Ptr cvQualifiers() const; - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: - NestedNameNode(const NestedNameNode &other) : ParseTreeNode(other) {} - ParseTreeNode::Ptr clone() const { return Ptr(new NestedNameNode(*this)); } - void parse(); - QByteArray description() const { return "NestedName"; } + NestedNameNode(const NestedNameNode &other) = default; + ParseTreeNode::Ptr clone() const override { return Ptr(new NestedNameNode(*this)); } + void parse() override; + QByteArray description() const override { return "NestedName"; } }; class SubstitutionNode : public ParseTreeNode { public: - typedef QSharedPointer<SubstitutionNode> Ptr; + using Ptr = QSharedPointer<SubstitutionNode>; SubstitutionNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const; + QByteArray toByteArray() const override; enum Type { ActualSubstitutionType, StdType, StdAllocType, StdBasicStringType, FullStdBasicStringType, @@ -462,11 +462,11 @@ public: private: SubstitutionNode(const SubstitutionNode &other); - ParseTreeNode::Ptr clone() const { return Ptr(new SubstitutionNode(*this)); } - void parse(); - QByteArray description() const; + ParseTreeNode::Ptr clone() const override { return Ptr(new SubstitutionNode(*this)); } + void parse() override; + QByteArray description() const override; - Type m_type; + Type m_type; // TODO: define? }; class PointerToMemberTypeNode : public ParseTreeNode @@ -474,19 +474,19 @@ class PointerToMemberTypeNode : public ParseTreeNode public: PointerToMemberTypeNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: - PointerToMemberTypeNode(const PointerToMemberTypeNode &other) : ParseTreeNode(other) {} - ParseTreeNode::Ptr clone() const { return Ptr(new PointerToMemberTypeNode(*this)); } - void parse(); - QByteArray description() const { return "PointerToMember"; } + PointerToMemberTypeNode(const PointerToMemberTypeNode &other) = default; + ParseTreeNode::Ptr clone() const override { return Ptr(new PointerToMemberTypeNode(*this)); } + void parse() override; + QByteArray description() const override { return "PointerToMember"; } }; class TemplateParamNode : public ParseTreeNode { public: - typedef QSharedPointer<TemplateParamNode> Ptr; + using Ptr = QSharedPointer<TemplateParamNode>; TemplateParamNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} @@ -494,15 +494,15 @@ public: int index() const { return m_index; } - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: TemplateParamNode(const TemplateParamNode &other); - ParseTreeNode::Ptr clone() const { return Ptr(new TemplateParamNode(*this)); } - void parse(); - QByteArray description() const; + ParseTreeNode::Ptr clone() const override { return Ptr(new TemplateParamNode(*this)); } + void parse() override; + QByteArray description() const override; - int m_index; + int m_index; // TODO: define? }; class TemplateArgsNode : public ParseTreeNode @@ -510,13 +510,13 @@ class TemplateArgsNode : public ParseTreeNode public: TemplateArgsNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: - TemplateArgsNode(const TemplateArgsNode &other) : ParseTreeNode(other) {} - ParseTreeNode::Ptr clone() const { return Ptr(new TemplateArgsNode(*this)); } - void parse(); - QByteArray description() const { return "TemplateArgs"; } + TemplateArgsNode(const TemplateArgsNode &other) = default; + ParseTreeNode::Ptr clone() const override { return Ptr(new TemplateArgsNode(*this)); } + void parse() override; + QByteArray description() const override { return "TemplateArgs"; } }; class SpecialNameNode : public ParseTreeNode @@ -524,45 +524,45 @@ class SpecialNameNode : public ParseTreeNode public: SpecialNameNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: SpecialNameNode(const SpecialNameNode &other); - ParseTreeNode::Ptr clone() const { return Ptr(new SpecialNameNode(*this)); } - void parse(); - QByteArray description() const; + ParseTreeNode::Ptr clone() const override { return Ptr(new SpecialNameNode(*this)); } + void parse() override; + QByteArray description() const override; enum Type { VirtualTableType, VttStructType, TypeInfoType, TypeInfoNameType, GuardVarType, SingleCallOffsetType, DoubleCallOffsetType - } m_type; + } m_type; // TODO: define? }; template<int base> class NonNegativeNumberNode : public ParseTreeNode { public: - typedef QSharedPointer<NonNegativeNumberNode<base> > Ptr; + using Ptr = QSharedPointer<NonNegativeNumberNode<base> >; NonNegativeNumberNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} static bool mangledRepresentationStartsWith(char c) { // Base can only be 10 or 36. return (c >= '0' && c <= '9') || (base == 36 && c >= 'A' && c <= 'Z'); } quint64 number() const { return m_number; } - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: NonNegativeNumberNode(const NonNegativeNumberNode &other); - ParseTreeNode::Ptr clone() const { return Ptr(new NonNegativeNumberNode<base>(*this)); } - void parse(); - QByteArray description() const; + ParseTreeNode::Ptr clone() const override { return Ptr(new NonNegativeNumberNode<base>(*this)); } + void parse() override; + QByteArray description() const override; - quint64 m_number; + quint64 m_number; // TODO: define? }; class NameNode : public ParseTreeNode { public: - typedef QSharedPointer<NameNode> Ptr; + using Ptr = QSharedPointer<NameNode>; NameNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} @@ -572,13 +572,13 @@ public: bool isConstructorOrDestructorOrConversionOperator() const; CvQualifiersNode::Ptr cvQualifiers() const; - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: - NameNode(const NameNode &other) : ParseTreeNode(other) {} - ParseTreeNode::Ptr clone() const { return Ptr(new NameNode(*this)); } - void parse(); - QByteArray description() const { return "Name"; } + NameNode(const NameNode &other) = default; + ParseTreeNode::Ptr clone() const override { return Ptr(new NameNode(*this)); } + void parse() override; + QByteArray description() const override { return "Name"; } }; class TemplateArgNode : public ParseTreeNode @@ -586,21 +586,21 @@ class TemplateArgNode : public ParseTreeNode public: TemplateArgNode(GlobalParseState *parseState); static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: TemplateArgNode(const TemplateArgNode &other); - ParseTreeNode::Ptr clone() const { return Ptr(new TemplateArgNode(*this)); } - void parse(); - QByteArray description() const; + ParseTreeNode::Ptr clone() const override { return Ptr(new TemplateArgNode(*this)); } + void parse() override; + QByteArray description() const override; - bool m_isTemplateArgumentPack; + bool m_isTemplateArgumentPack = false; }; class PrefixNode : public ParseTreeNode { public: - typedef QSharedPointer<PrefixNode> Ptr; + using Ptr = QSharedPointer<PrefixNode>; PrefixNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} static bool mangledRepresentationStartsWith(char c); @@ -608,21 +608,21 @@ public: bool isTemplate() const; bool isConstructorOrDestructorOrConversionOperator() const; - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: - PrefixNode(const PrefixNode &other) : ParseTreeNode(other) {} - ParseTreeNode::Ptr clone() const { return Ptr(new PrefixNode(*this)); } - void parse(); - QByteArray description() const { return "Prefix"; } + PrefixNode(const PrefixNode &other) = default; + ParseTreeNode::Ptr clone() const override { return Ptr(new PrefixNode(*this)); } + void parse() override; + QByteArray description() const override { return "Prefix"; } }; class TypeNode : public ParseTreeNode { public: - typedef QSharedPointer<TypeNode> Ptr; + using Ptr = QSharedPointer<TypeNode>; - TypeNode(GlobalParseState *parseState) : ParseTreeNode(parseState), m_type(OtherType) {} + TypeNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} static bool mangledRepresentationStartsWith(char c); @@ -632,19 +632,19 @@ public: }; Type type() const { return m_type; } - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: TypeNode(const TypeNode &other); - ParseTreeNode::Ptr clone() const { return Ptr(new TypeNode(*this)); } - void parse(); - QByteArray description() const; + ParseTreeNode::Ptr clone() const override { return Ptr(new TypeNode(*this)); } + void parse() override; + QByteArray description() const override; QByteArray toByteArrayQualPointerRef(const TypeNode *typeNode, const QByteArray &qualPtrRef) const; QByteArray qualPtrRefListToByteArray(const QList<const ParseTreeNode *> &nodeList) const; - Type m_type; + Type m_type = OtherType; }; class FloatValueNode : public ParseTreeNode @@ -652,15 +652,15 @@ class FloatValueNode : public ParseTreeNode public: FloatValueNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: FloatValueNode(const FloatValueNode &other); - ParseTreeNode::Ptr clone() const { return Ptr(new FloatValueNode(*this)); } - void parse(); - QByteArray description() const; + ParseTreeNode::Ptr clone() const override { return Ptr(new FloatValueNode(*this)); } + void parse() override; + QByteArray description() const override; - double m_value; + double m_value; // TODO: define? }; class LambdaSigNode : public ParseTreeNode @@ -668,26 +668,26 @@ class LambdaSigNode : public ParseTreeNode public: LambdaSigNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: - LambdaSigNode(const LambdaSigNode &other) : ParseTreeNode(other) {} - ParseTreeNode::Ptr clone() const { return Ptr(new LambdaSigNode(*this)); } - void parse(); - QByteArray description() const { return "LambdaSig"; } + LambdaSigNode(const LambdaSigNode &other) = default; + ParseTreeNode::Ptr clone() const override { return Ptr(new LambdaSigNode(*this)); } + void parse() override; + QByteArray description() const override { return "LambdaSig"; } }; class ClosureTypeNameNode : public ParseTreeNode { public: ClosureTypeNameNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: - ClosureTypeNameNode(const ClosureTypeNameNode &other) : ParseTreeNode(other) {} - ParseTreeNode::Ptr clone() const { return Ptr(new ClosureTypeNameNode(*this)); } - void parse(); - QByteArray description() const { return "ClosureType"; } + ClosureTypeNameNode(const ClosureTypeNameNode &other) = default; + ParseTreeNode::Ptr clone() const override { return Ptr(new ClosureTypeNameNode(*this)); } + void parse() override; + QByteArray description() const override { return "ClosureType"; } }; class UnnamedTypeNameNode : public ParseTreeNode @@ -695,13 +695,13 @@ class UnnamedTypeNameNode : public ParseTreeNode public: UnnamedTypeNameNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: - UnnamedTypeNameNode(const UnnamedTypeNameNode &other) : ParseTreeNode(other) {} - ParseTreeNode::Ptr clone() const { return Ptr(new UnnamedTypeNameNode(*this)); } - void parse(); - QByteArray description() const { return "UnnnamedType"; } + UnnamedTypeNameNode(const UnnamedTypeNameNode &other) = default; + ParseTreeNode::Ptr clone() const override { return Ptr(new UnnamedTypeNameNode(*this)); } + void parse() override; + QByteArray description() const override { return "UnnnamedType"; } }; class DeclTypeNode : public ParseTreeNode @@ -709,13 +709,13 @@ class DeclTypeNode : public ParseTreeNode public: DeclTypeNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: - DeclTypeNode(const DeclTypeNode &other) : ParseTreeNode(other) {} - ParseTreeNode::Ptr clone() const { return Ptr(new DeclTypeNode(*this)); } - void parse(); - QByteArray description() const { return "DeclType"; } + DeclTypeNode(const DeclTypeNode &other) = default; + ParseTreeNode::Ptr clone() const override { return Ptr(new DeclTypeNode(*this)); } + void parse() override; + QByteArray description() const override { return "DeclType"; } }; class UnresolvedTypeRule @@ -733,13 +733,13 @@ class SimpleIdNode : public ParseTreeNode public: SimpleIdNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: - SimpleIdNode(const SimpleIdNode &other) : ParseTreeNode(other) {} - ParseTreeNode::Ptr clone() const { return Ptr(new SimpleIdNode(*this)); } - void parse(); - QByteArray description() const { return "SimpleId"; } + SimpleIdNode(const SimpleIdNode &other) = default; + ParseTreeNode::Ptr clone() const override { return Ptr(new SimpleIdNode(*this)); } + void parse() override; + QByteArray description() const override { return "SimpleId"; } }; class DestructorNameNode : public ParseTreeNode @@ -747,13 +747,13 @@ class DestructorNameNode : public ParseTreeNode public: DestructorNameNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: - DestructorNameNode(const DestructorNameNode &other) : ParseTreeNode(other) {} - ParseTreeNode::Ptr clone() const { return Ptr(new DestructorNameNode(*this)); } - void parse(); - QByteArray description() const { return "DesctuctorName"; } + DestructorNameNode(const DestructorNameNode &other) = default; + ParseTreeNode::Ptr clone() const override { return Ptr(new DestructorNameNode(*this)); } + void parse() override; + QByteArray description() const override { return "DesctuctorName"; } }; class UnresolvedQualifierLevelRule @@ -771,15 +771,15 @@ class BaseUnresolvedNameNode : public ParseTreeNode public: BaseUnresolvedNameNode(GlobalParseState *parseState); static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: BaseUnresolvedNameNode(const BaseUnresolvedNameNode &other); - ParseTreeNode::Ptr clone() const { return Ptr(new BaseUnresolvedNameNode(*this)); } - void parse(); - QByteArray description() const; + ParseTreeNode::Ptr clone() const override { return Ptr(new BaseUnresolvedNameNode(*this)); } + void parse() override; + QByteArray description() const override; - bool m_isOperator; + bool m_isOperator = false; }; class InitializerNode : public ParseTreeNode @@ -787,13 +787,13 @@ class InitializerNode : public ParseTreeNode public: InitializerNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: - InitializerNode(const InitializerNode &other) : ParseTreeNode(other) {} - ParseTreeNode::Ptr clone() const { return Ptr(new InitializerNode(*this)); } - void parse(); - QByteArray description() const { return "Initializer"; } + InitializerNode(const InitializerNode &other) = default; + ParseTreeNode::Ptr clone() const override { return Ptr(new InitializerNode(*this)); } + void parse() override; + QByteArray description() const override { return "Initializer"; } }; class UnresolvedNameNode : public ParseTreeNode @@ -801,15 +801,15 @@ class UnresolvedNameNode : public ParseTreeNode public: UnresolvedNameNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: UnresolvedNameNode(const UnresolvedNameNode &other); - ParseTreeNode::Ptr clone() const { return Ptr(new UnresolvedNameNode(*this)); } - void parse(); - QByteArray description() const; + ParseTreeNode::Ptr clone() const override { return Ptr(new UnresolvedNameNode(*this)); } + void parse() override; + QByteArray description() const override; - bool m_globalNamespace; + bool m_globalNamespace; // TODO: define? }; class FunctionParamNode : public ParseTreeNode @@ -817,13 +817,13 @@ class FunctionParamNode : public ParseTreeNode public: FunctionParamNode(GlobalParseState *parseState) : ParseTreeNode(parseState) {} static bool mangledRepresentationStartsWith(char c); - QByteArray toByteArray() const; + QByteArray toByteArray() const override; private: - FunctionParamNode(const FunctionParamNode &other) : ParseTreeNode(other) {} - ParseTreeNode::Ptr clone() const { return Ptr(new FunctionParamNode(*this)); } - void parse(); - QByteArray description() const { return "FunctionParam"; } + FunctionParamNode(const FunctionParamNode &other) = default; + ParseTreeNode::Ptr clone() const override { return Ptr(new FunctionParamNode(*this)); } + void parse() override; + QByteArray description() const override { return "FunctionParam"; } }; } // namespace Internal diff --git a/src/plugins/debugger/outputcollector.h b/src/plugins/debugger/outputcollector.h index b176414ce5..8d04e56364 100644 --- a/src/plugins/debugger/outputcollector.h +++ b/src/plugins/debugger/outputcollector.h @@ -47,7 +47,7 @@ class OutputCollector : public QObject Q_OBJECT public: - OutputCollector() {} + OutputCollector() = default; ~OutputCollector() override; bool listen(); void shutdown(); diff --git a/src/plugins/debugger/pdb/pdbengine.cpp b/src/plugins/debugger/pdb/pdbengine.cpp index b54172d5ab..1ff061bf48 100644 --- a/src/plugins/debugger/pdb/pdbengine.cpp +++ b/src/plugins/debugger/pdb/pdbengine.cpp @@ -295,7 +295,7 @@ void PdbEngine::refreshModules(const GdbMi &modules) { ModulesHandler *handler = modulesHandler(); handler->beginUpdateAll(); - foreach (const GdbMi &item, modules.children()) { + for (const GdbMi &item : modules.children()) { Module module; module.moduleName = item["name"].data(); QString path = item["value"].data(); @@ -350,7 +350,7 @@ void PdbEngine::refreshSymbols(const GdbMi &symbols) { QString moduleName = symbols["module"].data(); Symbols syms; - foreach (const GdbMi &item, symbols["symbols"].children()) { + for (const GdbMi &item : symbols["symbols"].children()) { Symbol symbol; symbol.name = item["name"].data(); syms.append(symbol); @@ -512,7 +512,7 @@ void PdbEngine::refreshStack(const GdbMi &stack) { StackHandler *handler = stackHandler(); StackFrames frames; - foreach (const GdbMi &item, stack["frames"].children()) { + for (const GdbMi &item : stack["frames"].children()) { StackFrame frame; frame.level = item["level"].data(); frame.file = item["file"].data(); diff --git a/src/plugins/debugger/pdb/pdbengine.h b/src/plugins/debugger/pdb/pdbengine.h index b6120e3aec..ccef9d1e47 100644 --- a/src/plugins/debugger/pdb/pdbengine.h +++ b/src/plugins/debugger/pdb/pdbengine.h @@ -88,7 +88,6 @@ private: void reloadFullStack() override {} bool supportsThreads() const { return true; } - bool isSynchronous() const override { return true; } void updateItem(const QString &iname) override; void runCommand(const DebuggerCommand &cmd) override; diff --git a/src/plugins/debugger/procinterrupt.cpp b/src/plugins/debugger/procinterrupt.cpp index ef49b429e0..bc241d9d3b 100644 --- a/src/plugins/debugger/procinterrupt.cpp +++ b/src/plugins/debugger/procinterrupt.cpp @@ -53,7 +53,7 @@ static inline QString msgCannotInterrupt(qint64 pid, const QString &why) static BOOL isWow64Process(HANDLE hproc) { - typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); + using LPFN_ISWOW64PROCESS = BOOL (WINAPI*)(HANDLE, PBOOL); BOOL ret = false; diff --git a/src/plugins/debugger/qml/qmlcppengine.cpp b/src/plugins/debugger/qml/qmlcppengine.cpp index 1a920f5f3e..3353712dda 100644 --- a/src/plugins/debugger/qml/qmlcppengine.cpp +++ b/src/plugins/debugger/qml/qmlcppengine.cpp @@ -207,11 +207,6 @@ bool QmlCppEngine::hasCapability(unsigned cap) const return hasCap; } -bool QmlCppEngine::isSynchronous() const -{ - return m_activeEngine->isSynchronous(); -} - QString QmlCppEngine::qtNamespace() const { return m_cppEngine->qtNamespace(); diff --git a/src/plugins/debugger/qml/qmlcppengine.h b/src/plugins/debugger/qml/qmlcppengine.h index a8a0d61537..fffd08a89a 100644 --- a/src/plugins/debugger/qml/qmlcppengine.h +++ b/src/plugins/debugger/qml/qmlcppengine.h @@ -65,7 +65,6 @@ public: void setRegisterValue(const QString &name, const QString &value) override; bool hasCapability(unsigned cap) const override; - bool isSynchronous() const override; QString qtNamespace() const override; void createSnapshot() override; diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp index c62856be4a..62034f245f 100644 --- a/src/plugins/debugger/qml/qmlengine.cpp +++ b/src/plugins/debugger/qml/qmlengine.cpp @@ -127,7 +127,7 @@ struct QmlV8ObjectData } }; -typedef std::function<void(const QVariantMap &)> QmlCallback; +using QmlCallback = std::function<void(const QVariantMap &)>; struct LookupData { @@ -136,7 +136,7 @@ struct LookupData QString exp; }; -typedef QHash<int, LookupData> LookupItems; // id -> (iname, exp) +using LookupItems = QHash<int, LookupData>; // id -> (iname, exp) static void setWatchItemHasChildren(WatchItem *item, bool hasChildren) { @@ -170,6 +170,10 @@ public: bool enabled = true,int line = 0, int column = 0, const QString condition = QString(), int ignoreCount = -1); void clearBreakpoint(int breakpoint); + + bool canChangeBreakpoint() const; + void changeBreakpoint(int breakpoint, bool enabled); + void setExceptionBreak(Exceptions type, bool enabled = false); void flushSendBuffer(); @@ -225,6 +229,7 @@ public: bool automaticConnect = false; bool unpausedEvaluate = false; bool contextEvaluate = false; + bool supportChangeBreakpoint = false; QTimer connectionTimer; QmlDebug::QDebugMessageClient *msgClient = nullptr; @@ -410,7 +415,7 @@ void QmlEngine::connectionStartupFailed() return; } - QMessageBox *infoBox = new QMessageBox(ICore::mainWindow()); + auto infoBox = new QMessageBox(ICore::mainWindow()); infoBox->setIcon(QMessageBox::Critical); infoBox->setWindowTitle(Core::Constants::IDE_DISPLAY_NAME); infoBox->setText(tr("Could not connect to the in-process QML debugger." @@ -431,7 +436,7 @@ void QmlEngine::appStartupFailed(const QString &errorMessage) QString error = tr("Could not connect to the in-process QML debugger. %1").arg(errorMessage); if (isMasterEngine()) { - QMessageBox *infoBox = new QMessageBox(ICore::mainWindow()); + auto infoBox = new QMessageBox(ICore::mainWindow()); infoBox->setIcon(QMessageBox::Critical); infoBox->setWindowTitle(Core::Constants::IDE_DISPLAY_NAME); infoBox->setText(error); @@ -755,6 +760,8 @@ void QmlEngine::changeBreakpoint(Breakpoint bp) d->setExceptionBreak(AllExceptions, params.enabled); } else if (params.type == BreakpointOnQmlSignalEmit) { d->setBreakpoint(EVENT, params.functionName, params.enabled); + } else if (d->canChangeBreakpoint()) { + d->changeBreakpoint(d->breakpoints.value(bp.id()), params.enabled); } else { d->clearBreakpoint(d->breakpoints.take(bp.id())); d->setBreakpoint(SCRIPTREGEXP, params.fileName, @@ -779,13 +786,13 @@ void QmlEngine::attemptBreakpointSynchronization() BreakHandler *handler = breakHandler(); DebuggerEngine *bpOwner = masterEngine(); - foreach (Breakpoint bp, handler->unclaimedBreakpoints()) { + for (Breakpoint bp : handler->unclaimedBreakpoints()) { // Take ownership of the breakpoint. Requests insertion. if (acceptsBreakpoint(bp)) bp.setEngine(bpOwner); } - foreach (Breakpoint bp, handler->engineBreakpoints(bpOwner)) { + for (Breakpoint bp : handler->engineBreakpoints(bpOwner)) { switch (bp.state()) { case BreakpointNew: // Should not happen once claimed. @@ -925,9 +932,9 @@ void QmlEngine::selectWatchData(const QString &iname) bool compareConsoleItems(const ConsoleItem *a, const ConsoleItem *b) { - if (a == 0) + if (a == nullptr) return true; - if (b == 0) + if (b == nullptr) return false; return a->text() < b->text(); } @@ -937,7 +944,7 @@ static ConsoleItem *constructLogItemTree(const QVariant &result, { bool sorted = boolSetting(SortStructMembers); if (!result.isValid()) - return 0; + return nullptr; QString text; ConsoleItem *item = nullptr; @@ -1136,8 +1143,8 @@ void QmlEnginePrivate::updateScriptSource(const QString &fileName, int lineOffse } QTC_CHECK(cursor.positionInBlock() == columnOffset); - QStringList lines = source.split('\n'); - foreach (QString line, lines) { + const QStringList lines = source.split('\n'); + for (QString line : lines) { if (line.endsWith('\r')) line.remove(line.size() -1, 1); @@ -1499,6 +1506,19 @@ void QmlEnginePrivate::clearBreakpoint(int breakpoint) runCommand(cmd); } +bool QmlEnginePrivate::canChangeBreakpoint() const +{ + return supportChangeBreakpoint; +} + +void QmlEnginePrivate::changeBreakpoint(int breakpoint, bool enabled) +{ + DebuggerCommand cmd(CHANGEBREAKPOINT); + cmd.arg(BREAKPOINT, breakpoint); + cmd.arg(ENABLED, enabled); + runCommand(cmd); +} + void QmlEnginePrivate::setExceptionBreak(Exceptions type, bool enabled) { // { "seq" : <number>, @@ -1883,7 +1903,7 @@ void QmlEnginePrivate::messageReceived(const QByteArray &data) QList<int> v8BreakpointIds; { const QVariantList v8BreakpointIdList = breakData.value("breakpoints").toList(); - foreach (const QVariant &breakpointId, v8BreakpointIdList) + for (const QVariant &breakpointId : v8BreakpointIdList) v8BreakpointIds << breakpointId.toInt(); } @@ -1897,7 +1917,7 @@ void QmlEnginePrivate::messageReceived(const QByteArray &data) int newColumn = sourceLineText.indexOf('(') + 1; BreakHandler *handler = engine->breakHandler(); - foreach (int v8Id, v8BreakpointIds) { + for (int v8Id : v8BreakpointIds) { const BreakpointModelId id = breakpoints.key(v8Id); Breakpoint bp = handler->breakpointById(id); if (bp.isValid()) { @@ -1927,7 +1947,7 @@ void QmlEnginePrivate::messageReceived(const QByteArray &data) if (inferiorStop) { //Update breakpoint data BreakHandler *handler = engine->breakHandler(); - foreach (int v8Id, v8BreakpointIds) { + for (int v8Id : v8BreakpointIds) { const BreakpointModelId id = breakpoints.key(v8Id); Breakpoint bp = handler->breakpointById(id); if (bp) { @@ -1946,7 +1966,7 @@ void QmlEnginePrivate::messageReceived(const QByteArray &data) } if (engine->state() == InferiorRunOk) { - foreach (const QVariant &breakpointId, v8BreakpointIds) { + for (const QVariant &breakpointId : v8BreakpointIds) { if (breakpointsTemp.contains(breakpointId.toInt())) clearBreakpoint(breakpointId.toInt()); } @@ -1969,8 +1989,8 @@ void QmlEnginePrivate::messageReceived(const QByteArray &data) const QVariantMap exception = body.value("exception").toMap(); QString errorMessage = exception.value("text").toString(); - QStringList messages = highlightExceptionCode(lineNumber, filePath, errorMessage); - foreach (const QString msg, messages) + const QStringList messages = highlightExceptionCode(lineNumber, filePath, errorMessage); + for (const QString &msg : messages) engine->showMessage(msg, ConsoleOutput); if (engine->state() == InferiorRunOk) { @@ -2030,7 +2050,7 @@ void QmlEnginePrivate::handleBacktrace(const QVariantMap &response) StackFrames stackFrames; int i = 0; stackIndexLookup.clear(); - foreach (const QVariant &frame, frames) { + for (const QVariant &frame : frames) { StackFrame stackFrame = extractStackFrame(frame); if (stackFrame.level.isEmpty()) continue; @@ -2178,7 +2198,7 @@ void QmlEnginePrivate::handleFrame(const QVariantMap &response) currentFrameScopes.clear(); const QVariantList scopes = body.value("scopes").toList(); - foreach (const QVariant &scope, scopes) { + for (const QVariant &scope : scopes) { //Do not query for global types (0) //Showing global properties increases clutter. if (scope.toMap().value("type").toInt() == 0) @@ -2191,8 +2211,8 @@ void QmlEnginePrivate::handleFrame(const QVariantMap &response) // Send watchers list if (stackHandler->isContentsValid() && stackHandler->currentFrame().isUsable()) { - QStringList watchers = watchHandler->watchedExpressions(); - foreach (const QString &exp, watchers) { + const QStringList watchers = watchHandler->watchedExpressions(); + for (const QString &exp : watchers) { const QString iname = watchHandler->watcherName(exp); evaluate(exp, -1, [this, iname, exp](const QVariantMap &response) { handleEvaluateExpression(response, iname, exp); @@ -2231,10 +2251,10 @@ void QmlEnginePrivate::handleScope(const QVariantMap &response) if (bodyMap.value("frameIndex").toInt() != stackHandler->currentIndex()) return; - QmlV8ObjectData objectData = extractData(bodyMap.value("object")); + const QmlV8ObjectData objectData = extractData(bodyMap.value("object")); LookupItems itemsToLookup; - foreach (const QVariant &property, objectData.properties) { + for (const QVariant &property : objectData.properties) { QmlV8ObjectData localData = extractData(property); std::unique_ptr<WatchItem> item(new WatchItem); item->exp = localData.name; @@ -2281,7 +2301,7 @@ void QmlEnginePrivate::constructChildLogItems(ConsoleItem *item, const QmlV8Obje // changes, invalidating cached indices. So we presort them before inserting. QVarLengthArray<ConsoleItem *> children(objectData.properties.size()); auto it = children.begin(); - foreach (const QVariant &property, objectData.properties) + for (const QVariant &property : objectData.properties) *(it++) = constructLogItemTree(extractData(property), seenHandles); if (boolSetting(SortStructMembers)) @@ -2309,8 +2329,8 @@ ConsoleItem *QmlEnginePrivate::constructLogItemTree(const QmlV8ObjectData &objec cmd.arg(HANDLES, QList<int>() << handle); runCommand(cmd, [this, item, handle](const QVariantMap &response) { const QVariantMap body = response.value(BODY).toMap(); - QStringList handlesList = body.keys(); - foreach (const QString &handleString, handlesList) { + const QStringList handlesList = body.keys(); + for (const QString &handleString : handlesList) { if (handle != handleString.toInt()) continue; @@ -2370,7 +2390,7 @@ void QmlEnginePrivate::insertSubItems(WatchItem *parent, const QVariantList &pro LookupItems itemsToLookup; const QSet<QString> expandedINames = engine->watchHandler()->expandedINames(); - foreach (const QVariant &property, properties) { + for (const QVariant &property : properties) { QmlV8ObjectData propertyData = extractData(property); std::unique_ptr<WatchItem> item(new WatchItem); item->name = propertyData.name; @@ -2433,13 +2453,13 @@ void QmlEnginePrivate::handleLookup(const QVariantMap &response) // } const QVariantMap body = response.value(BODY).toMap(); - QStringList handlesList = body.keys(); - foreach (const QString &handleString, handlesList) { - int handle = handleString.toInt(); - QmlV8ObjectData bodyObjectData = extractData(body.value(handleString)); - QList<LookupData> vals = currentlyLookingUp.values(handle); + const QStringList handlesList = body.keys(); + for (const QString &handleString : handlesList) { + const int handle = handleString.toInt(); + const QmlV8ObjectData bodyObjectData = extractData(body.value(handleString)); + const QList<LookupData> vals = currentlyLookingUp.values(handle); currentlyLookingUp.remove(handle); - foreach (const LookupData &res, vals) { + for (const LookupData &res : vals) { auto item = new WatchItem; item->exp = res.exp; item->iname = res.iname; @@ -2475,8 +2495,10 @@ void QmlEnginePrivate::stateChanged(State state) void QmlEnginePrivate::handleVersion(const QVariantMap &response) { - unpausedEvaluate = response.value(BODY).toMap().value("UnpausedEvaluate", false).toBool(); - contextEvaluate = response.value(BODY).toMap().value("ContextEvaluate", false).toBool(); + const QVariantMap body = response.value(BODY).toMap(); + unpausedEvaluate = body.value("UnpausedEvaluate", false).toBool(); + contextEvaluate = body.value("ContextEvaluate", false).toBool(); + supportChangeBreakpoint = body.value("ChangeBreakpoint", false).toBool(); } void QmlEnginePrivate::flushSendBuffer() diff --git a/src/plugins/debugger/qml/qmlengine.h b/src/plugins/debugger/qml/qmlengine.h index 2f6889b62b..bdd6b2d64c 100644 --- a/src/plugins/debugger/qml/qmlengine.h +++ b/src/plugins/debugger/qml/qmlengine.h @@ -70,7 +70,6 @@ private: void gotoLocation(const Internal::Location &location) override; void insertBreakpoint(Breakpoint bp) override; - bool isSynchronous() const override { return false; } bool canDisplayTooltip() const override { return false; } void resetLocation() override; diff --git a/src/plugins/debugger/qml/qmlengineutils.cpp b/src/plugins/debugger/qml/qmlengineutils.cpp index 455a559e31..0ef1bf07e5 100644 --- a/src/plugins/debugger/qml/qmlengineutils.cpp +++ b/src/plugins/debugger/qml/qmlengineutils.cpp @@ -58,7 +58,7 @@ public: Node::accept(ast, this); } - bool preVisit(Node *ast) + bool preVisit(Node *ast) override { return !done && ast->lastSourceLocation().startLine >= *line; } @@ -73,7 +73,7 @@ public: //Add more types when suitable. - bool visit(UiScriptBinding *ast) + bool visit(UiScriptBinding *ast) override { if (!ast->statement) return true; @@ -87,7 +87,7 @@ public: statementColumn = ast->statement->firstSourceLocation().startColumn; } else if (ast->statement->kind == Node::Kind_Block) { - Block *block = static_cast<Block *>(ast->statement); + auto block = static_cast<Block *>(ast->statement); if (!block->statements) return true; statementStartLine = block->statements->firstSourceLocation().startLine; @@ -124,7 +124,7 @@ public: return true; } - bool visit(FunctionDeclaration *ast) { + bool visit(FunctionDeclaration *ast) override { quint32 sourceStartLine = ast->firstSourceLocation().startLine; quint32 sourceStartColumn = ast->firstSourceLocation().startColumn; quint32 statementStartLine = ast->body->firstSourceLocation().startLine; @@ -152,39 +152,39 @@ public: return true; } - bool visit(EmptyStatement *ast) + bool visit(EmptyStatement *ast) override { *line = ast->lastSourceLocation().startLine + 1; return true; } - bool visit(VariableStatement *ast) { test(ast); return true; } - bool visit(VariableDeclarationList *ast) { test(ast); return true; } - bool visit(VariableDeclaration *ast) { test(ast); return true; } - bool visit(ExpressionStatement *ast) { test(ast); return true; } - bool visit(IfStatement *ast) { test(ast); return true; } - bool visit(DoWhileStatement *ast) { test(ast); return true; } - bool visit(WhileStatement *ast) { test(ast); return true; } - bool visit(ForStatement *ast) { test(ast); return true; } - bool visit(LocalForStatement *ast) { test(ast); return true; } - bool visit(ForEachStatement *ast) { test(ast); return true; } - bool visit(LocalForEachStatement *ast) { test(ast); return true; } - bool visit(ContinueStatement *ast) { test(ast); return true; } - bool visit(BreakStatement *ast) { test(ast); return true; } - bool visit(ReturnStatement *ast) { test(ast); return true; } - bool visit(WithStatement *ast) { test(ast); return true; } - bool visit(SwitchStatement *ast) { test(ast); return true; } - bool visit(CaseBlock *ast) { test(ast); return true; } - bool visit(CaseClauses *ast) { test(ast); return true; } - bool visit(CaseClause *ast) { test(ast); return true; } - bool visit(DefaultClause *ast) { test(ast); return true; } - bool visit(LabelledStatement *ast) { test(ast); return true; } - bool visit(ThrowStatement *ast) { test(ast); return true; } - bool visit(TryStatement *ast) { test(ast); return true; } - bool visit(Catch *ast) { test(ast); return true; } - bool visit(Finally *ast) { test(ast); return true; } - bool visit(FunctionExpression *ast) { test(ast); return true; } - bool visit(DebuggerStatement *ast) { test(ast); return true; } + bool visit(VariableStatement *ast) override { test(ast); return true; } + bool visit(VariableDeclarationList *ast) override { test(ast); return true; } + bool visit(VariableDeclaration *ast) override { test(ast); return true; } + bool visit(ExpressionStatement *ast) override { test(ast); return true; } + bool visit(IfStatement *ast) override { test(ast); return true; } + bool visit(DoWhileStatement *ast) override { test(ast); return true; } + bool visit(WhileStatement *ast) override { test(ast); return true; } + bool visit(ForStatement *ast) override { test(ast); return true; } + bool visit(LocalForStatement *ast) override { test(ast); return true; } + bool visit(ForEachStatement *ast) override { test(ast); return true; } + bool visit(LocalForEachStatement *ast) override { test(ast); return true; } + bool visit(ContinueStatement *ast) override { test(ast); return true; } + bool visit(BreakStatement *ast) override { test(ast); return true; } + bool visit(ReturnStatement *ast) override { test(ast); return true; } + bool visit(WithStatement *ast) override { test(ast); return true; } + bool visit(SwitchStatement *ast) override { test(ast); return true; } + bool visit(CaseBlock *ast) override { test(ast); return true; } + bool visit(CaseClauses *ast) override { test(ast); return true; } + bool visit(CaseClause *ast) override { test(ast); return true; } + bool visit(DefaultClause *ast) override { test(ast); return true; } + bool visit(LabelledStatement *ast) override { test(ast); return true; } + bool visit(ThrowStatement *ast) override { test(ast); return true; } + bool visit(TryStatement *ast) override { test(ast); return true; } + bool visit(Catch *ast) override { test(ast); return true; } + bool visit(Finally *ast) override { test(ast); return true; } + bool visit(FunctionExpression *ast) override { test(ast); return true; } + bool visit(DebuggerStatement *ast) override { test(ast); return true; } void test(Node *ast) { @@ -241,13 +241,13 @@ void clearExceptionSelection() QStringList highlightExceptionCode(int lineNumber, const QString &filePath, const QString &errorMessage) { QStringList messages; - QList<IEditor *> editors = DocumentModel::editorsForFilePath(filePath); + const QList<IEditor *> editors = DocumentModel::editorsForFilePath(filePath); const TextEditor::FontSettings &fontSettings = TextEditor::TextEditorSettings::instance()->fontSettings(); QTextCharFormat errorFormat = fontSettings.toTextCharFormat(TextEditor::C_ERROR); - foreach (IEditor *editor, editors) { - TextEditorWidget *ed = qobject_cast<TextEditorWidget *>(editor->widget()); + for (IEditor *editor : editors) { + auto ed = qobject_cast<TextEditorWidget *>(editor->widget()); if (!ed) continue; diff --git a/src/plugins/debugger/qml/qmlinspectoragent.cpp b/src/plugins/debugger/qml/qmlinspectoragent.cpp index 72f224db51..3057a753e0 100644 --- a/src/plugins/debugger/qml/qmlinspectoragent.cpp +++ b/src/plugins/debugger/qml/qmlinspectoragent.cpp @@ -66,21 +66,14 @@ Q_LOGGING_CATEGORY(qmlInspectorLog, "qtc.dbg.qmlinspector") */ QmlInspectorAgent::QmlInspectorAgent(QmlEngine *engine, QmlDebugConnection *connection) : m_qmlEngine(engine) - , m_engineClient(0) - , m_engineQueryId(0) - , m_rootContextQueryId(0) , m_objectToSelect(WatchItem::InvalidId) , m_masterEngine(engine->masterEngine()) - , m_toolsClient(0) - , m_targetToSync(NoTarget) , m_debugIdToSelect(WatchItem::InvalidId) , m_currentSelectedDebugId(WatchItem::InvalidId) - , m_toolsClientConnected(false) , m_inspectorToolsContext("Debugger.QmlInspector") , m_selectAction(new QAction(this)) , m_zoomAction(new QAction(this)) , m_showAppOnTopAction(action(ShowAppOnTop)) - , m_engineClientConnected(false) { m_debugIdToIname.insert(WatchItem::InvalidId, "inspect"); connect(action(ShowQmlObjectTree), @@ -341,8 +334,8 @@ void QmlInspectorAgent::onResult(quint32 queryId, const QVariant &value, if (m_objectTreeQueryIds.contains(queryId)) { m_objectTreeQueryIds.removeOne(queryId); if (value.type() == QVariant::List) { - QVariantList objList = value.toList(); - foreach (const QVariant &var, objList) { + const QVariantList objList = value.toList(); + for (const QVariant &var : objList) { // TODO: check which among the list is the actual // object that needs to be selected. verifyAndInsertObjectInTree(qvariant_cast<ObjectReference>(var)); @@ -396,7 +389,7 @@ static bool insertChildren(WatchItem *parent, const QVariant &value) case QVariant::Map: { const QVariantMap map = value.toMap(); for (auto it = map.begin(), end = map.end(); it != end; ++it) { - WatchItem *child = new WatchItem; + auto child = new WatchItem; child->name = it.key(); child->value = it.value().toString(); child->type = QLatin1String(it.value().typeName()); @@ -410,7 +403,7 @@ static bool insertChildren(WatchItem *parent, const QVariant &value) case QVariant::List: { const QVariantList list = value.toList(); for (int i = 0, end = list.size(); i != end; ++i) { - WatchItem *child = new WatchItem; + auto child = new WatchItem; const QVariant &value = list.at(i); child->arrayIndex = i; child->value = value.toString(); @@ -756,7 +749,7 @@ void QmlInspectorAgent::clientStateChanged(QmlDebugClient::State state) { QString serviceName; float version = 0; - if (QmlDebugClient *client = qobject_cast<QmlDebugClient*>(sender())) { + if (auto client = qobject_cast<QmlDebugClient*>(sender())) { serviceName = client->name(); version = client->serviceVersion(); } @@ -766,7 +759,7 @@ void QmlInspectorAgent::clientStateChanged(QmlDebugClient::State state) void QmlInspectorAgent::toolsClientStateChanged(QmlDebugClient::State state) { - BaseToolsClient *client = qobject_cast<BaseToolsClient*>(sender()); + auto client = qobject_cast<BaseToolsClient*>(sender()); QTC_ASSERT(client, return); if (state == QmlDebugClient::Enabled) { m_toolsClient = client; @@ -820,8 +813,7 @@ void QmlInspectorAgent::toolsClientStateChanged(QmlDebugClient::State state) void QmlInspectorAgent::engineClientStateChanged(QmlDebugClient::State state) { - BaseEngineDebugClient *client - = qobject_cast<BaseEngineDebugClient*>(sender()); + auto client = qobject_cast<BaseEngineDebugClient*>(sender()); if (state == QmlDebugClient::Enabled && !m_engineClientConnected) { // We accept the first client that is enabled and reject the others. diff --git a/src/plugins/debugger/qml/qmlinspectoragent.h b/src/plugins/debugger/qml/qmlinspectoragent.h index 0f09016554..4d76c5f2a8 100644 --- a/src/plugins/debugger/qml/qmlinspectoragent.h +++ b/src/plugins/debugger/qml/qmlinspectoragent.h @@ -49,8 +49,8 @@ class QmlEngine; class WatchItem; //map <filename, editorRevision> -> <lineNumber, columnNumber> -> debugId -typedef -QHash<QPair<QString, int>, QHash<QPair<int, int>, QList<int> > > DebugIdHash; +using DebugIdHash = + QHash<QPair<QString, int>, QHash<QPair<int, int>, QList<int> > >; class QmlInspectorAgent : public QObject { @@ -118,10 +118,10 @@ private: private: QPointer<QmlEngine> m_qmlEngine; - QmlDebug::BaseEngineDebugClient *m_engineClient; + QmlDebug::BaseEngineDebugClient *m_engineClient = nullptr; - quint32 m_engineQueryId; - quint32 m_rootContextQueryId; + quint32 m_engineQueryId = 0; + quint32 m_rootContextQueryId = 0; int m_objectToSelect; QList<quint32> m_objectTreeQueryIds; QStack<QmlDebug::ObjectReference> m_objectStack; @@ -136,22 +136,22 @@ private: DebuggerEngine *m_masterEngine; QHash<QString, QmlDebug::BaseEngineDebugClient*> m_engineClients; - QmlDebug::BaseToolsClient *m_toolsClient; + QmlDebug::BaseToolsClient *m_toolsClient = nullptr; - SelectionTarget m_targetToSync; + SelectionTarget m_targetToSync = NoTarget; int m_debugIdToSelect; int m_currentSelectedDebugId; QString m_currentSelectedDebugName; // toolbar - bool m_toolsClientConnected; + bool m_toolsClientConnected = false; Core::Context m_inspectorToolsContext; QAction *m_selectAction; QAction *m_zoomAction; QAction *m_showAppOnTopAction; - bool m_engineClientConnected; + bool m_engineClientConnected = false; }; } // Internal diff --git a/src/plugins/debugger/qml/qmlv8debuggerclientconstants.h b/src/plugins/debugger/qml/qmlv8debuggerclientconstants.h index 90c585b8e3..3056dd74f9 100644 --- a/src/plugins/debugger/qml/qmlv8debuggerclientconstants.h +++ b/src/plugins/debugger/qml/qmlv8debuggerclientconstants.h @@ -73,6 +73,7 @@ const char SCOPE[] = "scope"; const char SCRIPTS[] = "scripts"; const char SETBREAKPOINT[] = "setbreakpoint"; const char CLEARBREAKPOINT[] = "clearbreakpoint"; +const char CHANGEBREAKPOINT[] = "changebreakpoint"; const char SETEXCEPTIONBREAK[] = "setexceptionbreak"; const char VERSION[] = "version"; const char DISCONNECT[] = "disconnect"; diff --git a/src/plugins/debugger/registerhandler.cpp b/src/plugins/debugger/registerhandler.cpp index 5ae39c1af5..1ee023aa31 100644 --- a/src/plugins/debugger/registerhandler.cpp +++ b/src/plugins/debugger/registerhandler.cpp @@ -69,7 +69,7 @@ enum RegisterDataRole class RegisterDelegate : public QItemDelegate { public: - RegisterDelegate() {} + RegisterDelegate() = default; QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index) const override @@ -80,7 +80,7 @@ public: lineEdit->setFrame(false); return lineEdit; } - return 0; + return nullptr; } void setEditorData(QWidget *editor, const QModelIndex &index) const override @@ -428,9 +428,9 @@ public: appendChild(new RegisterEditItem(i, subKind, subSize, format)); } - QVariant data(int column, int role) const; + QVariant data(int column, int role) const override; - Qt::ItemFlags flags(int column) const + Qt::ItemFlags flags(int column) const override { //return column == 1 ? Qt::ItemIsSelectable|Qt::ItemIsEnabled|Qt::ItemIsEditable // : Qt::ItemIsSelectable|Qt::ItemIsEnabled; @@ -464,7 +464,7 @@ public: }; RegisterItem::RegisterItem(DebuggerEngine *engine, const Register ®) - : m_engine(engine), m_reg(reg), m_changed(true) + : m_engine(engine), m_reg(reg) { if (m_reg.kind == UnknownRegister) m_reg.guessMissingData(); diff --git a/src/plugins/debugger/registerhandler.h b/src/plugins/debugger/registerhandler.h index 45675bf90d..3d9bf7bb58 100644 --- a/src/plugins/debugger/registerhandler.h +++ b/src/plugins/debugger/registerhandler.h @@ -103,7 +103,7 @@ class RegisterItem; using RegisterRootItem = Utils::TypedTreeItem<RegisterItem>; using RegisterModel = Utils::TreeModel<RegisterRootItem, RegisterItem, RegisterSubItem>; -typedef QMap<quint64, QString> RegisterMap; +using RegisterMap = QMap<quint64, QString>; class RegisterHandler : public RegisterModel { diff --git a/src/plugins/debugger/registerpostmortemaction.cpp b/src/plugins/debugger/registerpostmortemaction.cpp index f1c4b204e0..a4e6bb87a0 100644 --- a/src/plugins/debugger/registerpostmortemaction.cpp +++ b/src/plugins/debugger/registerpostmortemaction.cpp @@ -78,7 +78,7 @@ void RegisterPostMortemAction::readSettings(const QSettings *) Q_UNUSED(debuggerRegistryValueNameC); // avoid warning from MinGW bool registered = false; - HKEY handle = 0; + HKEY handle = NULL; QString errorMessage; if (openRegistryKey(HKEY_LOCAL_MACHINE, debuggerRegistryKeyC, false, &handle, &errorMessage)) registered = isRegistered(handle, debuggerCall(), &errorMessage); diff --git a/src/plugins/debugger/shared/cdbsymbolpathlisteditor.cpp b/src/plugins/debugger/shared/cdbsymbolpathlisteditor.cpp index 668c1d4c53..63bc34193c 100644 --- a/src/plugins/debugger/shared/cdbsymbolpathlisteditor.cpp +++ b/src/plugins/debugger/shared/cdbsymbolpathlisteditor.cpp @@ -53,13 +53,13 @@ CacheDirectoryDialog::CacheDirectoryDialog(QWidget *parent) : setModal(true); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); - QFormLayout *formLayout = new QFormLayout; + auto formLayout = new QFormLayout; m_chooser->setExpectedKind(Utils::PathChooser::ExistingDirectory); m_chooser->setHistoryCompleter(QLatin1String("Debugger.CdbCacheDir.History")); m_chooser->setMinimumWidth(400); formLayout->addRow(tr("Path:"), m_chooser); - QVBoxLayout *mainLayout = new QVBoxLayout; + auto mainLayout = new QVBoxLayout; mainLayout->addLayout(formLayout); mainLayout->addWidget(m_buttonBox); diff --git a/src/plugins/debugger/shared/peutils.cpp b/src/plugins/debugger/shared/peutils.cpp index 3d89fa77b4..1973cf3afe 100644 --- a/src/plugins/debugger/shared/peutils.cpp +++ b/src/plugins/debugger/shared/peutils.cpp @@ -72,21 +72,21 @@ struct CV_INFO_PDB70 // Retrieve the NT image header of an executable via the legacy DOS header. static IMAGE_NT_HEADERS *getNtHeader(void *fileMemory, QString *errorMessage) { - IMAGE_DOS_HEADER *dosHeader = static_cast<PIMAGE_DOS_HEADER>(fileMemory); + auto dosHeader = static_cast<PIMAGE_DOS_HEADER>(fileMemory); // Check DOS header consistency if (IsBadReadPtr(dosHeader, sizeof(IMAGE_DOS_HEADER)) || dosHeader->e_magic != IMAGE_DOS_SIGNATURE) { *errorMessage = QString::fromLatin1("DOS header check failed."); - return 0; + return nullptr; } // Retrieve NT header - IMAGE_NT_HEADERS *ntHeaders = makePtr<IMAGE_NT_HEADERS>(dosHeader, dosHeader->e_lfanew); + auto ntHeaders = makePtr<IMAGE_NT_HEADERS>(dosHeader, dosHeader->e_lfanew); // check NT header consistency if (IsBadReadPtr(ntHeaders, sizeof(ntHeaders->Signature)) || ntHeaders->Signature != IMAGE_NT_SIGNATURE || IsBadReadPtr(&ntHeaders->FileHeader, sizeof(IMAGE_FILE_HEADER))) { *errorMessage = QString::fromLatin1("NT header check failed."); - return 0; + return nullptr; } // Check magic const WORD magic = ntHeaders->OptionalHeader.Magic; @@ -100,14 +100,14 @@ static IMAGE_NT_HEADERS *getNtHeader(void *fileMemory, QString *errorMessage) if (magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC && magic != IMAGE_NT_OPTIONAL_HDR64_MAGIC) { *errorMessage = QString::fromLatin1("NT header check failed; magic %1 is none of %2, %3."). arg(magic).arg(IMAGE_NT_OPTIONAL_HDR32_MAGIC).arg(IMAGE_NT_OPTIONAL_HDR64_MAGIC); - return 0; + return nullptr; } #endif // Check section headers IMAGE_SECTION_HEADER *sectionHeaders = IMAGE_FIRST_SECTION(ntHeaders); if (IsBadReadPtr(sectionHeaders, ntHeaders->FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER))) { *errorMessage = QString::fromLatin1("NT header section header check failed."); - return 0; + return nullptr; } return ntHeaders; } @@ -134,22 +134,22 @@ static bool getDebugDirectory(IMAGE_NT_HEADERS *ntHeaders, void *fileMemory, { DWORD debugDirRva = 0; DWORD debugDirSize; - *debugDir = 0; + *debugDir = nullptr; *count = 0; #ifdef __GNUC__ // MinGW does not have complete 64bit definitions. - IMAGE_OPTIONAL_HEADER *optionalHeader = reinterpret_cast<IMAGE_OPTIONAL_HEADER*>(&(ntHeaders->OptionalHeader)); + auto optionalHeader = reinterpret_cast<IMAGE_OPTIONAL_HEADER*>(&(ntHeaders->OptionalHeader)); debugDirRva = optionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress; debugDirSize = optionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size; #else // Find the virtual address const bool is64Bit = ntHeaders->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC; if (is64Bit) { - IMAGE_OPTIONAL_HEADER64 *optionalHeader64 = reinterpret_cast<IMAGE_OPTIONAL_HEADER64*>(&(ntHeaders->OptionalHeader)); + auto optionalHeader64 = reinterpret_cast<IMAGE_OPTIONAL_HEADER64*>(&(ntHeaders->OptionalHeader)); debugDirRva = optionalHeader64->DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress; debugDirSize = optionalHeader64->DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size; } else { - IMAGE_OPTIONAL_HEADER32 *optionalHeader32 = reinterpret_cast<IMAGE_OPTIONAL_HEADER32*>(&(ntHeaders->OptionalHeader)); + auto optionalHeader32 = reinterpret_cast<IMAGE_OPTIONAL_HEADER32*>(&(ntHeaders->OptionalHeader)); debugDirRva = optionalHeader32->DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress; debugDirSize = optionalHeader32->DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size; } @@ -168,7 +168,7 @@ static bool getDebugDirectory(IMAGE_NT_HEADERS *ntHeaders, void *fileMemory, // Check if (IsBadReadPtr(*debugDir, debugDirSize) || debugDirSize < sizeof(IMAGE_DEBUG_DIRECTORY)) { *errorMessage = QString::fromLatin1("Debug directory corrupted."); - return 0; + return false; } *count = debugDirSize / sizeof(IMAGE_DEBUG_DIRECTORY); @@ -185,19 +185,19 @@ static QString getPDBFileOfCodeViewSection(void *debugInfo, DWORD size) const DWORD cvSignature = *static_cast<DWORD*>(debugInfo); if (cvSignature == CV_SIGNATURE_NB10) { - CV_INFO_PDB20* cvInfo = static_cast<CV_INFO_PDB20*>(debugInfo); + auto cvInfo = static_cast<CV_INFO_PDB20*>(debugInfo); if (IsBadReadPtr(debugInfo, sizeof(CV_INFO_PDB20))) return QString(); - CHAR* pdbFileName = reinterpret_cast<CHAR*>(cvInfo->PdbFileName); + auto pdbFileName = reinterpret_cast<CHAR*>(cvInfo->PdbFileName); if (IsBadStringPtrA(pdbFileName, UINT_MAX)) return QString(); return QString::fromLocal8Bit(pdbFileName); } if (cvSignature == CV_SIGNATURE_RSDS) { - CV_INFO_PDB70* cvInfo = static_cast<CV_INFO_PDB70*>(debugInfo); + auto cvInfo = static_cast<CV_INFO_PDB70*>(debugInfo); if (IsBadReadPtr(debugInfo, sizeof(CV_INFO_PDB70))) return QString(); - CHAR* pdbFileName = reinterpret_cast<CHAR*>(cvInfo->PdbFileName); + auto pdbFileName = reinterpret_cast<CHAR*>(cvInfo->PdbFileName); if (IsBadStringPtrA(pdbFileName, UINT_MAX)) return QString(); return QString::fromLocal8Bit(pdbFileName); diff --git a/src/plugins/debugger/shared/symbolpathsdialog.h b/src/plugins/debugger/shared/symbolpathsdialog.h index db4c596545..c3534fbcf6 100644 --- a/src/plugins/debugger/shared/symbolpathsdialog.h +++ b/src/plugins/debugger/shared/symbolpathsdialog.h @@ -39,7 +39,7 @@ class SymbolPathsDialog : public QDialog public: explicit SymbolPathsDialog(QWidget *parent = nullptr); - ~SymbolPathsDialog(); + ~SymbolPathsDialog() override; bool useSymbolCache() const; bool useSymbolServer() const; diff --git a/src/plugins/debugger/simplifytype.cpp b/src/plugins/debugger/simplifytype.cpp index a8a26a9f05..ae519d70d4 100644 --- a/src/plugins/debugger/simplifytype.cpp +++ b/src/plugins/debugger/simplifytype.cpp @@ -44,7 +44,7 @@ namespace Internal { static QString chopConst(QString type) { - while (1) { + while (true) { if (type.startsWith(QLatin1String("const"))) type = type.mid(5); else if (type.startsWith(QLatin1Char(' '))) diff --git a/src/plugins/debugger/snapshothandler.cpp b/src/plugins/debugger/snapshothandler.cpp index 61e5d4e181..21dcaf9d1e 100644 --- a/src/plugins/debugger/snapshothandler.cpp +++ b/src/plugins/debugger/snapshothandler.cpp @@ -116,10 +116,7 @@ QDebug operator<<(QDebug d, const SnapshotData &f) A snapshot represents a debugging session. */ -SnapshotHandler::SnapshotHandler() -{ - m_currentIndex = -1; -} +SnapshotHandler::SnapshotHandler() = default; SnapshotHandler::~SnapshotHandler() { @@ -196,10 +193,10 @@ QVariant SnapshotHandler::headerData(int section, Qt::Orientation orientation, i Qt::ItemFlags SnapshotHandler::flags(const QModelIndex &index) const { if (index.row() >= m_snapshots.size()) - return 0; + return nullptr; if (index.row() == m_snapshots.size()) return QAbstractTableModel::flags(index); - return true ? QAbstractTableModel::flags(index) : Qt::ItemFlags(0); + return true ? QAbstractTableModel::flags(index) : Qt::ItemFlags({}); } void SnapshotHandler::activateSnapshot(int index) @@ -207,7 +204,7 @@ void SnapshotHandler::activateSnapshot(int index) beginResetModel(); m_currentIndex = index; //qDebug() << "ACTIVATING INDEX: " << m_currentIndex << " OF " << size(); - Internal::displayDebugger(at(index), true); + Internal::displayDebugger(at(index)); endResetModel(); } diff --git a/src/plugins/debugger/snapshothandler.h b/src/plugins/debugger/snapshothandler.h index 5f43668d19..6b93b20e32 100644 --- a/src/plugins/debugger/snapshothandler.h +++ b/src/plugins/debugger/snapshothandler.h @@ -40,7 +40,7 @@ class SnapshotHandler : public QAbstractTableModel public: explicit SnapshotHandler(); - ~SnapshotHandler(); + ~SnapshotHandler() override; // Called from SnapshotHandler after a new snapshot has been added void removeAll(); @@ -58,13 +58,13 @@ public: private: // QAbstractTableModel - int rowCount(const QModelIndex &parent) const; - int columnCount(const QModelIndex &parent) const; - QVariant data(const QModelIndex &index, int role) const; - QVariant headerData(int section, Qt::Orientation orientation, int role) const; - Qt::ItemFlags flags(const QModelIndex &index) const; + int rowCount(const QModelIndex &parent) const override; + int columnCount(const QModelIndex &parent) const override; + QVariant data(const QModelIndex &index, int role) const override; + QVariant headerData(int section, Qt::Orientation orientation, int role) const override; + Qt::ItemFlags flags(const QModelIndex &index) const override; - int m_currentIndex; + int m_currentIndex = -1; QList< QPointer<DebuggerRunTool> > m_snapshots; }; diff --git a/src/plugins/debugger/snapshotwindow.h b/src/plugins/debugger/snapshotwindow.h index dfcdaf5e6a..a80284bacd 100644 --- a/src/plugins/debugger/snapshotwindow.h +++ b/src/plugins/debugger/snapshotwindow.h @@ -42,8 +42,8 @@ public: private: void rowActivated(const QModelIndex &index); void removeSnapshot(int i); - void keyPressEvent(QKeyEvent *ev); - void contextMenuEvent(QContextMenuEvent *ev); + void keyPressEvent(QKeyEvent *ev) override; + void contextMenuEvent(QContextMenuEvent *ev) override; SnapshotHandler *m_snapshotHandler; }; diff --git a/src/plugins/debugger/sourceagent.cpp b/src/plugins/debugger/sourceagent.cpp index f17f7e5928..d133081b46 100644 --- a/src/plugins/debugger/sourceagent.cpp +++ b/src/plugins/debugger/sourceagent.cpp @@ -62,15 +62,13 @@ public: public: QPointer<BaseTextEditor> editor; QPointer<DebuggerEngine> engine; - TextMark *locationMark; + TextMark *locationMark = nullptr; QString path; QString producer; }; SourceAgentPrivate::SourceAgentPrivate() - : editor(0) - , locationMark(nullptr) - , producer(QLatin1String("remote")) + : producer(QLatin1String("remote")) { } @@ -78,7 +76,7 @@ SourceAgentPrivate::~SourceAgentPrivate() { if (editor) EditorManager::closeDocument(editor->document()); - editor = 0; + editor = nullptr; delete locationMark; } @@ -135,7 +133,7 @@ void SourceAgent::updateLocationMarker() if (d->locationMark) d->editor->textDocument()->removeMark(d->locationMark); delete d->locationMark; - d->locationMark = 0; + d->locationMark = nullptr; if (d->engine->stackHandler()->currentFrame().file == d->path) { int lineNumber = d->engine->stackHandler()->currentFrame().line; diff --git a/src/plugins/debugger/sourcefileshandler.cpp b/src/plugins/debugger/sourcefileshandler.cpp index ba39fbd1b1..c7761c7b29 100644 --- a/src/plugins/debugger/sourcefileshandler.cpp +++ b/src/plugins/debugger/sourcefileshandler.cpp @@ -46,7 +46,7 @@ SourceFilesHandler::SourceFilesHandler(DebuggerEngine *engine) : m_engine(engine) { setObjectName("SourceFilesModel"); - QSortFilterProxyModel *proxy = new QSortFilterProxyModel(this); + auto proxy = new QSortFilterProxyModel(this); proxy->setObjectName("SourceFilesProxyModel"); proxy->setSourceModel(this); m_proxyModel = proxy; @@ -78,9 +78,9 @@ QVariant SourceFilesHandler::headerData(int section, Qt::ItemFlags SourceFilesHandler::flags(const QModelIndex &index) const { if (index.row() >= m_fullNames.size()) - return 0; + return nullptr; QFileInfo fi(m_fullNames.at(index.row())); - return fi.isReadable() ? QAbstractItemModel::flags(index) : Qt::ItemFlags(0); + return fi.isReadable() ? QAbstractItemModel::flags(index) : Qt::ItemFlags({}); } QVariant SourceFilesHandler::data(const QModelIndex &index, int role) const diff --git a/src/plugins/debugger/sourceutils.cpp b/src/plugins/debugger/sourceutils.cpp index 1184749c4e..dc42a69296 100644 --- a/src/plugins/debugger/sourceutils.cpp +++ b/src/plugins/debugger/sourceutils.cpp @@ -149,7 +149,7 @@ if (true) { \endcode */ -typedef QHash<QString, int> SeenHash; +using SeenHash = QHash<QString, int>; static void blockRecursion(const Overview &overview, const Scope *scope, @@ -182,27 +182,24 @@ static void blockRecursion(const Overview &overview, blockRecursion(overview, enclosingScope, line, uninitializedVariables, seenHash, level + 1); } -// Inline helper with integer error return codes. -static inline -int getUninitializedVariablesI(const Snapshot &snapshot, - const QString &functionName, - const QString &file, - int line, - QStringList *uninitializedVariables) +QStringList getUninitializedVariables(const Snapshot &snapshot, + const QString &functionName, + const QString &file, + int line) { - uninitializedVariables->clear(); + QStringList result; // Find document if (snapshot.isEmpty() || functionName.isEmpty() || file.isEmpty() || line < 1) - return 1; + return result; const Snapshot::const_iterator docIt = snapshot.find(file); if (docIt == snapshot.end()) - return 2; + return result; const Document::Ptr doc = docIt.value(); // Look at symbol at line and find its function. Either it is the // function itself or some expression/variable. const Symbol *symbolAtLine = doc->lastVisibleSymbolAt(line, 0); if (!symbolAtLine) - return 4; + return result; // First figure out the function to do a safety name check // and the innermost scope at cursor position const Function *function = nullptr; @@ -221,46 +218,25 @@ int getUninitializedVariablesI(const Snapshot &snapshot, } } if (!function || !innerMostScope) - return 7; + return result; // Compare function names with a bit off fuzz, // skipping modules from a CDB symbol "lib!foo" or namespaces // that the code model does not show at this point Overview overview; const QString name = overview.prettyName(function->name()); if (!functionName.endsWith(name)) - return 11; + return result; if (functionName.size() > name.size()) { const char previousChar = functionName.at(functionName.size() - name.size() - 1).toLatin1(); if (previousChar != ':' && previousChar != '!' ) - return 11; + return result; } // Starting from the innermost block scope, collect declarations. SeenHash seenHash; - blockRecursion(overview, innerMostScope, line, uninitializedVariables, &seenHash); - return 0; + blockRecursion(overview, innerMostScope, line, &result, &seenHash); + return result; } -bool getUninitializedVariables(const Snapshot &snapshot, - const QString &function, - const QString &file, - int line, - QStringList *uninitializedVariables) -{ - const int rc = getUninitializedVariablesI(snapshot, function, file, line, uninitializedVariables); - if (debug) { - QString msg; - QTextStream str(&msg); - str << "getUninitializedVariables() " << function << ' ' << file << ':' << line - << " returns (int) " << rc << " '" - << uninitializedVariables->join(QLatin1Char(',')) << '\''; - if (rc) - str << " of " << snapshot.size() << " documents"; - qDebug() << msg; - } - return rc == 0; -} - - QString cppFunctionAt(const QString &fileName, int line, int column) { const Snapshot snapshot = CppModelManager::instance()->snapshot(); diff --git a/src/plugins/debugger/sourceutils.h b/src/plugins/debugger/sourceutils.h index be19402844..a64c73295d 100644 --- a/src/plugins/debugger/sourceutils.h +++ b/src/plugins/debugger/sourceutils.h @@ -49,9 +49,8 @@ QString cppFunctionAt(const QString &fileName, int line, int column = 0); // Get variables that are not initialized at a certain line // of a function from the code model. Shadowed variables will // be reported using the debugger naming conventions '<shadowed n>' -bool getUninitializedVariables(const CPlusPlus::Snapshot &snapshot, - const QString &function, const QString &file, int line, - QStringList *uninitializedVariables); +QStringList getUninitializedVariables(const CPlusPlus::Snapshot &snapshot, + const QString &function, const QString &file, int line); ContextData getLocationContext(TextEditor::TextDocument *document, int lineNumber); diff --git a/src/plugins/debugger/stackframe.cpp b/src/plugins/debugger/stackframe.cpp index a92ea661d4..df69c284b4 100644 --- a/src/plugins/debugger/stackframe.cpp +++ b/src/plugins/debugger/stackframe.cpp @@ -44,9 +44,7 @@ namespace Internal { // //////////////////////////////////////////////////////////////////////// -StackFrame::StackFrame() - : language(CppLanguage), line(-1), address(0), usable(false) -{} +StackFrame::StackFrame() = default; void StackFrame::clear() { @@ -84,7 +82,7 @@ QList<StackFrame> StackFrame::parseFrames(const GdbMi &data, const DebuggerRunPa { StackFrames frames; frames.reserve(data.children().size()); - foreach (const GdbMi &item, data.children()) + for (const GdbMi &item : data.children()) frames.append(parseFrame(item, rp)); return frames; } diff --git a/src/plugins/debugger/stackframe.h b/src/plugins/debugger/stackframe.h index 916d578b52..e51736b518 100644 --- a/src/plugins/debugger/stackframe.h +++ b/src/plugins/debugger/stackframe.h @@ -53,21 +53,21 @@ public: void fixQrcFrame(const DebuggerRunParameters &rp); public: - DebuggerLanguage language; + DebuggerLanguage language = CppLanguage; QString level; QString function; QString file; // We try to put an absolute file name in there. QString module; // Sometimes something like "/usr/lib/libstdc++.so.6" QString receiver; // Used in ScriptEngine only. - qint32 line; - quint64 address; - bool usable; + qint32 line = -1; + quint64 address = 0; + bool usable = false; QString context; // Opaque value produced and consumed by the native backends. Q_DECLARE_TR_FUNCTIONS(Debugger::Internal::StackHandler) }; -typedef QList<StackFrame> StackFrames; +using StackFrames = QList<StackFrame>; } // namespace Internal } // namespace Debugger diff --git a/src/plugins/debugger/stackhandler.cpp b/src/plugins/debugger/stackhandler.cpp index a4f6c650e2..c4bb6630b0 100644 --- a/src/plugins/debugger/stackhandler.cpp +++ b/src/plugins/debugger/stackhandler.cpp @@ -77,9 +77,7 @@ StackHandler::StackHandler(DebuggerEngine *engine) this, &StackHandler::reloadFullStack); } -StackHandler::~StackHandler() -{ -} +StackHandler::~StackHandler() = default; int StackHandler::rowCount(const QModelIndex &parent) const { @@ -157,7 +155,7 @@ QVariant StackHandler::headerData(int section, Qt::Orientation orient, int role) Qt::ItemFlags StackHandler::flags(const QModelIndex &index) const { if (index.row() >= m_stackFrames.size() + m_canExpand) - return 0; + return nullptr; if (index.row() == m_stackFrames.size()) return QAbstractTableModel::flags(index); const StackFrame &frame = m_stackFrames.at(index.row()); @@ -361,7 +359,7 @@ void StackHandler::saveTaskFile() } QTextStream str(&file); - foreach (const StackFrame &frame, frames()) { + for (const StackFrame &frame : frames()) { if (frame.isUsable()) str << frame.file << '\t' << frame.line << "\tstack\tFrame #" << frame.level << '\n'; } diff --git a/src/plugins/debugger/threaddata.h b/src/plugins/debugger/threaddata.h index a011d88b81..e54d0f3771 100644 --- a/src/plugins/debugger/threaddata.h +++ b/src/plugins/debugger/threaddata.h @@ -41,7 +41,7 @@ namespace Internal { class ThreadId { public: - ThreadId() : m_id(-1) {} + ThreadId() = default; explicit ThreadId(qint64 id) : m_id(id) {} bool isValid() const { return m_id != -1; } @@ -50,7 +50,7 @@ public: bool operator!=(const ThreadId other) const { return m_id != other.m_id; } private: - qint64 m_id; + qint64 m_id = -1; }; //////////////////////////////////////////////////////////////////////// @@ -62,13 +62,7 @@ private: /*! A structure containing information about a single thread. */ struct ThreadData { - ThreadData() - { - frameLevel = -1; - lineNumber = -1; - address = 0; - stopped = true; - } + ThreadData() = default; enum { IdColumn, @@ -92,12 +86,12 @@ struct ThreadData QString groupId; QString targetId; QString core; - bool stopped; + bool stopped = true; // State information when stopped. - qint32 frameLevel; - qint32 lineNumber; - quint64 address; + qint32 frameLevel = -1; + qint32 lineNumber = -1; + quint64 address = 0; QString function; QString module; QString fileName; @@ -106,7 +100,7 @@ struct ThreadData QString name; }; -typedef QVector<ThreadData> Threads; +using Threads = QVector<ThreadData>; } // namespace Internal } // namespace Debugger diff --git a/src/plugins/debugger/threadshandler.cpp b/src/plugins/debugger/threadshandler.cpp index ef32e52df1..4ba1284fdb 100644 --- a/src/plugins/debugger/threadshandler.cpp +++ b/src/plugins/debugger/threadshandler.cpp @@ -62,7 +62,7 @@ public: : threadData(data), handler(handler) {} - QVariant data(int column, int role) const + QVariant data(int column, int role) const override { switch (role) { case Qt::DisplayRole: @@ -83,9 +83,9 @@ public: return QVariant(); } - Qt::ItemFlags flags(int column) const + Qt::ItemFlags flags(int column) const override { - return threadData.stopped ? TreeItem::flags(column) : Qt::ItemFlags(0); + return threadData.stopped ? TreeItem::flags(column) : Qt::ItemFlags({}); } QString threadToolTip() const @@ -233,7 +233,6 @@ public: ThreadsHandler::ThreadsHandler(DebuggerEngine *engine) : m_engine(engine) { - m_resetLocationScheduled = false; setObjectName(QLatin1String("ThreadsModel")); setHeader({ QLatin1String(" ") + tr("ID") + QLatin1String(" "), diff --git a/src/plugins/debugger/threadshandler.h b/src/plugins/debugger/threadshandler.h index 3bd015fc48..8f0b662afe 100644 --- a/src/plugins/debugger/threadshandler.h +++ b/src/plugins/debugger/threadshandler.h @@ -87,7 +87,7 @@ private: DebuggerEngine *m_engine; ThreadId m_currentId; - bool m_resetLocationScheduled; + bool m_resetLocationScheduled = false; QHash<QString, QString> m_pidForGroupId; }; diff --git a/src/plugins/debugger/unstartedappwatcherdialog.cpp b/src/plugins/debugger/unstartedappwatcherdialog.cpp index bca9a442e6..703c1ea5ba 100644 --- a/src/plugins/debugger/unstartedappwatcherdialog.cpp +++ b/src/plugins/debugger/unstartedappwatcherdialog.cpp @@ -57,8 +57,8 @@ namespace Internal { static bool isLocal(RunConfiguration *runConfiguration) { - Target *target = runConfiguration ? runConfiguration->target() : 0; - Kit *kit = target ? target->kit() : 0; + Target *target = runConfiguration ? runConfiguration->target() : nullptr; + Kit *kit = target ? target->kit() : nullptr; return DeviceTypeKitInformation::deviceTypeId(kit) == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE; } @@ -94,8 +94,8 @@ UnstartedAppWatcherDialog::UnstartedAppWatcherDialog(QWidget *parent) m_kitChooser->setVisible(true); Project *project = ProjectTree::currentProject(); - Target *activeTarget = project ? project->activeTarget() : 0; - Kit *kit = activeTarget ? activeTarget->kit() : 0; + Target *activeTarget = project ? project->activeTarget() : nullptr; + Kit *kit = activeTarget ? activeTarget->kit() : nullptr; if (kit) m_kitChooser->setCurrentKitId(kit->id()); @@ -140,14 +140,14 @@ UnstartedAppWatcherDialog::UnstartedAppWatcherDialog(QWidget *parent) m_waitingLabel = new QLabel(QString(), this); m_waitingLabel->setAlignment(Qt::AlignCenter); - QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, this); + auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, this); m_watchingPushButton = buttonBox->addButton(tr("Start Watching"), QDialogButtonBox::ActionRole); m_watchingPushButton->setCheckable(true); m_watchingPushButton->setChecked(false); m_watchingPushButton->setEnabled(false); m_watchingPushButton->setDefault(true); - QFormLayout *mainLayout = new QFormLayout(this); + auto mainLayout = new QFormLayout(this); mainLayout->addRow(new QLabel(tr("Kit: "), this), m_kitChooser); mainLayout->addRow(new QLabel(tr("Executable: "), this), pathLayout); mainLayout->addRow(m_hideOnAttachCheckBox); @@ -177,7 +177,7 @@ UnstartedAppWatcherDialog::UnstartedAppWatcherDialog(QWidget *parent) bool UnstartedAppWatcherDialog::event(QEvent *e) { if (e->type() == QEvent::ShortcutOverride) { - QKeyEvent *ke = static_cast<QKeyEvent *>(e); + auto ke = static_cast<QKeyEvent *>(e); if (ke->key() == Qt::Key_Escape && !ke->modifiers()) { ke->accept(); return true; @@ -191,7 +191,7 @@ void UnstartedAppWatcherDialog::selectExecutable() QString path; Project *project = ProjectTree::currentProject(); - Target *activeTarget = project ? project->activeTarget() : 0; + Target *activeTarget = project ? project->activeTarget() : nullptr; if (activeTarget) { if (RunConfiguration *runConfig = activeTarget->activeRunConfiguration()) { diff --git a/src/plugins/debugger/watchdata.cpp b/src/plugins/debugger/watchdata.cpp index d6f9ca8c64..128b790f30 100644 --- a/src/plugins/debugger/watchdata.cpp +++ b/src/plugins/debugger/watchdata.cpp @@ -236,9 +236,9 @@ public: void decodeArrayHelper(int childSize) { const QByteArray ba = QByteArray::fromHex(rawData.toUtf8()); - const T *p = (const T *) ba.data(); + const auto p = (const T*)ba.data(); for (int i = 0, n = ba.size() / sizeof(T); i < n; ++i) { - WatchItem *child = new WatchItem; + auto child = new WatchItem; child->arrayIndex = i; child->value = decodeItemHelper(p[i]); child->size = childSize; @@ -409,7 +409,7 @@ void WatchItem::parseHelper(const GdbMi &input, bool maySort) for (int i = 0, n = int(children.children().size()); i != n; ++i) { const GdbMi &subinput = children.children().at(i); - WatchItem *child = new WatchItem; + auto child = new WatchItem; if (childType.isValid()) child->type = childType.data(); if (childNumChild.isValid()) @@ -505,7 +505,7 @@ QString WatchItem::toToolTip() const if (arrayIndex >= 0) formatToolTipRow(str, tr("Array Index"), QString::number(arrayIndex)); if (size) - formatToolTipRow(str, tr("Static Object Size"), tr("%n bytes", 0, size)); + formatToolTipRow(str, tr("Static Object Size"), tr("%n bytes", nullptr, size)); formatToolTipRow(str, tr("Internal ID"), internalName()); str << "</table></body></html>"; return res; diff --git a/src/plugins/debugger/watchdelegatewidgets.cpp b/src/plugins/debugger/watchdelegatewidgets.cpp index 3bbda65996..4a6d9bbba4 100644 --- a/src/plugins/debugger/watchdelegatewidgets.cpp +++ b/src/plugins/debugger/watchdelegatewidgets.cpp @@ -58,7 +58,7 @@ class IntegerValidator : public QValidator { public: explicit IntegerValidator(QObject *parent); - virtual State validate(QString &, int &) const; + State validate(QString &, int &) const override; int base() const { return m_base; } void setBase(int b) { m_base = b; } diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index 17afe1b407..3b72e428d8 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -102,15 +102,15 @@ const char KeyProperty[] = "KeyProperty"; static QVariant createItemDelegate(); -typedef QList<MemoryMarkup> MemoryMarkupList; +using MemoryMarkupList = QList<MemoryMarkup>; // Helper functionality to indicate the area of a member variable in // a vector representing the memory area by a unique color // number and tooltip. Parts of it will be overwritten when recursing // over the children. -typedef QPair<int, QString> ColorNumberToolTip; -typedef QVector<ColorNumberToolTip> ColorNumberToolTips; +using ColorNumberToolTip = QPair<int, QString>; +using ColorNumberToolTips = QVector<ColorNumberToolTip>; struct TypeInfo { @@ -126,7 +126,7 @@ static const WatchModel *watchModel(const WatchItem *item) template <class T> void readNumericVectorHelper(std::vector<double> *v, const QByteArray &ba) { - const T *p = (const T *) ba.data(); + const auto p = (const T*)ba.data(); const int n = ba.size() / sizeof(T); v->resize(n); // Losing precision in case of 64 bit ints is ok here, as the result @@ -292,7 +292,7 @@ public: setSessionValue("DebuggerSeparateWidgetGeometry", geometry()); } - ~SeparatedView() + ~SeparatedView() override { saveGeometry(); } @@ -332,7 +332,7 @@ public: if (key == needle) return w; } - return 0; + return nullptr; } template <class T> T *prepareObject(const WatchItem *item) @@ -530,7 +530,7 @@ static QString parentName(const QString &iname) static QString niceTypeHelper(const QString &typeIn) { - typedef QMap<QString, QString> Cache; + using Cache = QMap<QString, QString>; static Cache cache; const Cache::const_iterator it = cache.constFind(typeIn); if (it != cache.constEnd()) @@ -651,7 +651,7 @@ static QString quoteUnprintable(const QString &str) QString encoded; if (theUnprintableBase == -1) { - foreach (const QChar c, str) { + for (const QChar c : str) { int u = c.unicode(); if (c.isPrint()) encoded += c; @@ -667,7 +667,7 @@ static QString quoteUnprintable(const QString &str) return encoded; } - foreach (const QChar c, str) { + for (const QChar c : str) { if (c.isPrint()) encoded += c; else if (theUnprintableBase == 8) @@ -766,7 +766,7 @@ static inline quint64 pointerValue(QString data) if (blankPos != -1) data.truncate(blankPos); data.remove('`'); - return data.toULongLong(0, 0); + return data.toULongLong(nullptr, 0); } // Return the type used for editing @@ -1067,8 +1067,8 @@ bool WatchModel::setData(const QModelIndex &idx, const QVariant &value, int role if (auto dev = ev.as<QDropEvent>()) { if (dev->mimeData()->hasText()) { QString exp; - QString data = dev->mimeData()->text(); - foreach (const QChar c, data) + const QString data = dev->mimeData()->text(); + for (const QChar c : data) exp.append(c.isPrint() ? c : QChar(' ')); m_handler->watchVariable(exp); //ev->acceptProposedAction(); @@ -1156,7 +1156,7 @@ bool WatchModel::setData(const QModelIndex &idx, const QVariant &value, int role Qt::ItemFlags WatchModel::flags(const QModelIndex &idx) const { if (!idx.isValid()) - return 0; + return nullptr; const WatchItem *item = nonRootItemForIndex(idx); if (!item) @@ -1783,6 +1783,12 @@ QMenu *WatchModel::createMemoryMenu(WatchItem *item, QWidget *parent) createPointerActions, [this, item, pos] { addVariableMemoryView(true, item, true, pos); }); + addAction(menu, tr("Open Memory View Showing Stack Layout"), + true, + [this, pos] { addStackLayoutMemoryView(true, pos); }); + + menu->addSeparator(); + addAction(menu, tr("Open Memory Editor at Object's Address (0x%1)").arg(item->address, 0, 16), tr("Open Memory Editor at Object's Address"), item->address, @@ -1793,9 +1799,8 @@ QMenu *WatchModel::createMemoryMenu(WatchItem *item, QWidget *parent) createPointerActions, [this, item, pos] { addVariableMemoryView(false, item, true, pos); }); - addAction(menu, tr("Open Memory Editor Showing Stack Layout"), - item && item->isLocal(), + true, [this, pos] { addStackLayoutMemoryView(false, pos); }); addAction(menu, tr("Open Memory Editor..."), @@ -1853,7 +1858,7 @@ QMenu *WatchModel::createFormatMenu(WatchItem *item, QWidget *parent) [this, iname] { // FIXME: Extend to multi-selection. //const QModelIndexList active = activeRows(); - //foreach (const QModelIndex &idx, active) + //for (const QModelIndex &idx : active) // setModelData(LocalsIndividualFormatRole, AutomaticFormat, idx); setIndividualFormat(iname, AutomaticFormat); m_engine->updateLocals(); @@ -1873,7 +1878,7 @@ QMenu *WatchModel::createFormatMenu(WatchItem *item, QWidget *parent) addCheckableAction(menu, spacer + tr("Automatic"), true, typeFormat == AutomaticFormat, [this, item] { //const QModelIndexList active = activeRows(); - //foreach (const QModelIndex &idx, active) + //for (const QModelIndex &idx : active) // setModelData(LocalsTypeFormatRole, AutomaticFormat, idx); setTypeFormat(item->type, AutomaticFormat); m_engine->updateLocals(); @@ -1892,7 +1897,7 @@ QMenu *WatchModel::createFormatMenu(WatchItem *item, QWidget *parent) static inline QString msgArrayFormat(int n) { - return WatchModel::tr("Array of %n items", 0, n); + return WatchModel::tr("Array of %n items", nullptr, n); } QString WatchModel::nameForFormat(int format) @@ -1955,7 +1960,7 @@ WatchHandler::~WatchHandler() // Do it manually to prevent calling back in model destructors // after m_cache is destroyed. delete m_model; - m_model = 0; + m_model = nullptr; } void WatchHandler::cleanup() @@ -1982,7 +1987,7 @@ void WatchHandler::insertItems(const GdbMi &data) QSet<WatchItem *> itemsToSort; const bool sortStructMembers = boolSetting(SortStructMembers); - foreach (const GdbMi &child, data.children()) { + for (const GdbMi &child : data.children()) { auto item = new WatchItem; item->parse(child, sortStructMembers); const TypeInfo ti = m_model->m_reportedTypeInfo.value(item->type); @@ -2262,7 +2267,7 @@ void WatchModel::showEditValue(const WatchItem *item) QTC_ASSERT(0 < imformat && imformat < 32, return); QImage im(width, height, QImage::Format(imformat)); std::memcpy(im.bits(), bits, nbytes); - ImageViewer *v = m_separatedView->prepareObject<ImageViewer>(item); + auto v = m_separatedView->prepareObject<ImageViewer>(item); v->setInfo(item->address ? tr("%1 Object at %2").arg(item->type, item->hexAddress()) : tr("%1 Object at Unknown Address").arg(item->type) + " " + @@ -2302,7 +2307,7 @@ void WatchModel::showEditValue(const WatchItem *item) QTC_ASSERT(ndims == 2, qDebug() << "Display format: " << format; return); QByteArray ba = QByteArray::fromHex(item->editvalue.toUtf8()); - void (*reader)(const char *p, QString *res, int size) = 0; + void (*reader)(const char *p, QString *res, int size) = nullptr; if (innerType == "int") reader = &readOne<qlonglong>; else if (innerType == "uint") @@ -2422,7 +2427,7 @@ const WatchItem *WatchHandler::findCppLocalVariable(const QString &name) const // iname.insert(localsPrefix.size(), "this."); // if (const WatchData *wd = findData(iname)) // return wd; - return 0; + return nullptr; } void WatchModel::setTypeFormat(const QString &type0, int format) @@ -2574,7 +2579,7 @@ void WatchHandler::appendWatchersAndTooltipRequests(DebuggerCommand *cmd) void WatchHandler::addDumpers(const GdbMi &dumpers) { - foreach (const GdbMi &dumper, dumpers.children()) { + for (const GdbMi &dumper : dumpers.children()) { DisplayFormats formats; formats.append(RawFormat); QString reportedFormats = dumper["formats"].data(); @@ -2641,7 +2646,7 @@ QSet<QString> WatchHandler::expandedINames() const void WatchHandler::recordTypeInfo(const GdbMi &typeInfo) { if (typeInfo.type() == GdbMi::List) { - foreach (const GdbMi &s, typeInfo.children()) { + for (const GdbMi &s : typeInfo.children()) { QString typeName = fromHex(s["name"].data()); TypeInfo ti(s["size"].data().toUInt()); m_model->m_reportedTypeInfo.insert(typeName, ti); @@ -2661,15 +2666,15 @@ public: QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index) const override { - const WatchModelBase *model = qobject_cast<const WatchModelBase *>(index.model()); - QTC_ASSERT(model, return 0); + const auto model = qobject_cast<const WatchModelBase *>(index.model()); + QTC_ASSERT(model, return nullptr); WatchItem *item = model->nonRootItemForIndex(index); - QTC_ASSERT(item, return 0); + QTC_ASSERT(item, return nullptr); // Value column: Custom editor. Apply integer-specific settings. if (index.column() == 1) { - QVariant::Type editType = QVariant::Type(item->editType()); + auto editType = QVariant::Type(item->editType()); if (editType == QVariant::Bool) return new BooleanComboBox(parent); diff --git a/src/plugins/debugger/watchhandler.h b/src/plugins/debugger/watchhandler.h index ee2f9a6d62..9a289ef7c4 100644 --- a/src/plugins/debugger/watchhandler.h +++ b/src/plugins/debugger/watchhandler.h @@ -37,14 +37,14 @@ class DebuggerCommand; class DebuggerEngine; class WatchModel; -typedef QVector<DisplayFormat> DisplayFormats; +using DisplayFormats = QVector<DisplayFormat>; class WatchModelBase : public Utils::TreeModel<WatchItem, WatchItem> { Q_OBJECT public: - WatchModelBase() {} + WatchModelBase() = default; signals: void currentIndexRequested(const QModelIndex &idx); diff --git a/src/plugins/debugger/watchwindow.cpp b/src/plugins/debugger/watchwindow.cpp index 008250f3e7..cf31ff7187 100644 --- a/src/plugins/debugger/watchwindow.cpp +++ b/src/plugins/debugger/watchwindow.cpp @@ -41,7 +41,7 @@ namespace Debugger { namespace Internal { WatchTreeView::WatchTreeView(WatchType type) - : m_type(type), m_sliderPosition(0) + : m_type(type) { setObjectName("WatchWindow"); setWindowTitle(tr("Locals and Expressions")); diff --git a/src/plugins/debugger/watchwindow.h b/src/plugins/debugger/watchwindow.h index 7827b32232..bd75e00549 100644 --- a/src/plugins/debugger/watchwindow.h +++ b/src/plugins/debugger/watchwindow.h @@ -62,7 +62,7 @@ private: void currentChanged(const QModelIndex ¤t, const QModelIndex &previous) override; WatchType m_type; - int m_sliderPosition; + int m_sliderPosition = 0; }; } // namespace Internal diff --git a/src/plugins/designer/codemodelhelpers.cpp b/src/plugins/designer/codemodelhelpers.cpp index b0b575f2cb..9f376a114a 100644 --- a/src/plugins/designer/codemodelhelpers.cpp +++ b/src/plugins/designer/codemodelhelpers.cpp @@ -64,7 +64,7 @@ public: explicit SearchFunction(const char *name); FunctionList operator()(const DocumentPtr &doc); - virtual bool visit(CPlusPlus::Function * f); + bool visit(CPlusPlus::Function * f) override; private: const size_t m_length; diff --git a/src/plugins/designer/formeditorplugin.cpp b/src/plugins/designer/formeditorplugin.cpp index 5198582c20..3972bd8f30 100644 --- a/src/plugins/designer/formeditorplugin.cpp +++ b/src/plugins/designer/formeditorplugin.cpp @@ -160,8 +160,6 @@ static QString otherFile() if (current.isEmpty()) return QString(); const Utils::MimeType currentMimeType = Utils::mimeTypeForFile(current); - if (!currentMimeType.isValid()) - return QString(); // Determine potential suffixes of candidate files // 'ui' -> 'cpp', 'cpp/h' -> 'ui'. QStringList candidateSuffixes; diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index 9407684c20..bf98680f5d 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -910,7 +910,7 @@ QDebug operator<<(QDebug ts, const Range &range) ExCommand::ExCommand(const QString &c, const QString &a, const Range &r) - : cmd(c), hasBang(false), args(a), range(r), count(1) + : cmd(c), args(a), range(r) {} bool ExCommand::matches(const QString &min, const QString &full) const diff --git a/src/plugins/fakevim/fakevimhandler.h b/src/plugins/fakevim/fakevimhandler.h index 153cf83d50..25ce463554 100644 --- a/src/plugins/fakevim/fakevimhandler.h +++ b/src/plugins/fakevim/fakevimhandler.h @@ -158,7 +158,6 @@ public: Signal<void(const QString &msg)> extraInformationChanged; Signal<void(const QList<QTextEdit::ExtraSelection> &selection)> selectionChanged; Signal<void(const QString &needle)> highlightMatches; - Signal<void(QString *error)> writeAllRequested; Signal<void(bool *moved, bool *forward, QTextCursor *cursor)> moveToMatchingParenthesis; Signal<void(bool *result, QChar c)> checkForElectricCharacter; Signal<void(int beginLine, int endLine, QChar typedChar)> indentRegion; diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp index 5c267e2b8b..443b36f4d9 100644 --- a/src/plugins/fakevim/fakevimplugin.cpp +++ b/src/plugins/fakevim/fakevimplugin.cpp @@ -1677,13 +1677,13 @@ void FakeVimPluginPrivate::editorOpened(IEditor *editor) triggerAction(Core::Constants::SPLIT_SIDE_BY_SIDE); else if (key == "W" || key == "<C-W>") triggerAction(Core::Constants::GOTO_NEXT_SPLIT); - else if (key.contains("RIGHT") || key == "L" || key == "<S-L>") + else if (key.contains("RIGHT") || key == "L" || key == "<S-L>" || key == "<C-L>") moveSomewhere(handler, &moveRightWeight, key == "<S-L>" ? -1 : count); - else if (key.contains("LEFT") || key == "H" || key == "<S-H>") + else if (key.contains("LEFT") || key == "H" || key == "<S-H>" || key == "<C-H>") moveSomewhere(handler, &moveLeftWeight, key == "<S-H>" ? -1 : count); - else if (key.contains("UP") || key == "K" || key == "<S-K>") + else if (key.contains("UP") || key == "K" || key == "<S-K>" || key == "<C-K>") moveSomewhere(handler, &moveUpWeight, key == "<S-K>" ? -1 : count); - else if (key.contains("DOWN") || key == "J" || key == "<S-J>") + else if (key.contains("DOWN") || key == "J" || key == "<S-J>" || key == "<C-J>") moveSomewhere(handler, &moveDownWeight, key == "<S-J>" ? -1 : count); else qDebug() << "UNKNOWN WINDOW COMMAND: <C-W>" << map; @@ -1921,14 +1921,16 @@ void FakeVimPluginPrivate::handleExCommand(FakeVimHandler *handler, bool *handle if (!saved) handler->showMessage(MessageError, Tr::tr("File not saved")); - } else if (cmd.matches("wa", "wall")) { - // :w[all] + } else if (cmd.matches("wa", "wall") || cmd.matches("wqa", "wqall")) { + // :wa[ll] :wqa[ll] triggerAction(Core::Constants::SAVEALL); const QList<IDocument *> failed = DocumentManager::modifiedDocuments(); if (failed.isEmpty()) handler->showMessage(MessageInfo, Tr::tr("Saving succeeded")); else handler->showMessage(MessageError, Tr::tr("%n files not saved", 0, failed.size())); + if (cmd.matches("wqa", "wqall")) + emit delayedQuitAllRequested(cmd.hasBang); } else if (cmd.matches("q", "quit")) { // :q[uit] emit delayedQuitRequested(cmd.hasBang, m_editorToHandler.key(handler)); diff --git a/src/plugins/genericprojectmanager/genericmakestep.cpp b/src/plugins/genericprojectmanager/genericmakestep.cpp index 37951d0308..9753140156 100644 --- a/src/plugins/genericprojectmanager/genericmakestep.cpp +++ b/src/plugins/genericprojectmanager/genericmakestep.cpp @@ -25,282 +25,19 @@ #include "genericmakestep.h" #include "genericprojectconstants.h" -#include "genericproject.h" -#include "ui_genericmakestep.h" -#include "genericbuildconfiguration.h" -#include <projectexplorer/buildsteplist.h> -#include <projectexplorer/gnumakeparser.h> -#include <projectexplorer/kitinformation.h> -#include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorerconstants.h> -#include <projectexplorer/target.h> -#include <projectexplorer/toolchain.h> -#include <qtsupport/qtkitinformation.h> -#include <qtsupport/qtparser.h> - -#include <utils/stringutils.h> -#include <utils/qtcassert.h> -#include <utils/qtcprocess.h> - -#include <QDir> - -using namespace Core; using namespace ProjectExplorer; namespace GenericProjectManager { namespace Internal { const char GENERIC_MS_ID[] = "GenericProjectManager.GenericMakeStep"; -const char GENERIC_MS_DISPLAY_NAME[] = QT_TRANSLATE_NOOP("GenericProjectManager::Internal::GenericMakeStep", - "Make"); - -const char BUILD_TARGETS_KEY[] = "GenericProjectManager.GenericMakeStep.BuildTargets"; -const char MAKE_ARGUMENTS_KEY[] = "GenericProjectManager.GenericMakeStep.MakeArguments"; -const char MAKE_COMMAND_KEY[] = "GenericProjectManager.GenericMakeStep.MakeCommand"; -const char CLEAN_KEY[] = "GenericProjectManager.GenericMakeStep.Clean"; GenericMakeStep::GenericMakeStep(BuildStepList *parent, const QString &buildTarget) - : AbstractProcessStep(parent, GENERIC_MS_ID) -{ - setDefaultDisplayName(QCoreApplication::translate("GenericProjectManager::Internal::GenericMakeStep", - GENERIC_MS_DISPLAY_NAME)); - setBuildTarget(buildTarget, true); -} - -bool GenericMakeStep::init(QList<const BuildStep *> &earlierSteps) -{ - BuildConfiguration *bc = buildConfiguration(); - if (!bc) - bc = target()->activeBuildConfiguration(); - if (!bc) - emit addTask(Task::buildConfigurationMissingTask()); - - ToolChain *tc = ToolChainKitInformation::toolChain(target()->kit(), ProjectExplorer::Constants::CXX_LANGUAGE_ID); - if (!tc) - emit addTask(Task::compilerMissingTask()); - - if (!bc || !tc) { - emitFaultyConfigurationMessage(); - return false; - } - - ProcessParameters *pp = processParameters(); - pp->setMacroExpander(bc->macroExpander()); - pp->setWorkingDirectory(bc->buildDirectory().toString()); - Utils::Environment env = bc->environment(); - Utils::Environment::setupEnglishOutput(&env); - pp->setEnvironment(env); - pp->setCommand(makeCommand(bc->environment())); - pp->setArguments(allArguments()); - pp->resolveAll(); - - // If we are cleaning, then make can fail with an error code, but that doesn't mean - // we should stop the clean queue - // That is mostly so that rebuild works on an already clean project - setIgnoreReturnValue(m_clean); - - setOutputParser(new GnuMakeParser()); - IOutputParser *parser = target()->kit()->createOutputParser(); - if (parser) - appendOutputParser(parser); - outputParser()->setWorkingDirectory(pp->effectiveWorkingDirectory()); - - return AbstractProcessStep::init(earlierSteps); -} - -void GenericMakeStep::setClean(bool clean) -{ - m_clean = clean; -} - -bool GenericMakeStep::isClean() const -{ - return m_clean; -} - -QVariantMap GenericMakeStep::toMap() const -{ - QVariantMap map(AbstractProcessStep::toMap()); - - map.insert(BUILD_TARGETS_KEY, m_buildTargets); - map.insert(MAKE_ARGUMENTS_KEY, m_makeArguments); - map.insert(MAKE_COMMAND_KEY, m_makeCommand); - map.insert(CLEAN_KEY, m_clean); - return map; -} - -bool GenericMakeStep::fromMap(const QVariantMap &map) -{ - m_buildTargets = map.value(BUILD_TARGETS_KEY).toStringList(); - m_makeArguments = map.value(MAKE_ARGUMENTS_KEY).toString(); - m_makeCommand = map.value(MAKE_COMMAND_KEY).toString(); - m_clean = map.value(CLEAN_KEY).toBool(); - - return BuildStep::fromMap(map); -} - -QString GenericMakeStep::allArguments() const -{ - QString args = m_makeArguments; - Utils::QtcProcess::addArgs(&args, m_buildTargets); - return args; -} - -QString GenericMakeStep::makeCommand(const Utils::Environment &environment) const -{ - QString command = m_makeCommand; - if (command.isEmpty()) { - ToolChain *tc = ToolChainKitInformation::toolChain(target()->kit(), ProjectExplorer::Constants::CXX_LANGUAGE_ID); - if (tc) - command = tc->makeCommand(environment); - else - command = "make"; - } - return command; -} - -void GenericMakeStep::run(QFutureInterface<bool> &fi) -{ - AbstractProcessStep::run(fi); -} - -BuildStepConfigWidget *GenericMakeStep::createConfigWidget() -{ - return new GenericMakeStepConfigWidget(this); -} - -bool GenericMakeStep::immutable() const -{ - return false; -} - -bool GenericMakeStep::buildsTarget(const QString &target) const -{ - return m_buildTargets.contains(target); -} - -void GenericMakeStep::setBuildTarget(const QString &target, bool on) -{ - QStringList old = m_buildTargets; - if (on && !old.contains(target)) - old << target; - else if (!on && old.contains(target)) - old.removeOne(target); - - m_buildTargets = old; -} - -// -// GenericMakeStepConfigWidget -// - -GenericMakeStepConfigWidget::GenericMakeStepConfigWidget(GenericMakeStep *makeStep) : - m_makeStep(makeStep) -{ - m_ui = new Ui::GenericMakeStep; - m_ui->setupUi(this); - - const auto pro = static_cast<GenericProject *>(m_makeStep->target()->project()); - const auto buildTargets = pro->buildTargets(); - for (const QString &target : buildTargets) { - auto item = new QListWidgetItem(target, m_ui->targetsList); - item->setFlags(item->flags() | Qt::ItemIsUserCheckable); - item->setCheckState(m_makeStep->buildsTarget(item->text()) ? Qt::Checked : Qt::Unchecked); - } - - m_ui->makeLineEdit->setText(m_makeStep->m_makeCommand); - m_ui->makeArgumentsLineEdit->setText(m_makeStep->m_makeArguments); - updateMakeOverrideLabel(); - updateDetails(); - - connect(m_ui->targetsList, &QListWidget::itemChanged, - this, &GenericMakeStepConfigWidget::itemChanged); - connect(m_ui->makeLineEdit, &QLineEdit::textEdited, - this, &GenericMakeStepConfigWidget::makeLineEditTextEdited); - connect(m_ui->makeArgumentsLineEdit, &QLineEdit::textEdited, - this, &GenericMakeStepConfigWidget::makeArgumentsLineEditTextEdited); - - connect(ProjectExplorerPlugin::instance(), &ProjectExplorerPlugin::settingsChanged, - this, &GenericMakeStepConfigWidget::updateMakeOverrideLabel); - connect(ProjectExplorerPlugin::instance(), &ProjectExplorerPlugin::settingsChanged, - this, &GenericMakeStepConfigWidget::updateDetails); - - connect(m_makeStep->target(), &Target::kitChanged, - this, &GenericMakeStepConfigWidget::updateMakeOverrideLabel); - - pro->subscribeSignal(&BuildConfiguration::environmentChanged, this, [this]() { - if (static_cast<BuildConfiguration *>(sender())->isActive()) { - updateMakeOverrideLabel(); - updateDetails(); - } - }); - connect(pro, &Project::activeProjectConfigurationChanged, - this, [this](ProjectConfiguration *pc) { - if (pc && pc->isActive()) { - updateMakeOverrideLabel(); - updateDetails(); - } - }); -} - -GenericMakeStepConfigWidget::~GenericMakeStepConfigWidget() -{ - delete m_ui; -} - -QString GenericMakeStepConfigWidget::displayName() const -{ - return tr("Make", "GenericMakestep display name."); -} - -void GenericMakeStepConfigWidget::updateMakeOverrideLabel() -{ - BuildConfiguration *bc = m_makeStep->buildConfiguration(); - if (!bc) - bc = m_makeStep->target()->activeBuildConfiguration(); - - m_ui->makeLabel->setText(tr("Override %1:").arg(QDir::toNativeSeparators(m_makeStep->makeCommand(bc->environment())))); -} - -void GenericMakeStepConfigWidget::updateDetails() -{ - BuildConfiguration *bc = m_makeStep->buildConfiguration(); - if (!bc) - bc = m_makeStep->target()->activeBuildConfiguration(); - - ProcessParameters param; - param.setMacroExpander(bc->macroExpander()); - param.setWorkingDirectory(bc->buildDirectory().toString()); - param.setEnvironment(bc->environment()); - param.setCommand(m_makeStep->makeCommand(bc->environment())); - param.setArguments(m_makeStep->allArguments()); - m_summaryText = param.summary(displayName()); - emit updateSummary(); -} - -QString GenericMakeStepConfigWidget::summaryText() const -{ - return m_summaryText; -} - -void GenericMakeStepConfigWidget::itemChanged(QListWidgetItem *item) -{ - m_makeStep->setBuildTarget(item->text(), item->checkState() & Qt::Checked); - updateDetails(); -} - -void GenericMakeStepConfigWidget::makeLineEditTextEdited() -{ - m_makeStep->m_makeCommand = m_ui->makeLineEdit->text(); - updateDetails(); -} - -void GenericMakeStepConfigWidget::makeArgumentsLineEditTextEdited() + : MakeStep(parent, GENERIC_MS_ID, buildTarget, {"all", "clean"}) { - m_makeStep->m_makeArguments = m_ui->makeArgumentsLineEdit->text(); - updateDetails(); } // @@ -315,8 +52,7 @@ GenericMakeAllStepFactory::GenericMakeAllStepFactory() }; registerStep<Step>(GENERIC_MS_ID); - setDisplayName(QCoreApplication::translate( - "GenericProjectManager::Internal::GenericMakeStep", GENERIC_MS_DISPLAY_NAME)); + setDisplayName(MakeStep::defaultDisplayName()); setSupportedProjectType(Constants::GENERICPROJECT_ID); setSupportedStepLists({ProjectExplorer::Constants::BUILDSTEPS_BUILD, ProjectExplorer::Constants::BUILDSTEPS_DEPLOY}); @@ -338,8 +74,7 @@ GenericMakeCleanStepFactory::GenericMakeCleanStepFactory() }; registerStep<Step>(GENERIC_MS_ID); - setDisplayName(QCoreApplication::translate( - "GenericProjectManager::Internal::GenericMakeStep", GENERIC_MS_DISPLAY_NAME)); + setDisplayName(MakeStep::defaultDisplayName()); setSupportedProjectType(Constants::GENERICPROJECT_ID); setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); } diff --git a/src/plugins/genericprojectmanager/genericmakestep.h b/src/plugins/genericprojectmanager/genericmakestep.h index 8a5758b100..6fe6bc4798 100644 --- a/src/plugins/genericprojectmanager/genericmakestep.h +++ b/src/plugins/genericprojectmanager/genericmakestep.h @@ -25,70 +25,19 @@ #pragma once -#include <projectexplorer/abstractprocessstep.h> +#include <projectexplorer/makestep.h> QT_FORWARD_DECLARE_CLASS(QListWidgetItem); namespace GenericProjectManager { namespace Internal { -class GenericMakeStepConfigWidget; - -namespace Ui { class GenericMakeStep; } - -class GenericMakeStep : public ProjectExplorer::AbstractProcessStep +class GenericMakeStep : public ProjectExplorer::MakeStep { Q_OBJECT - friend class GenericMakeStepConfigWidget; - public: explicit GenericMakeStep(ProjectExplorer::BuildStepList *parent, const QString &buildTarget = {}); - - bool init(QList<const BuildStep *> &earlierSteps) override; - void run(QFutureInterface<bool> &fi) override; - - ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override; - bool immutable() const override; - bool buildsTarget(const QString &target) const; - void setBuildTarget(const QString &target, bool on); - QString allArguments() const; - QString makeCommand(const Utils::Environment &environment) const; - - void setClean(bool clean); - bool isClean() const; - -private: - QVariantMap toMap() const override; - bool fromMap(const QVariantMap &map) override; - - QStringList m_buildTargets; - QString m_makeArguments; - QString m_makeCommand; - bool m_clean = false; -}; - -class GenericMakeStepConfigWidget : public ProjectExplorer::BuildStepConfigWidget -{ - Q_OBJECT - -public: - explicit GenericMakeStepConfigWidget(GenericMakeStep *makeStep); - ~GenericMakeStepConfigWidget() override; - - QString displayName() const override; - QString summaryText() const override; - -private: - void itemChanged(QListWidgetItem *item); - void makeLineEditTextEdited(); - void makeArgumentsLineEditTextEdited(); - void updateMakeOverrideLabel(); - void updateDetails(); - - Ui::GenericMakeStep *m_ui; - GenericMakeStep *m_makeStep; - QString m_summaryText; }; class GenericMakeAllStepFactory : public ProjectExplorer::BuildStepFactory diff --git a/src/plugins/genericprojectmanager/genericmakestep.ui b/src/plugins/genericprojectmanager/genericmakestep.ui deleted file mode 100644 index f3b7d9c8ac..0000000000 --- a/src/plugins/genericprojectmanager/genericmakestep.ui +++ /dev/null @@ -1,63 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>GenericProjectManager::Internal::GenericMakeStep</class> - <widget class="QWidget" name="GenericProjectManager::Internal::GenericMakeStep"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>399</width> - <height>279</height> - </rect> - </property> - <layout class="QFormLayout" name="formLayout"> - <property name="fieldGrowthPolicy"> - <enum>QFormLayout::ExpandingFieldsGrow</enum> - </property> - <property name="margin"> - <number>0</number> - </property> - <item row="0" column="0"> - <widget class="QLabel" name="makeLabel"> - <property name="text"> - <string>Override %1:</string> - </property> - <property name="buddy"> - <cstring>makeLineEdit</cstring> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QLineEdit" name="makeLineEdit"/> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="makeArgumentsLabel"> - <property name="text"> - <string>Make arguments:</string> - </property> - <property name="buddy"> - <cstring>makeArgumentsLineEdit</cstring> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QLineEdit" name="makeArgumentsLineEdit"/> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="targetsLabel"> - <property name="text"> - <string>Targets:</string> - </property> - <property name="buddy"> - <cstring>targetsList</cstring> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QListWidget" name="targetsList"/> - </item> - </layout> - </widget> - <resources/> - <connections/> -</ui> diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp index 10d8867b7e..f1a47947eb 100644 --- a/src/plugins/genericprojectmanager/genericproject.cpp +++ b/src/plugins/genericprojectmanager/genericproject.cpp @@ -475,12 +475,6 @@ void GenericProject::activeBuildConfigurationWasChanged() refresh(Everything); } -QStringList GenericProject::buildTargets() const -{ - const QStringList targets = { "all", "clean" }; - return targets; -} - Project::RestoreResult GenericProject::fromMap(const QVariantMap &map, QString *errorMessage) { const RestoreResult result = Project::fromMap(map, errorMessage); diff --git a/src/plugins/genericprojectmanager/genericproject.h b/src/plugins/genericprojectmanager/genericproject.h index 2a294ba917..28002743f8 100644 --- a/src/plugins/genericprojectmanager/genericproject.h +++ b/src/plugins/genericprojectmanager/genericproject.h @@ -40,8 +40,6 @@ public: explicit GenericProject(const Utils::FileName &filename); ~GenericProject() override; - QStringList buildTargets() const; - bool addFiles(const QStringList &filePaths); bool removeFiles(const QStringList &filePaths); bool setFiles(const QStringList &filePaths); diff --git a/src/plugins/genericprojectmanager/genericprojectmanager.pro b/src/plugins/genericprojectmanager/genericprojectmanager.pro index 110eaac850..3032f1edfc 100644 --- a/src/plugins/genericprojectmanager/genericprojectmanager.pro +++ b/src/plugins/genericprojectmanager/genericprojectmanager.pro @@ -17,8 +17,6 @@ SOURCES = genericproject.cpp \ genericbuildconfiguration.cpp \ filesselectionwizardpage.cpp -FORMS += genericmakestep.ui - equals(TEST, 1) { SOURCES += genericprojectplugin_test.cpp DEFINES += SRCDIR=\\\"$$PWD\\\" diff --git a/src/plugins/genericprojectmanager/genericprojectmanager.qbs b/src/plugins/genericprojectmanager/genericprojectmanager.qbs index cb062d1f52..273e58e791 100644 --- a/src/plugins/genericprojectmanager/genericprojectmanager.qbs +++ b/src/plugins/genericprojectmanager/genericprojectmanager.qbs @@ -25,7 +25,6 @@ QtcPlugin { "genericbuildconfiguration.h", "genericmakestep.cpp", "genericmakestep.h", - "genericmakestep.ui", "genericproject.cpp", "genericproject.h", "genericprojectconstants.h", diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index e2fa7fe8d5..5797619b4e 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -3371,10 +3371,10 @@ GitRemote::GitRemote(const QString &url) // Check for local remotes (refer to the root or relative path) // On Windows, local paths typically starts with <drive>: - if (url.startsWith('/') || url.startsWith('.') + if (url.startsWith("file://") || url.startsWith('/') || url.startsWith('.') || (HostOsInfo::isWindowsHost() && url[1] == ':')) { protocol = "file"; - path = QDir::fromNativeSeparators(url); + path = QDir::fromNativeSeparators(url.startsWith("file://") ? url.mid(7) : url); isValid = QDir(path).exists() || QDir(path + ".git").exists(); return; } diff --git a/src/plugins/git/mergetool.cpp b/src/plugins/git/mergetool.cpp index 511a762acf..8a224f09a7 100644 --- a/src/plugins/git/mergetool.cpp +++ b/src/plugins/git/mergetool.cpp @@ -235,6 +235,13 @@ void MergeTool::readData() prompt(tr("Unchanged File"), tr("Was the merge successful?")); } else if (m_line.startsWith("Continue merging")) { prompt(tr("Continue Merging"), tr("Continue merging other unresolved paths?")); + } else if (m_line.startsWith("Hit return")) { + QMessageBox::warning( + Core::ICore::dialogParent(), tr("Merge Tool"), + tr("<html><body><p>Merge tool is not configured.</p>\n" + "<p>Run git config --global merge.tool <tool> to configure it, " + "then try again</p></body></html>")); + m_process->kill(); } else if (m_line.endsWith('\n')) { // Skip unidentified lines m_line.clear(); diff --git a/src/plugins/glsleditor/glslcompletionassist.cpp b/src/plugins/glsleditor/glslcompletionassist.cpp index 2effaa7fa3..4fb33ac17e 100644 --- a/src/plugins/glsleditor/glslcompletionassist.cpp +++ b/src/plugins/glsleditor/glslcompletionassist.cpp @@ -161,15 +161,15 @@ static QIcon glslIcon(IconTypes iconType) switch (iconType) { case IconTypeType: - return Icons::iconForType(Icons::ClassIconType); + return Utils::CodeModelIcon::iconForType(Utils::CodeModelIcon::Class); case IconTypeConst: - return Icons::iconForType(Icons::EnumeratorIconType); + return Utils::CodeModelIcon::iconForType(Utils::CodeModelIcon::Enumerator); case IconTypeKeyword: - return Icons::iconForType(Icons::KeywordIconType); + return Utils::CodeModelIcon::iconForType(Utils::CodeModelIcon::Keyword); case IconTypeFunction: - return Icons::iconForType(Icons::FuncPublicIconType); + return Utils::CodeModelIcon::iconForType(Utils::CodeModelIcon::FuncPublic); case IconTypeVariable: - return Icons::iconForType(Icons::VarPublicIconType); + return Utils::CodeModelIcon::iconForType(Utils::CodeModelIcon::VarPublic); case IconTypeAttribute: { static const QIcon icon = Icon({{member, Theme::IconsCodeModelAttributeColor}}, Icon::Tint).icon(); @@ -187,7 +187,7 @@ static QIcon glslIcon(IconTypes iconType) } case IconTypeOther: default: - return Icons::iconForType(Icons::NamespaceIconType); + return Utils::CodeModelIcon::iconForType(Utils::CodeModelIcon::Namespace); } } diff --git a/src/plugins/glsleditor/glsleditor.cpp b/src/plugins/glsleditor/glsleditor.cpp index 108ef83879..8280c9713e 100644 --- a/src/plugins/glsleditor/glsleditor.cpp +++ b/src/plugins/glsleditor/glsleditor.cpp @@ -92,7 +92,7 @@ public: protected: using GLSL::Visitor::visit; - virtual void endVisit(CompoundStatementAST *ast) + void endVisit(CompoundStatementAST *ast) override { if (ast->symbol) { QTextCursor tc(textDocument); diff --git a/src/plugins/help/helpplugin.cpp b/src/plugins/help/helpplugin.cpp index 84428fe97b..405d05bebc 100644 --- a/src/plugins/help/helpplugin.cpp +++ b/src/plugins/help/helpplugin.cpp @@ -523,7 +523,7 @@ void HelpPluginPrivate::updateSideBarSource(const QUrl &newUrl) void HelpPluginPrivate::setupHelpEngineIfNeeded() { LocalHelpManager::setEngineNeedsUpdate(); - if (ModeManager::currentMode() == m_mode.id() + if (ModeManager::currentModeId() == m_mode.id() || LocalHelpManager::contextHelpOption() == HelpManager::ExternalHelpAlways) LocalHelpManager::setupGuiHelpEngine(); } diff --git a/src/plugins/imageviewer/imageview.cpp b/src/plugins/imageviewer/imageview.cpp index 881dde6b9f..d377810c4e 100644 --- a/src/plugins/imageviewer/imageview.cpp +++ b/src/plugins/imageviewer/imageview.cpp @@ -230,7 +230,7 @@ void ImageView::exportMultiImages() const QFileInfo origFi = m_file->filePath().toFileInfo(); const QSize size = svgSize(); const QString title = - tr("Export a Series of Images from %1 (%2x%3") + tr("Export a Series of Images from %1 (%2x%3)") .arg(origFi.fileName()).arg(size.width()).arg(size.height()); MultiExportDialog multiExportDialog; multiExportDialog.setWindowTitle(title); diff --git a/src/plugins/ios/iosbuildstep.cpp b/src/plugins/ios/iosbuildstep.cpp index 61fb670c90..3c04cc7080 100644 --- a/src/plugins/ios/iosbuildstep.cpp +++ b/src/plugins/ios/iosbuildstep.cpp @@ -73,8 +73,6 @@ bool IosBuildStep::init(QList<const BuildStep *> &earlierSteps) { BuildConfiguration *bc = buildConfiguration(); if (!bc) - bc = target()->activeBuildConfiguration(); - if (!bc) emit addTask(Task::buildConfigurationMissingTask()); ToolChain *tc = ToolChainKitInformation::toolChain(target()->kit(), ProjectExplorer::Constants::CXX_LANGUAGE_ID); @@ -140,7 +138,7 @@ QStringList IosBuildStep::defaultArguments() const QStringList res; Kit *kit = target()->kit(); ToolChain *tc = ToolChainKitInformation::toolChain(kit, ProjectExplorer::Constants::CXX_LANGUAGE_ID); - switch (target()->activeBuildConfiguration()->buildType()) { + switch (buildConfiguration()->buildType()) { case BuildConfiguration::Debug : res << "-configuration" << "Debug"; break; @@ -152,7 +150,7 @@ QStringList IosBuildStep::defaultArguments() const break; default: qCWarning(iosLog) << "IosBuildStep had an unknown buildType " - << target()->activeBuildConfiguration()->buildType(); + << buildConfiguration()->buildType(); } if (tc->typeId() == ProjectExplorer::Constants::GCC_TOOLCHAIN_TYPEID || tc->typeId() == ProjectExplorer::Constants::CLANG_TOOLCHAIN_TYPEID) { @@ -161,7 +159,7 @@ QStringList IosBuildStep::defaultArguments() const } if (!SysRootKitInformation::sysRoot(kit).isEmpty()) res << "-sdk" << SysRootKitInformation::sysRoot(kit).toString(); - res << "SYMROOT=" + target()->activeBuildConfiguration()->buildDirectory().toString(); + res << "SYMROOT=" + buildConfiguration()->buildDirectory().toString(); return res; } @@ -257,8 +255,6 @@ QString IosBuildStepConfigWidget::displayName() const void IosBuildStepConfigWidget::updateDetails() { BuildConfiguration *bc = m_buildStep->buildConfiguration(); - if (!bc) - bc = m_buildStep->target()->activeBuildConfiguration(); ProcessParameters param; param.setMacroExpander(bc->macroExpander()); diff --git a/src/plugins/ios/iosconfigurations.cpp b/src/plugins/ios/iosconfigurations.cpp index 4e8dd41aa2..ecddb7df50 100644 --- a/src/plugins/ios/iosconfigurations.cpp +++ b/src/plugins/ios/iosconfigurations.cpp @@ -63,6 +63,8 @@ #include <QStandardPaths> #include <QTimer> +#include <memory> + using namespace ProjectExplorer; using namespace QtSupport; using namespace Utils; @@ -298,7 +300,8 @@ void IosConfigurations::updateAutomaticKitList() kit->unblockNotification(); } else { qCDebug(kitSetupLog) << " - Setting up new kit"; - kit = new Kit; + auto newKit = std::make_unique<Kit>(); + kit = newKit.get(); kit->blockNotification(); kit->setAutoDetected(true); const QString baseDisplayName = isSimulatorDeviceId(pDeviceType) @@ -307,7 +310,7 @@ void IosConfigurations::updateAutomaticKitList() kit->setUnexpandedDisplayName(baseDisplayName); setupKit(kit, pDeviceType, platformToolchains, debuggerId, sdk.path, qtVersion); kit->unblockNotification(); - KitManager::registerKit(kit); + KitManager::registerKit(std::move(newKit)); } resultingKits.insert(kit); } @@ -330,8 +333,8 @@ IosConfigurations *IosConfigurations::instance() void IosConfigurations::initialize() { - QTC_CHECK(m_instance == 0); - m_instance = new IosConfigurations(0); + QTC_CHECK(m_instance == nullptr); + m_instance = new IosConfigurations(nullptr); } bool IosConfigurations::ignoreAllDevices() @@ -596,7 +599,7 @@ QList<ToolChain *> IosToolChainFactory::autoDetect(const QList<ToolChain *> &exi { QList<ClangToolChain *> existingClangToolChains = clangToolChains(existingToolChains); const QList<XcodePlatform> platforms = XcodeProbe::detectPlatforms().values(); - QList<ClangToolChain *> toolChains; + QList<ToolChain *> toolChains; toolChains.reserve(platforms.size()); foreach (const XcodePlatform &platform, platforms) { for (const XcodePlatform::ToolchainTarget &target : platform.targets) { @@ -614,7 +617,7 @@ QList<ToolChain *> IosToolChainFactory::autoDetect(const QList<ToolChain *> &exi createOrAdd(platformToolchains.second, ProjectExplorer::Constants::CXX_LANGUAGE_ID); } } - return Utils::transform(toolChains, [](ClangToolChain *tc) -> ToolChain * { return tc; }); + return toolChains; } QString DevelopmentTeam::identifier() const diff --git a/src/plugins/ios/iosdeploystepfactory.cpp b/src/plugins/ios/iosdeploystepfactory.cpp index b6a3506e91..cb748edd94 100644 --- a/src/plugins/ios/iosdeploystepfactory.cpp +++ b/src/plugins/ios/iosdeploystepfactory.cpp @@ -36,7 +36,7 @@ namespace Internal { IosDeployStepFactory::IosDeployStepFactory() { registerStep<IosDeployStep>(IosDeployStep::Id); - setDisplayName(tr("Deploy to iOS device or emulator")); + setDisplayName(IosDeployStep::tr("Deploy to iOS device or emulator")); setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY); setSupportedDeviceTypes({Constants::IOS_DEVICE_TYPE, Constants::IOS_SIMULATOR_TYPE}); setRepeatable(false); diff --git a/src/plugins/ios/iosdeploystepfactory.h b/src/plugins/ios/iosdeploystepfactory.h index 73d01f0599..d94a79f57f 100644 --- a/src/plugins/ios/iosdeploystepfactory.h +++ b/src/plugins/ios/iosdeploystepfactory.h @@ -32,8 +32,6 @@ namespace Internal { class IosDeployStepFactory : public ProjectExplorer::BuildStepFactory { - Q_OBJECT - public: IosDeployStepFactory(); }; diff --git a/src/plugins/ios/iosdsymbuildstep.cpp b/src/plugins/ios/iosdsymbuildstep.cpp index 2cf4834bc6..3fc3c090dc 100644 --- a/src/plugins/ios/iosdsymbuildstep.cpp +++ b/src/plugins/ios/iosdsymbuildstep.cpp @@ -64,8 +64,6 @@ IosDsymBuildStep::IosDsymBuildStep(BuildStepList *parent) : bool IosDsymBuildStep::init(QList<const BuildStep *> &earlierSteps) { BuildConfiguration *bc = buildConfiguration(); - if (!bc) - bc = target()->activeBuildConfiguration(); ProcessParameters *pp = processParameters(); pp->setMacroExpander(bc->macroExpander()); @@ -277,8 +275,6 @@ QString IosDsymBuildStepConfigWidget::displayName() const void IosDsymBuildStepConfigWidget::updateDetails() { BuildConfiguration *bc = m_buildStep->buildConfiguration(); - if (!bc) - bc = m_buildStep->target()->activeBuildConfiguration(); ProcessParameters param; param.setMacroExpander(bc->macroExpander()); diff --git a/src/plugins/ios/iosdsymbuildstep.h b/src/plugins/ios/iosdsymbuildstep.h index 39d01ef667..58200826f2 100644 --- a/src/plugins/ios/iosdsymbuildstep.h +++ b/src/plugins/ios/iosdsymbuildstep.h @@ -90,7 +90,6 @@ private: class IosDsymBuildStepFactory : public ProjectExplorer::BuildStepFactory { - Q_OBJECT public: explicit IosDsymBuildStepFactory(); }; diff --git a/src/plugins/ios/iosqtversion.cpp b/src/plugins/ios/iosqtversion.cpp index 1c18d07ffa..5c2b0e8278 100644 --- a/src/plugins/ios/iosqtversion.cpp +++ b/src/plugins/ios/iosqtversion.cpp @@ -85,7 +85,7 @@ QList<Abi> IosQtVersion::detectQtAbis() const for (int i = 0; i < abis.count(); ++i) { abis[i] = Abi(abis.at(i).architecture(), abis.at(i).os(), - Abi::GenericDarwinFlavor, + Abi::GenericFlavor, abis.at(i).binaryFormat(), abis.at(i).wordWidth()); } diff --git a/src/plugins/ios/iossettingswidget.cpp b/src/plugins/ios/iossettingswidget.cpp index 02168a79ad..4f7cd37f58 100644 --- a/src/plugins/ios/iossettingswidget.cpp +++ b/src/plugins/ios/iossettingswidget.cpp @@ -155,7 +155,7 @@ void IosSettingsWidget::onCreate() .arg(name).arg(response.simUdid), Utils::StdOutFormat); } else { statusDialog->addMessage(tr("Simulator device (%1) creation failed.\nError: %2"). - arg(name).arg(QString::fromUtf8(response.commandOutput)), + arg(name).arg(response.commandOutput), Utils::StdErrFormat); } }; diff --git a/src/plugins/ios/iostoolhandler.cpp b/src/plugins/ios/iostoolhandler.cpp index 95d0ede5ec..0ca710bda9 100644 --- a/src/plugins/ios/iostoolhandler.cpp +++ b/src/plugins/ios/iostoolhandler.cpp @@ -926,7 +926,7 @@ void IosSimulatorToolHandlerPrivate::installAppOnSimulator() didTransferApp(m_bundlePath, m_deviceId, IosToolHandler::Success); } else { errorMsg(IosToolHandler::tr("Application install on simulator failed. %1") - .arg(QString::fromLocal8Bit(response.commandOutput))); + .arg(response.commandOutput)); didTransferApp(m_bundlePath, m_deviceId, IosToolHandler::Failure); } emit q->finished(q); @@ -990,7 +990,7 @@ void IosSimulatorToolHandlerPrivate::launchAppOnSimulator(const QStringList &ext } else { m_pid = -1; errorMsg(IosToolHandler::tr("Application launch on simulator failed. %1") - .arg(QString::fromLocal8Bit(response.commandOutput))); + .arg(response.commandOutput)); didStartApp(m_bundlePath, m_deviceId, Ios::IosToolHandler::Failure); stop(-1); q->finished(q); diff --git a/src/plugins/ios/simulatorcontrol.cpp b/src/plugins/ios/simulatorcontrol.cpp index e96bbfffe4..723f17e95c 100644 --- a/src/plugins/ios/simulatorcontrol.cpp +++ b/src/plugins/ios/simulatorcontrol.cpp @@ -77,17 +77,17 @@ static bool checkForTimeout(const chrono::high_resolution_clock::time_point &sta return timedOut; } -static bool runCommand(QString command, const QStringList &args, QByteArray *output) +static bool runCommand(QString command, const QStringList &args, QString *output) { Utils::SynchronousProcess p; p.setTimeoutS(-1); Utils::SynchronousProcessResponse resp = p.runBlocking(command, args); if (output) - *output = resp.allRawOutput(); + *output = resp.stdOut(); return resp.result == Utils::SynchronousProcessResponse::Finished; } -static bool runSimCtlCommand(QStringList args, QByteArray *output) +static bool runSimCtlCommand(QStringList args, QString *output) { args.prepend("simctl"); return runCommand("xcrun", args, output); @@ -100,11 +100,10 @@ static bool launchSimulator(const QString &simUdid) { if (IosConfigurations::xcodeVersion() >= QVersionNumber(9)) { // For XCode 9 boot the second device instead of launching simulator app twice. - QByteArray psOutput; + QString psOutput; if (runCommand("ps", {"-A", "-o", "comm"}, &psOutput)) { - QByteArray simulatorCommand = simulatorAppPath.toLatin1(); - for (const QByteArray &comm : psOutput.split('\n')) { - if (comm == simulatorCommand) + for (const QString &comm : psOutput.split('\n')) { + if (comm == simulatorAppPath) return runSimCtlCommand(QStringList({"boot", simUdid}), nullptr); } } else { @@ -120,9 +119,9 @@ static bool launchSimulator(const QString &simUdid) { static QList<DeviceTypeInfo> getAvailableDeviceTypes() { QList<DeviceTypeInfo> deviceTypes; - QByteArray output; + QString output; runSimCtlCommand({"list", "-j", deviceTypeTag}, &output); - QJsonDocument doc = QJsonDocument::fromJson(output); + QJsonDocument doc = QJsonDocument::fromJson(output.toUtf8()); if (!doc.isNull()) { const QJsonArray runtimesArray = doc.object().value(deviceTypeTag).toArray(); foreach (const QJsonValue deviceTypeValue, runtimesArray) { @@ -144,9 +143,9 @@ static QList<DeviceTypeInfo> getAvailableDeviceTypes() static QList<RuntimeInfo> getAvailableRuntimes() { QList<RuntimeInfo> runtimes; - QByteArray output; + QString output; runSimCtlCommand({"list", "-j", runtimesTag}, &output); - QJsonDocument doc = QJsonDocument::fromJson(output); + QJsonDocument doc = QJsonDocument::fromJson(output.toUtf8()); if (!doc.isNull()) { const QJsonArray runtimesArray = doc.object().value(runtimesTag).toArray(); foreach (const QJsonValue runtimeValue, runtimesArray) { @@ -220,9 +219,9 @@ QList<SimulatorInfo> SimulatorControl::availableSimulators() static QList<SimulatorInfo> getAllSimulatorDevices() { QList<SimulatorInfo> simulatorDevices; - QByteArray output; + QString output; runSimCtlCommand({"list", "-j", devicesTag}, &output); - QJsonDocument doc = QJsonDocument::fromJson(output); + QJsonDocument doc = QJsonDocument::fromJson(output.toUtf8()); if (!doc.isNull()) { const QJsonObject runtimeObject = doc.object().value(devicesTag).toObject(); foreach (const QString &runtime, runtimeObject.keys()) { @@ -512,7 +511,7 @@ void SimulatorControlPrivate::launchApp(QFutureInterface<SimulatorControl::Respo } if (runSimCtlCommand(args, &response.commandOutput)) { - const QByteArray pIdStr = response.commandOutput.trimmed().split(' ').last().trimmed(); + const QString pIdStr = response.commandOutput.trimmed().split(' ').last().trimmed(); bool validPid = false; response.pID = pIdStr.toLongLong(&validPid); response.success = validPid; @@ -566,7 +565,7 @@ void SimulatorControlPrivate::createSimulator(QFutureInterface<SimulatorControl: deviceType.identifier, runtime.identifier}, &response.commandOutput); - response.simUdid = response.success ? QString::fromLatin1(response.commandOutput.trimmed()) + response.simUdid = response.success ? response.commandOutput.trimmed() : QString(); } diff --git a/src/plugins/ios/simulatorcontrol.h b/src/plugins/ios/simulatorcontrol.h index bb46035a00..4b8e9388d4 100644 --- a/src/plugins/ios/simulatorcontrol.h +++ b/src/plugins/ios/simulatorcontrol.h @@ -84,7 +84,7 @@ public: QString simUdid; bool success = false; qint64 pID = -1; - QByteArray commandOutput = ""; + QString commandOutput; }; public: diff --git a/src/plugins/ios/simulatoroperationdialog.cpp b/src/plugins/ios/simulatoroperationdialog.cpp index 6e687d8437..818b588194 100644 --- a/src/plugins/ios/simulatoroperationdialog.cpp +++ b/src/plugins/ios/simulatoroperationdialog.cpp @@ -98,10 +98,10 @@ void SimulatorOperationDialog::addMessage(const SimulatorInfo &siminfo, addMessage(tr("%1, %2\nOperation %3 completed successfully.").arg(siminfo.name) .arg(siminfo.runtimeName).arg(context), Utils::StdOutFormat); } else { - QByteArray erroMsg = response.commandOutput.trimmed(); + QString erroMsg = response.commandOutput.trimmed(); QString message = tr("%1, %2\nOperation %3 failed.\nUDID: %4\nError: %5").arg(siminfo.name) .arg(siminfo.runtimeName).arg(context).arg(siminfo.identifier) - .arg(erroMsg.isEmpty() ? tr("Unknown") : QString::fromUtf8(erroMsg)); + .arg(erroMsg.isEmpty() ? tr("Unknown") : erroMsg); addMessage(message, Utils::StdErrFormat); qCDebug(iosCommon) << message; } diff --git a/src/plugins/nim/nimplugin.cpp b/src/plugins/nim/nimplugin.cpp index 9421cdc1ac..248d5e99e0 100644 --- a/src/plugins/nim/nimplugin.cpp +++ b/src/plugins/nim/nimplugin.cpp @@ -76,9 +76,6 @@ bool NimPlugin::initialize(const QStringList &arguments, QString *errorMessage) ToolChainManager::registerLanguage(Constants::C_NIMLANGUAGE_ID, Constants::C_NIMLANGUAGE_NAME); - RunControl::registerWorker<NimRunConfiguration, SimpleTargetRunner> - (ProjectExplorer::Constants::NORMAL_RUN_MODE); - TextEditor::SnippetProvider::registerGroup(Constants::C_NIMSNIPPETSGROUP_ID, tr("Nim", "SnippetProvider"), &NimEditorFactory::decorateEditor); diff --git a/src/plugins/nim/project/nimcompilerbuildstep.cpp b/src/plugins/nim/project/nimcompilerbuildstep.cpp index df68620a24..d193fbd745 100644 --- a/src/plugins/nim/project/nimcompilerbuildstep.cpp +++ b/src/plugins/nim/project/nimcompilerbuildstep.cpp @@ -292,7 +292,7 @@ void NimCompilerBuildStep::updateTargetNimFile() NimCompilerBuildStepFactory::NimCompilerBuildStepFactory() { registerStep<NimCompilerBuildStep>(Constants::C_NIMCOMPILERBUILDSTEP_ID); - setDisplayName(tr("Nim Compiler Build Step")); + setDisplayName(NimCompilerBuildStep::tr("Nim Compiler Build Step")); setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); setSupportedConfiguration(Constants::C_NIMBUILDCONFIGURATION_ID); setRepeatable(false); diff --git a/src/plugins/nim/project/nimcompilercleanstep.cpp b/src/plugins/nim/project/nimcompilercleanstep.cpp index bd9eaf4edb..f3fac15081 100644 --- a/src/plugins/nim/project/nimcompilercleanstep.cpp +++ b/src/plugins/nim/project/nimcompilercleanstep.cpp @@ -117,7 +117,7 @@ NimCompilerCleanStepFactory::NimCompilerCleanStepFactory() setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); setSupportedConfiguration(Constants::C_NIMBUILDCONFIGURATION_ID); setRepeatable(false); - setDisplayName(tr(Nim::Constants::C_NIMCOMPILERCLEANSTEP_DISPLAY)); + setDisplayName(NimCompilerCleanStep::tr(Nim::Constants::C_NIMCOMPILERCLEANSTEP_DISPLAY)); } } // Nim diff --git a/src/plugins/nim/project/nimrunconfiguration.cpp b/src/plugins/nim/project/nimrunconfiguration.cpp index 3d84c40949..22bb972d5b 100644 --- a/src/plugins/nim/project/nimrunconfiguration.cpp +++ b/src/plugins/nim/project/nimrunconfiguration.cpp @@ -44,14 +44,11 @@ namespace Nim { NimRunConfiguration::NimRunConfiguration(Target *target, Core::Id id) : RunConfiguration(target, id) { - auto terminalAspect = new TerminalAspect(this, "Nim.NimRunConfiguration.TerminalAspect"); - terminalAspect->setRunMode(ApplicationLauncher::Gui); - addExtraAspect(terminalAspect); - addExtraAspect(new ExecutableAspect(this)); addExtraAspect(new ArgumentsAspect(this, "Nim.NimRunConfiguration.ArgumentAspect")); addExtraAspect(new WorkingDirectoryAspect(this, "Nim.NimRunConfiguration.WorkingDirectoryAspect")); addExtraAspect(new LocalEnvironmentAspect(this, LocalEnvironmentAspect::BaseEnvironmentModifier())); + addExtraAspect(new TerminalAspect(this, "Nim.NimRunConfiguration.TerminalAspect")); setDisplayName(tr("Current Build Target")); setDefaultDisplayName(tr("Current Build Target")); @@ -101,6 +98,7 @@ NimRunConfigurationFactory::NimRunConfigurationFactory() : FixedRunConfiguration { registerRunConfiguration<NimRunConfiguration>("Nim.NimRunConfiguration"); addSupportedProjectType(Constants::C_NIMPROJECT_ID); + addRunWorkerFactory<SimpleTargetRunner>(ProjectExplorer::Constants::NORMAL_RUN_MODE); } } // Nim diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro index 5d8b676a20..a540713d7a 100644 --- a/src/plugins/plugins.pro +++ b/src/plugins/plugins.pro @@ -105,8 +105,8 @@ exists(../shared/qbs/qbs.pro)|!isEmpty(QBS_INSTALL_DIR): \ SUBDIRS += \ clangcodemodel -QTC_NO_CLANG_LIBTOOLING=$$(QTC_NO_CLANG_LIBTOOLING) -isEmpty(QTC_NO_CLANG_LIBTOOLING) { +QTC_ENABLE_CLANG_LIBTOOLING=$$(QTC_ENABLE_CLANG_LIBTOOLING) +!isEmpty(QTC_ENABLE_CLANG_LIBTOOLING) { SUBDIRS += clangrefactoring SUBDIRS += clangpchmanager } else { diff --git a/src/plugins/projectexplorer/abi.cpp b/src/plugins/projectexplorer/abi.cpp index 4aff7c3a96..bc8c9efa4e 100644 --- a/src/plugins/projectexplorer/abi.cpp +++ b/src/plugins/projectexplorer/abi.cpp @@ -25,8 +25,11 @@ #include "abi.h" +#include <utils/algorithm.h> #include <utils/fileutils.h> +#include <utils/qtcassert.h> + #include <QDebug> #include <QtEndian> #include <QFile> @@ -50,6 +53,96 @@ namespace ProjectExplorer { // Helpers // -------------------------------------------------------------------------- +static std::vector<QByteArray> m_registeredOsFlavors; +static std::map<int, QList<Abi::OSFlavor>> m_osToOsFlavorMap; + +static QList<Abi::OSFlavor> moveGenericAndUnknownLast(const QList<Abi::OSFlavor> &in) +{ + QList<Abi::OSFlavor> result = in; + // Move unknown and generic to the back + if (result.removeOne(Abi::GenericFlavor)) + result.append(Abi::GenericFlavor); + if (result.removeOne(Abi::UnknownFlavor)) + result.append(Abi::UnknownFlavor); + + return result; +} + +static void insertIntoOsFlavorMap(const std::vector<Abi::OS> &oses, const Abi::OSFlavor flavor) +{ + QTC_ASSERT(oses.size() > 0, return); + for (const Abi::OS &os : oses) { + auto it = m_osToOsFlavorMap.find(os); + if (it == m_osToOsFlavorMap.end()) { + m_osToOsFlavorMap[os] = {flavor}; + continue; + } + QList<Abi::OSFlavor> flavors = it->second; + if (!flavors.contains(flavor)) { + flavors.append(flavor); + m_osToOsFlavorMap[os] = moveGenericAndUnknownLast(flavors); + } + } +} + +static void registerOsFlavor(const Abi::OSFlavor &flavor, const QByteArray &flavorName, + const std::vector<Abi::OS> &oses) +{ + const auto pos = static_cast<size_t>(flavor); + if (m_registeredOsFlavors.size() <= pos) + m_registeredOsFlavors.resize(pos + 1); + + m_registeredOsFlavors[pos] = flavorName; + + insertIntoOsFlavorMap(oses, flavor); +} + +static void setupPreregisteredOsFlavors() { + m_registeredOsFlavors.resize(static_cast<size_t>(Abi::UnknownFlavor)); + + registerOsFlavor(Abi::FreeBsdFlavor, "freebsd", {Abi::OS::BsdOS}); + registerOsFlavor(Abi::NetBsdFlavor, "netbsd", {Abi::OS::BsdOS}); + registerOsFlavor(Abi::OpenBsdFlavor, "openbsd", {Abi::OS::BsdOS}); + registerOsFlavor(Abi::AndroidLinuxFlavor, "android", {Abi::OS::LinuxOS}); + registerOsFlavor(Abi::SolarisUnixFlavor, "solaris", {Abi::OS::UnixOS}); + registerOsFlavor(Abi::WindowsMsvc2005Flavor, "msvc2005", {Abi::OS::WindowsOS}); + registerOsFlavor(Abi::WindowsMsvc2008Flavor, "msvc2008", {Abi::OS::WindowsOS}); + registerOsFlavor(Abi::WindowsMsvc2010Flavor, "msvc2010", {Abi::OS::WindowsOS}); + registerOsFlavor(Abi::WindowsMsvc2012Flavor, "msvc2012", {Abi::OS::WindowsOS}); + registerOsFlavor(Abi::WindowsMsvc2013Flavor, "msvc2013", {Abi::OS::WindowsOS}); + registerOsFlavor(Abi::WindowsMsvc2015Flavor, "msvc2015", {Abi::OS::WindowsOS}); + registerOsFlavor(Abi::WindowsMsvc2017Flavor, "msvc2017", {Abi::OS::WindowsOS}); + registerOsFlavor(Abi::WindowsMSysFlavor, "msys", {Abi::OS::WindowsOS}); + registerOsFlavor(Abi::WindowsCEFlavor, "ce", {Abi::OS::WindowsOS}); + registerOsFlavor(Abi::VxWorksFlavor, "vxworks", {Abi::OS::VxWorks}); + registerOsFlavor(Abi::RtosFlavor, "rtos", {Abi::OS::WindowsOS}); + registerOsFlavor(Abi::GenericFlavor, "generic", {Abi::OS::LinuxOS, + Abi::OS::DarwinOS, + Abi::OS::UnixOS, + Abi::OS::QnxOS, + Abi::OS::BareMetalOS}); + registerOsFlavor(Abi::UnknownFlavor, "unknown", {Abi::OS::BsdOS, + Abi::OS::LinuxOS, + Abi::OS::DarwinOS, + Abi::OS::UnixOS, + Abi::OS::WindowsOS, + Abi::OS::VxWorks, + Abi::OS::QnxOS, + Abi::OS::BareMetalOS, + Abi::OS::UnknownOS}); +} + +static std::vector<QByteArray> ®isteredOsFlavors() { + if (m_registeredOsFlavors.size() == 0) + setupPreregisteredOsFlavors(); + return m_registeredOsFlavors; +} + +static int indexOfFlavor(const QByteArray &flavor) +{ + return Utils::indexOf(registeredOsFlavors(), [flavor](const QByteArray &f) { return f == flavor; }); +} + static Abi::Architecture architectureFromQt() { const QString arch = QSysInfo::buildCpuArchitecture(); @@ -109,17 +202,17 @@ static quint32 getBEUint16(const QByteArray &ba, int pos) static Abi macAbiForCpu(quint32 type) { switch (type) { case 7: // CPU_TYPE_X86, CPU_TYPE_I386 - return Abi(Abi::X86Architecture, Abi::DarwinOS, Abi::GenericDarwinFlavor, Abi::MachOFormat, 32); + return Abi(Abi::X86Architecture, Abi::DarwinOS, Abi::GenericFlavor, Abi::MachOFormat, 32); case 0x01000000 + 7: // CPU_TYPE_X86_64 - return Abi(Abi::X86Architecture, Abi::DarwinOS, Abi::GenericDarwinFlavor, Abi::MachOFormat, 64); + return Abi(Abi::X86Architecture, Abi::DarwinOS, Abi::GenericFlavor, Abi::MachOFormat, 64); case 18: // CPU_TYPE_POWERPC - return Abi(Abi::PowerPCArchitecture, Abi::DarwinOS, Abi::GenericDarwinFlavor, Abi::MachOFormat, 32); + return Abi(Abi::PowerPCArchitecture, Abi::DarwinOS, Abi::GenericFlavor, Abi::MachOFormat, 32); case 0x01000000 + 18: // CPU_TYPE_POWERPC64 - return Abi(Abi::PowerPCArchitecture, Abi::DarwinOS, Abi::GenericDarwinFlavor, Abi::MachOFormat, 32); + return Abi(Abi::PowerPCArchitecture, Abi::DarwinOS, Abi::GenericFlavor, Abi::MachOFormat, 32); case 12: // CPU_TYPE_ARM - return Abi(Abi::ArmArchitecture, Abi::DarwinOS, Abi::GenericDarwinFlavor, Abi::MachOFormat, 32); + return Abi(Abi::ArmArchitecture, Abi::DarwinOS, Abi::GenericFlavor, Abi::MachOFormat, 32); case 0x01000000 + 12: // CPU_TYPE_ARM64 - return Abi(Abi::ArmArchitecture, Abi::DarwinOS, Abi::GenericDarwinFlavor, Abi::MachOFormat, 64); + return Abi(Abi::ArmArchitecture, Abi::DarwinOS, Abi::GenericFlavor, Abi::MachOFormat, 64); default: return Abi(); } @@ -223,7 +316,7 @@ static QList<Abi> abiOf(const QByteArray &data) quint8 osAbi = getUint8(data, 7); Abi::OS os = Abi::UnixOS; - Abi::OSFlavor flavor = Abi::GenericUnixFlavor; + Abi::OSFlavor flavor = Abi::GenericFlavor; // http://www.sco.com/developers/gabi/latest/ch4.eheader.html#elfid switch (osAbi) { #if defined(Q_OS_NETBSD) @@ -242,7 +335,7 @@ static QList<Abi> abiOf(const QByteArray &data) case 3: // Linux: case 97: // ARM, also linux most of the time. os = Abi::LinuxOS; - flavor = Abi::GenericLinuxFlavor; + flavor = Abi::GenericFlavor; break; case 6: // Solaris: os = Abi::UnixOS; @@ -342,79 +435,7 @@ Abi::Abi(const Architecture &a, const OS &o, const OSFlavor &of, const BinaryFormat &f, unsigned char w) : m_architecture(a), m_os(o), m_osFlavor(of), m_binaryFormat(f), m_wordWidth(w) { - switch (m_os) { - case UnknownOS: - m_osFlavor = UnknownFlavor; - break; - case LinuxOS: - if (m_osFlavor < GenericLinuxFlavor || m_osFlavor > AndroidLinuxFlavor) - m_osFlavor = UnknownFlavor; - break; - case BsdOS: - if (m_osFlavor < FreeBsdFlavor || m_osFlavor > OpenBsdFlavor) - m_osFlavor = UnknownFlavor; - break; - case DarwinOS: - if (m_osFlavor < GenericDarwinFlavor || m_osFlavor > GenericDarwinFlavor) - m_osFlavor = UnknownFlavor; - break; - case UnixOS: - if (m_osFlavor < GenericUnixFlavor || m_osFlavor > SolarisUnixFlavor) - m_osFlavor = UnknownFlavor; - break; - case WindowsOS: - if (m_osFlavor < WindowsMsvc2005Flavor || m_osFlavor > WindowsCEFlavor) - m_osFlavor = UnknownFlavor; - break; - case VxWorks: - if (m_osFlavor != VxWorksFlavor) - m_osFlavor = VxWorksFlavor; - break; - case QnxOS: - if (m_osFlavor != GenericQnxFlavor) - m_osFlavor = UnknownFlavor; - break; - case BareMetalOS: - if (m_osFlavor != GenericBareMetalFlavor) - m_osFlavor = GenericBareMetalFlavor; - break; - } -} - -Abi::Abi(const QString &abiString) : - m_architecture(UnknownArchitecture), m_os(UnknownOS), - m_osFlavor(UnknownFlavor), m_binaryFormat(UnknownFormat), m_wordWidth(0) -{ - const QVector<QStringRef> abiParts = abiString.splitRef('-'); - if (abiParts.count() >= 1) { - m_architecture = architectureFromString(abiParts.at(0)); - if (abiParts.at(0) != toString(m_architecture)) - return; - } - - if (abiParts.count() >= 2) { - m_os = osFromString(abiParts.at(1)); - if (abiParts.at(1) != toString(m_os)) - return; - } - - if (abiParts.count() >= 3) { - m_osFlavor = osFlavorFromString(abiParts.at(2), m_os); - if (abiParts.at(2) != toString(m_osFlavor)) - return; - } - - if (abiParts.count() >= 4) { - m_binaryFormat = binaryFormatFromString(abiParts.at(3)); - if (abiParts.at(3) != toString(m_binaryFormat)) - return; - } - - if (abiParts.count() >= 5) { - m_wordWidth = wordWidthFromString(abiParts.at(4)); - if (abiParts.at(4) != toString(m_wordWidth)) - return; - } + QTC_ASSERT(osSupportsFlavor(o, of), m_osFlavor = UnknownFlavor); } Abi Abi::abiFromTargetTriplet(const QString &triple) @@ -445,7 +466,7 @@ Abi Abi::abiFromTargetTriplet(const QString &triple) } else if (p == "xtensa") { arch = XtensaArchitecture; os = BareMetalOS; - flavor = GenericBareMetalFlavor; + flavor = GenericFlavor; format = ElfFormat; width = 32; } else if (p.startsWith("arm")) { @@ -457,7 +478,7 @@ Abi Abi::abiFromTargetTriplet(const QString &triple) } else if (p == "avr") { arch = AvrArchitecture; os = BareMetalOS; - flavor = GenericBareMetalFlavor; + flavor = GenericFlavor; format = ElfFormat; width = 16; } else if (p.startsWith("mips")) { @@ -475,7 +496,7 @@ Abi Abi::abiFromTargetTriplet(const QString &triple) } else if (p == "linux" || p == "linux6e") { os = LinuxOS; if (flavor == UnknownFlavor) - flavor = GenericLinuxFlavor; + flavor = GenericFlavor; format = ElfFormat; } else if (p == "android") { flavor = AndroidLinuxFlavor; @@ -500,7 +521,7 @@ Abi Abi::abiFromTargetTriplet(const QString &triple) format = PEFormat; } else if (p == "apple") { os = DarwinOS; - flavor = GenericDarwinFlavor; + flavor = GenericFlavor; format = MachOFormat; } else if (p == "darwin10") { width = 64; @@ -516,7 +537,7 @@ Abi Abi::abiFromTargetTriplet(const QString &triple) format = ElfFormat; } else if (p.startsWith("qnx")) { os = QnxOS; - flavor = GenericQnxFlavor; + flavor = GenericFlavor; format = ElfFormat; } else { ++unknownCount; @@ -563,7 +584,7 @@ bool Abi::isCompatibleWith(const Abi &other) const // work for them. if (!isCompat && (architecture() == other.architecture() || other.architecture() == UnknownArchitecture) && ((os() == other.os()) && (os() == LinuxOS)) - && (osFlavor() == GenericLinuxFlavor || other.osFlavor() == GenericLinuxFlavor) + && (osFlavor() == GenericFlavor || other.osFlavor() == GenericFlavor) && (binaryFormat() == other.binaryFormat() || other.binaryFormat() == UnknownFormat) && ((wordWidth() == other.wordWidth() && wordWidth() != 0) || other.wordWidth() == 0)) { isCompat = true; @@ -654,49 +675,11 @@ QString Abi::toString(const OS &o) QString Abi::toString(const OSFlavor &of) { - switch (of) { - case GenericLinuxFlavor: - case GenericDarwinFlavor: - case GenericUnixFlavor: - case GenericBareMetalFlavor: - case GenericQnxFlavor: - return QLatin1String("generic"); - case AndroidLinuxFlavor: - return QLatin1String("android"); - case FreeBsdFlavor: - return QLatin1String("freebsd"); - case NetBsdFlavor: - return QLatin1String("netbsd"); - case OpenBsdFlavor: - return QLatin1String("openbsd"); - case SolarisUnixFlavor: - return QLatin1String("solaris"); - case WindowsMsvc2005Flavor: - return QLatin1String("msvc2005"); - case WindowsMsvc2008Flavor: - return QLatin1String("msvc2008"); - case WindowsMsvc2010Flavor: - return QLatin1String("msvc2010"); - case WindowsMsvc2012Flavor: - return QLatin1String("msvc2012"); - case WindowsMsvc2013Flavor: - return QLatin1String("msvc2013"); - case WindowsMsvc2015Flavor: - return QLatin1String("msvc2015"); - case WindowsMsvc2017Flavor: - return QLatin1String("msvc2017"); - case WindowsMSysFlavor: - return QLatin1String("msys"); - case WindowsCEFlavor: - return QLatin1String("ce"); - case VxWorksFlavor: - return QLatin1String("vxworks"); - case RtosFlavor: - return QLatin1String("rtos"); - case UnknownFlavor: - default: - return QLatin1String("unknown"); - } + const auto index = static_cast<size_t>(of); + const std::vector<QByteArray> &flavors = registeredOsFlavors(); + QTC_ASSERT(index < flavors.size(), + return QString::fromUtf8(flavors.at(int(UnknownFlavor)))); + return QString::fromUtf8(flavors.at(index)); } QString Abi::toString(const BinaryFormat &bf) @@ -724,6 +707,47 @@ QString Abi::toString(int w) return QString::fromLatin1("%1bit").arg(w); } +Abi Abi::fromString(const QString &abiString) +{ + Abi::Architecture architecture = UnknownArchitecture; + const QVector<QStringRef> abiParts = abiString.splitRef('-'); + if (abiParts.count() >= 1) { + architecture = architectureFromString(abiParts.at(0)); + if (abiParts.at(0) != toString(architecture)) + return Abi(); + } + + Abi::OS os = UnknownOS; + if (abiParts.count() >= 2) { + os = osFromString(abiParts.at(1)); + if (abiParts.at(1) != toString(os)) + return Abi(architecture, UnknownOS, UnknownFlavor, UnknownFormat, 0); + } + + Abi::OSFlavor flavor = UnknownFlavor; + if (abiParts.count() >= 3) { + flavor = osFlavorFromString(abiParts.at(2), os); + if (abiParts.at(2) != toString(flavor)) + return Abi(architecture, os, UnknownFlavor, UnknownFormat, 0);; + } + + Abi::BinaryFormat format = UnknownFormat; + if (abiParts.count() >= 4) { + format = binaryFormatFromString(abiParts.at(3)); + if (abiParts.at(3) != toString(format)) + return Abi(architecture, os, flavor, UnknownFormat, 0);; + } + + unsigned char wordWidth = 0; + if (abiParts.count() >= 5) { + wordWidth = wordWidthFromString(abiParts.at(4)); + if (abiParts.at(4) != toString(wordWidth)) + return Abi(architecture, os, flavor, format, 0);; + } + + return Abi(architecture, os, flavor, format, wordWidth); +} + Abi::Architecture Abi::architectureFromString(const QStringRef &a) { if (a == "unknown") @@ -775,62 +799,11 @@ Abi::OS Abi::osFromString(const QStringRef &o) Abi::OSFlavor Abi::osFlavorFromString(const QStringRef &of, const OS os) { - Abi::OSFlavor result = UnknownFlavor; - if (of == "generic") { - switch (os) { - case LinuxOS: - result = GenericLinuxFlavor; - break; - case DarwinOS: - result = GenericDarwinFlavor; - break; - case UnixOS: - result = GenericUnixFlavor; - break; - case BareMetalOS: - result = GenericBareMetalFlavor; - break; - case QnxOS: - result = GenericQnxFlavor; - break; - default: - result = UnknownFlavor; - } - } else if (of == "android") { - result = AndroidLinuxFlavor; - } else if (of == "freebsd") { - result = FreeBsdFlavor; - } else if (of == "netbsd") { - result = NetBsdFlavor; - } else if (of == "openbsd") { - result = OpenBsdFlavor; - } else if (of == "solaris") { - result = SolarisUnixFlavor; - } else if (of == "msvc2005") { - result = WindowsMsvc2005Flavor; - } else if (of == "msvc2008") { - result = WindowsMsvc2008Flavor; - } else if (of == "msvc2010") { - result = WindowsMsvc2010Flavor; - } else if (of == "msvc2012") { - result = WindowsMsvc2012Flavor; - } else if (of == "msvc2013") { - result = WindowsMsvc2013Flavor; - } else if (of == "msvc2015") { - result = WindowsMsvc2015Flavor; - } else if (of == "msvc2017") { - result = WindowsMsvc2017Flavor; - } else if (of == "msys") { - result = WindowsMSysFlavor; - } else if (of == "ce") { - result = WindowsCEFlavor; - } else if (of == "vxworks") { - result = VxWorksFlavor; - } else if (of == "rtos") { - result = RtosFlavor; - } - - return flavorsForOs(os).contains(result) ? result : UnknownFlavor; + const int index = indexOfFlavor(of.toUtf8()); + const auto flavor = OSFlavor(index); + if (index >= 0 && osSupportsFlavor(os, flavor)) + return flavor; + return UnknownFlavor; } Abi::BinaryFormat Abi::binaryFormatFromString(const QStringRef &bf) @@ -863,31 +836,41 @@ unsigned char Abi::wordWidthFromString(const QStringRef &w) return static_cast<unsigned char>(bitCount); } +Abi::OSFlavor Abi::registerOsFlavor(const std::vector<OS> &oses, const QString &flavorName) +{ + QTC_ASSERT(oses.size() > 0, return UnknownFlavor); + const QByteArray flavorBytes = flavorName.toUtf8(); + + int index = indexOfFlavor(flavorBytes); + if (index < 0) + index = int(registeredOsFlavors().size()); + + auto toRegister = OSFlavor(index); + ProjectExplorer::registerOsFlavor(toRegister, flavorBytes, oses); + return toRegister; +} + QList<Abi::OSFlavor> Abi::flavorsForOs(const Abi::OS &o) { - switch (o) { - case BsdOS: - return {FreeBsdFlavor, OpenBsdFlavor, NetBsdFlavor, UnknownFlavor}; - case LinuxOS: - return {GenericLinuxFlavor, AndroidLinuxFlavor, UnknownFlavor}; - case DarwinOS: - return {GenericDarwinFlavor, UnknownFlavor}; - case UnixOS: - return {GenericUnixFlavor, SolarisUnixFlavor, UnknownFlavor}; - case WindowsOS: - return {WindowsMsvc2005Flavor, WindowsMsvc2008Flavor, WindowsMsvc2010Flavor, - WindowsMsvc2012Flavor, WindowsMsvc2013Flavor, WindowsMsvc2015Flavor, - WindowsMsvc2017Flavor , WindowsMSysFlavor, WindowsCEFlavor, UnknownFlavor}; - case VxWorks: - return {VxWorksFlavor, UnknownFlavor}; - case QnxOS: - return {GenericQnxFlavor, UnknownFlavor}; - case BareMetalOS: - return {GenericBareMetalFlavor, RtosFlavor, UnknownFlavor}; - case UnknownOS: - return {UnknownFlavor}; - } - return QList<OSFlavor>(); + registeredOsFlavors(); // Make sure m_osToOsFlavorMap is populated! + auto it = m_osToOsFlavorMap.find(o); + if (it == m_osToOsFlavorMap.end()) + return {}; + + return it->second; +} + +QList<Abi::OSFlavor> Abi::allOsFlavors() +{ + QList<OSFlavor> result; + for (size_t i = 0; i < registeredOsFlavors().size(); ++i) + result << OSFlavor(i); + return moveGenericAndUnknownLast(result); +} + +bool Abi::osSupportsFlavor(const Abi::OS &os, const Abi::OSFlavor &flavor) +{ + return flavorsForOs(os).contains(flavor); } Abi::OSFlavor Abi::flavorForMsvcVersion(int version) @@ -929,11 +912,11 @@ Abi Abi::hostAbi() format = PEFormat; #elif defined (Q_OS_LINUX) os = LinuxOS; - subos = GenericLinuxFlavor; + subos = GenericFlavor; format = ElfFormat; #elif defined (Q_OS_DARWIN) os = DarwinOS; - subos = GenericDarwinFlavor; + subos = GenericFlavor; format = MachOFormat; #elif defined (Q_OS_BSD4) os = BsdOS; @@ -1029,11 +1012,7 @@ QList<Abi> Abi::abisOfBinary(const Utils::FileName &path) static bool isGenericFlavor(ProjectExplorer::Abi::OSFlavor f) { - return f == ProjectExplorer::Abi::GenericBareMetalFlavor - || f == ProjectExplorer::Abi::GenericDarwinFlavor - || f == ProjectExplorer::Abi::GenericLinuxFlavor - || f == ProjectExplorer::Abi::GenericQnxFlavor - || f == ProjectExplorer::Abi::GenericUnixFlavor; + return f == ProjectExplorer::Abi::GenericFlavor; } void ProjectExplorer::ProjectExplorerPlugin::testAbiRoundTrips() @@ -1048,18 +1027,17 @@ void ProjectExplorer::ProjectExplorerPlugin::testAbiRoundTrips() const Abi::OS os = Abi::osFromString(QStringRef(&string)); QCOMPARE(static_cast<Abi::OS>(i), os); } - for (int i = 0; i <= Abi::UnknownFlavor; ++i) { - const Abi::OSFlavor flavorEnum = static_cast<Abi::OSFlavor>(i); - const QString string = Abi::toString(flavorEnum); + for (const Abi::OSFlavor flavorIt : Abi::allOsFlavors()) { + const QString string = Abi::toString(flavorIt); for (int os = 0; os <= Abi::UnknownOS; ++os) { - const Abi::OS osEnum = static_cast<Abi::OS>(os); + const auto osEnum = static_cast<Abi::OS>(os); const Abi::OSFlavor flavor = Abi::osFlavorFromString(QStringRef(&string), osEnum); - if (isGenericFlavor(flavorEnum) && flavor != Abi::UnknownFlavor) + if (isGenericFlavor(flavorIt) && flavor != Abi::UnknownFlavor) QVERIFY(isGenericFlavor(flavor)); - else if (flavor == Abi::UnknownFlavor && i != Abi::UnknownFlavor) - QVERIFY(!Abi::flavorsForOs(osEnum).contains(flavorEnum)); + else if (flavor == Abi::UnknownFlavor && flavorIt != Abi::UnknownFlavor) + QVERIFY(!Abi::flavorsForOs(osEnum).contains(flavorIt)); else - QCOMPARE(flavorEnum, flavor); + QCOMPARE(flavorIt, flavor); } } for (int i = 0; i <= Abi::UnknownFormat; ++i) { @@ -1215,25 +1193,6 @@ void ProjectExplorer::ProjectExplorerPlugin::testAbiOfBinary() QCOMPARE(result.at(i).toString(), abis.at(i)); } -void ProjectExplorer::ProjectExplorerPlugin::testFlavorForOs() -{ - QList<QList<Abi::OSFlavor> > flavorLists; - for (int i = 0; i != static_cast<int>(Abi::UnknownOS); ++i) - flavorLists.append(Abi::flavorsForOs(static_cast<Abi::OS>(i))); - - int foundCounter = 0; - for (int i = 0; i != Abi::UnknownFlavor; ++i) { - foundCounter = 0; - // make sure i is in exactly on of the flavor lists! - foreach (const QList<Abi::OSFlavor> &l, flavorLists) { - QVERIFY(l.contains(Abi::UnknownFlavor)); - if (l.contains(static_cast<Abi::OSFlavor>(i))) - ++foundCounter; - } - QCOMPARE(foundCounter, 1); - } -} - void ProjectExplorer::ProjectExplorerPlugin::testAbiFromTargetTriplet_data() { QTest::addColumn<int>("architecture"); @@ -1243,15 +1202,15 @@ void ProjectExplorer::ProjectExplorerPlugin::testAbiFromTargetTriplet_data() QTest::addColumn<int>("wordWidth"); QTest::newRow("x86_64-apple-darwin") << int(Abi::X86Architecture) - << int(Abi::DarwinOS) << int(Abi::GenericDarwinFlavor) + << int(Abi::DarwinOS) << int(Abi::GenericFlavor) << int(Abi::MachOFormat) << 64; QTest::newRow("x86_64-apple-darwin12.5.0") << int(Abi::X86Architecture) - << int(Abi::DarwinOS) << int(Abi::GenericDarwinFlavor) + << int(Abi::DarwinOS) << int(Abi::GenericFlavor) << int(Abi::MachOFormat) << 64; QTest::newRow("x86_64-linux-gnu") << int(Abi::X86Architecture) - << int(Abi::LinuxOS) << int(Abi::GenericLinuxFlavor) + << int(Abi::LinuxOS) << int(Abi::GenericFlavor) << int(Abi::ElfFormat) << 64; QTest::newRow("x86_64-pc-mingw32msvc") << int(Abi::X86Architecture) @@ -1263,7 +1222,7 @@ void ProjectExplorer::ProjectExplorerPlugin::testAbiFromTargetTriplet_data() << int(Abi::PEFormat) << 32; QTest::newRow("i686-linux-gnu") << int(Abi::X86Architecture) - << int(Abi::LinuxOS) << int(Abi::GenericLinuxFlavor) + << int(Abi::LinuxOS) << int(Abi::GenericFlavor) << int(Abi::ElfFormat) << 32; QTest::newRow("i686-linux-android") << int(Abi::X86Architecture) @@ -1307,7 +1266,7 @@ void ProjectExplorer::ProjectExplorerPlugin::testAbiFromTargetTriplet_data() << int(Abi::ElfFormat) << 32; QTest::newRow("arm-none-linux-gnueabi") << int(Abi::ArmArchitecture) - << int(Abi::LinuxOS) << int(Abi::GenericLinuxFlavor) + << int(Abi::LinuxOS) << int(Abi::GenericFlavor) << int(Abi::ElfFormat) << 32; QTest::newRow("mipsel-linux-android") << int(Abi::MipsArchitecture) @@ -1319,7 +1278,7 @@ void ProjectExplorer::ProjectExplorerPlugin::testAbiFromTargetTriplet_data() << int(Abi::ElfFormat) << 32; QTest::newRow("mips-linux-gnu") << int(Abi::MipsArchitecture) - << int(Abi::LinuxOS) << int(Abi::GenericLinuxFlavor) + << int(Abi::LinuxOS) << int(Abi::GenericFlavor) << int(Abi::ElfFormat) << 32; QTest::newRow("mips64el-linux-android") << int(Abi::MipsArchitecture) @@ -1331,11 +1290,11 @@ void ProjectExplorer::ProjectExplorerPlugin::testAbiFromTargetTriplet_data() << int(Abi::ElfFormat) << 64; QTest::newRow("mips64-linux-octeon-gnu") << int(Abi::MipsArchitecture) - << int(Abi::LinuxOS) << int(Abi::GenericLinuxFlavor) + << int(Abi::LinuxOS) << int(Abi::GenericFlavor) << int(Abi::ElfFormat) << 64; QTest::newRow("mips64el-linux-gnuabi") << int(Abi::MipsArchitecture) - << int(Abi::LinuxOS) << int(Abi::GenericLinuxFlavor) + << int(Abi::LinuxOS) << int(Abi::GenericFlavor) << int(Abi::ElfFormat) << 64; QTest::newRow("arm-wrs-vxworks") << int(Abi::ArmArchitecture) @@ -1347,15 +1306,15 @@ void ProjectExplorer::ProjectExplorerPlugin::testAbiFromTargetTriplet_data() << int(Abi::ElfFormat) << 64; QTest::newRow("aarch64-unknown-linux-gnu") << int(Abi::ArmArchitecture) - << int(Abi::LinuxOS) << int(Abi::GenericLinuxFlavor) + << int(Abi::LinuxOS) << int(Abi::GenericFlavor) << int(Abi::ElfFormat) << 64; QTest::newRow("xtensa-lx106-elf") << int(Abi::XtensaArchitecture) - << int(Abi::BareMetalOS) << int(Abi::GenericBareMetalFlavor) + << int(Abi::BareMetalOS) << int(Abi::GenericFlavor) << int(Abi::ElfFormat) << 32; // Yes, that's the entire triplet QTest::newRow("avr") << int(Abi::AvrArchitecture) - << int(Abi::BareMetalOS) << int(Abi::GenericBareMetalFlavor) + << int(Abi::BareMetalOS) << int(Abi::GenericFlavor) << int(Abi::ElfFormat) << 16; } @@ -1375,4 +1334,65 @@ void ProjectExplorer::ProjectExplorerPlugin::testAbiFromTargetTriplet() QCOMPARE(Abi::abiFromTargetTriplet(QLatin1String(QTest::currentDataTag())), expectedAbi); } +void ProjectExplorer::ProjectExplorerPlugin::testAbiUserOsFlavor_data() +{ + QTest::addColumn<int>("os"); + QTest::addColumn<QString>("osFlavorName"); + QTest::addColumn<int>("expectedFlavor"); + + QTest::newRow("linux-generic flavor") + << int(Abi::LinuxOS) << "generic" << int(Abi::GenericFlavor); + QTest::newRow("linux-unknown flavor") + << int(Abi::LinuxOS) << "unknown" << int(Abi::UnknownFlavor); + QTest::newRow("windows-msvc2010 flavor") + << int(Abi::WindowsOS) << "msvc2010" << int(Abi::WindowsMsvc2010Flavor); + QTest::newRow("windows-unknown flavor") + << int(Abi::WindowsOS) << "unknown" << int(Abi::UnknownFlavor); + + QTest::newRow("windows-msvc2100 flavor") + << int(Abi::WindowsOS) << "msvc2100" << int(Abi::UnknownFlavor) + 1; + QTest::newRow("linux-msvc2100 flavor") + << int(Abi::LinuxOS) << "msvc2100" << int(Abi::UnknownFlavor) + 1; + + QTest::newRow("windows-msvc2100 flavor reregister") + << int(Abi::WindowsOS) << "msvc2100" << int(Abi::UnknownFlavor) + 1; + QTest::newRow("linux-msvc2100 flavor reregister") + << int(Abi::LinuxOS) << "msvc2100" << int(Abi::UnknownFlavor) + 1; + QTest::newRow("unix-msvc2100 flavor register") + << int(Abi::UnixOS) << "msvc2100" << int(Abi::UnknownFlavor) + 1; +} + +void ProjectExplorer::ProjectExplorerPlugin::testAbiUserOsFlavor() +{ + QFETCH(int, os); + QFETCH(QString, osFlavorName); + QFETCH(int, expectedFlavor); + + QMap<int, QList<Abi::OSFlavor>> osFlavorMap; + for (int i = 0; i <= Abi::UnknownOS; ++i) + osFlavorMap.insert(i, Abi::flavorsForOs(static_cast<ProjectExplorer::Abi::OS>(i))); + + Abi::OSFlavor osFlavor = Abi::registerOsFlavor({static_cast<Abi::OS>(os)}, osFlavorName); + QCOMPARE(osFlavor, static_cast<Abi::OSFlavor>(expectedFlavor)); + + for (int i = 0; i <= Abi::UnknownOS; ++i) { + const QList<Abi::OSFlavor> flavors = Abi::flavorsForOs(static_cast<Abi::OS>(i)); + const QList<Abi::OSFlavor> previousFlavors = osFlavorMap.value(static_cast<Abi::OS>(i)); + const int previousCount = previousFlavors.count(); + + if (i == os && previousCount != flavors.count()) { + QVERIFY(flavors.count() == previousCount + 1); + QVERIFY(flavors.contains(osFlavor)); + for (const Abi::OSFlavor &f : previousFlavors) { + if (f == osFlavor) + continue; + QVERIFY(previousFlavors.contains(f)); + } + } else { + QCOMPARE(flavors, previousFlavors); + } + } +} + + #endif diff --git a/src/plugins/projectexplorer/abi.h b/src/plugins/projectexplorer/abi.h index 45702b0054..09cc284a5c 100644 --- a/src/plugins/projectexplorer/abi.h +++ b/src/plugins/projectexplorer/abi.h @@ -72,14 +72,9 @@ public: OpenBsdFlavor, // Linux - GenericLinuxFlavor, AndroidLinuxFlavor, - // Darwin - GenericDarwinFlavor, - // Unix - GenericUnixFlavor, SolarisUnixFlavor, // Windows @@ -95,13 +90,12 @@ public: // Embedded VxWorksFlavor, - GenericQnxFlavor, - GenericBareMetalFlavor, // Generic: RtosFlavor, + GenericFlavor, - UnknownFlavor + UnknownFlavor // keep last in this enum! }; enum BinaryFormat { @@ -112,14 +106,9 @@ public: UnknownFormat }; - Abi() : - m_architecture(UnknownArchitecture), m_os(UnknownOS), - m_osFlavor(UnknownFlavor), m_binaryFormat(UnknownFormat), m_wordWidth(0) - { } - - Abi(const Architecture &a, const OS &o, - const OSFlavor &so, const BinaryFormat &f, unsigned char w); - Abi(const QString &abiString); + Abi(const Architecture &a = UnknownArchitecture, const OS &o = UnknownOS, + const OSFlavor &so = UnknownFlavor, const BinaryFormat &f = UnknownFormat, + unsigned char w = 0); static Abi abiFromTargetTriplet(const QString &machineTriple); @@ -150,12 +139,17 @@ public: static BinaryFormat binaryFormatFromString(const QStringRef &bf); static unsigned char wordWidthFromString(const QStringRef &w); + static OSFlavor registerOsFlavor(const std::vector<OS> &oses, const QString &flavorName); static QList<OSFlavor> flavorsForOs(const OS &o); + static QList<OSFlavor> allOsFlavors(); + static bool osSupportsFlavor(const OS &os, const OSFlavor &flavor); static OSFlavor flavorForMsvcVersion(int version); + static Abi fromString(const QString &abiString); static Abi hostAbi(); static QList<Abi> abisOfBinary(const Utils::FileName &path); + private: Architecture m_architecture; OS m_os; diff --git a/src/plugins/projectexplorer/abiwidget.cpp b/src/plugins/projectexplorer/abiwidget.cpp index efff460634..d4a3070d69 100644 --- a/src/plugins/projectexplorer/abiwidget.cpp +++ b/src/plugins/projectexplorer/abiwidget.cpp @@ -75,9 +75,9 @@ public: // -------------------------------------------------------------------------- AbiWidget::AbiWidget(QWidget *parent) : QWidget(parent), - d(new Internal::AbiWidgetPrivate) + d(std::make_unique<Internal::AbiWidgetPrivate>()) { - QHBoxLayout *layout = new QHBoxLayout(this); + auto *layout = new QHBoxLayout(this); layout->setMargin(0); layout->setSpacing(2); @@ -152,10 +152,7 @@ AbiWidget::AbiWidget(QWidget *parent) : QWidget(parent), setAbis(QList<Abi>(), Abi::hostAbi()); } -AbiWidget::~AbiWidget() -{ - delete d; -} +AbiWidget::~AbiWidget() = default; static Abi selectAbi(const Abi ¤t, const QList<Abi> &abiList) { @@ -197,7 +194,7 @@ QList<Abi> AbiWidget::supportedAbis() const QList<Abi> result; result.reserve(d->m_abi->count()); for (int i = 1; i < d->m_abi->count(); ++i) - result << Abi(d->m_abi->itemData(i).toString()); + result << Abi::fromString(d->m_abi->itemData(i).toString()); return result; } @@ -240,7 +237,7 @@ void AbiWidget::mainComboBoxChanged() if (d->m_ignoreChanges.isLocked()) return; - const Abi newAbi = d->m_abi->currentData().toString(); + const Abi newAbi = Abi::fromString(d->m_abi->currentData().toString()); const bool customMode = d->isCustom(); d->m_architectureComboBox->setEnabled(customMode); @@ -254,7 +251,7 @@ void AbiWidget::mainComboBoxChanged() if (customMode) customComboBoxesChanged(); else - emitAbiChanged(Abi(d->m_abi->currentData().toString())); + emitAbiChanged(Abi::fromString(d->m_abi->currentData().toString())); } void AbiWidget::customComboBoxesChanged() diff --git a/src/plugins/projectexplorer/abiwidget.h b/src/plugins/projectexplorer/abiwidget.h index 569840bc1f..b8a64dd05c 100644 --- a/src/plugins/projectexplorer/abiwidget.h +++ b/src/plugins/projectexplorer/abiwidget.h @@ -29,6 +29,8 @@ #include <QWidget> +#include <memory> + namespace ProjectExplorer { class Abi; @@ -64,7 +66,7 @@ private: void emitAbiChanged(const Abi ¤t); - Internal::AbiWidgetPrivate *const d; + const std::unique_ptr<Internal::AbiWidgetPrivate> d; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/abstractmsvctoolchain.cpp b/src/plugins/projectexplorer/abstractmsvctoolchain.cpp index 195f430d70..a0755b38c2 100644 --- a/src/plugins/projectexplorer/abstractmsvctoolchain.cpp +++ b/src/plugins/projectexplorer/abstractmsvctoolchain.cpp @@ -53,10 +53,6 @@ AbstractMsvcToolChain::AbstractMsvcToolChain(Core::Id typeId, Core::Id l, Detect m_abi(abi), m_vcvarsBat(vcvarsBat) { - Q_ASSERT(abi.os() == Abi::WindowsOS); - Q_ASSERT(abi.binaryFormat() == Abi::PEFormat); - Q_ASSERT(abi.osFlavor() != Abi::WindowsMSysFlavor); - Q_ASSERT(!m_vcvarsBat.isEmpty()); setLanguage(l); } @@ -437,15 +433,14 @@ bool AbstractMsvcToolChain::operator ==(const ToolChain &other) const if (!ToolChain::operator ==(other)) return false; - const AbstractMsvcToolChain *msvcTc = static_cast<const AbstractMsvcToolChain *>(&other); + const auto *msvcTc = static_cast<const AbstractMsvcToolChain *>(&other); return targetAbi() == msvcTc->targetAbi() && m_vcvarsBat == msvcTc->m_vcvarsBat; } AbstractMsvcToolChain::WarningFlagAdder::WarningFlagAdder(const QString &flag, WarningFlags &flags) : - m_flags(flags), - m_triggered(false) + m_flags(flags) { if (flag.startsWith(QLatin1String("-wd"))) { m_doesEnable = false; diff --git a/src/plugins/projectexplorer/abstractmsvctoolchain.h b/src/plugins/projectexplorer/abstractmsvctoolchain.h index 7bfdf3ac46..7feee8561c 100644 --- a/src/plugins/projectexplorer/abstractmsvctoolchain.h +++ b/src/plugins/projectexplorer/abstractmsvctoolchain.h @@ -107,7 +107,7 @@ protected: mutable QList<HeaderPath> m_headerPaths; Abi m_abi; - QString m_vcvarsBat; + QString m_vcvarsBat; }; } // namespace Internal diff --git a/src/plugins/projectexplorer/applicationlauncher.cpp b/src/plugins/projectexplorer/applicationlauncher.cpp index 804954d14e..8cb71a9bec 100644 --- a/src/plugins/projectexplorer/applicationlauncher.cpp +++ b/src/plugins/projectexplorer/applicationlauncher.cpp @@ -69,7 +69,7 @@ class ApplicationLauncherPrivate : public QObject public: enum State { Inactive, Run }; explicit ApplicationLauncherPrivate(ApplicationLauncher *parent); - ~ApplicationLauncherPrivate() { setFinished(); } + ~ApplicationLauncherPrivate() override { setFinished(); } void start(const Runnable &runnable, const IDevice::ConstPtr &device, bool local); void stop(); @@ -104,7 +104,7 @@ public: // Local QtcProcess m_guiProcess; ConsoleProcess m_consoleProcess; - ApplicationLauncher::Mode m_currentMode = ApplicationLauncher::Gui; + bool m_useTerminal = false; // Keep track whether we need to emit a finished signal bool m_processRunning = false; @@ -165,20 +165,21 @@ ApplicationLauncherPrivate::ApplicationLauncherPrivate(ApplicationLauncher *pare } ApplicationLauncher::ApplicationLauncher(QObject *parent) : QObject(parent), - d(new ApplicationLauncherPrivate(this)) -{ -} + d(std::make_unique<ApplicationLauncherPrivate>(this)) +{ } -ApplicationLauncher::~ApplicationLauncher() -{ - delete d; -} +ApplicationLauncher::~ApplicationLauncher() = default; void ApplicationLauncher::setProcessChannelMode(QProcess::ProcessChannelMode mode) { d->m_guiProcess.setProcessChannelMode(mode); } +void ApplicationLauncher::setUseTerminal(bool on) +{ + d->m_useTerminal = on; +} + void ApplicationLauncher::stop() { d->stop(); @@ -189,15 +190,15 @@ void ApplicationLauncherPrivate::stop() if (m_isLocal) { if (!isRunning()) return; - if (m_currentMode == ApplicationLauncher::Gui) { + if (m_useTerminal) { + m_consoleProcess.stop(); + localProcessDone(0, QProcess::CrashExit); + } else { m_guiProcess.terminate(); if (!m_guiProcess.waitForFinished(1000) && m_guiProcess.state() == QProcess::Running) { // This is blocking, so be fast. m_guiProcess.kill(); m_guiProcess.waitForFinished(); } - } else { - m_consoleProcess.stop(); - localProcessDone(0, QProcess::CrashExit); } } else { if (m_stopRequested) @@ -227,9 +228,9 @@ bool ApplicationLauncher::isRemoteRunning() const bool ApplicationLauncherPrivate::isRunning() const { - if (m_currentMode == ApplicationLauncher::Gui) - return m_guiProcess.state() != QProcess::NotRunning; - return m_consoleProcess.isRunning(); + if (m_useTerminal) + return m_consoleProcess.isRunning(); + return m_guiProcess.state() != QProcess::NotRunning; } bool ApplicationLauncherPrivate::isRemoteRunning() const @@ -247,7 +248,7 @@ qint64 ApplicationLauncherPrivate::applicationPID() const if (!isRunning()) return 0; - if (m_currentMode == ApplicationLauncher::Console) + if (m_useTerminal) return m_consoleProcess.applicationPID(); return m_guiProcess.processId(); @@ -255,18 +256,18 @@ qint64 ApplicationLauncherPrivate::applicationPID() const QString ApplicationLauncher::errorString() const { - if (d->m_currentMode == Gui) - return d->m_guiProcess.errorString(); - else + if (d->m_useTerminal) return d->m_consoleProcess.errorString(); + else + return d->m_guiProcess.errorString(); } QProcess::ProcessError ApplicationLauncher::processError() const { - if (d->m_currentMode == Gui) - return d->m_guiProcess.error(); - else + if (d->m_useTerminal) return d->m_consoleProcess.error(); + else + return d->m_guiProcess.error(); } void ApplicationLauncherPrivate::localGuiProcessError() @@ -319,7 +320,7 @@ void ApplicationLauncherPrivate::readLocalStandardError() void ApplicationLauncherPrivate::cannotRetrieveLocalDebugOutput() { #ifdef Q_OS_WIN - disconnect(WinDebugInterface::instance(), 0, this, 0); + disconnect(WinDebugInterface::instance(), nullptr, this, nullptr); emit q->appendMessage(ApplicationLauncher::msgWinCannotRetrieveDebuggingOutput(), ErrorMessageFormat); #endif } @@ -377,8 +378,7 @@ void ApplicationLauncherPrivate::start(const Runnable &runnable, const IDevice:: WinDebugInterface::instance()->start(); // Try to start listener again... #endif - m_currentMode = runnable.runMode; - if (m_currentMode == ApplicationLauncher::Gui) { + if (!m_useTerminal) { m_guiProcess.setCommand(runnable.executable, runnable.commandLineArguments); m_guiProcess.closeWriteChannel(); m_guiProcess.start(); @@ -442,7 +442,7 @@ void ApplicationLauncherPrivate::setFinished() if (m_deviceProcess) { m_deviceProcess->disconnect(this); m_deviceProcess->deleteLater(); - m_deviceProcess = 0; + m_deviceProcess = nullptr; } m_state = Inactive; diff --git a/src/plugins/projectexplorer/applicationlauncher.h b/src/plugins/projectexplorer/applicationlauncher.h index a321c2214d..68376fece0 100644 --- a/src/plugins/projectexplorer/applicationlauncher.h +++ b/src/plugins/projectexplorer/applicationlauncher.h @@ -34,6 +34,8 @@ #include <QProcess> +#include <memory> + namespace Utils { class ProcessHandle; } namespace ProjectExplorer { @@ -47,15 +49,11 @@ class PROJECTEXPLORER_EXPORT ApplicationLauncher : public QObject Q_OBJECT public: - enum Mode { - Console, - Gui - }; - explicit ApplicationLauncher(QObject *parent = nullptr); ~ApplicationLauncher() override; void setProcessChannelMode(QProcess::ProcessChannelMode mode); + void setUseTerminal(bool on); void start(const Runnable &runnable); void start(const Runnable &runnable, const IDevice::ConstPtr &device); void stop(); @@ -83,7 +81,7 @@ signals: void finished(bool success); private: - Internal::ApplicationLauncherPrivate *d; + std::unique_ptr<Internal::ApplicationLauncherPrivate> d; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/appoutputpane.cpp b/src/plugins/projectexplorer/appoutputpane.cpp index de0151e02d..b3e200dfb3 100644 --- a/src/plugins/projectexplorer/appoutputpane.cpp +++ b/src/plugins/projectexplorer/appoutputpane.cpp @@ -121,14 +121,14 @@ bool TabWidget::eventFilter(QObject *object, QEvent *event) { if (object == tabBar()) { if (event->type() == QEvent::MouseButtonPress) { - QMouseEvent *me = static_cast<QMouseEvent *>(event); + auto *me = static_cast<QMouseEvent *>(event); if (me->button() == Qt::MiddleButton) { m_tabIndexForMiddleClick = tabBar()->tabAt(me->pos()); event->accept(); return true; } } else if (event->type() == QEvent::MouseButtonRelease) { - QMouseEvent *me = static_cast<QMouseEvent *>(event); + auto *me = static_cast<QMouseEvent *>(event); if (me->button() == Qt::MiddleButton) { int tab = tabBar()->tabAt(me->pos()); if (tab != -1 && tab == m_tabIndexForMiddleClick) @@ -221,7 +221,7 @@ AppOutputPane::AppOutputPane() : // Spacer (?) - QVBoxLayout *layout = new QVBoxLayout; + auto *layout = new QVBoxLayout; layout->setMargin(0); m_tabWidget->setDocumentMode(true); m_tabWidget->setTabsClosable(true); @@ -353,7 +353,7 @@ int AppOutputPane::priorityInStatusBar() const void AppOutputPane::clearContents() { - Core::OutputWindow *currentWindow = qobject_cast<Core::OutputWindow *>(m_tabWidget->currentWidget()); + auto *currentWindow = qobject_cast<Core::OutputWindow *>(m_tabWidget->currentWidget()); if (currentWindow) currentWindow->clear(); } @@ -411,8 +411,15 @@ void AppOutputPane::createNewOutputWindow(RunControl *rc) this, &AppOutputPane::appendMessage); // First look if we can reuse a tab - const int tabIndex = Utils::indexOf(m_runControlTabs, [rc](const RunControlTab &tab) { - return rc->canReUseOutputPane(tab.runControl); + const Runnable thisRunnable = rc->runnable(); + const int tabIndex = Utils::indexOf(m_runControlTabs, [&](const RunControlTab &tab) { + if (!tab.runControl || tab.runControl->isRunning()) + return false; + const Runnable otherRunnable = tab.runControl->runnable(); + return thisRunnable.executable == otherRunnable.executable + && thisRunnable.commandLineArguments == otherRunnable.commandLineArguments + && thisRunnable.workingDirectory == otherRunnable.workingDirectory + && thisRunnable.environment == otherRunnable.environment; }); if (tabIndex != -1) { RunControlTab &tab = m_runControlTabs[tabIndex]; @@ -451,7 +458,7 @@ void AppOutputPane::createNewOutputWindow(RunControl *rc) tab.window->setFontZoom(m_zoom); }); - Aggregation::Aggregate *agg = new Aggregation::Aggregate; + auto *agg = new Aggregation::Aggregate; agg->add(ow); agg->add(new Core::BaseTextFind(ow)); m_runControlTabs.push_back(RunControlTab(rc, ow)); @@ -682,7 +689,7 @@ void AppOutputPane::tabChanged(int i) void AppOutputPane::contextMenuRequested(const QPoint &pos, int index) { QList<QAction *> actions = QList<QAction *>() << m_closeCurrentTabAction << m_closeAllTabsAction << m_closeOtherTabsAction; - QAction *action = QMenu::exec(actions, m_tabWidget->mapToGlobal(pos), 0, m_tabWidget); + QAction *action = QMenu::exec(actions, m_tabWidget->mapToGlobal(pos), nullptr, m_tabWidget); const int currentIdx = index != -1 ? index : currentIndex(); if (action == m_closeCurrentTabAction) { if (currentIdx >= 0) @@ -705,7 +712,7 @@ void AppOutputPane::slotRunControlChanged() void AppOutputPane::slotRunControlFinished() { - RunControl *rc = qobject_cast<RunControl *>(sender()); + auto *rc = qobject_cast<RunControl *>(sender()); QTimer::singleShot(0, this, [this, rc]() { slotRunControlFinished2(rc); }); if (rc->outputFormatter()) rc->outputFormatter()->flush(); diff --git a/src/plugins/projectexplorer/baseprojectwizarddialog.cpp b/src/plugins/projectexplorer/baseprojectwizarddialog.cpp index 61a66a1206..cb0734f226 100644 --- a/src/plugins/projectexplorer/baseprojectwizarddialog.cpp +++ b/src/plugins/projectexplorer/baseprojectwizarddialog.cpp @@ -64,7 +64,7 @@ BaseProjectWizardDialog::BaseProjectWizardDialog(const Core::BaseFileWizardFacto QWidget *parent, const Core::WizardDialogParameters ¶meters) : Core::BaseFileWizard(factory, parameters.extraValues(), parent), - d(new BaseProjectWizardDialogPrivate(new Utils::ProjectIntroPage)) + d(std::make_unique<BaseProjectWizardDialogPrivate>(new Utils::ProjectIntroPage)) { setPath(parameters.defaultPath()); setSelectedPlatform(parameters.selectedPlatform()); @@ -77,7 +77,7 @@ BaseProjectWizardDialog::BaseProjectWizardDialog(const Core::BaseFileWizardFacto QWidget *parent, const Core::WizardDialogParameters ¶meters) : Core::BaseFileWizard(factory, parameters.extraValues(), parent), - d(new BaseProjectWizardDialogPrivate(introPage, introId)) + d(std::make_unique<BaseProjectWizardDialogPrivate>(introPage, introId)) { setPath(parameters.defaultPath()); setSelectedPlatform(parameters.selectedPlatform()); @@ -96,10 +96,7 @@ void BaseProjectWizardDialog::init() connect(this, &QDialog::accepted, this, &BaseProjectWizardDialog::slotAccepted); } -BaseProjectWizardDialog::~BaseProjectWizardDialog() -{ - delete d; -} +BaseProjectWizardDialog::~BaseProjectWizardDialog() = default; QString BaseProjectWizardDialog::projectName() const { diff --git a/src/plugins/projectexplorer/baseprojectwizarddialog.h b/src/plugins/projectexplorer/baseprojectwizarddialog.h index 3cd414e338..98db214c96 100644 --- a/src/plugins/projectexplorer/baseprojectwizarddialog.h +++ b/src/plugins/projectexplorer/baseprojectwizarddialog.h @@ -30,6 +30,8 @@ #include <coreplugin/basefilewizard.h> #include <coreplugin/basefilewizardfactory.h> +#include <memory> + namespace Utils { class ProjectIntroPage; } namespace ProjectExplorer { @@ -82,7 +84,7 @@ private: void slotAccepted(); bool validateCurrentPage() override; - BaseProjectWizardDialogPrivate *d; + std::unique_ptr<BaseProjectWizardDialogPrivate> d; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp index b58bea1e5c..202e6cb463 100644 --- a/src/plugins/projectexplorer/buildconfiguration.cpp +++ b/src/plugins/projectexplorer/buildconfiguration.cpp @@ -25,19 +25,18 @@ #include "buildconfiguration.h" +#include "buildenvironmentwidget.h" #include "buildinfo.h" #include "buildsteplist.h" -#include "projectexplorer.h" +#include "kit.h" +#include "kitinformation.h" #include "kitmanager.h" -#include "target.h" #include "project.h" -#include "kit.h" - -#include <projectexplorer/buildenvironmentwidget.h> -#include <projectexplorer/kitinformation.h> -#include <projectexplorer/projectexplorerconstants.h> -#include <projectexplorer/projectmacroexpander.h> -#include <projectexplorer/target.h> +#include "projectexplorer.h" +#include "projectexplorerconstants.h" +#include "projectmacroexpander.h" +#include "projecttree.h" +#include "target.h" #include <coreplugin/idocument.h> @@ -77,9 +76,12 @@ BuildConfiguration::BuildConfiguration(Target *target, Core::Id id) updateCacheAndEmitEnvironmentChanged(); connect(target, &Target::kitChanged, - this, &BuildConfiguration::handleKitUpdate); + this, &BuildConfiguration::updateCacheAndEmitEnvironmentChanged); connect(this, &BuildConfiguration::environmentChanged, this, &BuildConfiguration::emitBuildDirectoryChanged); + // Many macroexpanders are based on the current project, so they may change the environment: + connect(ProjectTree::instance(), &ProjectTree::currentProjectChanged, + this, &BuildConfiguration::updateCacheAndEmitEnvironmentChanged); } Utils::FileName BuildConfiguration::buildDirectory() const @@ -184,11 +186,6 @@ void BuildConfiguration::updateCacheAndEmitEnvironmentChanged() emit environmentChanged(); // might trigger buildDirectoryChanged signal! } -void BuildConfiguration::handleKitUpdate() -{ - updateCacheAndEmitEnvironmentChanged(); -} - void BuildConfiguration::emitBuildDirectoryChanged() { if (buildDirectory() != m_lastEmmitedBuildDirectory) { @@ -271,6 +268,12 @@ QString BuildConfiguration::disabledReason() const return QString(); } +bool BuildConfiguration::regenerateBuildFiles(Node *node) +{ + Q_UNUSED(node); + return false; +} + QString BuildConfiguration::buildTypeName(BuildConfiguration::BuildType type) { switch (type) { @@ -355,7 +358,7 @@ int IBuildConfigurationFactory::priority(const Kit *k, const QString &projectPat // setup IBuildConfigurationFactory *IBuildConfigurationFactory::find(const Kit *k, const QString &projectPath) { - IBuildConfigurationFactory *factory = 0; + IBuildConfigurationFactory *factory = nullptr; int priority = -1; for (IBuildConfigurationFactory *i : g_buildConfigurationFactories) { int iPriority = i->priority(k, projectPath); @@ -370,7 +373,7 @@ IBuildConfigurationFactory *IBuildConfigurationFactory::find(const Kit *k, const // create IBuildConfigurationFactory * IBuildConfigurationFactory::find(Target *parent) { - IBuildConfigurationFactory *factory = 0; + IBuildConfigurationFactory *factory = nullptr; int priority = -1; for (IBuildConfigurationFactory *i : g_buildConfigurationFactories) { int iPriority = i->priority(parent); diff --git a/src/plugins/projectexplorer/buildconfiguration.h b/src/plugins/projectexplorer/buildconfiguration.h index 7535409a67..a368fe4909 100644 --- a/src/plugins/projectexplorer/buildconfiguration.h +++ b/src/plugins/projectexplorer/buildconfiguration.h @@ -36,6 +36,7 @@ namespace ProjectExplorer { class BuildInfo; class NamedWidget; class BuildStepList; +class Node; class Kit; class Target; class IOutputParser; @@ -79,6 +80,8 @@ public: virtual bool isEnabled() const; virtual QString disabledReason() const; + virtual bool regenerateBuildFiles(Node *node); + enum BuildType { Unknown, Debug, @@ -93,6 +96,7 @@ public: void prependCompilerPathToEnvironment(Utils::Environment &env) const; static void prependCompilerPathToEnvironment(Kit *k, Utils::Environment &env); + void updateCacheAndEmitEnvironmentChanged(); signals: void environmentChanged(); @@ -102,10 +106,8 @@ signals: protected: virtual void initialize(const BuildInfo *info); - void updateCacheAndEmitEnvironmentChanged(); private: - void handleKitUpdate(); void emitBuildDirectoryChanged(); bool m_clearSystemEnvironment = false; diff --git a/src/plugins/projectexplorer/buildinfo.cpp b/src/plugins/projectexplorer/buildinfo.cpp index d8b9d6987c..67dca0e280 100644 --- a/src/plugins/projectexplorer/buildinfo.cpp +++ b/src/plugins/projectexplorer/buildinfo.cpp @@ -27,5 +27,4 @@ using namespace ProjectExplorer; -BuildInfo::~BuildInfo() -{ } +BuildInfo::~BuildInfo() = default; diff --git a/src/plugins/projectexplorer/buildmanager.cpp b/src/plugins/projectexplorer/buildmanager.cpp index ac23d7f3e7..10c60357fe 100644 --- a/src/plugins/projectexplorer/buildmanager.cpp +++ b/src/plugins/projectexplorer/buildmanager.cpp @@ -61,7 +61,7 @@ namespace ProjectExplorer { static QString msgProgress(int progress, int total) { - return BuildManager::tr("Finished %1 of %n steps", 0, total).arg(progress); + return BuildManager::tr("Finished %1 of %n steps", nullptr, total).arg(progress); } class BuildManagerPrivate @@ -103,6 +103,7 @@ static BuildManager *m_instance = nullptr; BuildManager::BuildManager(QObject *parent, QAction *cancelBuildAction) : QObject(parent) { + QTC_CHECK(!m_instance); m_instance = this; d = new BuildManagerPrivate; @@ -166,6 +167,7 @@ BuildManager::~BuildManager() delete d->m_outputWindow; delete d; + d = nullptr; } void BuildManager::aboutToRemoveProject(Project *p) @@ -642,8 +644,8 @@ void BuildManager::decrementActiveBuildSteps(BuildStep *bs) void BuildManager::disconnectOutput(BuildStep *bs) { - disconnect(bs, &BuildStep::addTask, m_instance, 0); - disconnect(bs, &BuildStep::addOutput, m_instance, 0); + disconnect(bs, &BuildStep::addTask, m_instance, nullptr); + disconnect(bs, &BuildStep::addOutput, m_instance, nullptr); } } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/buildstep.cpp b/src/plugins/projectexplorer/buildstep.cpp index 232a95483a..864fdbf6b3 100644 --- a/src/plugins/projectexplorer/buildstep.cpp +++ b/src/plugins/projectexplorer/buildstep.cpp @@ -140,12 +140,20 @@ QVariantMap BuildStep::toMap() const BuildConfiguration *BuildStep::buildConfiguration() const { - return qobject_cast<BuildConfiguration *>(parent()->parent()); + auto config = qobject_cast<BuildConfiguration *>(parent()->parent()); + if (config) + return config; + // step is not part of a build configuration, use active build configuration of step's target + return target()->activeBuildConfiguration(); } DeployConfiguration *BuildStep::deployConfiguration() const { - return qobject_cast<DeployConfiguration *>(parent()->parent()); + auto config = qobject_cast<DeployConfiguration *>(parent()->parent()); + if (config) + return config; + // step is not part of a deploy configuration, use active deploy configuration of step's target + return target()->activeDeployConfiguration(); } ProjectConfiguration *BuildStep::projectConfiguration() const diff --git a/src/plugins/projectexplorer/buildstep.h b/src/plugins/projectexplorer/buildstep.h index dd68e52216..d6e685735b 100644 --- a/src/plugins/projectexplorer/buildstep.h +++ b/src/plugins/projectexplorer/buildstep.h @@ -118,13 +118,11 @@ public: BuildStepCreator creator; }; -class PROJECTEXPLORER_EXPORT BuildStepFactory : public QObject +class PROJECTEXPLORER_EXPORT BuildStepFactory { - Q_OBJECT - public: BuildStepFactory(); - ~BuildStepFactory() override; + virtual ~BuildStepFactory(); static const QList<BuildStepFactory *> allBuildStepFactories(); @@ -133,9 +131,12 @@ public: BuildStep *create(BuildStepList *parent, Core::Id id); BuildStep *restore(BuildStepList *parent, const QVariantMap &map); - virtual bool canHandle(BuildStepList *bsl) const; + bool canHandle(BuildStepList *bsl) const; protected: + BuildStepFactory(const BuildStepFactory &) = delete; + BuildStepFactory &operator=(const BuildStepFactory &) = delete; + using BuildStepCreator = std::function<BuildStep *(BuildStepList *)>; template <class BuildStepType> diff --git a/src/plugins/projectexplorer/buildsteplist.cpp b/src/plugins/projectexplorer/buildsteplist.cpp index 6ae0cd6319..f961d9f4ef 100644 --- a/src/plugins/projectexplorer/buildsteplist.cpp +++ b/src/plugins/projectexplorer/buildsteplist.cpp @@ -184,7 +184,7 @@ Target *BuildStepList::target() const auto dc = qobject_cast<DeployConfiguration *>(parent()); if (dc) return dc->target(); - return 0; + return nullptr; } Project *BuildStepList::project() const diff --git a/src/plugins/projectexplorer/buildstepspage.cpp b/src/plugins/projectexplorer/buildstepspage.cpp index 6b6b6af6bb..2465ef002d 100644 --- a/src/plugins/projectexplorer/buildstepspage.cpp +++ b/src/plugins/projectexplorer/buildstepspage.cpp @@ -50,8 +50,7 @@ using namespace ProjectExplorer; using namespace ProjectExplorer::Internal; using namespace Utils; -ToolWidget::ToolWidget(QWidget *parent) : FadingPanel(parent), - m_targetOpacity(.999) +ToolWidget::ToolWidget(QWidget *parent) : FadingPanel(parent) { auto layout = new QHBoxLayout; layout->setMargin(4); @@ -169,7 +168,7 @@ void ToolWidget::setDownVisible(bool b) } BuildStepsWidgetData::BuildStepsWidgetData(BuildStep *s) : - step(s), widget(0), detailsWidget(0) + step(s), widget(nullptr), detailsWidget(nullptr) { widget = s->createConfigWidget(); Q_ASSERT(widget); diff --git a/src/plugins/projectexplorer/buildstepspage.h b/src/plugins/projectexplorer/buildstepspage.h index 81fd9a4c3d..17b2879376 100644 --- a/src/plugins/projectexplorer/buildstepspage.h +++ b/src/plugins/projectexplorer/buildstepspage.h @@ -52,8 +52,8 @@ class ToolWidget : public Utils::FadingPanel public: explicit ToolWidget(QWidget *parent = nullptr); - void fadeTo(qreal value); - void setOpacity(qreal value); + void fadeTo(qreal value) override; + void setOpacity(qreal value) override; void setBuildStepEnabled(bool b); void setUpEnabled(bool b); @@ -77,7 +77,7 @@ private: bool m_buildStepEnabled = true; Utils::FadingWidget *m_firstWidget; Utils::FadingWidget *m_secondWidget; - qreal m_targetOpacity; + qreal m_targetOpacity = .999; }; class BuildStepsWidgetData @@ -98,7 +98,7 @@ class BuildStepListWidget : public NamedWidget public: BuildStepListWidget(QWidget *parent = nullptr); - virtual ~BuildStepListWidget(); + ~BuildStepListWidget() override; void init(BuildStepList *bsl); diff --git a/src/plugins/projectexplorer/compileoutputwindow.cpp b/src/plugins/projectexplorer/compileoutputwindow.cpp index 2f1e4f75a0..ffdd9c24fb 100644 --- a/src/plugins/projectexplorer/compileoutputwindow.cpp +++ b/src/plugins/projectexplorer/compileoutputwindow.cpp @@ -108,7 +108,7 @@ private: } protected: - void mouseMoveEvent(QMouseEvent *ev) + void mouseMoveEvent(QMouseEvent *ev) override { const int line = cursorForPosition(ev->pos()).block().blockNumber(); if (m_taskids.contains(line) && m_mousePressButton == Qt::NoButton) @@ -118,14 +118,14 @@ protected: QPlainTextEdit::mouseMoveEvent(ev); } - void mousePressEvent(QMouseEvent *ev) + void mousePressEvent(QMouseEvent *ev) override { m_mousePressPosition = ev->pos(); m_mousePressButton = ev->button(); QPlainTextEdit::mousePressEvent(ev); } - void mouseReleaseEvent(QMouseEvent *ev) + void mouseReleaseEvent(QMouseEvent *ev) override { if ((m_mousePressPosition - ev->pos()).manhattanLength() < 4 && m_mousePressButton == Qt::LeftButton) { diff --git a/src/plugins/projectexplorer/currentprojectfind.cpp b/src/plugins/projectexplorer/currentprojectfind.cpp index 79a418afc8..578e0bdba7 100644 --- a/src/plugins/projectexplorer/currentprojectfind.cpp +++ b/src/plugins/projectexplorer/currentprojectfind.cpp @@ -66,7 +66,7 @@ QString CurrentProjectFind::displayName() const bool CurrentProjectFind::isEnabled() const { - return ProjectTree::currentProject() != 0 && BaseFileFind::isEnabled(); + return ProjectTree::currentProject() != nullptr && BaseFileFind::isEnabled(); } QVariant CurrentProjectFind::additionalParameters() const diff --git a/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp b/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp index 4d248bd43d..b26591ca81 100644 --- a/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp +++ b/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp @@ -152,7 +152,7 @@ void CustomExecutableDialog::accept() bool CustomExecutableDialog::event(QEvent *event) { if (event->type() == QEvent::ShortcutOverride) { - QKeyEvent *ke = static_cast<QKeyEvent *>(event); + auto *ke = static_cast<QKeyEvent *>(event); if (ke->key() == Qt::Key_Escape && !ke->modifiers()) { ke->accept(); return true; @@ -254,7 +254,6 @@ Runnable CustomExecutableRunConfiguration::runnable() const r.executable = extraAspect<ExecutableAspect>()->executable().toString(); r.commandLineArguments = extraAspect<ArgumentsAspect>()->arguments(); r.environment = extraAspect<EnvironmentAspect>()->environment(); - r.runMode = extraAspect<TerminalAspect>()->runMode(); r.workingDirectory = workingDirectory.toString(); r.device = DeviceManager::instance()->defaultDevice(Constants::DESKTOP_DEVICE_TYPE); @@ -285,6 +284,8 @@ CustomExecutableRunConfigurationFactory::CustomExecutableRunConfigurationFactory FixedRunConfigurationFactory(CustomExecutableRunConfiguration::tr("Custom Executable")) { registerRunConfiguration<CustomExecutableRunConfiguration>(CUSTOM_EXECUTABLE_ID); + + addRunWorkerFactory<SimpleTargetRunner>(ProjectExplorer::Constants::NORMAL_RUN_MODE); } } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/customparser.cpp b/src/plugins/projectexplorer/customparser.cpp index 34a9833b1d..8c0b287ce4 100644 --- a/src/plugins/projectexplorer/customparser.cpp +++ b/src/plugins/projectexplorer/customparser.cpp @@ -113,7 +113,7 @@ bool CustomParserSettings::operator ==(const CustomParserSettings &other) const CustomParser::CustomParser(const CustomParserSettings &settings) { - setObjectName(QLatin1String("CustomParser")); + setObjectName("CustomParser"); setSettings(settings); } @@ -134,6 +134,11 @@ void CustomParser::stdOutput(const QString &line) IOutputParser::stdOutput(line); } +void CustomParser::setWorkingDirectory(const QString &workingDirectory) +{ + m_workingDirectory = workingDirectory; +} + void CustomParser::setSettings(const CustomParserSettings &settings) { m_error = settings.error; @@ -145,6 +150,14 @@ Core::Id CustomParser::id() return Core::Id("ProjectExplorer.OutputParser.Custom"); } +FileName CustomParser::absoluteFilePath(const QString &filePath) const +{ + if (m_workingDirectory.isEmpty()) + return FileName::fromUserInput(filePath); + + return FileName::fromString(FileUtils::resolvePath(m_workingDirectory, filePath)); +} + bool CustomParser::hasMatch(const QString &line, CustomParserExpression::CustomParserChannel channel, const CustomParserExpression &expression, Task::TaskType taskType) { @@ -158,7 +171,7 @@ bool CustomParser::hasMatch(const QString &line, CustomParserExpression::CustomP if (!match.hasMatch()) return false; - const FileName fileName = FileName::fromUserInput(match.captured(expression.fileNameCap())); + const FileName fileName = absoluteFilePath(match.captured(expression.fileNameCap())); const int lineNumber = match.captured(expression.lineNumberCap()).toInt(); const QString message = match.captured(expression.messageCap()); @@ -188,6 +201,7 @@ bool CustomParser::parseLine(const QString &rawLine, CustomParserExpression::Cus void ProjectExplorerPlugin::testCustomOutputParsers_data() { QTest::addColumn<QString>("input"); + QTest::addColumn<QString>("workDir"); QTest::addColumn<OutputParserTester::Channel>("inputChannel"); QTest::addColumn<CustomParserExpression::CustomParserChannel>("filterErrorChannel"); QTest::addColumn<CustomParserExpression::CustomParserChannel>("filterWarningChannel"); @@ -205,11 +219,12 @@ void ProjectExplorerPlugin::testCustomOutputParsers_data() QTest::addColumn<QString>("outputLines"); const Core::Id categoryCompile = Constants::TASK_CATEGORY_COMPILE; - const QString simplePattern = QLatin1String("^([a-z]+\\.[a-z]+):(\\d+): error: ([^\\s].+)$"); - const FileName fileName = FileName::fromUserInput(QLatin1String("main.c")); + const QString simplePattern = "^([a-z]+\\.[a-z]+):(\\d+): error: ([^\\s].+)$"; + const FileName fileName = FileName::fromUserInput("main.c"); QTest::newRow("empty patterns") << QString::fromLatin1("Sometext") + << QString() << OutputParserTester::STDOUT << CustomParserExpression::ParseBothChannels << CustomParserExpression::ParseBothChannels << QString() << 1 << 2 << 3 @@ -220,6 +235,7 @@ void ProjectExplorerPlugin::testCustomOutputParsers_data() QTest::newRow("pass-through stdout") << QString::fromLatin1("Sometext") + << QString() << OutputParserTester::STDOUT << CustomParserExpression::ParseBothChannels << CustomParserExpression::ParseBothChannels << simplePattern << 1 << 2 << 3 @@ -230,6 +246,7 @@ void ProjectExplorerPlugin::testCustomOutputParsers_data() QTest::newRow("pass-through stderr") << QString::fromLatin1("Sometext") + << QString() << OutputParserTester::STDERR << CustomParserExpression::ParseBothChannels << CustomParserExpression::ParseBothChannels << simplePattern << 1 << 2 << 3 @@ -238,24 +255,63 @@ void ProjectExplorerPlugin::testCustomOutputParsers_data() << QList<Task>() << QString(); - const QString simpleError = QLatin1String("main.c:9: error: `sfasdf' undeclared (first use this function)"); - const QString simpleErrorPassThrough = simpleError + QLatin1Char('\n'); - const QString message = QLatin1String("`sfasdf' undeclared (first use this function)"); + const QString simpleError = "main.c:9: error: `sfasdf' undeclared (first use this function)"; + const QString simpleErrorPassThrough = simpleError + '\n'; + const QString message = "`sfasdf' undeclared (first use this function)"; QTest::newRow("simple error") << simpleError + << QString() << OutputParserTester::STDERR << CustomParserExpression::ParseBothChannels << CustomParserExpression::ParseBothChannels << simplePattern << 1 << 2 << 3 << QString() << 0 << 0 << 0 << QString() << QString() - << (QList<Task>() - << Task(Task::Error, message, fileName, 9, categoryCompile) - ) + << QList<Task>{Task(Task::Error, message, fileName, 9, categoryCompile)} + << QString(); + + const QString pathPattern = "^([a-z\\./]+):(\\d+): error: ([^\\s].+)$"; + QString workingDir = "/home/src/project"; + FileName expandedFileName = FileName::fromString("/home/src/project/main.c"); + + QTest::newRow("simple error with expanded path") + << "main.c:9: error: `sfasdf' undeclared (first use this function)" + << workingDir + << OutputParserTester::STDERR + << CustomParserExpression::ParseBothChannels << CustomParserExpression::ParseBothChannels + << pathPattern << 1 << 2 << 3 + << QString() << 0 << 0 << 0 + << QString() << QString() + << QList<Task>{Task(Task::Error, message, expandedFileName, 9, categoryCompile)} + << QString(); + + expandedFileName = FileName::fromString("/home/src/project/subdir/main.c"); + QTest::newRow("simple error with subdir path") + << "subdir/main.c:9: error: `sfasdf' undeclared (first use this function)" + << workingDir + << OutputParserTester::STDERR + << CustomParserExpression::ParseBothChannels << CustomParserExpression::ParseBothChannels + << pathPattern << 1 << 2 << 3 + << QString() << 0 << 0 << 0 + << QString() << QString() + << QList<Task>{Task(Task::Error, message, expandedFileName, 9, categoryCompile)} + << QString(); + + workingDir = "/home/src/build-project"; + QTest::newRow("simple error with buildir path") + << "../project/subdir/main.c:9: error: `sfasdf' undeclared (first use this function)" + << workingDir + << OutputParserTester::STDERR + << CustomParserExpression::ParseBothChannels << CustomParserExpression::ParseBothChannels + << pathPattern << 1 << 2 << 3 + << QString() << 0 << 0 << 0 + << QString() << QString() + << QList<Task>{Task(Task::Error, message, expandedFileName, 9, categoryCompile)} << QString(); QTest::newRow("simple error on wrong channel") << simpleError + << QString() << OutputParserTester::STDOUT << CustomParserExpression::ParseStdErrChannel << CustomParserExpression::ParseBothChannels << simplePattern << 1 << 2 << 3 @@ -266,6 +322,7 @@ void ProjectExplorerPlugin::testCustomOutputParsers_data() QTest::newRow("simple error on other wrong channel") << simpleError + << QString() << OutputParserTester::STDERR << CustomParserExpression::ParseStdOutChannel << CustomParserExpression::ParseBothChannels << simplePattern << 1 << 2 << 3 @@ -274,68 +331,65 @@ void ProjectExplorerPlugin::testCustomOutputParsers_data() << QList<Task>() << QString(); - const QString simpleError2 = QLatin1String("Error: Line 19 in main.c: `sfasdf' undeclared (first use this function)"); - const QString simplePattern2 = QLatin1String("^Error: Line (\\d+) in ([a-z]+\\.[a-z]+): ([^\\s].+)$"); + const QString simpleError2 = "Error: Line 19 in main.c: `sfasdf' undeclared (first use this function)"; + const QString simplePattern2 = "^Error: Line (\\d+) in ([a-z]+\\.[a-z]+): ([^\\s].+)$"; const int lineNumber2 = 19; QTest::newRow("another simple error on stderr") << simpleError2 + << QString() << OutputParserTester::STDERR << CustomParserExpression::ParseBothChannels << CustomParserExpression::ParseBothChannels << simplePattern2 << 2 << 1 << 3 << QString() << 1 << 2 << 3 << QString() << QString() - << (QList<Task>() - << Task(Task::Error, message, fileName, lineNumber2, categoryCompile) - ) + << QList<Task>{Task(Task::Error, message, fileName, lineNumber2, categoryCompile)} << QString(); QTest::newRow("another simple error on stdout") << simpleError2 + << QString() << OutputParserTester::STDOUT << CustomParserExpression::ParseBothChannels << CustomParserExpression::ParseBothChannels << simplePattern2 << 2 << 1 << 3 << QString() << 1 << 2 << 3 << QString() << QString() - << (QList<Task>() - << Task(Task::Error, message, fileName, lineNumber2, categoryCompile) - ) + << QList<Task>{Task(Task::Error, message, fileName, lineNumber2, categoryCompile)} << QString(); - const QString simpleWarningPattern = QLatin1String("^([a-z]+\\.[a-z]+):(\\d+): warning: ([^\\s].+)$"); - const QString simpleWarning = QLatin1String("main.c:1234: warning: `helloWorld' declared but not used"); - const QString warningMessage = QLatin1String("`helloWorld' declared but not used"); + const QString simpleWarningPattern = "^([a-z]+\\.[a-z]+):(\\d+): warning: ([^\\s].+)$"; + const QString simpleWarning = "main.c:1234: warning: `helloWorld' declared but not used"; + const QString warningMessage = "`helloWorld' declared but not used"; QTest::newRow("simple warning") << simpleWarning + << QString() << OutputParserTester::STDERR << CustomParserExpression::ParseBothChannels << CustomParserExpression::ParseBothChannels << QString() << 1 << 2 << 3 << simpleWarningPattern << 1 << 2 << 3 << QString() << QString() - << (QList<Task>() - << Task(Task::Warning, warningMessage, fileName, 1234, categoryCompile) - ) + << QList<Task>{Task(Task::Warning, warningMessage, fileName, 1234, categoryCompile)} << QString(); - const QString simpleWarning2 = QLatin1String("Warning: `helloWorld' declared but not used (main.c:19)"); - const QString simpleWarningPassThrough2 = simpleWarning2 + QLatin1Char('\n'); - const QString simpleWarningPattern2 = QLatin1String("^Warning: (.*) \\(([a-z]+\\.[a-z]+):(\\d+)\\)$"); + const QString simpleWarning2 = "Warning: `helloWorld' declared but not used (main.c:19)"; + const QString simpleWarningPassThrough2 = simpleWarning2 + '\n'; + const QString simpleWarningPattern2 = "^Warning: (.*) \\(([a-z]+\\.[a-z]+):(\\d+)\\)$"; QTest::newRow("another simple warning on stdout") << simpleWarning2 + << QString() << OutputParserTester::STDOUT << CustomParserExpression::ParseBothChannels << CustomParserExpression::ParseStdOutChannel << simplePattern2 << 1 << 2 << 3 << simpleWarningPattern2 << 2 << 3 << 1 << QString() << QString() - << (QList<Task>() - << Task(Task::Warning, warningMessage, fileName, lineNumber2, categoryCompile) - ) + << QList<Task>{Task(Task::Warning, warningMessage, fileName, lineNumber2, categoryCompile)} << QString(); QTest::newRow("warning on wrong channel") << simpleWarning2 + << QString() << OutputParserTester::STDOUT << CustomParserExpression::ParseBothChannels << CustomParserExpression::ParseStdErrChannel << QString() << 1 << 2 << 3 @@ -346,6 +400,7 @@ void ProjectExplorerPlugin::testCustomOutputParsers_data() QTest::newRow("warning on other wrong channel") << simpleWarning2 + << QString() << OutputParserTester::STDERR << CustomParserExpression::ParseBothChannels << CustomParserExpression::ParseStdOutChannel << QString() << 1 << 2 << 3 @@ -356,50 +411,48 @@ void ProjectExplorerPlugin::testCustomOutputParsers_data() QTest::newRow("error and *warning*") << simpleWarning + << QString() << OutputParserTester::STDERR << CustomParserExpression::ParseBothChannels << CustomParserExpression::ParseBothChannels << simplePattern << 1 << 2 << 3 << simpleWarningPattern << 1 << 2 << 3 << QString() << QString() - << (QList<Task>() - << Task(Task::Warning, warningMessage, fileName, 1234, categoryCompile) - ) + << QList<Task>{Task(Task::Warning, warningMessage, fileName, 1234, categoryCompile)} << QString(); QTest::newRow("*error* when equal pattern") << simpleError + << QString() << OutputParserTester::STDERR << CustomParserExpression::ParseBothChannels << CustomParserExpression::ParseBothChannels << simplePattern << 1 << 2 << 3 << simplePattern << 1 << 2 << 3 << QString() << QString() - << (QList<Task>() - << Task(Task::Error, message, fileName, 9, categoryCompile) - ) + << QList<Task>{Task(Task::Error, message, fileName, 9, categoryCompile)} << QString(); - const QString unitTestError = QLatin1String("../LedDriver/LedDriverTest.c:63: FAIL: Expected 0x0080 Was 0xffff"); - const FileName unitTestFileName = FileName::fromUserInput(QLatin1String("../LedDriver/LedDriverTest.c")); - const QString unitTestMessage = QLatin1String("Expected 0x0080 Was 0xffff"); - const QString unitTestPattern = QLatin1String("^([^:]+):(\\d+): FAIL: ([^\\s].+)$"); + const QString unitTestError = "../LedDriver/LedDriverTest.c:63: FAIL: Expected 0x0080 Was 0xffff"; + const FileName unitTestFileName = FileName::fromUserInput("../LedDriver/LedDriverTest.c"); + const QString unitTestMessage = "Expected 0x0080 Was 0xffff"; + const QString unitTestPattern = "^([^:]+):(\\d+): FAIL: ([^\\s].+)$"; const int unitTestLineNumber = 63; QTest::newRow("unit test error") << unitTestError + << QString() << OutputParserTester::STDOUT << CustomParserExpression::ParseBothChannels << CustomParserExpression::ParseBothChannels << unitTestPattern << 1 << 2 << 3 << QString() << 1 << 2 << 3 << QString() << QString() - << (QList<Task>() - << Task(Task::Error, unitTestMessage, unitTestFileName, unitTestLineNumber, categoryCompile) - ) + << QList<Task>{Task(Task::Error, unitTestMessage, unitTestFileName, unitTestLineNumber, categoryCompile)} << QString(); } void ProjectExplorerPlugin::testCustomOutputParsers() { QFETCH(QString, input); + QFETCH(QString, workDir); QFETCH(OutputParserTester::Channel, inputChannel); QFETCH(CustomParserExpression::CustomParserChannel, filterErrorChannel); QFETCH(CustomParserExpression::CustomParserChannel, filterWarningChannel); @@ -430,6 +483,7 @@ void ProjectExplorerPlugin::testCustomOutputParsers() CustomParser *parser = new CustomParser; parser->setSettings(settings); + parser->setWorkingDirectory(workDir); OutputParserTester testbench; testbench.appendOutputParser(parser); diff --git a/src/plugins/projectexplorer/customparser.h b/src/plugins/projectexplorer/customparser.h index e1490baeab..b7c70d4759 100644 --- a/src/plugins/projectexplorer/customparser.h +++ b/src/plugins/projectexplorer/customparser.h @@ -89,17 +89,22 @@ public: void stdError(const QString &line) override; void stdOutput(const QString &line) override; + void setWorkingDirectory(const QString &workingDirectory) override; + void setSettings(const CustomParserSettings &settings); static Core::Id id(); private: + Utils::FileName absoluteFilePath(const QString &filePath) const; bool hasMatch(const QString &line, CustomParserExpression::CustomParserChannel channel, const CustomParserExpression &expression, Task::TaskType taskType); bool parseLine(const QString &rawLine, CustomParserExpression::CustomParserChannel channel); CustomParserExpression m_error; CustomParserExpression m_warning; + + QString m_workingDirectory; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/customtoolchain.cpp b/src/plugins/projectexplorer/customtoolchain.cpp index a5b9a74302..68c663bbc9 100644 --- a/src/plugins/projectexplorer/customtoolchain.cpp +++ b/src/plugins/projectexplorer/customtoolchain.cpp @@ -336,7 +336,7 @@ bool CustomToolChain::fromMap(const QVariantMap &data) m_compilerCommand = FileName::fromString(data.value(QLatin1String(compilerCommandKeyC)).toString()); m_makeCommand = FileName::fromString(data.value(QLatin1String(makeCommandKeyC)).toString()); - m_targetAbi = Abi(data.value(QLatin1String(targetAbiKeyC)).toString()); + m_targetAbi = Abi::fromString(data.value(QLatin1String(targetAbiKeyC)).toString()); const QStringList macros = data.value(QLatin1String(predefinedMacrosKeyC)).toStringList(); m_predefinedMacros = Macro::toMacros(macros.join('\n').toUtf8()); setHeaderPaths(data.value(QLatin1String(headerPathsKeyC)).toStringList()); @@ -379,43 +379,8 @@ Core::Id CustomToolChain::outputParserId() const return m_outputParserId; } -static Core::Id convertLegacySettings(Core::Id parserId) -{ - enum OutputParser - { - Gcc = 0, - Clang = 1, - LinuxIcc = 2, - Msvc = 3, - Custom = 4, - OutputParserCount - }; - - bool ok; - const OutputParser index = static_cast<OutputParser>(parserId.toString().toInt(&ok)); - if (!ok) - return parserId; - - switch (index) { - case Gcc: - return GccParser::id(); - case Clang: - return ClangParser::id(); - case LinuxIcc: - return LinuxIccParser::id(); - case Msvc: - return HostOsInfo::isWindowsHost() ? MsvcParser::id() : CustomParser::id(); - case Custom: - return CustomParser::id(); - default: - return parserId; - } -} - void CustomToolChain::setOutputParserId(Core::Id parserId) { - parserId = convertLegacySettings(parserId); - if (m_outputParserId == parserId) return; m_outputParserId = parserId; diff --git a/src/plugins/projectexplorer/customwizard/customwizard.cpp b/src/plugins/projectexplorer/customwizard/customwizard.cpp index c9a84889d1..9a3ea42a4e 100644 --- a/src/plugins/projectexplorer/customwizard/customwizard.cpp +++ b/src/plugins/projectexplorer/customwizard/customwizard.cpp @@ -160,7 +160,7 @@ void CustomWizard::setParameters(const CustomWizardParametersPtr &p) Core::BaseFileWizard *CustomWizard::create(QWidget *parent, const Core::WizardDialogParameters &p) const { - QTC_ASSERT(!d->m_parameters.isNull(), return 0); + QTC_ASSERT(!d->m_parameters.isNull(), return nullptr); auto wizard = new Core::BaseFileWizard(this, p.extraValues(), parent); d->m_context->reset(); @@ -213,7 +213,7 @@ static inline bool createFile(CustomWizardFile cwFile, generatedFile.setContents(CustomWizardContext::processFile(fm, contentsIn)); } - Core::GeneratedFile::Attributes attributes = 0; + Core::GeneratedFile::Attributes attributes = {}; if (cwFile.openEditor) attributes |= Core::GeneratedFile::OpenEditorAttribute; if (cwFile.openProject) @@ -230,7 +230,7 @@ template <class WizardPage> foreach (int pageId, w->pageIds()) if (auto wp = qobject_cast<WizardPage *>(w->page(pageId))) return wp; - return 0; + return nullptr; } // Determine where to run the generator script. The user may specify @@ -362,7 +362,7 @@ CustomWizard *CustomWizard::createWizard(const CustomProjectWizard::CustomWizard if (!rc) { qWarning("Unable to create custom wizard for class %s.", qPrintable(p->klass)); - return 0; + return nullptr; } rc->setParameters(p); @@ -487,9 +487,7 @@ QList<Core::IWizardFactory *> CustomWizard::createWizards() for QLineEdit-type fields' default text. */ -CustomProjectWizard::CustomProjectWizard() -{ -} +CustomProjectWizard::CustomProjectWizard() = default; /*! Can be reimplemented to create custom project wizards. @@ -540,7 +538,7 @@ void CustomProjectWizard::initProjectWizardDialog(BaseProjectWizardDialog *w, Core::GeneratedFiles CustomProjectWizard::generateFiles(const QWizard *w, QString *errorMessage) const { - const BaseProjectWizardDialog *dialog = qobject_cast<const BaseProjectWizardDialog *>(w); + const auto *dialog = qobject_cast<const BaseProjectWizardDialog *>(w); QTC_ASSERT(dialog, return Core::GeneratedFiles()); // Add project name as macro. Path is here under project directory CustomWizardContextPtr ctx = context(); diff --git a/src/plugins/projectexplorer/customwizard/customwizardpage.cpp b/src/plugins/projectexplorer/customwizard/customwizardpage.cpp index 3cdfe71bbd..2f5f9923f6 100644 --- a/src/plugins/projectexplorer/customwizard/customwizardpage.cpp +++ b/src/plugins/projectexplorer/customwizard/customwizardpage.cpp @@ -163,7 +163,7 @@ void CustomWizardFieldPage::addField(const CustomWizardField &field)\ static void comboChoices(const CustomWizardField::ControlAttributeMap &controlAttributes, QStringList *values, QStringList *displayTexts) { - typedef CustomWizardField::ControlAttributeMap::ConstIterator AttribMapConstIt; + using AttribMapConstIt = CustomWizardField::ControlAttributeMap::ConstIterator; values->clear(); displayTexts->clear(); @@ -260,7 +260,7 @@ QWidget *CustomWizardFieldPage::registerCheckBox(const QString &fieldName, const QString &fieldDescription, const CustomWizardField &field) { - typedef CustomWizardField::ControlAttributeMap::const_iterator AttributeMapConstIt; + using AttributeMapConstIt = CustomWizardField::ControlAttributeMap::const_iterator; auto checkBox = new TextFieldCheckBox(fieldDescription); const bool defaultValue = field.controlAttributes.value(QLatin1String("defaultvalue")) == QLatin1String("true"); diff --git a/src/plugins/projectexplorer/customwizard/customwizardparameters.cpp b/src/plugins/projectexplorer/customwizard/customwizardparameters.cpp index 14fd113138..827edbedb3 100644 --- a/src/plugins/projectexplorer/customwizard/customwizardparameters.cpp +++ b/src/plugins/projectexplorer/customwizard/customwizardparameters.cpp @@ -835,8 +835,8 @@ bool CustomWizardContext::replaceFields(const FieldReplacementMap &fm, QString * // used for the arguments of a generator script. class TemporaryFileTransform { public: - typedef CustomWizardContext::TemporaryFilePtr TemporaryFilePtr; - typedef CustomWizardContext::TemporaryFilePtrList TemporaryFilePtrList; + using TemporaryFilePtr = CustomWizardContext::TemporaryFilePtr; + using TemporaryFilePtrList = CustomWizardContext::TemporaryFilePtrList; explicit TemporaryFileTransform(TemporaryFilePtrList *f); diff --git a/src/plugins/projectexplorer/customwizard/customwizardscriptgenerator.cpp b/src/plugins/projectexplorer/customwizard/customwizardscriptgenerator.cpp index 80c5866248..71c43b01c1 100644 --- a/src/plugins/projectexplorer/customwizard/customwizardscriptgenerator.cpp +++ b/src/plugins/projectexplorer/customwizard/customwizardscriptgenerator.cpp @@ -230,7 +230,7 @@ bool runCustomWizardGeneratorScript(const QString &targetPath, { return runGenerationScriptHelper(targetPath, script, arguments, false, fieldMap, - 0, errorMessage); + nullptr, errorMessage); } } // namespace Internal diff --git a/src/plugins/projectexplorer/deploymentdataview.cpp b/src/plugins/projectexplorer/deploymentdataview.cpp index 40f4ad3fb4..bce3bff0b4 100644 --- a/src/plugins/projectexplorer/deploymentdataview.cpp +++ b/src/plugins/projectexplorer/deploymentdataview.cpp @@ -45,7 +45,7 @@ public: using namespace Internal; DeploymentDataView::DeploymentDataView(Target *target, QWidget *parent) : NamedWidget(parent), - d(new DeploymentDataViewPrivate) + d(std::make_unique<DeploymentDataViewPrivate>()) { d->ui.setupUi(this); d->ui.deploymentDataView->setTextElideMode(Qt::ElideMiddle); @@ -60,10 +60,7 @@ DeploymentDataView::DeploymentDataView(Target *target, QWidget *parent) : NamedW updateDeploymentDataModel(); } -DeploymentDataView::~DeploymentDataView() -{ - delete d; -} +DeploymentDataView::~DeploymentDataView() = default; void DeploymentDataView::updateDeploymentDataModel() { diff --git a/src/plugins/projectexplorer/deploymentdataview.h b/src/plugins/projectexplorer/deploymentdataview.h index f8d3b11698..9cc49eaa8f 100644 --- a/src/plugins/projectexplorer/deploymentdataview.h +++ b/src/plugins/projectexplorer/deploymentdataview.h @@ -28,6 +28,8 @@ #include "namedwidget.h" #include "projectexplorer_export.h" +#include <memory> + namespace ProjectExplorer { class Target; @@ -44,7 +46,7 @@ public: private: void updateDeploymentDataModel(); - Internal::DeploymentDataViewPrivate * const d; + const std::unique_ptr<Internal::DeploymentDataViewPrivate> d; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp b/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp index f779d1eba4..eef4931904 100644 --- a/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp @@ -60,9 +60,7 @@ DesktopDevice::DesktopDevice() : IDevice(Core::Id(DESKTOP_DEVICE_TYPE), setFreePorts(Utils::PortList::fromString(portRange)); } -DesktopDevice::DesktopDevice(const DesktopDevice &other) : - IDevice(other) -{ } +DesktopDevice::DesktopDevice(const DesktopDevice &other) = default; IDevice::DeviceInfo DesktopDevice::deviceInformation() const { @@ -76,7 +74,7 @@ QString DesktopDevice::displayType() const IDeviceWidget *DesktopDevice::createWidget() { - return 0; + return nullptr; // DesktopDeviceConfigurationWidget currently has just one editable field viz. free ports. // Querying for an available port is quite straightforward. Having a field for the port // range can be confusing to the user. Hence, disabling the widget for now. @@ -127,7 +125,7 @@ DeviceProcessSignalOperation::Ptr DesktopDevice::signalOperation() const class DesktopDeviceEnvironmentFetcher : public DeviceEnvironmentFetcher { public: - DesktopDeviceEnvironmentFetcher() {} + DesktopDeviceEnvironmentFetcher() = default; void start() override { diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp index 585478a611..e6d78e4651 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp @@ -46,6 +46,7 @@ #include <QVariantList> #include <limits> +#include <memory> namespace ProjectExplorer { namespace Internal { @@ -57,8 +58,7 @@ const char DefaultDevicesKey[] = "DefaultDevices"; class DeviceManagerPrivate { public: - DeviceManagerPrivate() : writer(0) - { } + DeviceManagerPrivate() = default; int indexForId(Core::Id id) const { @@ -74,15 +74,15 @@ public: QHash<Core::Id, Core::Id> defaultDevices; QSsh::SshHostKeyDatabasePtr hostKeyDatabase; - Utils::PersistentSettingsWriter *writer; + Utils::PersistentSettingsWriter *writer = nullptr; }; -DeviceManager *DeviceManagerPrivate::clonedInstance = 0; +DeviceManager *DeviceManagerPrivate::clonedInstance = nullptr; } // namespace Internal using namespace Internal; -DeviceManager *DeviceManager::m_instance = 0; +DeviceManager *DeviceManager::m_instance = nullptr; DeviceManager *DeviceManager::instance() { @@ -104,12 +104,12 @@ void DeviceManager::replaceInstance() void DeviceManager::removeClonedInstance() { delete DeviceManagerPrivate::clonedInstance; - DeviceManagerPrivate::clonedInstance = 0; + DeviceManagerPrivate::clonedInstance = nullptr; } DeviceManager *DeviceManager::cloneInstance() { - QTC_ASSERT(!DeviceManagerPrivate::clonedInstance, return 0); + QTC_ASSERT(!DeviceManagerPrivate::clonedInstance, return nullptr); DeviceManagerPrivate::clonedInstance = new DeviceManager(false); copy(instance(), DeviceManagerPrivate::clonedInstance, true); @@ -210,7 +210,7 @@ QVariantMap DeviceManager::toMap() const { QVariantMap map; QVariantMap defaultDeviceMap; - typedef QHash<Core::Id, Core::Id> TypeIdHash; + using TypeIdHash = QHash<Core::Id, Core::Id>; for (TypeIdHash::ConstIterator it = d->defaultDevices.constBegin(); it != d->defaultDevices.constEnd(); ++it) { defaultDeviceMap.insert(it.key().toString(), it.value().toSetting()); @@ -349,7 +349,7 @@ const IDeviceFactory *DeviceManager::restoreFactory(const QVariantMap &map) return factory; } -DeviceManager::DeviceManager(bool isInstance) : d(new DeviceManagerPrivate) +DeviceManager::DeviceManager(bool isInstance) : d(std::make_unique<DeviceManagerPrivate>()) { if (isInstance) { QTC_ASSERT(!m_instance, return); @@ -370,8 +370,7 @@ DeviceManager::~DeviceManager() if (d->clonedInstance != this) delete d->writer; if (m_instance == this) - m_instance = 0; - delete d; + m_instance = nullptr; } IDevice::ConstPtr DeviceManager::deviceAt(int idx) const @@ -429,9 +428,9 @@ public: static Core::Id testTypeId() { return "TestType"; } private: - TestDevice(const TestDevice &other) : IDevice(other) {} + TestDevice(const TestDevice &other) = default; QString displayType() const override { return QLatin1String("blubb"); } - IDeviceWidget *createWidget() override { return 0; } + IDeviceWidget *createWidget() override { return nullptr; } QList<Core::Id> actionIds() const override { return QList<Core::Id>(); } QString displayNameForActionId(Core::Id) const override { return QString(); } void executeAction(Core::Id, QWidget *) override { } diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.h b/src/plugins/projectexplorer/devicesupport/devicemanager.h index 964e10ff81..2b086f0683 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.h +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.h @@ -31,6 +31,8 @@ #include <QObject> +#include <memory> + namespace QSsh { class SshHostKeyDatabase; } namespace Utils { class FileName; } @@ -101,7 +103,7 @@ private: static Utils::FileName systemSettingsFilePath(const QString &deviceFileRelativePath); static void copy(const DeviceManager *source, DeviceManager *target, bool deep); - Internal::DeviceManagerPrivate * const d; + const std::unique_ptr<Internal::DeviceManagerPrivate> d; static DeviceManager *m_instance; diff --git a/src/plugins/projectexplorer/devicesupport/devicemanagermodel.cpp b/src/plugins/projectexplorer/devicesupport/devicemanagermodel.cpp index e1cfb0dfc5..0aa0ac12d6 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanagermodel.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanagermodel.cpp @@ -44,7 +44,7 @@ public: } // namespace Internal DeviceManagerModel::DeviceManagerModel(const DeviceManager *deviceManager, QObject *parent) : - QAbstractListModel(parent), d(new Internal::DeviceManagerModelPrivate) + QAbstractListModel(parent), d(std::make_unique<Internal::DeviceManagerModelPrivate>()) { d->deviceManager = deviceManager; handleDeviceListChanged(); @@ -58,10 +58,7 @@ DeviceManagerModel::DeviceManagerModel(const DeviceManager *deviceManager, QObje this, &DeviceManagerModel::handleDeviceListChanged); } -DeviceManagerModel::~DeviceManagerModel() -{ - delete d; -} +DeviceManagerModel::~DeviceManagerModel() = default; void DeviceManagerModel::setFilter(const QList<Core::Id> &filter) { diff --git a/src/plugins/projectexplorer/devicesupport/devicemanagermodel.h b/src/plugins/projectexplorer/devicesupport/devicemanagermodel.h index 5851699478..da2fee8e46 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanagermodel.h +++ b/src/plugins/projectexplorer/devicesupport/devicemanagermodel.h @@ -30,6 +30,8 @@ #include <QAbstractListModel> +#include <memory> + namespace ProjectExplorer { namespace Internal { class DeviceManagerModelPrivate; } class IDevice; @@ -62,7 +64,7 @@ private: QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; bool matchesTypeFilter(const IDevice::ConstPtr &dev) const; - Internal::DeviceManagerModelPrivate * const d; + const std::unique_ptr<Internal::DeviceManagerModelPrivate> d; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.cpp b/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.cpp index 1e5ea1bade..dd6a851929 100644 --- a/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.cpp +++ b/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.cpp @@ -58,7 +58,7 @@ class ProcessListFilterModel : public QSortFilterProxyModel { public: ProcessListFilterModel(); - bool lessThan(const QModelIndex &left, const QModelIndex &right) const; + bool lessThan(const QModelIndex &left, const QModelIndex &right) const override; }; ProcessListFilterModel::ProcessListFilterModel() @@ -120,14 +120,14 @@ DeviceProcessesDialogPrivate::DeviceProcessesDialogPrivate(KitChooser *chooser, : q(parent) , kitLabel(new QLabel(DeviceProcessesDialog::tr("Kit:"), parent)) , kitChooser(chooser) - , acceptButton(0) + , acceptButton(nullptr) , buttonBox(new QDialogButtonBox(parent)) { q->setWindowTitle(DeviceProcessesDialog::tr("List of Processes")); q->setWindowFlags(q->windowFlags() & ~Qt::WindowContextHelpButtonHint); q->setMinimumHeight(500); - processList = 0; + processList = nullptr; processFilterLineEdit = new FancyLineEdit(q); processFilterLineEdit->setPlaceholderText(DeviceProcessesDialog::tr("Filter")); @@ -159,7 +159,7 @@ DeviceProcessesDialogPrivate::DeviceProcessesDialogPrivate(KitChooser *chooser, buttonBox->addButton(updateListButton, QDialogButtonBox::ActionRole); buttonBox->addButton(killProcessButton, QDialogButtonBox::ActionRole); - QFormLayout *leftColumn = new QFormLayout(); + auto *leftColumn = new QFormLayout(); leftColumn->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); leftColumn->addRow(kitLabel, kitChooser); leftColumn->addRow(DeviceProcessesDialog::tr("&Filter:"), processFilterLineEdit); @@ -173,7 +173,7 @@ DeviceProcessesDialogPrivate::DeviceProcessesDialogPrivate(KitChooser *chooser, // horizontalLayout->addLayout(leftColumn); // horizontalLayout->addLayout(rightColumn); - QVBoxLayout *mainLayout = new QVBoxLayout(q); + auto *mainLayout = new QVBoxLayout(q); mainLayout->addLayout(leftColumn); mainLayout->addWidget(procView); mainLayout->addWidget(errorText); @@ -212,8 +212,8 @@ DeviceProcessesDialogPrivate::DeviceProcessesDialogPrivate(KitChooser *chooser, void DeviceProcessesDialogPrivate::setDevice(const IDevice::ConstPtr &device) { delete processList; - processList = 0; - proxyModel.setSourceModel(0); + processList = nullptr; + proxyModel.setSourceModel(nullptr); if (!device) return; @@ -316,19 +316,14 @@ DeviceProcessItem DeviceProcessesDialogPrivate::selectedProcess() const */ DeviceProcessesDialog::DeviceProcessesDialog(QWidget *parent) - : QDialog(parent), d(new Internal::DeviceProcessesDialogPrivate(new KitChooser(this), this)) -{ -} + : QDialog(parent), d(std::make_unique<Internal::DeviceProcessesDialogPrivate>(new KitChooser(this), this)) +{ } DeviceProcessesDialog::DeviceProcessesDialog(KitChooser *chooser, QWidget *parent) - : QDialog(parent), d(new Internal::DeviceProcessesDialogPrivate(chooser, this)) -{ -} + : QDialog(parent), d(std::make_unique<Internal::DeviceProcessesDialogPrivate>(chooser, this)) +{ } -DeviceProcessesDialog::~DeviceProcessesDialog() -{ - delete d; -} +DeviceProcessesDialog::~DeviceProcessesDialog() = default; void DeviceProcessesDialog::addAcceptButton(const QString &label) { diff --git a/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.h b/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.h index 0f5fcace6b..7876bf6edd 100644 --- a/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.h +++ b/src/plugins/projectexplorer/devicesupport/deviceprocessesdialog.h @@ -31,6 +31,8 @@ #include <QDialog> +#include <memory> + namespace ProjectExplorer { class DeviceProcessItem; @@ -58,7 +60,7 @@ public: private: void setKitVisible(bool); - Internal::DeviceProcessesDialogPrivate * const d; + const std::unique_ptr<Internal::DeviceProcessesDialogPrivate> d; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/devicesupport/deviceprocesslist.cpp b/src/plugins/projectexplorer/devicesupport/deviceprocesslist.cpp index 9cdd2d4cb1..e6075da516 100644 --- a/src/plugins/projectexplorer/devicesupport/deviceprocesslist.cpp +++ b/src/plugins/projectexplorer/devicesupport/deviceprocesslist.cpp @@ -51,14 +51,10 @@ public: using namespace Internal; DeviceProcessList::DeviceProcessList(const IDevice::ConstPtr &device, QObject *parent) - : QAbstractItemModel(parent), d(new DeviceProcessListPrivate(device)) -{ -} + : QAbstractItemModel(parent), d(std::make_unique<DeviceProcessListPrivate>(device)) +{ } -DeviceProcessList::~DeviceProcessList() -{ - delete d; -} +DeviceProcessList::~DeviceProcessList() = default; QModelIndex DeviceProcessList::parent(const QModelIndex &) const { diff --git a/src/plugins/projectexplorer/devicesupport/deviceprocesslist.h b/src/plugins/projectexplorer/devicesupport/deviceprocesslist.h index 77f71351ff..6e965b0450 100644 --- a/src/plugins/projectexplorer/devicesupport/deviceprocesslist.h +++ b/src/plugins/projectexplorer/devicesupport/deviceprocesslist.h @@ -30,6 +30,8 @@ #include <QAbstractItemModel> #include <QList> +#include <memory> + namespace ProjectExplorer { namespace Internal { class DeviceProcessListPrivate; } @@ -86,7 +88,7 @@ private: void setFinished(); - Internal::DeviceProcessListPrivate * const d; + const std::unique_ptr<Internal::DeviceProcessListPrivate> d; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp index 98a841122e..117ba78043 100644 --- a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp @@ -58,14 +58,14 @@ const char LastDeviceIndexKey[] = "LastDisplayedMaemoDeviceConfig"; class NameValidator : public QValidator { public: - NameValidator(const DeviceManager *deviceManager, QWidget *parent = 0) + NameValidator(const DeviceManager *deviceManager, QWidget *parent = nullptr) : QValidator(parent), m_deviceManager(deviceManager) { } void setDisplayName(const QString &name) { m_oldName = name; } - virtual State validate(QString &input, int & /* pos */) const + State validate(QString &input, int & /* pos */) const override { if (input.trimmed().isEmpty() || (input != m_oldName && m_deviceManager->hasDevice(input))) @@ -73,7 +73,7 @@ public: return Acceptable; } - virtual void fixup(QString &input) const + void fixup(QString &input) const override { int dummy = 0; if (validate(input, dummy) != Acceptable) @@ -91,7 +91,7 @@ DeviceSettingsWidget::DeviceSettingsWidget(QWidget *parent) m_deviceManager(DeviceManager::cloneInstance()), m_deviceManagerModel(new DeviceManagerModel(m_deviceManager, this)), m_nameValidator(new NameValidator(m_deviceManager, this)), - m_configWidget(0) + m_configWidget(nullptr) { initGui(); connect(m_deviceManager, &DeviceManager::deviceUpdated, @@ -270,7 +270,7 @@ void DeviceSettingsWidget::currentDeviceChanged(int index) { qDeleteAll(m_additionalActionButtons); delete m_configWidget; - m_configWidget = 0; + m_configWidget = nullptr; m_additionalActionButtons.clear(); const IDevice::ConstPtr device = m_deviceManagerModel->device(index); if (device.isNull()) { diff --git a/src/plugins/projectexplorer/devicesupport/devicetestdialog.cpp b/src/plugins/projectexplorer/devicesupport/devicetestdialog.cpp index 8557292aed..e308b76f46 100644 --- a/src/plugins/projectexplorer/devicesupport/devicetestdialog.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicetestdialog.cpp @@ -50,7 +50,8 @@ public: DeviceTestDialog::DeviceTestDialog(const IDevice::ConstPtr &deviceConfiguration, QWidget *parent) - : QDialog(parent), d(new DeviceTestDialogPrivate(deviceConfiguration->createDeviceTester())) + : QDialog(parent) + , d(std::make_unique<DeviceTestDialogPrivate>(deviceConfiguration->createDeviceTester())) { d->ui.setupUi(this); @@ -64,10 +65,7 @@ DeviceTestDialog::DeviceTestDialog(const IDevice::ConstPtr &deviceConfiguration, d->deviceTester->testDevice(deviceConfiguration); } -DeviceTestDialog::~DeviceTestDialog() -{ - delete d; -} +DeviceTestDialog::~DeviceTestDialog() = default; void DeviceTestDialog::reject() { diff --git a/src/plugins/projectexplorer/devicesupport/devicetestdialog.h b/src/plugins/projectexplorer/devicesupport/devicetestdialog.h index 69e7c3c9b5..7263234fbe 100644 --- a/src/plugins/projectexplorer/devicesupport/devicetestdialog.h +++ b/src/plugins/projectexplorer/devicesupport/devicetestdialog.h @@ -29,6 +29,8 @@ #include <QDialog> +#include <memory> + namespace ProjectExplorer { namespace Internal { @@ -37,7 +39,7 @@ class DeviceTestDialog : public QDialog Q_OBJECT public: - DeviceTestDialog(const IDevice::ConstPtr &deviceConfiguration, QWidget *parent = 0); + DeviceTestDialog(const IDevice::ConstPtr &deviceConfiguration, QWidget *parent = nullptr); ~DeviceTestDialog() override; void reject() override; @@ -50,7 +52,7 @@ private: void addText(const QString &text, const QString &color, bool bold); class DeviceTestDialogPrivate; - DeviceTestDialogPrivate * const d; + const std::unique_ptr<DeviceTestDialogPrivate> d; }; } // namespace Internal diff --git a/src/plugins/projectexplorer/devicesupport/deviceusedportsgatherer.cpp b/src/plugins/projectexplorer/devicesupport/deviceusedportsgatherer.cpp index 83a36ccbe7..975ca59217 100644 --- a/src/plugins/projectexplorer/devicesupport/deviceusedportsgatherer.cpp +++ b/src/plugins/projectexplorer/devicesupport/deviceusedportsgatherer.cpp @@ -93,7 +93,7 @@ void DeviceUsedPortsGatherer::stop() d->remoteStdout.clear(); d->remoteStderr.clear(); if (d->process) - disconnect(d->process.data(), 0, this, 0); + disconnect(d->process.data(), nullptr, this, nullptr); d->process.clear(); } @@ -187,9 +187,7 @@ PortsGatherer::PortsGatherer(RunControl *runControl) }); } -PortsGatherer::~PortsGatherer() -{ -} +PortsGatherer::~PortsGatherer() = default; void PortsGatherer::start() { @@ -353,9 +351,7 @@ ChannelProvider::ChannelProvider(RunControl *runControl, int requiredChannels) } } -ChannelProvider::~ChannelProvider() -{ -} +ChannelProvider::~ChannelProvider() = default; QUrl ChannelProvider::channel(int i) const { diff --git a/src/plugins/projectexplorer/devicesupport/idevice.cpp b/src/plugins/projectexplorer/devicesupport/idevice.cpp index f46095c1f9..2ff4090ffd 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevice.cpp @@ -128,7 +128,7 @@ const char SshOptionsKey[] = "SshOptions"; const char DebugServerKey[] = "DebugServerKey"; const char QmlsceneKey[] = "QmlsceneKey"; -typedef QSsh::SshConnectionParameters::AuthenticationType AuthType; +using AuthType = QSsh::SshConnectionParameters::AuthenticationType; const AuthType DefaultAuthType = QSsh::SshConnectionParameters::AuthenticationTypePublicKey; const IDevice::MachineType DefaultMachineType = IDevice::Hardware; @@ -138,20 +138,15 @@ namespace Internal { class IDevicePrivate { public: - IDevicePrivate() : - origin(IDevice::AutoDetected), - deviceState(IDevice::DeviceStateUnknown), - machineType(IDevice::Hardware), - version(0) - { } + IDevicePrivate() = default; QString displayName; Core::Id type; - IDevice::Origin origin; + IDevice::Origin origin = IDevice::AutoDetected; Core::Id id; - IDevice::DeviceState deviceState; - IDevice::MachineType machineType; - int version; // This is used by devices that have been added by the SDK. + IDevice::DeviceState deviceState = IDevice::DeviceStateUnknown; + IDevice::MachineType machineType = IDevice::Hardware; + int version = 0; // This is used by devices that have been added by the SDK. QSsh::SshConnectionParameters sshParameters; Utils::PortList freePorts; @@ -170,7 +165,7 @@ IDevice::IDevice() : d(new Internal::IDevicePrivate) } IDevice::IDevice(Core::Id type, Origin origin, MachineType machineType, Core::Id id) - : d(new Internal::IDevicePrivate) + : d(std::make_unique<Internal::IDevicePrivate>()) { d->type = type; d->origin = origin; @@ -182,15 +177,12 @@ IDevice::IDevice(Core::Id type, Origin origin, MachineType machineType, Core::Id IDevice::IDevice(const IDevice &other) : QEnableSharedFromThis<IDevice>(other) - , d(new Internal::IDevicePrivate) + , d(std::make_unique<Internal::IDevicePrivate>()) { *d = *other.d; } -IDevice::~IDevice() -{ - delete d; -} +IDevice::~IDevice() = default; /*! Specifies a free-text name for the device to be displayed in GUI elements. @@ -270,14 +262,14 @@ PortsGatheringMethod::Ptr IDevice::portsGatheringMethod() const DeviceProcessList *IDevice::createProcessListModel(QObject *parent) const { Q_UNUSED(parent); - QTC_ASSERT(false, qDebug("This should not have been called..."); return 0); - return 0; + QTC_ASSERT(false, qDebug("This should not have been called..."); return nullptr); + return nullptr; } DeviceTester *IDevice::createDeviceTester() const { QTC_ASSERT(false, qDebug("This should not have been called...")); - return 0; + return nullptr; } Utils::OsType IDevice::osType() const @@ -288,7 +280,7 @@ Utils::OsType IDevice::osType() const DeviceProcess *IDevice::createProcess(QObject * /* parent */) const { QTC_CHECK(false); - return 0; + return nullptr; } DeviceEnvironmentFetcher::Ptr IDevice::environmentFetcher() const @@ -479,12 +471,8 @@ void DeviceProcessSignalOperation::setDebuggerCommand(const QString &cmd) m_debuggerCommand = cmd; } -DeviceProcessSignalOperation::DeviceProcessSignalOperation() -{ -} +DeviceProcessSignalOperation::DeviceProcessSignalOperation() = default; -DeviceEnvironmentFetcher::DeviceEnvironmentFetcher() -{ -} +DeviceEnvironmentFetcher::DeviceEnvironmentFetcher() = default; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/devicesupport/idevice.h b/src/plugins/projectexplorer/devicesupport/idevice.h index c040fab334..493b7b306e 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.h +++ b/src/plugins/projectexplorer/devicesupport/idevice.h @@ -38,6 +38,7 @@ #include <QVariantMap> #include <functional> +#include <memory> QT_BEGIN_NAMESPACE class QWidget; @@ -214,7 +215,7 @@ private: int version() const; - Internal::IDevicePrivate *d; + const std::unique_ptr<Internal::IDevicePrivate> d; friend class DeviceManager; }; diff --git a/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp b/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp index b34e0ce805..0a4ac513bc 100644 --- a/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp +++ b/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp @@ -63,7 +63,7 @@ public: }; SshDeviceProcess::SshDeviceProcess(const IDevice::ConstPtr &device, QObject *parent) - : DeviceProcess(device, parent), d(new SshDeviceProcessPrivate(this)) + : DeviceProcess(device, parent), d(std::make_unique<SshDeviceProcessPrivate>(this)) { connect(&d->killTimer, &QTimer::timeout, this, &SshDeviceProcess::handleKillOperationTimeout); } @@ -71,7 +71,6 @@ SshDeviceProcess::SshDeviceProcess(const IDevice::ConstPtr &device, QObject *par SshDeviceProcess::~SshDeviceProcess() { d->setState(SshDeviceProcessPrivate::Inactive); - delete d; } void SshDeviceProcess::start(const Runnable &runnable) @@ -342,7 +341,7 @@ void SshDeviceProcess::SshDeviceProcessPrivate::setState(SshDeviceProcess::SshDe if (connection) { connection->disconnect(q); QSsh::releaseConnection(connection); - connection = 0; + connection = nullptr; } } diff --git a/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.h b/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.h index a6de321f3b..19acc31769 100644 --- a/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.h +++ b/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.h @@ -27,6 +27,8 @@ #include "deviceprocess.h" +#include <memory> + namespace ProjectExplorer { class Runnable; @@ -72,7 +74,7 @@ private: class SshDeviceProcessPrivate; friend class SshDeviceProcessPrivate; - SshDeviceProcessPrivate * const d; + const std::unique_ptr<SshDeviceProcessPrivate> d; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/devicesupport/sshdeviceprocesslist.cpp b/src/plugins/projectexplorer/devicesupport/sshdeviceprocesslist.cpp index a25d56c380..589b3d1721 100644 --- a/src/plugins/projectexplorer/devicesupport/sshdeviceprocesslist.cpp +++ b/src/plugins/projectexplorer/devicesupport/sshdeviceprocesslist.cpp @@ -42,14 +42,11 @@ public: }; SshDeviceProcessList::SshDeviceProcessList(const IDevice::ConstPtr &device, QObject *parent) : - DeviceProcessList(device, parent), d(new SshDeviceProcessListPrivate) + DeviceProcessList(device, parent), d(std::make_unique<SshDeviceProcessListPrivate>()) { } -SshDeviceProcessList::~SshDeviceProcessList() -{ - delete d; -} +SshDeviceProcessList::~SshDeviceProcessList() = default; void SshDeviceProcessList::doUpdate() { diff --git a/src/plugins/projectexplorer/devicesupport/sshdeviceprocesslist.h b/src/plugins/projectexplorer/devicesupport/sshdeviceprocesslist.h index 9c97ce04ff..8ecefce9b9 100644 --- a/src/plugins/projectexplorer/devicesupport/sshdeviceprocesslist.h +++ b/src/plugins/projectexplorer/devicesupport/sshdeviceprocesslist.h @@ -27,6 +27,8 @@ #include "deviceprocesslist.h" +#include <memory> + namespace ProjectExplorer { class PROJECTEXPLORER_EXPORT SshDeviceProcessList : public DeviceProcessList @@ -51,7 +53,7 @@ private: void setFinished(); class SshDeviceProcessListPrivate; - SshDeviceProcessListPrivate * const d; + const std::unique_ptr<SshDeviceProcessListPrivate> d; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/editorconfiguration.cpp b/src/plugins/projectexplorer/editorconfiguration.cpp index f011eb3a7e..43f7b79c69 100644 --- a/src/plugins/projectexplorer/editorconfiguration.cpp +++ b/src/plugins/projectexplorer/editorconfiguration.cpp @@ -83,7 +83,7 @@ struct EditorConfigurationPrivate QList<BaseTextEditor *> m_editors; }; -EditorConfiguration::EditorConfiguration() : d(new EditorConfigurationPrivate) +EditorConfiguration::EditorConfiguration() : d(std::make_unique<EditorConfigurationPrivate>()) { const QMap<Core::Id, ICodeStylePreferences *> languageCodeStylePreferences = TextEditorSettings::codeStyles(); QMapIterator<Core::Id, ICodeStylePreferences *> itCodeStyle(languageCodeStylePreferences); @@ -119,7 +119,6 @@ EditorConfiguration::EditorConfiguration() : d(new EditorConfigurationPrivate) EditorConfiguration::~EditorConfiguration() { qDeleteAll(d->m_languageCodeStylePreferences); - delete d; } bool EditorConfiguration::useGlobalSettings() const @@ -273,7 +272,7 @@ void EditorConfiguration::deconfigureEditor(BaseTextEditor *textEditor) const void EditorConfiguration::setUseGlobalSettings(bool use) { d->m_useGlobal = use; - d->m_defaultCodeStyle->setCurrentDelegate(use ? TextEditorSettings::codeStyle() : 0); + d->m_defaultCodeStyle->setCurrentDelegate(use ? TextEditorSettings::codeStyle() : nullptr); foreach (Core::IEditor *editor, Core::DocumentModel::editorsForOpenedDocuments()) { if (auto widget = qobject_cast<TextEditorWidget *>(editor->widget())) { Project *project = SessionManager::projectForFile(editor->document()->filePath()); diff --git a/src/plugins/projectexplorer/editorconfiguration.h b/src/plugins/projectexplorer/editorconfiguration.h index 9f410d6a1e..e9c6138648 100644 --- a/src/plugins/projectexplorer/editorconfiguration.h +++ b/src/plugins/projectexplorer/editorconfiguration.h @@ -30,6 +30,8 @@ #include <QObject> #include <QVariantMap> +#include <memory> + namespace Core { class IEditor; class Id; @@ -107,7 +109,7 @@ signals: private: void switchSettings(TextEditor::TextEditorWidget *baseTextEditor) const; - EditorConfigurationPrivate *d; + const std::unique_ptr<EditorConfigurationPrivate> d; }; // Return the editor settings in the case it's not null. Otherwise, try to find the project diff --git a/src/plugins/projectexplorer/environmentaspect.cpp b/src/plugins/projectexplorer/environmentaspect.cpp index 21fc6adb27..555a12db16 100644 --- a/src/plugins/projectexplorer/environmentaspect.cpp +++ b/src/plugins/projectexplorer/environmentaspect.cpp @@ -93,13 +93,13 @@ void EnvironmentAspect::addSupportedBaseEnvironment(int base, const QString &dis { m_displayNames[base] = displayName; if (m_base == -1) - m_base = base; + setBaseEnvironmentBase(base); } void EnvironmentAspect::addPreferredBaseEnvironment(int base, const QString &displayName) { m_displayNames[base] = displayName; - m_base = base; + setBaseEnvironmentBase(base); } void EnvironmentAspect::fromMap(const QVariantMap &map) diff --git a/src/plugins/projectexplorer/environmentwidget.cpp b/src/plugins/projectexplorer/environmentwidget.cpp index 726352bf0f..e39f21532b 100644 --- a/src/plugins/projectexplorer/environmentwidget.cpp +++ b/src/plugins/projectexplorer/environmentwidget.cpp @@ -96,7 +96,7 @@ public: : QStyledItemDelegate(view), m_model(model), m_view(view) {} - QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const + QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override { QWidget *w = QStyledItemDelegate::createEditor(parent, option, index); if (index.column() != 0) @@ -132,7 +132,7 @@ public: }; EnvironmentWidget::EnvironmentWidget(QWidget *parent, QWidget *additionalDetailsWidget) - : QWidget(parent), d(new EnvironmentWidgetPrivate) + : QWidget(parent), d(std::make_unique<EnvironmentWidgetPrivate>()) { d->m_model = new Utils::EnvironmentModel(); connect(d->m_model, &Utils::EnvironmentModel::userChangesChanged, @@ -235,7 +235,6 @@ EnvironmentWidget::~EnvironmentWidget() { delete d->m_model; d->m_model = nullptr; - delete d; } void EnvironmentWidget::focusIndex(const QModelIndex &index) diff --git a/src/plugins/projectexplorer/environmentwidget.h b/src/plugins/projectexplorer/environmentwidget.h index 380a68917e..004f1cb1e6 100644 --- a/src/plugins/projectexplorer/environmentwidget.h +++ b/src/plugins/projectexplorer/environmentwidget.h @@ -29,6 +29,8 @@ #include <QWidget> +#include <memory> + QT_FORWARD_DECLARE_CLASS(QModelIndex) namespace Utils { @@ -71,7 +73,7 @@ private: void updateButtons(); void linkActivated(const QString &link); - EnvironmentWidgetPrivate *d; + const std::unique_ptr<EnvironmentWidgetPrivate> d; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/extraabi.cpp b/src/plugins/projectexplorer/extraabi.cpp new file mode 100644 index 0000000000..a1da2193fd --- /dev/null +++ b/src/plugins/projectexplorer/extraabi.cpp @@ -0,0 +1,101 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "extraabi.h" + +#include "abi.h" + +#include <coreplugin/icore.h> + +#include <utils/algorithm.h> +#include <utils/fileutils.h> +#include <utils/settingsaccessor.h> + +#include <app/app_version.h> + +#include <QDebug> + +using namespace Utils; + +namespace ProjectExplorer { +namespace Internal { + +// -------------------------------------------------------------------- +// Helpers: +// -------------------------------------------------------------------- + +class AbiFlavorUpgraderV0 : public VersionUpgrader +{ +public: + AbiFlavorUpgraderV0() : VersionUpgrader(0, "") { } + + QVariantMap upgrade(const QVariantMap &data) override { return data; } +}; + +class AbiFlavorAccessor : public UpgradingSettingsAccessor +{ +public: + AbiFlavorAccessor(); +}; + +AbiFlavorAccessor::AbiFlavorAccessor() : + UpgradingSettingsAccessor("QtCreatorExtraAbi", + QCoreApplication::translate("ProjectExplorer::ToolChainManager", "ABI"), + Core::Constants::IDE_DISPLAY_NAME) +{ + setBaseFilePath(FileName::fromString(Core::ICore::installerResourcePath() + "/abi.xml")); + + addVersionUpgrader(std::make_unique<AbiFlavorUpgraderV0>()); +} + +// -------------------------------------------------------------------- +// ExtraAbi: +// -------------------------------------------------------------------- + +void ExtraAbi::load() +{ + AbiFlavorAccessor accessor; + const QVariantMap data = accessor.restoreSettings(Core::ICore::dialogParent()).value("Flavors").toMap(); + for (auto it = data.constBegin(); it != data.constEnd(); ++it) { + const QString flavor = it.key(); + if (flavor.isEmpty()) + continue; + + const QStringList osNames = it.value().toStringList(); + std::vector<Abi::OS> oses; + for (const QString &osName : osNames) { + Abi::OS os = Abi::osFromString(&osName); + if (Abi::toString(os) != osName) + qWarning() << "Invalid OS found when registering extra abi flavor" << it.key(); + else + oses.push_back(os); + } + + Abi::registerOsFlavor(oses, flavor); + } +} + +} // namespace Internal +} // namespace ProjectExplorer diff --git a/src/plugins/resourceeditor/qrceditor/test/main.cpp b/src/plugins/projectexplorer/extraabi.h index a89072898f..fe1b049d69 100644 --- a/src/plugins/resourceeditor/qrceditor/test/main.cpp +++ b/src/plugins/projectexplorer/extraabi.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2018 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt Creator. @@ -23,14 +23,16 @@ ** ****************************************************************************/ -#include "mainwindow.h" +#pragma once -#include <resourceeditor/qrceditor/qrceditor.h> +namespace ProjectExplorer { +namespace Internal { -int main(int argc, char *argv[]) +class ExtraAbi { - QApplication app(argc, argv); - MainWindow mw; - mw.show(); - return app.exec(); -} +public: + static void load(); +}; + +} // namespace Internal +} // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/extracompiler.cpp b/src/plugins/projectexplorer/extracompiler.cpp index 1d5e97add9..e73b44cb90 100644 --- a/src/plugins/projectexplorer/extracompiler.cpp +++ b/src/plugins/projectexplorer/extracompiler.cpp @@ -72,7 +72,7 @@ public: ExtraCompiler::ExtraCompiler(const Project *project, const Utils::FileName &source, const Utils::FileNameList &targets, QObject *parent) : - QObject(parent), d(new ExtraCompilerPrivate) + QObject(parent), d(std::make_unique<ExtraCompilerPrivate>()) { d->project = project; d->source = source; @@ -129,10 +129,7 @@ ExtraCompiler::ExtraCompiler(const Project *project, const Utils::FileName &sour } } -ExtraCompiler::~ExtraCompiler() -{ - delete d; -} +ExtraCompiler::~ExtraCompiler() = default; const Project *ExtraCompiler::project() const { diff --git a/src/plugins/projectexplorer/extracompiler.h b/src/plugins/projectexplorer/extracompiler.h index d4ef5326ac..c93830b10c 100644 --- a/src/plugins/projectexplorer/extracompiler.h +++ b/src/plugins/projectexplorer/extracompiler.h @@ -39,6 +39,7 @@ #include <QList> #include <functional> +#include <memory> QT_FORWARD_DECLARE_CLASS(QProcess); QT_FORWARD_DECLARE_CLASS(QThreadPool); @@ -89,7 +90,7 @@ private: virtual void run(const QByteArray &sourceContent) = 0; virtual void run(const Utils::FileName &file) = 0; - ExtraCompilerPrivate *const d; + const std::unique_ptr<ExtraCompilerPrivate> d; }; class PROJECTEXPLORER_EXPORT ProcessExtraCompiler : public ExtraCompiler diff --git a/src/plugins/projectexplorer/foldernavigationwidget.cpp b/src/plugins/projectexplorer/foldernavigationwidget.cpp index d4c91d32b9..07ff03be6a 100644 --- a/src/plugins/projectexplorer/foldernavigationwidget.cpp +++ b/src/plugins/projectexplorer/foldernavigationwidget.cpp @@ -147,7 +147,7 @@ public: FolderSortProxyModel(QObject *parent = nullptr); protected: - bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const; + bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override; }; FolderSortProxyModel::FolderSortProxyModel(QObject *parent) diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index 98b7825d5b..27413c22ea 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -32,6 +32,8 @@ #include "projectexplorerconstants.h" #include "toolchainmanager.h" +#include <coreplugin/icore.h> + #include <utils/algorithm.h> #include <utils/environment.h> #include <utils/hostosinfo.h> @@ -73,7 +75,7 @@ static const char compilerPlatformLinkerFlagsKeyC[] = "ProjectExplorer.GccToolCh static const char targetAbiKeyC[] = "ProjectExplorer.GccToolChain.TargetAbi"; static const char originalTargetTripleKeyC[] = "ProjectExplorer.GccToolChain.OriginalTargetTriple"; static const char supportedAbisKeyC[] = "ProjectExplorer.GccToolChain.SupportedAbis"; -static const char binaryRegexp[] = "(?:^|-|\\b)(?:gcc|g\\+\\+)(?:-([\\d.]+))?$"; +static const char binaryRegexp[] = "(?:^|-|\\b)(?:gcc|g\\+\\+|clang(?:\\+\\+)?)(?:-([\\d.]+))?$"; static QByteArray runGcc(const FileName &gcc, const QStringList &arguments, const QStringList &env) { @@ -707,7 +709,7 @@ FileNameList GccToolChain::suggestedMkspecList() const } if (abi.os() == Abi::LinuxOS) { - if (abi.osFlavor() != Abi::GenericLinuxFlavor) + if (abi.osFlavor() != Abi::GenericFlavor) return FileNameList(); // most likely not a desktop, so leave the mkspec alone. if (abi.wordWidth() == host.wordWidth()) { // no need to explicitly set the word width, but provide that mkspec anyway to make sure @@ -831,12 +833,12 @@ bool GccToolChain::fromMap(const QVariantMap &data) m_compilerCommand = FileName::fromString(data.value(compilerCommandKeyC).toString()); m_platformCodeGenFlags = data.value(compilerPlatformCodeGenFlagsKeyC).toStringList(); m_platformLinkerFlags = data.value(compilerPlatformLinkerFlagsKeyC).toStringList(); - m_targetAbi = Abi(data.value(targetAbiKeyC).toString()); + m_targetAbi = Abi::fromString(data.value(targetAbiKeyC).toString()); m_originalTargetTriple = data.value(originalTargetTripleKeyC).toString(); const QStringList abiList = data.value(supportedAbisKeyC).toStringList(); m_supportedAbis.clear(); for (const QString &a : abiList) { - Abi abi(a); + Abi abi = Abi::fromString(a); if (!abi.isValid()) continue; m_supportedAbis.append(abi); @@ -922,40 +924,47 @@ ToolChain *GccToolChainFactory::create(Core::Id language) return tc; } +void GccToolChainFactory::versionProbe(const QString &name, Core::Id language, Core::Id type, + QList<ToolChain *> &tcs, QList<ToolChain *> &known, + const QSet<QString> &filteredNames) +{ + if (!HostOsInfo::isLinuxHost()) + return; + const QRegularExpression regexp(binaryRegexp); + for (const QString &dir : QStringList({ "/usr/bin", "/usr/local/bin" })) { + QDir binDir(dir); + for (const QString &entry : binDir.entryList( + {"*-" + name, name + "-*", "*-" + name + "-*"}, + QDir::Files | QDir::Executable)) { + const QString fileName = FileName::fromString(entry).fileName(); + if (filteredNames.contains(fileName)) + continue; + const QRegularExpressionMatch match = regexp.match(fileName); + if (!match.hasMatch()) + continue; + const bool isNative = fileName.startsWith(name); + const Abi abi = isNative ? Abi::hostAbi() : Abi(); + tcs.append(autoDetectToolchains(compilerPathFromEnvironment(entry), abi, language, type, + known)); + known.append(tcs); + } + } +} + QList<ToolChain *> GccToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown) { QList<ToolChain *> tcs; QList<ToolChain *> known = alreadyKnown; - tcs.append(autoDetectToolchains("g++", Abi::hostAbi(), Constants::CXX_LANGUAGE_ID, - Constants::GCC_TOOLCHAIN_TYPEID, alreadyKnown)); - tcs.append(autoDetectToolchains("gcc", Abi::hostAbi(), Constants::C_LANGUAGE_ID, - Constants::GCC_TOOLCHAIN_TYPEID, alreadyKnown)); + tcs.append(autoDetectToolchains(compilerPathFromEnvironment("g++"), Abi::hostAbi(), + Constants::CXX_LANGUAGE_ID, Constants::GCC_TOOLCHAIN_TYPEID, + alreadyKnown)); + tcs.append(autoDetectToolchains(compilerPathFromEnvironment("gcc"), Abi::hostAbi(), + Constants::C_LANGUAGE_ID, Constants::GCC_TOOLCHAIN_TYPEID, + alreadyKnown)); known.append(tcs); - if (HostOsInfo::isLinuxHost()) { - const QRegularExpression regexp(binaryRegexp); - for (const QString &dir : QStringList({ "/usr/bin", "/usr/local/bin" })) { - QDir binDir(dir); - auto gccProbe = [&](const QString &name, Core::Id language) { - for (const QString &entry : binDir.entryList( - {"*-" + name, name + "-*", "*-" + name + "-*"}, - QDir::Files | QDir::Executable)) { - const QString fileName = FileName::fromString(entry).fileName(); - if (fileName == "c89-gcc" || fileName == "c99-gcc") - continue; - const QRegularExpressionMatch match = regexp.match(fileName); - if (!match.hasMatch()) - continue; - const bool isNative = fileName.startsWith(name); - const Abi abi = isNative ? Abi::hostAbi() : Abi(); - tcs.append(autoDetectToolchains(entry, abi, language, - Constants::GCC_TOOLCHAIN_TYPEID, known)); - known.append(tcs); - } - }; - gccProbe("g++", Constants::CXX_LANGUAGE_ID); - gccProbe("gcc", Constants::C_LANGUAGE_ID); - } - } + versionProbe("g++", Constants::CXX_LANGUAGE_ID, Constants::GCC_TOOLCHAIN_TYPEID, tcs, known); + versionProbe("gcc", Constants::C_LANGUAGE_ID, Constants::GCC_TOOLCHAIN_TYPEID, tcs, known, + {"c89-gcc", "c99-gcc"}); return tcs; } @@ -992,7 +1001,13 @@ GccToolChain *GccToolChainFactory::createToolChain(bool autoDetect) return new GccToolChain(autoDetect ? ToolChain::AutoDetection : ToolChain::ManualDetection); } -QList<ToolChain *> GccToolChainFactory::autoDetectToolchains(const QString &compiler, +Utils::FileName GccToolChainFactory::compilerPathFromEnvironment(const QString &compilerName) +{ + Environment systemEnvironment = Environment::systemEnvironment(); + return systemEnvironment.searchInPath(compilerName); +} + +QList<ToolChain *> GccToolChainFactory::autoDetectToolchains(const FileName &compilerPath, const Abi &requiredAbi, Core::Id language, const Core::Id requiredTypeId, @@ -1000,11 +1015,8 @@ QList<ToolChain *> GccToolChainFactory::autoDetectToolchains(const QString &comp { QList<ToolChain *> result; - Environment systemEnvironment = Environment::systemEnvironment(); - const FileName compilerPath = systemEnvironment.searchInPath(compiler); if (compilerPath.isEmpty()) return result; - const FileName canonicalPath = FileUtils::canonicalPath(compilerPath); result = Utils::filtered(alreadyKnown, [requiredTypeId, compilerPath](ToolChain *tc) { return tc->typeId() == requiredTypeId && tc->compilerCommand() == compilerPath; @@ -1019,19 +1031,6 @@ QList<ToolChain *> GccToolChainFactory::autoDetectToolchains(const QString &comp result = autoDetectToolChain(compilerPath, language, requiredAbi); - if (!requiredAbi.isNull()) { - const Abi alternateAbi = Abi(requiredAbi.architecture(), requiredAbi.os(), - requiredAbi.osFlavor(), requiredAbi.binaryFormat(), 32); - ToolChain *abiTc = Utils::findOrDefault(result, [&requiredAbi, &alternateAbi](const ToolChain *tc) { - return requiredAbi == tc->targetAbi() - || (requiredAbi.wordWidth() == 64 && tc->targetAbi() == alternateAbi); - }); - if (!abiTc) { - qDeleteAll(result); - result.clear(); - } - } - return result; } @@ -1055,8 +1054,9 @@ QList<ToolChain *> GccToolChainFactory::autoDetectToolChain(const FileName &comp if (!requiredAbi.isNull() && !abiList.contains(requiredAbi)) { if (requiredAbi.wordWidth() != 64 || !abiList.contains(Abi(requiredAbi.architecture(), requiredAbi.os(), requiredAbi.osFlavor(), - requiredAbi.binaryFormat(), 32))) + requiredAbi.binaryFormat(), 32))) { return result; + } } for (const Abi &abi : abiList) { @@ -1345,12 +1345,32 @@ QSet<Core::Id> ClangToolChainFactory::supportedLanguages() const QList<ToolChain *> ClangToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown) { - QList<ToolChain *> result - = autoDetectToolchains("clang++", Abi::hostAbi(), Constants::CXX_LANGUAGE_ID, - Constants::CLANG_TOOLCHAIN_TYPEID, alreadyKnown); - result += autoDetectToolchains("clang", Abi::hostAbi(), Constants::C_LANGUAGE_ID, - Constants::CLANG_TOOLCHAIN_TYPEID, alreadyKnown); - return result; + QList<ToolChain *> tcs; + QList<ToolChain *> known = alreadyKnown; + + const Abi hostAbi = Abi::hostAbi(); + tcs.append(autoDetectToolchains(compilerPathFromEnvironment("clang++"), hostAbi, + Constants::CXX_LANGUAGE_ID, Constants::CLANG_TOOLCHAIN_TYPEID, + alreadyKnown)); + tcs.append(autoDetectToolchains(compilerPathFromEnvironment("clang"), hostAbi, + Constants::C_LANGUAGE_ID, Constants::CLANG_TOOLCHAIN_TYPEID, + alreadyKnown)); + known.append(tcs); + versionProbe("clang++", Constants::CXX_LANGUAGE_ID, Constants::CLANG_TOOLCHAIN_TYPEID, tcs, known); + versionProbe("clang", Constants::C_LANGUAGE_ID, Constants::CLANG_TOOLCHAIN_TYPEID, tcs, known); + + const FileName compilerPath = FileName::fromString(Core::ICore::clangExecutable(CLANG_BINDIR)); + if (!compilerPath.isEmpty()) { + tcs.append(autoDetectToolchains(compilerPath.parentDir().appendPath( + HostOsInfo::withExecutableSuffix("clang++")), + hostAbi, Constants::CXX_LANGUAGE_ID, + Constants::CLANG_TOOLCHAIN_TYPEID, alreadyKnown)); + tcs.append(autoDetectToolchains(compilerPath.parentDir().appendPath( + HostOsInfo::withExecutableSuffix("clang")), + hostAbi, Constants::C_LANGUAGE_ID, + Constants::CLANG_TOOLCHAIN_TYPEID, alreadyKnown)); + } + return tcs; } QList<ToolChain *> ClangToolChainFactory::autoDetect(const FileName &compilerPath, const Core::Id &language) @@ -1440,10 +1460,12 @@ QList<ToolChain *> MingwToolChainFactory::autoDetect(const QList<ToolChain *> &a { Abi ha = Abi::hostAbi(); ha = Abi(ha.architecture(), Abi::WindowsOS, Abi::WindowsMSysFlavor, Abi::PEFormat, ha.wordWidth()); - QList<ToolChain *> result = autoDetectToolchains("g++", ha, Constants::CXX_LANGUAGE_ID, - Constants::MINGW_TOOLCHAIN_TYPEID, alreadyKnown); - result += autoDetectToolchains("gcc", ha, Constants::C_LANGUAGE_ID, - Constants::MINGW_TOOLCHAIN_TYPEID, alreadyKnown); + QList<ToolChain *> result = autoDetectToolchains( + compilerPathFromEnvironment("g++"), ha, Constants::CXX_LANGUAGE_ID, + Constants::MINGW_TOOLCHAIN_TYPEID, alreadyKnown); + result += autoDetectToolchains( + compilerPathFromEnvironment("gcc"), ha, Constants::C_LANGUAGE_ID, + Constants::MINGW_TOOLCHAIN_TYPEID, alreadyKnown); return result; } @@ -1537,8 +1559,9 @@ QSet<Core::Id> LinuxIccToolChainFactory::supportedLanguages() const QList<ToolChain *> LinuxIccToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown) { - return autoDetectToolchains("icpc", Abi::hostAbi(), Constants::CXX_LANGUAGE_ID, - Constants::LINUXICC_TOOLCHAIN_TYPEID, alreadyKnown); + return autoDetectToolchains(compilerPathFromEnvironment("icpc"), Abi::hostAbi(), + Constants::CXX_LANGUAGE_ID, Constants::LINUXICC_TOOLCHAIN_TYPEID, + alreadyKnown); } QList<ToolChain *> LinuxIccToolChainFactory::autoDetect(const FileName &compilerPath, const Core::Id &language) diff --git a/src/plugins/projectexplorer/gcctoolchainfactories.h b/src/plugins/projectexplorer/gcctoolchainfactories.h index e4c0a583e9..54d4f41782 100644 --- a/src/plugins/projectexplorer/gcctoolchainfactories.h +++ b/src/plugins/projectexplorer/gcctoolchainfactories.h @@ -31,6 +31,7 @@ #include "abiwidget.h" #include <QList> +#include <QSet> QT_BEGIN_NAMESPACE class QComboBox; @@ -62,9 +63,18 @@ public: protected: virtual GccToolChain *createToolChain(bool autoDetect); - QList<ToolChain *> autoDetectToolchains(const QString &compiler, const Abi &requiredAbi, - Core::Id language, const Core::Id requiredTypeId, - const QList<ToolChain *> &alreadyKnown); + void versionProbe(const QString &name, + Core::Id language, + Core::Id type, + QList<ToolChain *> &tcs, + QList<ToolChain *> &known, + const QSet<QString> &filteredNames = {}); + + Utils::FileName compilerPathFromEnvironment(const QString &compilerName); + + QList<ToolChain *> autoDetectToolchains( + const Utils::FileName &compilerPath, const Abi &requiredAbi, Core::Id language, + const Core::Id requiredTypeId, const QList<ToolChain *> &alreadyKnown); QList<ToolChain *> autoDetectToolChain(const Utils::FileName &compilerPath, const Core::Id language, const Abi &requiredAbi = Abi()); }; diff --git a/src/plugins/projectexplorer/gnumakeparser.cpp b/src/plugins/projectexplorer/gnumakeparser.cpp index 736833cacd..92c49a020a 100644 --- a/src/plugins/projectexplorer/gnumakeparser.cpp +++ b/src/plugins/projectexplorer/gnumakeparser.cpp @@ -83,11 +83,11 @@ void GnuMakeParser::stdOutput(const QString &line) class Result { public: - Result() : isFatal(false), type(Task::Error) { } + Result() = default; QString description; - bool isFatal; - Task::TaskType type; + bool isFatal = false; + Task::TaskType type = Task::Error; }; static Result parseDescription(const QString &description) @@ -401,8 +401,8 @@ void ProjectExplorerPlugin::testGnuMakeParserParsing_data() void ProjectExplorerPlugin::testGnuMakeParserParsing() { OutputParserTester testbench; - GnuMakeParser *childParser = new GnuMakeParser; - GnuMakeParserTester *tester = new GnuMakeParserTester(childParser); + auto *childParser = new GnuMakeParser; + auto *tester = new GnuMakeParserTester(childParser); connect(&testbench, &OutputParserTester::aboutToDeleteParser, tester, &GnuMakeParserTester::parserIsAboutToBeDeleted); @@ -494,7 +494,7 @@ void ProjectExplorerPlugin::testGnuMakeParserTaskMangling_data() void ProjectExplorerPlugin::testGnuMakeParserTaskMangling() { OutputParserTester testbench; - GnuMakeParser *childParser = new GnuMakeParser; + auto *childParser = new GnuMakeParser; testbench.appendOutputParser(childParser); QFETCH(QStringList, files); diff --git a/src/plugins/projectexplorer/ioutputparser.cpp b/src/plugins/projectexplorer/ioutputparser.cpp index bf772e576c..0da7005948 100644 --- a/src/plugins/projectexplorer/ioutputparser.cpp +++ b/src/plugins/projectexplorer/ioutputparser.cpp @@ -149,7 +149,7 @@ IOutputParser *IOutputParser::takeOutputParserChain() IOutputParser *parser = m_parser; disconnect(parser, &IOutputParser::addOutput, this, &IOutputParser::outputAdded); disconnect(parser, &IOutputParser::addTask, this, &IOutputParser::taskAdded); - m_parser = 0; + m_parser = nullptr; return parser; } diff --git a/src/plugins/projectexplorer/ioutputparser.h b/src/plugins/projectexplorer/ioutputparser.h index 7590ce2f7e..47c8f4f1c0 100644 --- a/src/plugins/projectexplorer/ioutputparser.h +++ b/src/plugins/projectexplorer/ioutputparser.h @@ -52,7 +52,6 @@ public: virtual void stdError(const QString &line); virtual bool hasFatalErrors() const; - // For GnuMakeParser virtual void setWorkingDirectory(const QString &workingDirectory); void flush(); // flush out pending tasks diff --git a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp index 578023972f..c4e3477596 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp @@ -114,13 +114,13 @@ public: m_fixupExpando = expando; } - QValidator::State validate(QString &input, int &pos) const + QValidator::State validate(QString &input, int &pos) const override { fixup(input); return QRegularExpressionValidator::validate(input, pos); } - void fixup(QString &fixup) const + void fixup(QString &fixup) const override { if (m_fixupExpando.isEmpty()) return; @@ -139,14 +139,13 @@ private: // JsonFieldPage::FieldData: // -------------------------------------------------------------------- -JsonFieldPage::Field::Field() : d(new FieldPrivate) +JsonFieldPage::Field::Field() : d(std::make_unique<FieldPrivate>()) { } JsonFieldPage::Field::~Field() { delete d->m_widget; delete d->m_label; - delete d; } QString JsonFieldPage::Field::type() @@ -159,7 +158,7 @@ JsonFieldPage::Field *JsonFieldPage::Field::parse(const QVariant &input, QString if (input.type() != QVariant::Map) { *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonFieldPage", "Field is not an object."); - return 0; + return nullptr; } QVariantMap tmp = input.toMap(); @@ -167,13 +166,13 @@ JsonFieldPage::Field *JsonFieldPage::Field::parse(const QVariant &input, QString if (name.isEmpty()) { *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonFieldPage", "Field has no name."); - return 0; + return nullptr; } const QString type = consumeValue(tmp, TYPE_KEY).toString(); if (type.isEmpty()) { *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonFieldPage", "Field \"%1\" has no type.").arg(name); - return 0; + return nullptr; } Field *data = createFieldData(type); @@ -181,7 +180,7 @@ JsonFieldPage::Field *JsonFieldPage::Field::parse(const QVariant &input, QString *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonFieldPage", "Field \"%1\" has unsupported type \"%2\".") .arg(name).arg(type); - return 0; + return nullptr; } data->setTexts(name, JsonWizardFactory::localizedString(consumeValue(tmp, DISPLAY_NAME_KEY).toString()), @@ -200,7 +199,7 @@ JsonFieldPage::Field *JsonFieldPage::Field::parse(const QVariant &input, QString "When parsing Field \"%1\": %2") .arg(name).arg(*errorMessage); delete data; - return 0; + return nullptr; } warnAboutUnsupportedKeys(tmp, name); @@ -927,7 +926,7 @@ void ListField::initializeData(MacroExpander *expander) QString iconPath = expandedValuesItem->data(IconStringRole).toString(); if (!iconPath.isEmpty()) { - if (JsonFieldPage *page = qobject_cast<JsonFieldPage*>(widget()->parentWidget())) { + if (auto *page = qobject_cast<JsonFieldPage*>(widget()->parentWidget())) { const QString wizardDirectory = page->value("WizardDir").toString(); iconPath = QDir::cleanPath(QDir(wizardDirectory).absoluteFilePath(iconPath)); if (QFileInfo::exists(iconPath)) { diff --git a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.h b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.h index 7cdb50c544..e1ddc7b559 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.h +++ b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.h @@ -33,6 +33,8 @@ #include <QRegularExpression> #include <QVariant> +#include <memory> + QT_BEGIN_NAMESPACE class QFormLayout; class QLabel; @@ -105,7 +107,7 @@ public: friend class JsonFieldPage; - FieldPrivate *const d; + const std::unique_ptr<FieldPrivate> d; }; JsonFieldPage(Utils::MacroExpander *expander, QWidget *parent = 0); diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp index d8d781908c..1ef81e7d45 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp @@ -127,7 +127,7 @@ static JsonWizardFactory::Generator parseGenerator(const QVariant &value, QStrin } Core::Id typeId = Core::Id::fromString(QLatin1String(Constants::GENERATOR_ID_PREFIX) + strVal); JsonWizardGeneratorFactory *factory - = Utils::findOr(s_generatorFactories, 0, [typeId](JsonWizardGeneratorFactory *f) { return f->canCreate(typeId); }); + = Utils::findOr(s_generatorFactories, nullptr, [typeId](JsonWizardGeneratorFactory *f) { return f->canCreate(typeId); }); if (!factory) { *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonWizardFactory", "TypeId \"%1\" of generator is unknown. Supported typeIds are: \"%2\".") @@ -164,7 +164,7 @@ static JsonWizardFactory::Page parsePage(const QVariant &value, QString *errorMe Core::Id typeId = Core::Id::fromString(QLatin1String(Constants::PAGE_ID_PREFIX) + strVal); JsonWizardPageFactory *factory - = Utils::findOr(s_pageFactories, 0, [typeId](JsonWizardPageFactory *f) { return f->canCreate(typeId); }); + = Utils::findOr(s_pageFactories, nullptr, [typeId](JsonWizardPageFactory *f) { return f->canCreate(typeId); }); if (!factory) { *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonWizardFactory", "TypeId \"%1\" of page is unknown. Supported typeIds are: \"%2\".") @@ -306,7 +306,7 @@ QList<Core::IWizardFactory *> JsonWizardFactory::createWizardFactories() JsonWizardFactory *JsonWizardFactory::createWizardFactory(const QVariantMap &data, const QDir &baseDir, QString *errorMessage) { - JsonWizardFactory *factory = new JsonWizardFactory; + auto *factory = new JsonWizardFactory; if (!factory->initialize(data, baseDir, errorMessage)) { delete factory; factory = nullptr; @@ -404,7 +404,7 @@ Utils::Wizard *JsonWizardFactory::runWizardImpl(const QString &path, QWidget *pa continue; havePage = true; - JsonWizardPageFactory *factory = Utils::findOr(s_pageFactories, 0, + JsonWizardPageFactory *factory = Utils::findOr(s_pageFactories, nullptr, [&data](JsonWizardPageFactory *f) { return f->canCreate(data.typeId); }); @@ -427,7 +427,7 @@ Utils::Wizard *JsonWizardFactory::runWizardImpl(const QString &path, QWidget *pa foreach (const Generator &data, m_generators) { QTC_ASSERT(data.isValid(), continue); - JsonWizardGeneratorFactory *factory = Utils::findOr(s_generatorFactories, 0, + JsonWizardGeneratorFactory *factory = Utils::findOr(s_generatorFactories, nullptr, [&data](JsonWizardGeneratorFactory *f) { return f->canCreate(data.typeId); }); @@ -441,7 +441,7 @@ Utils::Wizard *JsonWizardFactory::runWizardImpl(const QString &path, QWidget *pa if (!havePage) { wizard->accept(); wizard->deleteLater(); - return 0; + return nullptr; } wizard->show(); @@ -629,7 +629,7 @@ bool JsonWizardFactory::initialize(const QVariantMap &data, const QDir &baseDir, return false; } - WizardFlags flags = 0; + WizardFlags flags = {}; if (data.value(QLatin1String(PLATFORM_INDEPENDENT_KEY), false).toBool()) flags |= PlatformIndependent; setFlags(flags); diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardfilegenerator.cpp b/src/plugins/projectexplorer/jsonwizard/jsonwizardfilegenerator.cpp index 5e599c39de..ee7da5b419 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonwizardfilegenerator.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardfilegenerator.cpp @@ -139,7 +139,7 @@ Core::GeneratedFile JsonWizardFileGenerator::generateFile(const File &file, } } - Core::GeneratedFile::Attributes attributes = 0; + Core::GeneratedFile::Attributes attributes = {}; if (JsonWizard::boolFromVariant(file.openInEditor, expander)) attributes |= Core::GeneratedFile::OpenEditorAttribute; if (JsonWizard::boolFromVariant(file.openAsProject, expander)) diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardgeneratorfactory.cpp b/src/plugins/projectexplorer/jsonwizard/jsonwizardgeneratorfactory.cpp index 6d96f67114..013de06c0a 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonwizardgeneratorfactory.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardgeneratorfactory.cpp @@ -67,7 +67,7 @@ namespace ProjectExplorer { static ICodeStylePreferences *codeStylePreferences(Project *project, Id languageId) { if (!languageId.isValid()) - return 0; + return nullptr; if (project) return project->editorConfiguration()->codeStyle(languageId); @@ -310,7 +310,7 @@ JsonWizardGenerator *FileGeneratorFactory::create(Id typeId, const QVariant &dat Q_UNUSED(platform); Q_UNUSED(variables); - QTC_ASSERT(canCreate(typeId), return 0); + QTC_ASSERT(canCreate(typeId), return nullptr); auto gen = new JsonWizardFileGenerator; QString errorMessage; @@ -319,7 +319,7 @@ JsonWizardGenerator *FileGeneratorFactory::create(Id typeId, const QVariant &dat if (!errorMessage.isEmpty()) { qWarning() << "FileGeneratorFactory setup error:" << errorMessage; delete gen; - return 0; + return nullptr; } return gen; @@ -350,7 +350,7 @@ JsonWizardGenerator *ScannerGeneratorFactory::create(Id typeId, const QVariant & Q_UNUSED(platform); Q_UNUSED(variables); - QTC_ASSERT(canCreate(typeId), return 0); + QTC_ASSERT(canCreate(typeId), return nullptr); auto gen = new JsonWizardScannerGenerator; QString errorMessage; @@ -359,7 +359,7 @@ JsonWizardGenerator *ScannerGeneratorFactory::create(Id typeId, const QVariant & if (!errorMessage.isEmpty()) { qWarning() << "ScannerGeneratorFactory setup error:" << errorMessage; delete gen; - return 0; + return nullptr; } return gen; diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardpagefactory.cpp b/src/plugins/projectexplorer/jsonwizard/jsonwizardpagefactory.cpp index 3e6f12a15e..c2c49b61ed 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonwizardpagefactory.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardpagefactory.cpp @@ -35,8 +35,7 @@ namespace ProjectExplorer { // JsonWizardPageFactory: // -------------------------------------------------------------------- -JsonWizardPageFactory::~JsonWizardPageFactory() -{ } +JsonWizardPageFactory::~JsonWizardPageFactory() = default; void JsonWizardPageFactory::setTypeIdsSuffixes(const QStringList &suffixes) { diff --git a/src/plugins/projectexplorer/kit.cpp b/src/plugins/projectexplorer/kit.cpp index 17f067abe9..37d71a2aff 100644 --- a/src/plugins/projectexplorer/kit.cpp +++ b/src/plugins/projectexplorer/kit.cpp @@ -132,14 +132,14 @@ public: // ------------------------------------------------------------------------- Kit::Kit(Id id) : - d(new Internal::KitPrivate(id, this)) + d(std::make_unique<Internal::KitPrivate>(id, this)) { foreach (KitInformation *sti, KitManager::kitInformation()) d->m_data.insert(sti->id(), sti->defaultValue(this)); } Kit::Kit(const QVariantMap &data) : - d(new Internal::KitPrivate(Id(), this)) + d(std::make_unique<Internal::KitPrivate>(Id(), this)) { d->m_id = Id::fromSetting(data.value(QLatin1String(ID_KEY))); @@ -174,10 +174,7 @@ Kit::Kit(const QVariantMap &data) : d->m_sticky.insert(Id::fromString(stickyInfo)); } -Kit::~Kit() -{ - delete d; -} +Kit::~Kit() = default; void Kit::blockNotification() { @@ -472,7 +469,7 @@ bool Kit::isEqual(const Kit *other) const QVariantMap Kit::toMap() const { - typedef QHash<Id, QVariant>::ConstIterator IdVariantConstIt; + using IdVariantConstIt = QHash<Id, QVariant>::ConstIterator; QVariantMap data; data.insert(QLatin1String(ID_KEY), QString::fromLatin1(d->m_id.name())); diff --git a/src/plugins/projectexplorer/kit.h b/src/plugins/projectexplorer/kit.h index 9c5551d8c6..ab9b1681f6 100644 --- a/src/plugins/projectexplorer/kit.h +++ b/src/plugins/projectexplorer/kit.h @@ -33,6 +33,8 @@ #include <QSet> #include <QVariant> +#include <memory> + namespace Utils { class Environment; class MacroExpander; @@ -59,6 +61,8 @@ public: using Predicate = std::function<bool(const Kit *)>; explicit Kit(Core::Id id = Core::Id()); + explicit Kit(const QVariantMap &data); + ~Kit(); // Do not trigger evaluations void blockNotification(); @@ -127,9 +131,6 @@ public: private: void setSdkProvided(bool sdkProvided); - ~Kit(); - Kit(const QVariantMap &data); - // Unimplemented. Kit(const Kit &other); void operator=(const Kit &other); @@ -139,7 +140,7 @@ private: QVariantMap toMap() const; - Internal::KitPrivate *const d; + const std::unique_ptr<Internal::KitPrivate> d; friend class KitInformation; friend class KitManager; diff --git a/src/plugins/projectexplorer/kitinformationconfigwidget.cpp b/src/plugins/projectexplorer/kitinformationconfigwidget.cpp index 5f6ddec6ad..c6fafe7469 100644 --- a/src/plugins/projectexplorer/kitinformationconfigwidget.cpp +++ b/src/plugins/projectexplorer/kitinformationconfigwidget.cpp @@ -417,6 +417,7 @@ KitEnvironmentConfigWidget::KitEnvironmentConfigWidget(Kit *workingCopy, const K m_mainWidget(new QWidget) { auto *layout = new QVBoxLayout; + layout->setContentsMargins(0, 0, 0, 0); layout->addWidget(m_summaryLabel); if (Utils::HostOsInfo::isWindowsHost()) initMSVCOutputSwitch(layout); diff --git a/src/plugins/projectexplorer/kitmanager.cpp b/src/plugins/projectexplorer/kitmanager.cpp index 8e9b3653ce..9ed48df0bd 100644 --- a/src/plugins/projectexplorer/kitmanager.cpp +++ b/src/plugins/projectexplorer/kitmanager.cpp @@ -34,11 +34,11 @@ #include <coreplugin/icore.h> +#include <utils/environment.h> #include <utils/persistentsettings.h> +#include <utils/pointeralgorithm.h> #include <utils/qtcassert.h> #include <utils/stringutils.h> -#include <utils/environment.h> -#include <utils/algorithm.h> #include <QSettings> @@ -67,23 +67,13 @@ static FileName settingsFileName() class KitManagerPrivate { public: - ~KitManagerPrivate(); - Kit *m_defaultKit = nullptr; bool m_initialized = false; - QList<KitInformation *> m_informationList; - QList<Kit *> m_kitList; - PersistentSettingsWriter *m_writer = nullptr; + std::vector<std::unique_ptr<KitInformation>> m_informationList; + std::vector<std::unique_ptr<Kit>> m_kitList; + std::unique_ptr<PersistentSettingsWriter> m_writer; }; -KitManagerPrivate::~KitManagerPrivate() -{ - foreach (Kit *k, m_kitList) - delete k; - qDeleteAll(m_informationList); - delete m_writer; -} - } // namespace Internal // -------------------------------------------------------------------------- @@ -98,15 +88,14 @@ KitManager *KitManager::instance() return m_instance; } -KitManager::KitManager(QObject *parent) : - QObject(parent) +KitManager::KitManager(QObject *parent) + : QObject(parent) { d = new KitManagerPrivate; QTC_CHECK(!m_instance); m_instance = this; - connect(ICore::instance(), &ICore::saveSettingsRequested, - this, &KitManager::saveKits); + connect(ICore::instance(), &ICore::saveSettingsRequested, this, &KitManager::saveKits); connect(this, &KitManager::kitAdded, this, &KitManager::kitsChanged); connect(this, &KitManager::kitRemoved, this, &KitManager::kitsChanged); @@ -115,106 +104,90 @@ KitManager::KitManager(QObject *parent) : void KitManager::restoreKits() { - QTC_ASSERT(!d->m_initialized, return); - static bool initializing = false; - - if (initializing) // kits will call kits() to check their display names, which will trigger another - // call to restoreKits, which ... - return; + QTC_ASSERT(!d->m_initialized, return ); - initializing = true; - - QList<Kit *> kitsToRegister; - QList<Kit *> kitsToValidate; - QList<Kit *> kitsToCheck; - QList<Kit *> sdkKits; - - // read all kits from SDK - QFileInfo kitFile(ICore::installerResourcePath() + KIT_FILENAME); - if (kitFile.exists()) { - KitList system = restoreKits(FileName(kitFile)); - // make sure we mark these as autodetected and run additional setup logic - foreach (Kit *k, system.kits) { - k->setAutoDetected(true); - k->setSdkProvided(true); - k->makeSticky(); - } - - // SDK kits are always considered to be up for validation since they might have been - // extended with additional information by creator in the meantime: - kitsToValidate = system.kits; - } + std::vector<std::unique_ptr<Kit>> resultList; // read all kits from user file - KitList userKits; - FileName userSettingsFile(settingsFileName()); - if (userSettingsFile.exists()) - userKits = restoreKits(userSettingsFile); - foreach (Kit *k, userKits.kits) { - if (k->isSdkProvided()) - kitsToCheck.append(k); - else - kitsToRegister.append(k); + Core::Id defaultUserKit; + std::vector<std::unique_ptr<Kit>> kitsToCheck; + { + KitList userKits = restoreKits(settingsFileName()); + defaultUserKit = userKits.defaultKit; + + for (auto &k : userKits.kits) { + if (k->isSdkProvided()) { + kitsToCheck.emplace_back(std::move(k)); + } else { + completeKit(k.get()); // Store manual kits + resultList.emplace_back(std::move(k)); + } + } } - Kit *toStore = 0; - foreach (Kit *current, kitsToValidate) { - toStore = current; - toStore->upgrade(); - toStore->setup(); // Make sure all kitinformation are properly set up before merging them - // with the information from the user settings file - - // Check whether we had this kit stored and prefer the stored one: - for (int i = 0; i < kitsToCheck.count(); ++i) { - if (kitsToCheck.at(i)->id() == current->id()) { - toStore = kitsToCheck.at(i); - kitsToCheck.removeAt(i); + // read all kits from SDK + { + KitList system + = restoreKits(FileName::fromString(ICore::installerResourcePath() + KIT_FILENAME)); + + // SDK kits need to get updated with the user-provided extra settings: + for (auto ¤t : system.kits) { + // make sure we mark these as autodetected and run additional setup logic + current->setAutoDetected(true); + current->setSdkProvided(true); + current->makeSticky(); + + // Process: + auto toStore = std::move(current); + toStore->upgrade(); + toStore->setup(); // Make sure all kitinformation are properly set up before merging them + // with the information from the user settings file + + // Check whether we had this kit stored and prefer the stored one: + const auto i = std::find_if(std::begin(kitsToCheck), + std::end(kitsToCheck), + Utils::equal(&Kit::id, toStore->id())); + if (i != std::end(kitsToCheck)) { + Kit *ptr = i->get(); // Overwrite settings that the SDK sets to those values: - foreach (const KitInformation *ki, kitInformation()) { + foreach (const KitInformation *ki, KitManager::kitInformation()) { // Copy sticky settings over: - if (current->isSticky(ki->id())) { - toStore->setValue(ki->id(), current->value(ki->id())); - toStore->setSticky(ki->id(), true); + if (ptr->isSticky(ki->id())) { + ptr->setValue(ki->id(), toStore->value(ki->id())); + ptr->setSticky(ki->id(), true); } } - - delete current; - break; + toStore = std::move(*i); + kitsToCheck.erase(i); } + completeKit(toStore.get()); // Store manual kits + resultList.emplace_back(std::move(toStore)); } - addKit(toStore); - sdkKits << toStore; } // Delete all loaded autodetected kits that were not rediscovered: - foreach (Kit *k, kitsToCheck) - delete k; kitsToCheck.clear(); - // Store manual kits - foreach (Kit *k, kitsToRegister) - addKit(k); - - if (kits().isEmpty()) { - Kit *defaultKit = new Kit; // One kit using default values + if (resultList.size() == 0) { + auto defaultKit = std::make_unique<Kit>(); // One kit using default values defaultKit->setUnexpandedDisplayName(tr("Desktop")); defaultKit->setSdkProvided(false); defaultKit->setAutoDetected(false); defaultKit->setup(); - addKit(defaultKit); - setDefaultKit(defaultKit); + completeKit(defaultKit.get()); // Store manual kits + resultList.emplace_back(std::move(defaultKit)); } - Kit *k = kit(userKits.defaultKit); - if (!k && !defaultKit()) - k = Utils::findOrDefault(kitsToRegister + sdkKits, &Kit::isValid); - if (k) - setDefaultKit(k); + Kit *k = Utils::findOrDefault(resultList, Utils::equal(&Kit::id, defaultUserKit)); + if (!k) + k = Utils::findOrDefault(resultList, &Kit::isValid); + std::swap(resultList, d->m_kitList); + setDefaultKit(k); - d->m_writer = new PersistentSettingsWriter(settingsFileName(), QLatin1String("QtCreatorProfiles")); + d->m_writer = std::make_unique<PersistentSettingsWriter>(settingsFileName(), "QtCreatorProfiles"); d->m_initialized = true; emit kitsLoaded(); emit kitsChanged(); @@ -254,22 +227,19 @@ bool KitManager::isLoaded() return d->m_initialized; } -static bool greaterPriority(KitInformation *a, KitInformation *b) +void KitManager::registerKitInformation(std::unique_ptr<KitInformation> &&ki) { - return a->priority() > b->priority(); -} - -void KitManager::registerKitInformation(KitInformation *ki) -{ - QTC_CHECK(!isLoaded()); - QTC_ASSERT(!d->m_informationList.contains(ki), return); - - auto it = std::lower_bound(d->m_informationList.begin(), d->m_informationList.end(), - ki, greaterPriority); - d->m_informationList.insert(it, ki); + QTC_ASSERT(ki->id().isValid(), return ); + QTC_ASSERT(!Utils::contains(d->m_informationList, ki.get()), return ); - if (!isLoaded()) - return; + auto it = std::lower_bound(std::begin(d->m_informationList), + std::end(d->m_informationList), + ki, + [](const std::unique_ptr<KitInformation> &a, + const std::unique_ptr<KitInformation> &b) { + return a->priority() > b->priority(); + }); + d->m_informationList.insert(it, std::move(ki)); foreach (Kit *k, kits()) { if (!k->hasValue(ki->id())) @@ -281,13 +251,6 @@ void KitManager::registerKitInformation(KitInformation *ki) return; } -void KitManager::deregisterKitInformation(KitInformation *ki) -{ - QTC_CHECK(d->m_informationList.contains(ki)); - d->m_informationList.removeOne(ki); - delete ki; -} - QSet<Id> KitManager::supportedPlatforms() { QSet<Id> platforms; @@ -314,13 +277,15 @@ QList<Kit *> KitManager::sortKits(const QList<Kit *> kits) // calling executables to find version information, etc.) to call that // method! // Avoid lots of potentially expensive calls to Kit::displayName(): - QList<QPair<QString, Kit *> > sortList - = Utils::transform(kits, [](Kit *k) { return qMakePair(k->displayName(), k); }); - Utils::sort(sortList, [](const QPair<QString, Kit *> &a, const QPair<QString, Kit *> &b) -> bool { - if (a.first == b.first) - return a.second < b.second; - return a. first < b.first; + QList<QPair<QString, Kit *>> sortList = Utils::transform(kits, [](Kit *k) { + return qMakePair(k->displayName(), k); }); + Utils::sort(sortList, + [](const QPair<QString, Kit *> &a, const QPair<QString, Kit *> &b) -> bool { + if (a.first == b.first) + return a.second < b.second; + return a.first < b.first; + }); return Utils::transform(sortList, &QPair<QString, Kit *>::second); } @@ -328,9 +293,13 @@ KitManager::KitList KitManager::restoreKits(const FileName &fileName) { KitList result; + if (!fileName.exists()) + return result; + PersistentSettingsReader reader; if (!reader.load(fileName)) { - qWarning("Warning: Failed to read \"%s\", cannot restore kits!", qPrintable(fileName.toUserOutput())); + qWarning("Warning: Failed to read \"%s\", cannot restore kits!", + qPrintable(fileName.toUserOutput())); return result; } QVariantMap data = reader.restoreValues(); @@ -350,47 +319,44 @@ KitManager::KitList KitManager::restoreKits(const FileName &fileName) const QVariantMap stMap = data.value(key).toMap(); - Kit *k = new Kit(stMap); + auto k = std::make_unique<Kit>(stMap); if (k->id().isValid()) { - result.kits.append(k); + result.kits.emplace_back(std::move(k)); } else { - // If the Id is broken, then do not trust the rest of the data either. - delete k; qWarning("Warning: Unable to restore kits stored in %s at position %d.", - qPrintable(fileName.toUserOutput()), i); + qPrintable(fileName.toUserOutput()), + i); } } const Id id = Id::fromSetting(data.value(QLatin1String(KIT_DEFAULT_KEY))); if (!id.isValid()) return result; - foreach (Kit *k, result.kits) { - if (k->id() == id) { - result.defaultKit = id; - break; - } - } + if (Utils::contains(result.kits, [id](const std::unique_ptr<Kit> &k) { return k->id() == id; })) + result.defaultKit = id; + return result; } QList<Kit *> KitManager::kits(const Kit::Predicate &predicate) { + const QList<Kit *> result = Utils::toRawPointer<QList>(d->m_kitList); if (predicate) - return Utils::filtered(d->m_kitList, predicate); - return d->m_kitList; -} + return Utils::filtered(result, predicate); + return result; + } Kit *KitManager::kit(Id id) { if (!id.isValid()) - return 0; + return nullptr; - return Utils::findOrDefault(kits(), Utils::equal(&Kit::id, id)); + return Utils::findOrDefault(d->m_kitList, Utils::equal(&Kit::id, id)); } Kit *KitManager::kit(const Kit::Predicate &predicate) { - return Utils::findOrDefault(d->m_kitList, predicate); + return Utils::findOrDefault(kits(), predicate); } Kit *KitManager::defaultKit() @@ -400,12 +366,12 @@ Kit *KitManager::defaultKit() QList<KitInformation *> KitManager::kitInformation() { - return d->m_informationList; + return Utils::toRawPointer<QList>(d->m_informationList); } KitManagerConfigWidget *KitManager::createConfigWidget(Kit *k) { - KitManagerConfigWidget *result = new KitManagerConfigWidget(k); + auto *result = new KitManagerConfigWidget(k); foreach (KitInformation *ki, kitInformation()) result->addConfigWidget(ki->createConfigWidget(result->workingCopy())); @@ -414,24 +380,18 @@ KitManagerConfigWidget *KitManager::createConfigWidget(Kit *k) return result; } -void KitManager::deleteKit(Kit *k) -{ - QTC_ASSERT(!KitManager::kits().contains(k), return); - delete k; -} - void KitManager::notifyAboutUpdate(Kit *k) { if (!k || !isLoaded()) return; - if (d->m_kitList.contains(k)) + if (Utils::contains(d->m_kitList, k)) emit m_instance->kitUpdated(k); else emit m_instance->unmanagedKitUpdated(k); } -bool KitManager::registerKit(Kit *k) +bool KitManager::registerKit(std::unique_ptr<Kit> &&k) { QTC_ASSERT(isLoaded(), return false); @@ -440,62 +400,61 @@ bool KitManager::registerKit(Kit *k) QTC_ASSERT(k->id().isValid(), return false); - if (kits().contains(k)) + Kit *kptr = k.get(); + if (Utils::contains(d->m_kitList, kptr)) return false; // make sure we have all the information in our kits: - m_instance->addKit(k); + completeKit(kptr); - if (!d->m_defaultKit || - (!d->m_defaultKit->isValid() && k->isValid())) - setDefaultKit(k); + d->m_kitList.emplace_back(std::move(k)); - emit m_instance->kitAdded(k); + if (!d->m_defaultKit || (!d->m_defaultKit->isValid() && kptr->isValid())) + setDefaultKit(kptr); + + emit m_instance->kitAdded(kptr); return true; } void KitManager::deregisterKit(Kit *k) { - if (!k || !kits().contains(k)) + if (!k || !Utils::contains(d->m_kitList, k)) return; - d->m_kitList.removeOne(k); + auto taken = Utils::take(d->m_kitList, k); if (defaultKit() == k) { Kit *newDefault = Utils::findOrDefault(kits(), [](Kit *k) { return k->isValid(); }); setDefaultKit(newDefault); } emit m_instance->kitRemoved(k); - delete k; } void KitManager::setDefaultKit(Kit *k) { if (defaultKit() == k) return; - if (k && !kits().contains(k)) + if (k && !Utils::contains(d->m_kitList, k)) return; d->m_defaultKit = k; emit m_instance->defaultkitChanged(); } -void KitManager::addKit(Kit *k) +void KitManager::completeKit(Kit *k) { - if (!k) - return; - - { - KitGuard g(k); - foreach (KitInformation *ki, d->m_informationList) { - ki->upgrade(k); - if (!k->hasValue(ki->id())) - k->setValue(ki->id(), ki->defaultValue(k)); - else - ki->fix(k); - } + QTC_ASSERT(k, return); + KitGuard g(k); + for (const std::unique_ptr<KitInformation> &ki : d->m_informationList) { + ki->upgrade(k); + if (!k->hasValue(ki->id())) + k->setValue(ki->id(), ki->defaultValue(k)); + else + ki->fix(k); } - - d->m_kitList.append(k); } +// -------------------------------------------------------------------- +// KitInformation: +// -------------------------------------------------------------------- + void KitInformation::addToEnvironment(const Kit *k, Environment &env) const { Q_UNUSED(k); @@ -505,7 +464,7 @@ void KitInformation::addToEnvironment(const Kit *k, Environment &env) const IOutputParser *KitInformation::createOutputParser(const Kit *k) const { Q_UNUSED(k); - return 0; + return nullptr; } QString KitInformation::displayNamePostfix(const Kit *k) const diff --git a/src/plugins/projectexplorer/kitmanager.h b/src/plugins/projectexplorer/kitmanager.h index db5bb28304..a576a1d360 100644 --- a/src/plugins/projectexplorer/kitmanager.h +++ b/src/plugins/projectexplorer/kitmanager.h @@ -29,8 +29,8 @@ #include "kit.h" -#include <coreplugin/id.h> #include <coreplugin/featureprovider.h> +#include <coreplugin/id.h> #include <QObject> #include <QPair> @@ -41,7 +41,7 @@ namespace Utils { class Environment; class FileName; class MacroExpander; -} +} // namespace Utils namespace ProjectExplorer { class Task; @@ -124,14 +124,14 @@ public: static Internal::KitManagerConfigWidget *createConfigWidget(Kit *k); - static void deleteKit(Kit *k); - - static bool registerKit(Kit *k); + static bool registerKit(std::unique_ptr<Kit> &&k); static void deregisterKit(Kit *k); static void setDefaultKit(Kit *k); - static void registerKitInformation(KitInformation *ki); - static void deregisterKitInformation(KitInformation *ki); + template<typename KI, typename... Args> + static void registerKitInformation(Args&&... args) { + registerKitInformation(std::make_unique<KI>(std::forward<Args>(args)...)); + } static QSet<Core::Id> supportedPlatforms(); static QSet<Core::Id> availableFeatures(Core::Id platformId); @@ -159,20 +159,22 @@ signals: private: explicit KitManager(QObject *parent = nullptr); + static void registerKitInformation(std::unique_ptr<KitInformation> &&ki); + // Make sure the this is only called after all // KitInformation are registered! void restoreKits(); class KitList { public: - KitList() { } + KitList() {} Core::Id defaultKit; - QList<Kit *> kits; + std::vector<std::unique_ptr<Kit>> kits; }; KitList restoreKits(const Utils::FileName &fileName); static void notifyAboutUpdate(Kit *k); - void addKit(Kit *k); + static void completeKit(Kit *k); friend class ProjectExplorerPlugin; // for constructor friend class Kit; diff --git a/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp b/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp index a7e19ff9e9..c9b8391bd9 100644 --- a/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp +++ b/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp @@ -32,6 +32,7 @@ #include <coreplugin/variablechooser.h> +#include <utils/algorithm.h> #include <utils/detailswidget.h> #include <utils/qtcassert.h> #include <utils/macroexpander.h> @@ -60,7 +61,7 @@ KitManagerConfigWidget::KitManagerConfigWidget(Kit *k) : m_nameEdit(new QLineEdit), m_fileSystemFriendlyNameLineEdit(new QLineEdit), m_kit(k), - m_modifiedKit(new Kit(Core::Id(WORKING_COPY_KIT_ID))) + m_modifiedKit(std::make_unique<Kit>(Core::Id(WORKING_COPY_KIT_ID))) { static auto alignment = static_cast<const Qt::Alignment>(style()->styleHint(QStyle::SH_FormLayoutLabelAlignment)); @@ -129,10 +130,9 @@ KitManagerConfigWidget::~KitManagerConfigWidget() qDeleteAll(m_actions); m_actions.clear(); - KitManager::deleteKit(m_modifiedKit); // Make sure our workingCopy did not get registered somehow: - foreach (const Kit *k, KitManager::kits()) - QTC_CHECK(k->id() != Core::Id(WORKING_COPY_KIT_ID)); + QTC_CHECK(!Utils::contains(KitManager::kits(), + Utils::equal(&Kit::id, Core::Id(WORKING_COPY_KIT_ID)))); } QString KitManagerConfigWidget::displayName() const @@ -151,13 +151,14 @@ void KitManagerConfigWidget::apply() { bool mustSetDefault = m_isDefaultKit; bool mustRegister = false; + auto toRegister = std::make_unique<Kit>(); if (!m_kit) { mustRegister = true; - m_kit = new Kit; + m_kit = toRegister.get(); } - m_kit->copyFrom(m_modifiedKit); //m_isDefaultKit is reset in discard() here. + m_kit->copyFrom(m_modifiedKit.get()); //m_isDefaultKit is reset in discard() here. if (mustRegister) - KitManager::registerKit(m_kit); + KitManager::registerKit(std::move(toRegister)); if (mustSetDefault) KitManager::setDefaultKit(m_kit); @@ -186,7 +187,7 @@ void KitManagerConfigWidget::discard() bool KitManagerConfigWidget::isDirty() const { return !m_kit - || !m_kit->isEqual(m_modifiedKit) + || !m_kit->isEqual(m_modifiedKit.get()) || m_isDefaultKit != (KitManager::defaultKit() == m_kit); } @@ -218,7 +219,7 @@ void KitManagerConfigWidget::addConfigWidget(KitConfigWidget *widget) QString name = widget->displayName(); QString toolTip = widget->toolTip(); - auto action = new QAction(tr("Mark as Mutable"), 0); + auto action = new QAction(tr("Mark as Mutable"), nullptr); action->setCheckable(true); action->setChecked(widget->isMutable()); action->setEnabled(!widget->isSticky()); @@ -272,7 +273,7 @@ void KitManagerConfigWidget::makeStickySubWidgetsReadOnly() Kit *KitManagerConfigWidget::workingCopy() const { - return m_modifiedKit; + return m_modifiedKit.get(); } bool KitManagerConfigWidget::configures(Kit *k) const @@ -340,7 +341,7 @@ void KitManagerConfigWidget::setFileSystemFriendlyName() void KitManagerConfigWidget::workingCopyWasUpdated(Kit *k) { - if (k != m_modifiedKit || m_fixingKit) + if (k != m_modifiedKit.get() || m_fixingKit) return; m_fixingKit = true; diff --git a/src/plugins/projectexplorer/kitmanagerconfigwidget.h b/src/plugins/projectexplorer/kitmanagerconfigwidget.h index 81745e4f9f..026a8e25b4 100644 --- a/src/plugins/projectexplorer/kitmanagerconfigwidget.h +++ b/src/plugins/projectexplorer/kitmanagerconfigwidget.h @@ -29,6 +29,8 @@ #include <QWidget> +#include <memory> + QT_BEGIN_NAMESPACE class QGridLayout; class QLabel; @@ -98,7 +100,7 @@ private: QList<KitConfigWidget *> m_widgets; QList<QLabel *> m_labels; Kit *m_kit; - Kit *m_modifiedKit; + std::unique_ptr<Kit> m_modifiedKit; bool m_isDefaultKit = false; bool m_fixingKit = false; bool m_hasUniqueName = true; diff --git a/src/plugins/projectexplorer/kitmodel.cpp b/src/plugins/projectexplorer/kitmodel.cpp index 43205858c9..cc35e243ef 100644 --- a/src/plugins/projectexplorer/kitmodel.cpp +++ b/src/plugins/projectexplorer/kitmodel.cpp @@ -54,12 +54,12 @@ public: } } - ~KitNode() + ~KitNode() override { delete widget; } - QVariant data(int, int role) const + QVariant data(int, int role) const override { if (widget) { if (role == Qt::FontRole) { @@ -132,7 +132,7 @@ KitModel::KitModel(QBoxLayout *parentLayout, QObject *parent) Kit *KitModel::kit(const QModelIndex &index) { KitNode *n = kitNode(index); - return n ? n->widget->workingCopy() : 0; + return n ? n->widget->workingCopy() : nullptr; } KitNode *KitModel::kitNode(const QModelIndex &index) @@ -161,7 +161,7 @@ bool KitModel::isDefaultKit(Kit *k) const KitManagerConfigWidget *KitModel::widget(const QModelIndex &index) { KitNode *n = kitNode(index); - return n ? n->widget : 0; + return n ? n->widget : nullptr; } void KitModel::isAutoDetectedChanged() @@ -244,7 +244,7 @@ void KitModel::markForRemoval(Kit *k) setDefaultNode(findItemAtLevel<2>([node](KitNode *kn) { return kn != node; })); takeItem(node); - if (node->widget->configures(0)) + if (node->widget->configures(nullptr)) delete node; else m_toRemoveList.append(node); @@ -252,7 +252,7 @@ void KitModel::markForRemoval(Kit *k) Kit *KitModel::markForAddition(Kit *baseKit) { - KitNode *node = createNode(0); + KitNode *node = createNode(nullptr); m_manualRoot->appendChild(node); Kit *k = node->widget->workingCopy(); KitGuard g(k); @@ -331,7 +331,7 @@ void KitModel::removeKit(Kit *k) if (n->widget->configures(k)) { m_toRemoveList.removeOne(n); if (m_defaultNode == n) - m_defaultNode = 0; + m_defaultNode = nullptr; delete n; return; } diff --git a/src/plugins/projectexplorer/kitoptionspage.cpp b/src/plugins/projectexplorer/kitoptionspage.cpp index 24535eb57c..262d6c2706 100644 --- a/src/plugins/projectexplorer/kitoptionspage.cpp +++ b/src/plugins/projectexplorer/kitoptionspage.cpp @@ -157,7 +157,7 @@ void KitOptionsPageWidget::kitSelectionChanged() void KitOptionsPageWidget::addNewKit() { - Kit *k = m_model->markForAddition(0); + Kit *k = m_model->markForAddition(nullptr); QModelIndex newIdx = m_model->indexOf(k); m_selectionModel->select(newIdx, diff --git a/src/plugins/projectexplorer/makestep.cpp b/src/plugins/projectexplorer/makestep.cpp new file mode 100644 index 0000000000..4473c1b5e8 --- /dev/null +++ b/src/plugins/projectexplorer/makestep.cpp @@ -0,0 +1,492 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "makestep.h" +#include "ui_makestep.h" + +#include "buildconfiguration.h" +#include "gnumakeparser.h" +#include "kitinformation.h" +#include "project.h" +#include "projectexplorer.h" +#include "projectexplorerconstants.h" +#include "target.h" +#include "toolchain.h" + +#include <coreplugin/id.h> +#include <coreplugin/variablechooser.h> +#include <utils/hostosinfo.h> +#include <utils/qtcprocess.h> +#include <utils/utilsicons.h> + +#include <QThread> + +using namespace Core; + +const char BUILD_TARGETS_SUFFIX[] = ".BuildTargets"; +const char MAKE_ARGUMENTS_SUFFIX[] = ".MakeArguments"; +const char MAKE_COMMAND_SUFFIX[] = ".MakeCommand"; +const char CLEAN_SUFFIX[] = ".Clean"; +const char OVERRIDE_MAKEFLAGS_SUFFIX[] = ".OverrideMakeflags"; +const char JOBCOUNT_SUFFIX[] = ".JobCount"; + +const char MAKEFLAGS[] = "MAKEFLAGS"; + +namespace ProjectExplorer { + +MakeStep::MakeStep(BuildStepList *parent, + Core::Id id, + const QString &buildTarget, + const QStringList &availableTargets) + : AbstractProcessStep(parent, id), + m_availableTargets(availableTargets), + m_userJobCount(defaultJobCount()) +{ + setDefaultDisplayName(defaultDisplayName()); + if (!buildTarget.isEmpty()) + setBuildTarget(buildTarget, true); +} + +bool MakeStep::init(QList<const BuildStep *> &earlierSteps) +{ + BuildConfiguration *bc = buildConfiguration(); + if (!bc) + emit addTask(Task::buildConfigurationMissingTask()); + + const QString make = effectiveMakeCommand(); + if (make.isEmpty()) + emit addTask(makeCommandMissingTask()); + + if (!bc || make.isEmpty()) { + emitFaultyConfigurationMessage(); + return false; + } + + ProcessParameters *pp = processParameters(); + pp->setMacroExpander(bc->macroExpander()); + pp->setWorkingDirectory(bc->buildDirectory().toString()); + pp->setEnvironment(environment(bc)); + pp->setCommand(make); + pp->setArguments(allArguments()); + pp->resolveAll(); + + // If we are cleaning, then make can fail with an error code, but that doesn't mean + // we should stop the clean queue + // That is mostly so that rebuild works on an already clean project + setIgnoreReturnValue(isClean()); + + setOutputParser(new GnuMakeParser()); + IOutputParser *parser = target()->kit()->createOutputParser(); + if (parser) + appendOutputParser(parser); + outputParser()->setWorkingDirectory(pp->effectiveWorkingDirectory()); + + return AbstractProcessStep::init(earlierSteps); +} + +void MakeStep::setClean(bool clean) +{ + m_clean = clean; +} + +bool MakeStep::isClean() const +{ + return m_clean; +} + +QString MakeStep::defaultDisplayName() +{ + return tr("Make"); +} + +static const QList<ToolChain *> preferredToolChains(const Kit *kit) +{ + QList<ToolChain *> tcs = ToolChainKitInformation::toolChains(kit); + // prefer CXX, then C, then others + Utils::sort(tcs, [](ToolChain *tcA, ToolChain *tcB) { + if (tcA->language() == tcB->language()) + return false; + if (tcA->language() == Constants::CXX_LANGUAGE_ID) + return true; + if (tcB->language() == Constants::CXX_LANGUAGE_ID) + return false; + if (tcA->language() == Constants::C_LANGUAGE_ID) + return true; + return false; + }); + return tcs; +} + +QString MakeStep::defaultMakeCommand() const +{ + BuildConfiguration *bc = buildConfiguration(); + if (!bc) + return QString(); + const Utils::Environment env = environment(bc); + for (const ToolChain *tc : preferredToolChains(target()->kit())) { + const QString make = tc->makeCommand(env); + if (!make.isEmpty()) + return make; + } + return QString(); +} + +QString MakeStep::msgNoMakeCommand() +{ + return tr("Make command missing. Specify Make command in step configuration."); +} + +Task MakeStep::makeCommandMissingTask() +{ + return Task(Task::Error, + msgNoMakeCommand(), + Utils::FileName(), + -1, + Constants::TASK_CATEGORY_BUILDSYSTEM); +} + +bool MakeStep::isJobCountSupported() const +{ + const QList<ToolChain *> tcs = preferredToolChains(target()->kit()); + const ToolChain *tc = tcs.isEmpty() ? nullptr : tcs.constFirst(); + return tc + && (tc->targetAbi().os() != Abi::WindowsOS + || tc->targetAbi().osFlavor() == Abi::WindowsMSysFlavor); +} + +int MakeStep::jobCount() const +{ + return m_userJobCount; +} + +void MakeStep::setJobCount(int count) +{ + m_userJobCount = count; +} + +bool MakeStep::jobCountOverridesMakeflags() const +{ + return m_overrideMakeflags; +} + +void MakeStep::setJobCountOverrideMakeflags(bool override) +{ + m_overrideMakeflags = override; +} + +bool MakeStep::makeflagsContainsJobCount() const +{ + const Utils::Environment env = environment(buildConfiguration()); + if (!env.hasKey(MAKEFLAGS)) + return false; + const QStringList args = Utils::QtcProcess::splitArgs(env.value(MAKEFLAGS), + Utils::HostOsInfo::hostOs()); + return Utils::anyOf(args, [](const QString &arg) { return arg.startsWith("-j"); }); +} + +Utils::Environment MakeStep::environment(BuildConfiguration *bc) const +{ + Utils::Environment env = bc ? bc->environment() : Utils::Environment::systemEnvironment(); + Utils::Environment::setupEnglishOutput(&env); + if (makeCommand().isEmpty()) { + // We also prepend "L" to the MAKEFLAGS, so that nmake / jom are less verbose + const QList<ToolChain *> tcs = preferredToolChains(target()->kit()); + const ToolChain *tc = tcs.isEmpty() ? nullptr : tcs.constFirst(); + if (tc && tc->targetAbi().os() == Abi::WindowsOS + && tc->targetAbi().osFlavor() != Abi::WindowsMSysFlavor) { + env.set(MAKEFLAGS, 'L' + env.value(MAKEFLAGS)); + } + } + return env; +} + +void MakeStep::setMakeCommand(const QString &command) +{ + m_makeCommand = command; +} + +QVariantMap MakeStep::toMap() const +{ + QVariantMap map(AbstractProcessStep::toMap()); + + map.insert(id().withSuffix(BUILD_TARGETS_SUFFIX).toString(), m_buildTargets); + map.insert(id().withSuffix(MAKE_ARGUMENTS_SUFFIX).toString(), m_makeArguments); + map.insert(id().withSuffix(MAKE_COMMAND_SUFFIX).toString(), m_makeCommand); + map.insert(id().withSuffix(CLEAN_SUFFIX).toString(), m_clean); + const QString jobCountKey = id().withSuffix(JOBCOUNT_SUFFIX).toString(); + if (m_userJobCount != defaultJobCount()) + map.insert(jobCountKey, m_userJobCount); + else + map.remove(jobCountKey); + map.insert(id().withSuffix(OVERRIDE_MAKEFLAGS_SUFFIX).toString(), m_overrideMakeflags); + return map; +} + +bool MakeStep::fromMap(const QVariantMap &map) +{ + m_buildTargets = map.value(id().withSuffix(BUILD_TARGETS_SUFFIX).toString()).toStringList(); + m_makeArguments = map.value(id().withSuffix(MAKE_ARGUMENTS_SUFFIX).toString()).toString(); + m_makeCommand = map.value(id().withSuffix(MAKE_COMMAND_SUFFIX).toString()).toString(); + m_clean = map.value(id().withSuffix(CLEAN_SUFFIX).toString()).toBool(); + m_overrideMakeflags = map.value(id().withSuffix(OVERRIDE_MAKEFLAGS_SUFFIX).toString(), false).toBool(); + m_userJobCount = map.value(id().withSuffix(JOBCOUNT_SUFFIX).toString(), defaultJobCount()).toInt(); + return BuildStep::fromMap(map); +} + +int MakeStep::defaultJobCount() +{ + return QThread::idealThreadCount(); +} + +QStringList MakeStep::jobArguments() const +{ + if (!isJobCountSupported() || (makeflagsContainsJobCount() && !jobCountOverridesMakeflags())) + return {}; + return {"-j" + QString::number(m_userJobCount)}; +} + +QString MakeStep::allArguments() const +{ + QString args = m_makeArguments; + Utils::QtcProcess::addArgs(&args, jobArguments() + m_buildTargets); + return args; +} + +QString MakeStep::userArguments() const +{ + return m_makeArguments; +} + +void MakeStep::setUserArguments(const QString &args) +{ + m_makeArguments = args; +} + +QString MakeStep::makeCommand() const +{ + return m_makeCommand; +} + +QString MakeStep::effectiveMakeCommand() const +{ + if (!m_makeCommand.isEmpty()) + return m_makeCommand; + return defaultMakeCommand(); +} + +BuildStepConfigWidget *MakeStep::createConfigWidget() +{ + return new MakeStepConfigWidget(this); +} + +bool MakeStep::immutable() const +{ + return false; +} + +bool MakeStep::buildsTarget(const QString &target) const +{ + return m_buildTargets.contains(target); +} + +void MakeStep::setBuildTarget(const QString &target, bool on) +{ + QStringList old = m_buildTargets; + if (on && !old.contains(target)) + old << target; + else if (!on && old.contains(target)) + old.removeOne(target); + + m_buildTargets = old; +} + +QStringList MakeStep::availableTargets() const +{ + return m_availableTargets; +} + +// +// GenericMakeStepConfigWidget +// + +MakeStepConfigWidget::MakeStepConfigWidget(MakeStep *makeStep) : + m_makeStep(makeStep) +{ + m_ui = new Internal::Ui::MakeStep; + m_ui->setupUi(this); + + const auto availableTargets = makeStep->availableTargets(); + for (const QString &target : availableTargets) { + auto item = new QListWidgetItem(target, m_ui->targetsList); + item->setFlags(item->flags() | Qt::ItemIsUserCheckable); + item->setCheckState(m_makeStep->buildsTarget(item->text()) ? Qt::Checked : Qt::Unchecked); + } + if (availableTargets.isEmpty()) { + m_ui->targetsLabel->hide(); + m_ui->targetsList->hide(); + } + + m_ui->makeLineEdit->setExpectedKind(Utils::PathChooser::ExistingCommand); + m_ui->makeLineEdit->setBaseDirectory(Utils::PathChooser::homePath()); + m_ui->makeLineEdit->setHistoryCompleter("PE.MakeCommand.History"); + m_ui->makeLineEdit->setPath(m_makeStep->makeCommand()); + m_ui->makeArgumentsLineEdit->setText(m_makeStep->userArguments()); + m_ui->nonOverrideWarning->setToolTip("<html><body><p>" + + tr("<code>MAKEFLAGS</code> specifies parallel jobs. Check \"%1\" to override.") + .arg(m_ui->overrideMakeflags->text()) + "</p></body></html>"); + m_ui->nonOverrideWarning->setPixmap(Utils::Icons::WARNING.pixmap()); + updateDetails(); + + connect(m_ui->targetsList, &QListWidget::itemChanged, + this, &MakeStepConfigWidget::itemChanged); + connect(m_ui->makeLineEdit, &Utils::PathChooser::rawPathChanged, + this, &MakeStepConfigWidget::makeLineEditTextEdited); + connect(m_ui->makeArgumentsLineEdit, &QLineEdit::textEdited, + this, &MakeStepConfigWidget::makeArgumentsLineEditTextEdited); + connect(m_ui->userJobCount, QOverload<int>::of(&QSpinBox::valueChanged), this, [this](int value) { + m_makeStep->setJobCount(value); + updateDetails(); + }); + connect(m_ui->overrideMakeflags, &QCheckBox::stateChanged, this, [this](int state) { + m_makeStep->setJobCountOverrideMakeflags(state == Qt::Checked); + updateDetails(); + }); + + connect(ProjectExplorerPlugin::instance(), &ProjectExplorerPlugin::settingsChanged, + this, &MakeStepConfigWidget::updateDetails); + + connect(m_makeStep->target(), &Target::kitChanged, + this, &MakeStepConfigWidget::updateDetails); + + const auto pro = m_makeStep->target()->project(); + pro->subscribeSignal(&BuildConfiguration::environmentChanged, this, [this]() { + if (static_cast<BuildConfiguration *>(sender())->isActive()) { + updateDetails(); + } + }); + pro->subscribeSignal(&BuildConfiguration::buildDirectoryChanged, this, [this]() { + if (static_cast<BuildConfiguration *>(sender())->isActive()) { + updateDetails(); + } + }); + connect(pro, &Project::activeProjectConfigurationChanged, + this, [this](ProjectConfiguration *pc) { + if (pc && pc->isActive()) { + updateDetails(); + } + }); + + Core::VariableChooser::addSupportForChildWidgets(this, m_makeStep->macroExpander()); +} + +MakeStepConfigWidget::~MakeStepConfigWidget() +{ + delete m_ui; +} + +QString MakeStepConfigWidget::displayName() const +{ + return m_makeStep->displayName(); +} + +void MakeStepConfigWidget::setSummaryText(const QString &text) +{ + if (text == m_summaryText) + return; + m_summaryText = text; + emit updateSummary(); +} + +void MakeStepConfigWidget::setUserJobCountVisible(bool visible) +{ + m_ui->jobsLabel->setVisible(visible); + m_ui->userJobCount->setVisible(visible); + m_ui->overrideMakeflags->setVisible(visible); +} + +void MakeStepConfigWidget::updateDetails() +{ + BuildConfiguration *bc = m_makeStep->buildConfiguration(); + + const QString defaultMake = m_makeStep->defaultMakeCommand(); + if (defaultMake.isEmpty()) + m_ui->makeLabel->setText(tr("Make:")); + else + m_ui->makeLabel->setText(tr("Override %1:").arg(QDir::toNativeSeparators(defaultMake))); + + if (m_makeStep->effectiveMakeCommand().isEmpty()) { + setSummaryText(tr("<b>Make:</b> %1").arg(MakeStep::msgNoMakeCommand())); + return; + } + if (!bc) { + setSummaryText(tr("<b>Make:</b> No build configuration.")); + return; + } + + setUserJobCountVisible(m_makeStep->isJobCountSupported()); + m_ui->userJobCount->setValue(m_makeStep->jobCount()); + m_ui->overrideMakeflags->setCheckState( + m_makeStep->jobCountOverridesMakeflags() ? Qt::Checked : Qt::Unchecked); + m_ui->nonOverrideWarning->setVisible(m_makeStep->makeflagsContainsJobCount() + && !m_makeStep->jobCountOverridesMakeflags()); + + ProcessParameters param; + param.setMacroExpander(bc->macroExpander()); + param.setWorkingDirectory(bc->buildDirectory().toString()); + param.setCommand(m_makeStep->effectiveMakeCommand()); + + param.setArguments(m_makeStep->allArguments()); + param.setEnvironment(m_makeStep->environment(bc)); + + if (param.commandMissing()) + setSummaryText(tr("<b>Make:</b> %1 not found in the environment.").arg(param.command())); // Override display text + else + setSummaryText(param.summaryInWorkdir(displayName())); +} + +QString MakeStepConfigWidget::summaryText() const +{ + return m_summaryText; +} + +void MakeStepConfigWidget::itemChanged(QListWidgetItem *item) +{ + m_makeStep->setBuildTarget(item->text(), item->checkState() & Qt::Checked); + updateDetails(); +} + +void MakeStepConfigWidget::makeLineEditTextEdited() +{ + m_makeStep->setMakeCommand(m_ui->makeLineEdit->rawPath()); + updateDetails(); +} + +void MakeStepConfigWidget::makeArgumentsLineEditTextEdited() +{ + m_makeStep->setUserArguments(m_ui->makeArgumentsLineEdit->text()); + updateDetails(); +} + +} // namespace GenericProjectManager diff --git a/src/plugins/projectexplorer/makestep.h b/src/plugins/projectexplorer/makestep.h new file mode 100644 index 0000000000..8bc1e3f9fb --- /dev/null +++ b/src/plugins/projectexplorer/makestep.h @@ -0,0 +1,119 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include "abstractprocessstep.h" +#include "projectexplorer_global.h" + +QT_FORWARD_DECLARE_CLASS(QListWidgetItem); + +namespace ProjectExplorer { + +namespace Internal { +namespace Ui { class MakeStep; } +} // namespace Internal + +class PROJECTEXPLORER_EXPORT MakeStep : public ProjectExplorer::AbstractProcessStep +{ + Q_OBJECT + +public: + explicit MakeStep(ProjectExplorer::BuildStepList *parent, + Core::Id id, + const QString &buildTarget = QString(), + const QStringList &availableTargets = {}); + + bool init(QList<const BuildStep *> &earlierSteps) override; + ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override; + bool immutable() const override; + bool buildsTarget(const QString &target) const; + void setBuildTarget(const QString &target, bool on); + QStringList availableTargets() const; + QString allArguments() const; + QString userArguments() const; + void setUserArguments(const QString &args); + QString makeCommand() const; + void setMakeCommand(const QString &command); + QString effectiveMakeCommand() const; + + void setClean(bool clean); + bool isClean() const; + + static QString defaultDisplayName(); + + QString defaultMakeCommand() const; + static QString msgNoMakeCommand(); + static Task makeCommandMissingTask(); + + bool isJobCountSupported() const; + int jobCount() const; + void setJobCount(int count); + bool jobCountOverridesMakeflags() const; + void setJobCountOverrideMakeflags(bool override); + bool makeflagsContainsJobCount() const; + + Utils::Environment environment(BuildConfiguration *bc) const; + +private: + QVariantMap toMap() const override; + bool fromMap(const QVariantMap &map) override; + static int defaultJobCount(); + QStringList jobArguments() const; + + QStringList m_buildTargets; + QStringList m_availableTargets; + QString m_makeArguments; + QString m_makeCommand; + int m_userJobCount = 4; + bool m_overrideMakeflags = false; + bool m_clean = false; +}; + +class PROJECTEXPLORER_EXPORT MakeStepConfigWidget : public ProjectExplorer::BuildStepConfigWidget +{ + Q_OBJECT + +public: + explicit MakeStepConfigWidget(MakeStep *makeStep); + ~MakeStepConfigWidget() override; + + QString displayName() const override; + QString summaryText() const override; + +private: + void itemChanged(QListWidgetItem *item); + void makeLineEditTextEdited(); + void makeArgumentsLineEditTextEdited(); + void updateDetails(); + void setSummaryText(const QString &text); + void setUserJobCountVisible(bool visible); + + Internal::Ui::MakeStep *m_ui; + MakeStep *m_makeStep; + QString m_summaryText; +}; + +} // namespace GenericProjectManager diff --git a/src/plugins/projectexplorer/makestep.ui b/src/plugins/projectexplorer/makestep.ui new file mode 100644 index 0000000000..e4caaae994 --- /dev/null +++ b/src/plugins/projectexplorer/makestep.ui @@ -0,0 +1,119 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ProjectExplorer::Internal::MakeStep</class> + <widget class="QWidget" name="ProjectExplorer::Internal::MakeStep"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>399</width> + <height>279</height> + </rect> + </property> + <layout class="QFormLayout" name="formLayout"> + <property name="fieldGrowthPolicy"> + <enum>QFormLayout::ExpandingFieldsGrow</enum> + </property> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item row="0" column="0"> + <widget class="QLabel" name="makeLabel"> + <property name="text"> + <string>Override %1:</string> + </property> + <property name="buddy"> + <cstring>makeLineEdit</cstring> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="Utils::PathChooser" name="makeLineEdit" native="true"/> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="makeArgumentsLabel"> + <property name="text"> + <string>Make arguments:</string> + </property> + <property name="buddy"> + <cstring>makeArgumentsLineEdit</cstring> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLineEdit" name="makeArgumentsLineEdit"/> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="jobsLabel"> + <property name="text"> + <string>Parallel jobs:</string> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="targetsLabel"> + <property name="text"> + <string>Targets:</string> + </property> + <property name="buddy"> + <cstring>targetsList</cstring> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QListWidget" name="targetsList"/> + </item> + <item row="2" column="1"> + <layout class="QHBoxLayout" name="jobLayout"> + <item> + <widget class="QSpinBox" name="userJobCount"> + <property name="minimum"> + <number>1</number> + </property> + <property name="value"> + <number>4</number> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="overrideMakeflags"> + <property name="text"> + <string>Override MAKEFLAGS</string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="nonOverrideWarning"> + <property name="text"> + <string/> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <customwidgets> + <customwidget> + <class>Utils::PathChooser</class> + <extends>QWidget</extends> + <header location="global">utils/pathchooser.h</header> + <container>1</container> + <slots> + <signal>editingFinished()</signal> + <signal>browsingFinished()</signal> + </slots> + </customwidget> + </customwidgets> + <resources/> + <connections/> +</ui> diff --git a/src/plugins/projectexplorer/miniprojecttargetselector.cpp b/src/plugins/projectexplorer/miniprojecttargetselector.cpp index 438fed2834..adc7ad7125 100644 --- a/src/plugins/projectexplorer/miniprojecttargetselector.cpp +++ b/src/plugins/projectexplorer/miniprojecttargetselector.cpp @@ -66,7 +66,7 @@ static QIcon createCenteredIcon(const QIcon &icon, const QIcon &overlay) { QPixmap targetPixmap; const qreal appDevicePixelRatio = qApp->devicePixelRatio(); - const int deviceSpaceIconSize = static_cast<int>(Core::Constants::MODEBAR_ICON_SIZE * appDevicePixelRatio); + const auto deviceSpaceIconSize = static_cast<int>(Core::Constants::MODEBAR_ICON_SIZE * appDevicePixelRatio); targetPixmap = QPixmap(deviceSpaceIconSize, deviceSpaceIconSize); targetPixmap.setDevicePixelRatio(appDevicePixelRatio); targetPixmap.fill(Qt::transparent); @@ -107,10 +107,10 @@ class TargetSelectorDelegate : public QItemDelegate public: TargetSelectorDelegate(ListWidget *parent) : QItemDelegate(parent), m_listWidget(parent) { } private: - QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; + QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override; void paint(QPainter *painter, const QStyleOptionViewItem &option, - const QModelIndex &index) const; + const QModelIndex &index) const override; ListWidget *m_listWidget; }; @@ -227,8 +227,8 @@ void ListWidget::setOptimalWidth(int width) int ListWidget::padding() { // there needs to be enough extra pixels to show a scrollbar - return 2 * style()->pixelMetric(QStyle::PM_FocusFrameHMargin, 0, this) - + style()->pixelMetric(QStyle::PM_ScrollBarExtent, 0, this) + return 2 * style()->pixelMetric(QStyle::PM_FocusFrameHMargin, nullptr, this) + + style()->pixelMetric(QStyle::PM_ScrollBarExtent, nullptr, this) + 10; } @@ -272,7 +272,7 @@ void ProjectListWidget::addProject(Project *project) int pos = count(); for (int i = 0; i < count(); ++i) { - Project *p = item(i)->data(Qt::UserRole).value<Project*>(); + auto *p = item(i)->data(Qt::UserRole).value<Project*>(); if (projectLesserThan(project, p)) { pos = i; break; @@ -281,7 +281,7 @@ void ProjectListWidget::addProject(Project *project) bool useFullName = false; for (int i = 0; i < count(); ++i) { - Project *p = item(i)->data(Qt::UserRole).value<Project*>(); + auto *p = item(i)->data(Qt::UserRole).value<Project*>(); if (p->displayName() == project->displayName()) { useFullName = true; item(i)->setText(fullName(p)); @@ -289,7 +289,7 @@ void ProjectListWidget::addProject(Project *project) } QString displayName = useFullName ? fullName(project) : project->displayName(); - QListWidgetItem *item = new QListWidgetItem(); + auto *item = new QListWidgetItem(); item->setData(Qt::UserRole, QVariant::fromValue(project)); item->setText(displayName); insertItem(pos, item); @@ -317,14 +317,14 @@ void ProjectListWidget::removeProject(Project *project) int countDisplayName = 0; int otherIndex = -1; for (int i = 0; i < count(); ++i) { - Project *p = item(i)->data(Qt::UserRole).value<Project *>(); + auto *p = item(i)->data(Qt::UserRole).value<Project *>(); if (p->displayName() == name) { ++countDisplayName; otherIndex = i; } } if (countDisplayName == 1) { - Project *p = item(otherIndex)->data(Qt::UserRole).value<Project *>(); + auto *p = item(otherIndex)->data(Qt::UserRole).value<Project *>(); item(otherIndex)->setText(p->displayName()); } @@ -346,7 +346,7 @@ void ProjectListWidget::projectDisplayNameChanged(Project *project) int oldPos = 0; bool useFullName = false; for (int i = 0; i < count(); ++i) { - Project *p = item(i)->data(Qt::UserRole).value<Project*>(); + auto *p = item(i)->data(Qt::UserRole).value<Project*>(); if (p == project) { oldPos = i; } else if (p->displayName() == project->displayName()) { @@ -360,7 +360,7 @@ void ProjectListWidget::projectDisplayNameChanged(Project *project) int pos = count(); for (int i = 0; i < count(); ++i) { - Project *p = item(i)->data(Qt::UserRole).value<Project*>(); + auto *p = item(i)->data(Qt::UserRole).value<Project*>(); if (projectLesserThan(project, p)) { pos = i; break; @@ -389,7 +389,7 @@ void ProjectListWidget::setProject(int index) return; if (index < 0) return; - Project *p = item(index)->data(Qt::UserRole).value<Project *>(); + auto *p = item(index)->data(Qt::UserRole).value<Project *>(); SessionManager::setStartupProject(p); } @@ -415,7 +415,7 @@ void GenericListWidget::setProjectConfigurations(const QList<ProjectConfiguratio clear(); for (int i = 0; i < count(); ++i) { - ProjectConfiguration *p = item(i)->data(Qt::UserRole).value<ProjectConfiguration *>(); + auto *p = item(i)->data(Qt::UserRole).value<ProjectConfiguration *>(); disconnect(p, &ProjectConfiguration::displayNameChanged, this, &GenericListWidget::displayNameChanged); } @@ -450,7 +450,7 @@ void GenericListWidget::addProjectConfiguration(ProjectConfiguration *pc) // Figure out pos int pos = count(); for (int i = 0; i < count(); ++i) { - ProjectConfiguration *p = item(i)->data(Qt::UserRole).value<ProjectConfiguration *>(); + auto *p = item(i)->data(Qt::UserRole).value<ProjectConfiguration *>(); if (caseFriendlyCompare(pc->displayName(), p->displayName()) < 0) { pos = i; break; @@ -480,7 +480,7 @@ void GenericListWidget::removeProjectConfiguration(ProjectConfiguration *pc) QFontMetrics fn(font()); int width = 0; for (int i = 0; i < count(); ++i) { - ProjectConfiguration *p = item(i)->data(Qt::UserRole).value<ProjectConfiguration *>(); + auto *p = item(i)->data(Qt::UserRole).value<ProjectConfiguration *>(); width = qMax(width, fn.width(p->displayName()) + padding()); } setOptimalWidth(width); @@ -504,7 +504,7 @@ void GenericListWidget::displayNameChanged() if (currentItem()) activeProjectConfiguration = currentItem()->data(Qt::UserRole).value<ProjectConfiguration *>(); - ProjectConfiguration *pc = qobject_cast<ProjectConfiguration *>(sender()); + auto *pc = qobject_cast<ProjectConfiguration *>(sender()); int index = -1; int i = 0; for (; i < count(); ++i) { @@ -520,7 +520,7 @@ void GenericListWidget::displayNameChanged() lwi->setText(pc->displayName()); int pos = count(); for (int i = 0; i < count(); ++i) { - ProjectConfiguration *p = item(i)->data(Qt::UserRole).value<ProjectConfiguration *>(); + auto *p = item(i)->data(Qt::UserRole).value<ProjectConfiguration *>(); if (caseFriendlyCompare(pc->displayName(), p->displayName()) < 0) { pos = i; break; @@ -533,7 +533,7 @@ void GenericListWidget::displayNameChanged() QFontMetrics fn(font()); int width = 0; for (int i = 0; i < count(); ++i) { - ProjectConfiguration *p = item(i)->data(Qt::UserRole).value<ProjectConfiguration *>(); + auto *p = item(i)->data(Qt::UserRole).value<ProjectConfiguration *>(); width = qMax(width, fn.width(p->displayName()) + padding()); } setOptimalWidth(width); @@ -543,7 +543,7 @@ void GenericListWidget::displayNameChanged() void GenericListWidget::toolTipChanged() { - ProjectConfiguration *pc = qobject_cast<ProjectConfiguration *>(sender()); + auto *pc = qobject_cast<ProjectConfiguration *>(sender()); if (QListWidgetItem *lwi = itemForProjectConfiguration(pc)) { lwi->setData(Qt::ToolTipRole, pc->toolTip()); lwi->setData(Qt::UserRole + 1, pc->toolTip()); @@ -646,9 +646,9 @@ void KitAreaWidget::updateKit(Kit *k) QWidget *MiniProjectTargetSelector::createTitleLabel(const QString &text) { - StyledBar *bar = new StyledBar(this); + auto *bar = new StyledBar(this); bar->setSingleRow(true); - QVBoxLayout *toolLayout = new QVBoxLayout(bar); + auto *toolLayout = new QVBoxLayout(bar); toolLayout->setContentsMargins(6, 0, 6, 0); toolLayout->setSpacing(0); @@ -864,7 +864,7 @@ void MiniProjectTargetSelector::doLayout(bool keepSize) // if there's a configured project in the seesion // that could be improved static QStatusBar *statusBar = Core::ICore::statusBar(); - static QWidget *actionBar = Core::ICore::mainWindow()->findChild<QWidget*>(QLatin1String("actionbar")); + static auto *actionBar = Core::ICore::mainWindow()->findChild<QWidget*>(QLatin1String("actionbar")); Q_ASSERT(actionBar); m_kitAreaWidget->move(0, 0); @@ -1407,7 +1407,7 @@ void MiniProjectTargetSelector::nextOrShow() } else { m_hideOnRelease = true; m_earliestHidetime = QDateTime::currentDateTime().addMSecs(800); - if (ListWidget *lw = qobject_cast<ListWidget *>(focusWidget())) { + if (auto *lw = qobject_cast<ListWidget *>(focusWidget())) { if (lw->currentRow() < lw->count() -1) lw->setCurrentRow(lw->currentRow() + 1); else diff --git a/src/plugins/projectexplorer/msvctoolchain.cpp b/src/plugins/projectexplorer/msvctoolchain.cpp index 8ed356a324..9a68a59689 100644 --- a/src/plugins/projectexplorer/msvctoolchain.cpp +++ b/src/plugins/projectexplorer/msvctoolchain.cpp @@ -31,6 +31,8 @@ #include "taskhub.h" #include "toolchainmanager.h" +#include <coreplugin/icore.h> + #include <utils/algorithm.h> #include <utils/hostosinfo.h> #include <utils/optional.h> @@ -38,6 +40,7 @@ #include <utils/synchronousprocess.h> #include <utils/runextensions.h> #include <utils/temporarydirectory.h> +#include <utils/pathchooser.h> #include <utils/winutils.h> #include <QDir> @@ -96,6 +99,8 @@ const MsvcPlatform platforms[] = {MsvcToolChain::amd64_x86, "amd64_x86", "/bin/amd64_x86", "vcvarsamd64_x86.bat"} }; +static QList<const MsvcToolChain *> g_availableMsvcToolchains; + static const MsvcPlatform *platformEntry(MsvcToolChain::Platform t) { for (const MsvcPlatform &p : platforms) { @@ -397,10 +402,10 @@ static QByteArray msvcCompilationFile() "_WIN64", "_WINRT_DLL", "_Wp64", - 0 + nullptr }; QByteArray file = "#define __PPOUT__(x) V##x=x\n\n"; - for (int i = 0; macros[i] != 0; ++i) + for (int i = 0; macros[i] != nullptr; ++i) file += msvcCompilationDefine(macros[i]); file += "\nvoid main(){}\n\n"; return file; @@ -747,7 +752,7 @@ bool MsvcToolChain::fromMap(const QVariantMap &data) m_vcvarsBat = QDir::fromNativeSeparators(data.value(QLatin1String(varsBatKeyC)).toString()); m_varsBatArg = data.value(QLatin1String(varsBatArgKeyC)).toString(); const QString abiString = data.value(QLatin1String(supportedAbiKeyC)).toString(); - m_abi = Abi(abiString); + m_abi = Abi::fromString(abiString); m_environmentModifications = Utils::EnvironmentItem::itemsFromVariantList( data.value(QLatin1String(environModsKeyC)).toList()); @@ -788,7 +793,7 @@ MsvcBasedToolChainConfigWidget::MsvcBasedToolChainConfigWidget(ToolChain *tc) : void MsvcBasedToolChainConfigWidget::setFromMsvcToolChain() { - const MsvcToolChain *tc = static_cast<const MsvcToolChain *>(toolChain()); + const auto *tc = static_cast<const MsvcToolChain *>(toolChain()); QTC_ASSERT(tc, return); m_nameDisplayLabel->setText(tc->displayName()); QString varsBatDisplay = QDir::toNativeSeparators(tc->varsBat()); @@ -816,57 +821,188 @@ MsvcToolChainConfigWidget::MsvcToolChainConfigWidget(ToolChain *tc) : ClangClToolChainConfigWidget::ClangClToolChainConfigWidget(ToolChain *tc) : MsvcBasedToolChainConfigWidget(tc) - , m_llvmDirLabel(new QLabel(this)) { - m_llvmDirLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); - m_mainLayout->addRow(tr("LLVM:"), m_llvmDirLabel); + if (tc->isAutoDetected()) { + m_llvmDirLabel = new QLabel(this); + m_llvmDirLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); + m_mainLayout->addRow(tr("&Compiler path:"), m_llvmDirLabel); + } else { + const QStringList gnuVersionArgs = QStringList("--version"); + m_compilerCommand = new Utils::PathChooser(this); + m_compilerCommand->setExpectedKind(Utils::PathChooser::ExistingCommand); + m_compilerCommand->setCommandVersionArguments(gnuVersionArgs); + m_compilerCommand->setHistoryCompleter("PE.Clang.Command.History"); + m_mainLayout->addRow(tr("&Compiler path:"), m_compilerCommand); + } addErrorLabel(); setFromClangClToolChain(); + + if (m_compilerCommand) { + connect(m_compilerCommand, &Utils::PathChooser::rawPathChanged, + this, &ClangClToolChainConfigWidget::dirty); + } } void ClangClToolChainConfigWidget::setFromClangClToolChain() { setFromMsvcToolChain(); - const ClangClToolChain *tc = static_cast<const ClangClToolChain *>(toolChain()); - QTC_ASSERT(tc, return); - m_llvmDirLabel->setText(QDir::toNativeSeparators(tc-> llvmDir())); + const auto *clangClToolChain = static_cast<const ClangClToolChain *>(toolChain()); + if (clangClToolChain->isAutoDetected()) + m_llvmDirLabel->setText(QDir::toNativeSeparators(clangClToolChain->clangPath())); + else + m_compilerCommand->setFileName(Utils::FileName::fromString(clangClToolChain->clangPath())); } -// -------------------------------------------------------------------------- -// ClangClToolChain, piggy-backing on MSVC2015 and providing the compiler -// clang-cl.exe as a [to some extent] compatible drop-in replacement for cl. -// -------------------------------------------------------------------------- +static const MsvcToolChain *findMsvcToolChain(unsigned char wordWidth, Abi::OSFlavor flavor) +{ + return Utils::findOrDefault(g_availableMsvcToolchains, + [wordWidth, flavor] (const MsvcToolChain *tc) + { const Abi abi = tc->targetAbi(); + return abi.osFlavor() == flavor + && wordWidth == abi.wordWidth();} ); +} + +static QVersionNumber clangClVersion(const QString& clangClPath) +{ + Utils::SynchronousProcess clangClProcess; + const Utils::SynchronousProcessResponse response = clangClProcess.runBlocking( + clangClPath, {QStringLiteral("--version")}); + if (response.result != Utils::SynchronousProcessResponse::Finished || response.exitCode != 0) + return {}; + const QRegularExpressionMatch match = QRegularExpression( + QStringLiteral("clang version (\\d+(\\.\\d+)+)")).match(response.stdOut()); + if (!match.hasMatch()) + return {}; + return QVersionNumber::fromString(match.captured(1)); +} + +static const MsvcToolChain *selectMsvcToolChain(const QString &clangClPath, + unsigned char wordWidth) +{ + const MsvcToolChain *toolChain = nullptr; + const QVersionNumber version = clangClVersion(clangClPath); + if (version.majorVersion() >= 6) + toolChain = findMsvcToolChain(wordWidth, Abi::WindowsMsvc2017Flavor); + if (!toolChain) { + toolChain = findMsvcToolChain(wordWidth, Abi::WindowsMsvc2015Flavor); + if (!toolChain) + toolChain = findMsvcToolChain(wordWidth, Abi::WindowsMsvc2013Flavor); + } + return toolChain; +} + +static QList<ToolChain *> detectClangClToolChainInPath( + const QString &clangClPath, const QList<ToolChain *> &alreadyKnown, bool isDefault = false) +{ + QList<ToolChain *> res; + const unsigned char wordWidth = Utils::is64BitWindowsBinary(clangClPath) ? 64 : 32; + const MsvcToolChain *toolChain = selectMsvcToolChain(clangClPath, wordWidth); + + if (!toolChain) { + qWarning("Unable to find a suitable MSVC version for \"%s\".", + qPrintable(QDir::toNativeSeparators(clangClPath))); + return res; + } + + Utils::Environment systemEnvironment = Utils::Environment::systemEnvironment(); + const Abi targetAbi = toolChain->targetAbi(); + const QString name = QString("%1LLVM %2 bit based on %3") + .arg(QLatin1String(isDefault ? "Default " : "")) + .arg(wordWidth) + .arg(Abi::toString(targetAbi.osFlavor()).toUpper()); + for (auto language: {Constants::C_LANGUAGE_ID, Constants::CXX_LANGUAGE_ID}) { + ClangClToolChain *tc = static_cast<ClangClToolChain *>( + Utils::findOrDefault( + alreadyKnown, + [&targetAbi, &language, &clangClPath, &systemEnvironment](ToolChain *tc) -> bool { + if (tc->typeId() != Constants::CLANG_CL_TOOLCHAIN_TYPEID) + return false; + if (tc->targetAbi() != targetAbi) + return false; + if (tc->language() != language) + return false; + return systemEnvironment.isSameExecutable(tc->compilerCommand().toString(), clangClPath); + })); + if (!tc) { + tc = new ClangClToolChain(name, clangClPath, language, ToolChain::AutoDetection); + tc->resetMsvcToolChain(toolChain); + } + res << tc; + } + return res; +} static QString compilerFromPath(const QString &path) { return path + "/bin/clang-cl.exe"; } -ClangClToolChain::ClangClToolChain(const QString &name, const QString &llvmDir, - const Abi &abi, - const QString &varsBat, const QString &varsBatArg, Core::Id language, +void ClangClToolChainConfigWidget::applyImpl() +{ + Utils::FileName clangClPath = m_compilerCommand->fileName(); + auto clangClToolChain = static_cast<ClangClToolChain *>(toolChain()); + clangClToolChain->setClangPath(clangClPath.toString()); + + if (clangClPath.fileName() != "clang-cl.exe") { + clangClToolChain->resetMsvcToolChain(); + setFromClangClToolChain(); + return; + } + + QList<ToolChain *> results = detectClangClToolChainInPath(clangClPath.toString(), {}); + + if (results.isEmpty()) { + clangClToolChain->resetMsvcToolChain(); + } else { + for (const ToolChain *toolchain : results) { + if (toolchain->language() == clangClToolChain->language()) { + clangClToolChain->resetMsvcToolChain(static_cast<const MsvcToolChain *>(toolchain)); + break; + } + } + + qDeleteAll(results); + } + setFromClangClToolChain(); +} + +void ClangClToolChainConfigWidget::discardImpl() +{ + setFromClangClToolChain(); +} + +// -------------------------------------------------------------------------- +// ClangClToolChain, piggy-backing on MSVC2015 and providing the compiler +// clang-cl.exe as a [to some extent] compatible drop-in replacement for cl. +// -------------------------------------------------------------------------- + +ClangClToolChain::ClangClToolChain(const QString &name, const QString &clangPath, + Core::Id language, Detection d) - : MsvcToolChain(Constants::CLANG_CL_TOOLCHAIN_TYPEID, name, abi, varsBat, varsBatArg, language, d) - , m_llvmDir(llvmDir) -{ } + : MsvcToolChain(Constants::CLANG_CL_TOOLCHAIN_TYPEID, name, Abi(), "", "", language, d) + , m_clangPath(clangPath) +{ +} ClangClToolChain::ClangClToolChain() : MsvcToolChain(Constants::CLANG_CL_TOOLCHAIN_TYPEID) { } bool ClangClToolChain::isValid() const { - return MsvcToolChain::isValid() && compilerCommand().exists(); + return MsvcToolChain::isValid() && compilerCommand().exists() + && compilerCommand().fileName() == "clang-cl.exe"; } void ClangClToolChain::addToEnvironment(Utils::Environment &env) const { MsvcToolChain::addToEnvironment(env); - env.prependOrSetPath(m_llvmDir + QStringLiteral("/bin")); + QDir path = QFileInfo(m_clangPath).absoluteDir(); // bin folder + env.prependOrSetPath(path.canonicalPath()); } Utils::FileName ClangClToolChain::compilerCommand() const { - return Utils::FileName::fromString(compilerFromPath(m_llvmDir)); + return Utils::FileName::fromString(m_clangPath); } QString ClangClToolChain::typeDisplayName() const @@ -896,7 +1032,7 @@ static inline QString llvmDirKey() { return QStringLiteral("ProjectExplorer.Clan QVariantMap ClangClToolChain::toMap() const { QVariantMap result = MsvcToolChain::toMap(); - result.insert(llvmDirKey(), m_llvmDir); + result.insert(llvmDirKey(), m_clangPath); return result; } @@ -904,10 +1040,11 @@ bool ClangClToolChain::fromMap(const QVariantMap &data) { if (!MsvcToolChain::fromMap(data)) return false; - const QString llvmDir = data.value(llvmDirKey()).toString(); - if (llvmDir.isEmpty()) + const QString clangPath = data.value(llvmDirKey()).toString(); + if (clangPath.isEmpty()) return false; - m_llvmDir = llvmDir; + m_clangPath = clangPath; + return true; } @@ -916,6 +1053,28 @@ ToolChainConfigWidget *ClangClToolChain::configurationWidget() return new ClangClToolChainConfigWidget(this); } +void ClangClToolChain::resetMsvcToolChain(const MsvcToolChain *base) +{ + if (!base) { + m_abi = Abi(); + m_vcvarsBat.clear(); + setVarsBatArg(""); + return; + } + m_abi = base->targetAbi(); + m_vcvarsBat = base->varsBat(); + setVarsBatArg(base->varsBatArg()); +} + +bool ClangClToolChain::operator ==(const ToolChain &other) const +{ + if (!MsvcToolChain::operator ==(other)) + return false; + + const auto *clangClTc = static_cast<const ClangClToolChain *>(&other); + return m_clangPath == clangClTc->m_clangPath; +} + // -------------------------------------------------------------------------- // MsvcToolChainFactory // -------------------------------------------------------------------------- @@ -1009,96 +1168,6 @@ static void detectCppBuildTools2015(QList<ToolChain *> *list) } } -static ToolChain *findMsvcToolChain(const QList<ToolChain *> &list, - unsigned char wordWidth, Abi::OSFlavor flavor) -{ - return Utils::findOrDefault(list, [wordWidth, flavor] (const ToolChain *tc) - { const Abi abi = tc->targetAbi(); - return abi.osFlavor() == flavor - && wordWidth == abi.wordWidth();} ); -} - -static QVersionNumber clangClVersion(const QString& clangClPath) -{ - Utils::SynchronousProcess clangClProcess; - const Utils::SynchronousProcessResponse response = clangClProcess.runBlocking( - clangClPath, {QStringLiteral("--version")}); - if (response.result != Utils::SynchronousProcessResponse::Finished || response.exitCode != 0) - return {}; - const QRegularExpressionMatch match = QRegularExpression( - QStringLiteral("clang version (\\d+(\\.\\d+)+)")).match(response.stdOut()); - if (!match.hasMatch()) - return {}; - return QVersionNumber::fromString(match.captured(1)); -} - -static const ToolChain *selectMsvcToolChain(const QString &clangClPath, - const QList<ToolChain *> &list, - unsigned char wordWidth) -{ - const ToolChain *toolChain = nullptr; - const QVersionNumber version = clangClVersion(clangClPath); - if (version.majorVersion() >= 6) - toolChain = findMsvcToolChain(list, wordWidth, Abi::WindowsMsvc2017Flavor); - if (!toolChain) { - toolChain = findMsvcToolChain(list, wordWidth, Abi::WindowsMsvc2015Flavor); - if (!toolChain) - toolChain = findMsvcToolChain(list, wordWidth, Abi::WindowsMsvc2013Flavor); - } - return toolChain; -} - -static void detectClangClToolChainInPath(const QString &clangClPath, QList<ToolChain *> *list) -{ - const unsigned char wordWidth = Utils::is64BitWindowsBinary(clangClPath) ? 64 : 32; - const ToolChain *toolChain = selectMsvcToolChain(clangClPath, *list, wordWidth); - - QDir path = QFileInfo(clangClPath).absoluteDir(); // bin folder - path.cdUp(); // cd to LLVM root - const QString rootPath = path.canonicalPath(); - - if (!toolChain) { - qWarning("Unable to find a suitable MSVC version for \"%s\".", - qPrintable(QDir::toNativeSeparators(rootPath))); - return; - } - const MsvcToolChain *msvcToolChain = static_cast<const MsvcToolChain *>(toolChain); - const Abi targetAbi = msvcToolChain->targetAbi(); - const QString name = QStringLiteral("LLVM ") + QString::number(wordWidth) - + QStringLiteral("bit based on ") - + Abi::toString(targetAbi.osFlavor()).toUpper(); - for (auto language: {Constants::C_LANGUAGE_ID, Constants::CXX_LANGUAGE_ID}) { - list->append(new ClangClToolChain(name, rootPath, targetAbi, - msvcToolChain->varsBat(), msvcToolChain->varsBatArg(), - language, ToolChain::AutoDetection)); - } -} - -// Detect Clang-cl on top of MSVC2017, MSVC2015 or MSVC2013. -static void detectClangClToolChain(QList<ToolChain *> *list) -{ -#ifdef Q_OS_WIN64 - const char registryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\LLVM\\LLVM"; -#else - const char registryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\LLVM\\LLVM"; -#endif - - const QSettings registry(QLatin1String(registryNode), QSettings::NativeFormat); - if (registry.status() == QSettings::NoError) { - const QString path = QDir::cleanPath(registry.value(QStringLiteral(".")).toString()); - const QString clangClPath = compilerFromPath(path); - if (!path.isEmpty()) { - detectClangClToolChainInPath(path, list); - return; - } - } - - const Utils::Environment systemEnvironment = Utils::Environment::systemEnvironment(); - const Utils::FileName clangClPath = systemEnvironment.searchInPath("clang-cl"); - if (!clangClPath.isEmpty()) - detectClangClToolChainInPath(clangClPath.toString(), list); -} - QList<ToolChain *> MsvcToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown) { QList<ToolChain *> results; @@ -1171,23 +1240,78 @@ QList<ToolChain *> MsvcToolChainFactory::autoDetect(const QList<ToolChain *> &al detectCppBuildTools2015(&results); - detectClangClToolChain(&results); + for (const ToolChain *toolchain : results) + g_availableMsvcToolchains.append(static_cast<const MsvcToolChain *>(toolchain)); + + return results; +} + +ClangClToolChainFactory::ClangClToolChainFactory() +{ + setDisplayName(tr("clang-cl")); +} + +bool ClangClToolChainFactory::canCreate() +{ + return !g_availableMsvcToolchains.isEmpty(); +} + +QList<ToolChain *> ClangClToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown) +{ + Q_UNUSED(alreadyKnown) + +#ifdef Q_OS_WIN64 + const char registryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\LLVM\\LLVM"; +#else + const char registryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\LLVM\\LLVM"; +#endif + + QList<ToolChain *> results; + QList<ToolChain *> known = alreadyKnown; + + QString qtCreatorsClang = Core::ICore::clangExecutable(CLANG_BINDIR); + if (!qtCreatorsClang.isEmpty()) { + qtCreatorsClang = Utils::FileName::fromString(qtCreatorsClang).parentDir() + .appendPath("clang-cl.exe").toString(); + results.append(detectClangClToolChainInPath(qtCreatorsClang, alreadyKnown, true)); + known.append(results); + } + + const QSettings registry(QLatin1String(registryNode), QSettings::NativeFormat); + if (registry.status() == QSettings::NoError) { + const QString path = QDir::cleanPath(registry.value(QStringLiteral(".")).toString()); + const QString clangClPath = compilerFromPath(path); + if (!path.isEmpty()) { + results.append(detectClangClToolChainInPath(clangClPath, known)); + known.append(results); + } + } + + const Utils::Environment systemEnvironment = Utils::Environment::systemEnvironment(); + const Utils::FileName clangClPath = systemEnvironment.searchInPath("clang-cl"); + if (!clangClPath.isEmpty()) + results.append(detectClangClToolChainInPath(clangClPath.toString(), known)); return results; } +ToolChain *ClangClToolChainFactory::create(Core::Id l) +{ + return new ClangClToolChain("clang-cl", "", l, ToolChain::ManualDetection); +} + bool MsvcToolChain::operator ==(const ToolChain &other) const { if (!AbstractMsvcToolChain::operator ==(other)) return false; - const MsvcToolChain *msvcTc = static_cast<const MsvcToolChain *>(&other); + const auto *msvcTc = static_cast<const MsvcToolChain *>(&other); return m_varsBatArg == msvcTc->m_varsBatArg; } bool MsvcToolChainFactory::canRestore(const QVariantMap &data) { const Core::Id id = typeIdFromMap(data); - return id == Constants::MSVC_TOOLCHAIN_TYPEID || id == Constants::CLANG_CL_TOOLCHAIN_TYPEID; + return id == Constants::MSVC_TOOLCHAIN_TYPEID; } template <class ToolChainType> @@ -1202,11 +1326,19 @@ ToolChainType *readFromMap(const QVariantMap &data) ToolChain *MsvcToolChainFactory::restore(const QVariantMap &data) { - const Core::Id id = typeIdFromMap(data); - if (id == Constants::CLANG_CL_TOOLCHAIN_TYPEID) - return readFromMap<ClangClToolChain>(data); return readFromMap<MsvcToolChain>(data); } +bool ClangClToolChainFactory::canRestore(const QVariantMap &data) +{ + const Core::Id id = typeIdFromMap(data); + return id == Constants::CLANG_CL_TOOLCHAIN_TYPEID; +} + +ToolChain *ClangClToolChainFactory::restore(const QVariantMap &data) +{ + return readFromMap<ClangClToolChain>(data); +} + } // namespace Internal } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/msvctoolchain.h b/src/plugins/projectexplorer/msvctoolchain.h index 8cd39af2dc..8510cece09 100644 --- a/src/plugins/projectexplorer/msvctoolchain.h +++ b/src/plugins/projectexplorer/msvctoolchain.h @@ -36,6 +36,8 @@ QT_FORWARD_DECLARE_CLASS(QLabel) QT_FORWARD_DECLARE_CLASS(QVersionNumber) +namespace Utils { class PathChooser; } + namespace ProjectExplorer { namespace Internal { @@ -76,6 +78,7 @@ public: ToolChain *clone() const override; QString varsBatArg() const { return m_varsBatArg; } + void setVarsBatArg(const QString &varsBA) { m_varsBatArg = varsBA; } bool operator == (const ToolChain &) const override; @@ -110,11 +113,9 @@ private: class ClangClToolChain : public MsvcToolChain { public: - explicit ClangClToolChain(const QString &name, const QString &llvmDir, - const Abi &abi, - const QString &varsBat, const QString &varsBatArg, - Core::Id language, - Detection d = ManualDetection); + ClangClToolChain(const QString &name, const QString &llvmDir, + Core::Id language, + Detection d); ClangClToolChain(); bool isValid() const override; @@ -128,10 +129,15 @@ public: bool fromMap(const QVariantMap &data) override; ToolChainConfigWidget *configurationWidget() override; - QString llvmDir() const { return m_llvmDir; } + const QList<MsvcToolChain *> &msvcToolchains() const; + QString clangPath() const { return m_clangPath; } + void setClangPath(const QString &path) { m_clangPath = path; } + + void resetMsvcToolChain(const MsvcToolChain *base = nullptr); + bool operator ==(const ToolChain &) const override; private: - QString m_llvmDir; + QString m_clangPath; }; // -------------------------------------------------------------------------- @@ -151,11 +157,27 @@ public: bool canRestore(const QVariantMap &data) override; ToolChain *restore(const QVariantMap &data) override; - ToolChainConfigWidget *configurationWidget(ToolChain *); static QString vcVarsBatFor(const QString &basePath, MsvcToolChain::Platform platform, const QVersionNumber &v); }; +class ClangClToolChainFactory : public MsvcToolChainFactory +{ + Q_OBJECT + +public: + ClangClToolChainFactory(); + + QList<ToolChain *> autoDetect(const QList<ToolChain *> &alreadyKnown) override; + + bool canRestore(const QVariantMap &data) override; + ToolChain *restore(const QVariantMap &data) override; + + bool canCreate() override; + ToolChain *create(Core::Id l) override; +}; + + // -------------------------------------------------------------------------- // MsvcBasedToolChainConfigWidget // -------------------------------------------------------------------------- @@ -204,12 +226,14 @@ public: explicit ClangClToolChainConfigWidget(ToolChain *); protected: - void discardImpl() override { setFromClangClToolChain(); } + void applyImpl() override; + void discardImpl() override; private: void setFromClangClToolChain(); - QLabel *m_llvmDirLabel; + QLabel *m_llvmDirLabel = nullptr; + Utils::PathChooser *m_compilerCommand = nullptr; }; } // namespace Internal diff --git a/src/plugins/projectexplorer/outputparser_test.cpp b/src/plugins/projectexplorer/outputparser_test.cpp index 4b84a080a9..cb2a9772c3 100644 --- a/src/plugins/projectexplorer/outputparser_test.cpp +++ b/src/plugins/projectexplorer/outputparser_test.cpp @@ -34,14 +34,11 @@ namespace ProjectExplorer { static inline QByteArray msgFileComparisonFail(const Utils::FileName &f1, const Utils::FileName &f2) { - const QString result = QLatin1Char('"') + f1.toUserOutput() - + QLatin1String("\" != \"") + f2.toUserOutput() + QLatin1Char('"'); + const QString result = '"' + f1.toUserOutput() + "\" != \"" + f2.toUserOutput() + '"'; return result.toLocal8Bit(); } -OutputParserTester::OutputParserTester() : - m_debug(false) -{ } +OutputParserTester::OutputParserTester() = default; // test functions: void OutputParserTester::testParsing(const QString &lines, @@ -54,28 +51,28 @@ void OutputParserTester::testParsing(const QString &lines, reset(); Q_ASSERT(childParser()); - QStringList inputLines = lines.split(QLatin1Char('\n')); - foreach (const QString &input, inputLines) { + const QStringList inputLines = lines.split('\n'); + for (const QString &input : inputLines) { if (inputChannel == STDOUT) - childParser()->stdOutput(input + QLatin1Char('\n')); + childParser()->stdOutput(input + '\n'); else - childParser()->stdError(input + QLatin1Char('\n')); + childParser()->stdError(input + '\n'); } childParser()->flush(); // first disconnect ourselves from the end of the parser chain again - IOutputParser * parser = this; + IOutputParser *parser = this; while ( (parser = parser->childParser()) ) { if (parser->childParser() == this) { childParser()->takeOutputParserChain(); break; } } - parser = 0; + parser = nullptr; emit aboutToDeleteParser(); // then delete the parser(s) to test - setChildParser(0); + setChildParser(nullptr); QCOMPARE(m_receivedOutput, outputLines); QCOMPARE(m_receivedStdErrChildLine, childStdErrLines); @@ -142,7 +139,7 @@ void OutputParserTester::outputAdded(const QString &line, BuildStep::OutputForma { Q_UNUSED(format); if (!m_receivedOutput.isEmpty()) - m_receivedOutput.append(QLatin1Char('\n')); + m_receivedOutput.append('\n'); m_receivedOutput.append(line); } @@ -167,13 +164,13 @@ TestTerminator::TestTerminator(OutputParserTester *t) : void TestTerminator::stdOutput(const QString &line) { - QVERIFY(line.endsWith(QLatin1Char('\n'))); + QVERIFY(line.endsWith('\n')); m_tester->m_receivedStdOutChildLine.append(line); } void TestTerminator::stdError(const QString &line) { - QVERIFY(line.endsWith(QLatin1Char('\n'))); + QVERIFY(line.endsWith('\n')); m_tester->m_receivedStdErrChildLine.append(line); } diff --git a/src/plugins/projectexplorer/outputparser_test.h b/src/plugins/projectexplorer/outputparser_test.h index f071da6bb3..7836331632 100644 --- a/src/plugins/projectexplorer/outputparser_test.h +++ b/src/plugins/projectexplorer/outputparser_test.h @@ -72,7 +72,7 @@ private: void reset(); - bool m_debug; + bool m_debug = false; QString m_receivedStdErrChildLine; QString m_receivedStdOutChildLine; @@ -93,7 +93,7 @@ public: void stdError(const QString &line) override; private: - OutputParserTester *m_tester; + OutputParserTester *m_tester = nullptr; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/panelswidget.cpp b/src/plugins/projectexplorer/panelswidget.cpp index 2ba2e5c583..882f4d0f44 100644 --- a/src/plugins/projectexplorer/panelswidget.cpp +++ b/src/plugins/projectexplorer/panelswidget.cpp @@ -62,7 +62,7 @@ public: setMinimumHeight(1); setMaximumHeight(1); } - void paintEvent(QPaintEvent *e) + void paintEvent(QPaintEvent *e) override { Q_UNUSED(e); QPainter p(this); @@ -77,7 +77,7 @@ public: RootWidget(QWidget *parent) : QWidget(parent) { setFocusPolicy(Qt::NoFocus); } - void paintEvent(QPaintEvent *); + void paintEvent(QPaintEvent *) override; }; void RootWidget::paintEvent(QPaintEvent *e) @@ -153,9 +153,7 @@ PanelsWidget::PanelsWidget(const QString &displayName, const QIcon &icon, QWidge addPropertiesPanel(displayName, icon, widget); } -PanelsWidget::~PanelsWidget() -{ -} +PanelsWidget::~PanelsWidget() = default; /* * Add a widget with heading information into the grid diff --git a/src/plugins/projectexplorer/processstep.cpp b/src/plugins/projectexplorer/processstep.cpp index 82805fa3ee..81e463eb10 100644 --- a/src/plugins/projectexplorer/processstep.cpp +++ b/src/plugins/projectexplorer/processstep.cpp @@ -58,8 +58,6 @@ ProcessStep::ProcessStep(BuildStepList *bsl) bool ProcessStep::init(QList<const BuildStep *> &earlierSteps) { BuildConfiguration *bc = buildConfiguration(); - if (!bc) - bc = target()->activeBuildConfiguration(); ProcessParameters *pp = processParameters(); pp->setMacroExpander(bc ? bc->macroExpander() : Utils::globalMacroExpander()); pp->setEnvironment(bc ? bc->environment() : Utils::Environment::systemEnvironment()); @@ -115,7 +113,7 @@ void ProcessStep::setArguments(const QString &arguments) void ProcessStep::setWorkingDirectory(const QString &workingDirectory) { if (workingDirectory.isEmpty()) - if (target()->activeBuildConfiguration()) + if (buildConfiguration()) m_workingDirectory = Constants::DEFAULT_WORKING_DIR; else m_workingDirectory = Constants::DEFAULT_WORKING_DIR_ALTERNATE; @@ -163,8 +161,6 @@ ProcessStepConfigWidget::ProcessStepConfigWidget(ProcessStep *step) : m_ui.workingDirectory->setExpectedKind(Utils::PathChooser::Directory); BuildConfiguration *bc = m_step->buildConfiguration(); - if (!bc) - bc = m_step->target()->activeBuildConfiguration(); Utils::Environment env = bc ? bc->environment() : Utils::Environment::systemEnvironment(); m_ui.command->setEnvironment(env); m_ui.command->setPath(m_step->command()); @@ -193,8 +189,6 @@ void ProcessStepConfigWidget::updateDetails() displayName = tr("Custom Process Step"); ProcessParameters param; BuildConfiguration *bc = m_step->buildConfiguration(); - if (!bc) // iff the step is actually in the deploy list - bc = m_step->target()->activeBuildConfiguration(); param.setMacroExpander(bc ? bc->macroExpander() : Utils::globalMacroExpander()); param.setEnvironment(bc ? bc->environment() : Utils::Environment::systemEnvironment()); diff --git a/src/plugins/projectexplorer/processstep.h b/src/plugins/projectexplorer/processstep.h index 7da9f4ec09..4b61b2f51a 100644 --- a/src/plugins/projectexplorer/processstep.h +++ b/src/plugins/projectexplorer/processstep.h @@ -33,8 +33,6 @@ namespace Internal { class ProcessStepFactory : public BuildStepFactory { - Q_OBJECT - public: ProcessStepFactory(); }; diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 9c25e8d3b5..43188661df 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -47,7 +47,7 @@ #include <projectexplorer/kitmanager.h> #include <projectexplorer/projecttree.h> -#include <utils/algorithm.h> +#include <utils/pointeralgorithm.h> #include <utils/macroexpander.h> #include <utils/qtcassert.h> @@ -163,7 +163,7 @@ public: std::unique_ptr<Core::IDocument> m_document; std::unique_ptr<ProjectNode> m_rootProjectNode; std::unique_ptr<ContainerNode> m_containerNode; - QList<Target *> m_targets; + std::vector<std::unique_ptr<Target>> m_targets; Target *m_activeTarget = nullptr; EditorConfiguration m_editorConfiguration; Core::Context m_projectLanguages; @@ -181,8 +181,6 @@ public: ProjectPrivate::~ProjectPrivate() { - qDeleteAll(m_targets); - // Make sure our root node is null when deleting the actual node std::unique_ptr<ProjectNode> oldNode = std::move(m_rootProjectNode); } @@ -241,57 +239,52 @@ bool Project::hasActiveBuildSettings() const return activeTarget() && IBuildConfigurationFactory::find(activeTarget()); } -void Project::addTarget(Target *t) +void Project::addTarget(std::unique_ptr<Target> &&t) { - QTC_ASSERT(t && !d->m_targets.contains(t), return); + auto pointer = t.get(); + QTC_ASSERT(t && !Utils::contains(d->m_targets, pointer), return); QTC_ASSERT(!target(t->kit()), return); Q_ASSERT(t->project() == this); t->setDefaultDisplayName(t->displayName()); // add it - d->m_targets.push_back(t); - connect(t, &Target::addedProjectConfiguration, this, &Project::addedProjectConfiguration); - connect(t, &Target::aboutToRemoveProjectConfiguration, this, &Project::aboutToRemoveProjectConfiguration); - connect(t, &Target::removedProjectConfiguration, this, &Project::removedProjectConfiguration); - connect(t, &Target::activeProjectConfigurationChanged, this, &Project::activeProjectConfigurationChanged); - emit addedProjectConfiguration(t); - emit addedTarget(t); + d->m_targets.emplace_back(std::move(t)); + connect(pointer, &Target::addedProjectConfiguration, this, &Project::addedProjectConfiguration); + connect(pointer, &Target::aboutToRemoveProjectConfiguration, this, &Project::aboutToRemoveProjectConfiguration); + connect(pointer, &Target::removedProjectConfiguration, this, &Project::removedProjectConfiguration); + connect(pointer, &Target::activeProjectConfigurationChanged, this, &Project::activeProjectConfigurationChanged); + emit addedProjectConfiguration(pointer); + emit addedTarget(pointer); // check activeTarget: if (!activeTarget()) - setActiveTarget(t); + SessionManager::setActiveTarget(this, pointer, SetActive::Cascade); } bool Project::removeTarget(Target *target) { - QTC_ASSERT(target && d->m_targets.contains(target), return false); + QTC_ASSERT(target && Utils::contains(d->m_targets, target), return false); if (BuildManager::isBuilding(target)) return false; - if (target == activeTarget()) { - if (d->m_targets.size() == 1) - SessionManager::setActiveTarget(this, nullptr, SetActive::Cascade); - else if (d->m_targets.first() == target) - SessionManager::setActiveTarget(this, d->m_targets.at(1), SetActive::Cascade); - else - SessionManager::setActiveTarget(this, d->m_targets.at(0), SetActive::Cascade); - } - emit aboutToRemoveProjectConfiguration(target); emit aboutToRemoveTarget(target); - d->m_targets.removeOne(target); + auto keep = Utils::take(d->m_targets, target); + if (target == d->m_activeTarget) { + Target *newActiveTarget = (d->m_targets.size() == 0 ? nullptr : d->m_targets.at(0).get()); + SessionManager::setActiveTarget(this, newActiveTarget, SetActive::Cascade); + } emit removedTarget(target); emit removedProjectConfiguration(target); - delete target; return true; } QList<Target *> Project::targets() const { - return d->m_targets; + return Utils::toRawPointer<QList>(d->m_targets); } Target *Project::activeTarget() const @@ -301,8 +294,12 @@ Target *Project::activeTarget() const void Project::setActiveTarget(Target *target) { - if ((!target && !d->m_targets.isEmpty()) || - (target && d->m_targets.contains(target) && d->m_activeTarget != target)) { + if (d->m_activeTarget == target) + return; + + // Allow to set nullptr just before the last target is removed or when no target exists. + if ((!target && d->m_targets.size() == 0) || + (target && Utils::contains(d->m_targets, target))) { d->m_activeTarget = target; emit activeProjectConfigurationChanged(d->m_activeTarget); emit activeTargetChanged(d->m_activeTarget); @@ -327,16 +324,14 @@ QList<Task> Project::projectIssues(const Kit *k) const return {}; } -Target *Project::createTarget(Kit *k) +std::unique_ptr<Target> Project::createTarget(Kit *k) { if (!k || target(k)) return nullptr; - auto t = new Target(this, k); - if (!setupTarget(t)) { - delete t; - return nullptr; - } + auto t = std::make_unique<Target>(this, k, Target::_constructor_tag{}); + if (!setupTarget(t.get())) + return {}; return t; } @@ -529,7 +524,7 @@ void Project::handleSubTreeChanged(FolderNode *node) emit fileListChanged(); } -Target *Project::restoreTarget(const QVariantMap &data) +std::unique_ptr<Target> Project::restoreTarget(const QVariantMap &data) { Core::Id id = idFromMap(data); if (target(id)) { @@ -544,11 +539,9 @@ Target *Project::restoreTarget(const QVariantMap &data) return nullptr; } - auto t = new Target(this, k); - if (!t->fromMap(data)) { - delete t; - return nullptr; - } + auto t = std::make_unique<Target>(this, k, Target::_constructor_tag{}); + if (!t->fromMap(data)) + return {}; return t; } @@ -649,6 +642,15 @@ Utils::FileName Project::projectDirectory(const Utils::FileName &top) return Utils::FileName::fromString(top.toFileInfo().absoluteDir().path()); } +/*! + Returns the common root directory that contains all files which belongs to a project. +*/ + +Utils::FileName Project::rootProjectDirectory() const +{ + return projectDirectory(); // TODO parse all files and find the common path +} + ProjectNode *Project::rootProjectNode() const { return d->m_rootProjectNode.get(); @@ -698,16 +700,11 @@ void Project::createTargetFromMap(const QVariantMap &map, int index) return; QVariantMap targetMap = map.value(key).toMap(); - Target *t = restoreTarget(targetMap); - if (!t) + std::unique_ptr<Target> t = restoreTarget(targetMap); + if (!t || (t->runConfigurations().isEmpty() && t->buildConfigurations().isEmpty())) return; - if (t->runConfigurations().isEmpty() && t->buildConfigurations().isEmpty()) { - delete t; - return; - } - - addTarget(t); + addTarget(std::move(t)); } EditorConfiguration *Project::editorConfiguration() const @@ -799,7 +796,7 @@ void Project::setNamedSettings(const QString &name, const QVariant &value) bool Project::needsConfiguration() const { - return d->m_targets.isEmpty(); + return d->m_targets.size() == 0; } bool Project::needsBuildConfigurations() const @@ -822,20 +819,20 @@ bool Project::knowsAllBuildExecutables() const return true; } -void Project::setup(QList<const BuildInfo *> infoList) +void Project::setup(const QList<const BuildInfo *> &infoList) { - QList<Target *> toRegister; - foreach (const BuildInfo *info, infoList) { + std::vector<std::unique_ptr<Target>> toRegister; + for (const BuildInfo *info : infoList) { Kit *k = KitManager::kit(info->kitId); if (!k) continue; Target *t = target(k); - if (!t) { + if (!t) t = Utils::findOrDefault(toRegister, Utils::equal(&Target::kit, k)); - } if (!t) { - t = new Target(this, k); - toRegister << t; + auto newTarget = std::make_unique<Target>(this, k, Target::_constructor_tag{}); + t = newTarget.get(); + toRegister.emplace_back(std::move(newTarget)); } if (!info->factory()) @@ -846,10 +843,10 @@ void Project::setup(QList<const BuildInfo *> infoList) continue; t->addBuildConfiguration(bc); } - foreach (Target *t, toRegister) { + for (std::unique_ptr<Target> &t : toRegister) { t->updateDefaultDeployConfigurations(); t->updateDefaultRunConfigurations(); - addTarget(t); + addTarget(std::move(t)); } } diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index 29e6d7fb2d..e6df98372f 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -55,7 +55,6 @@ class ProjectConfiguration; class ProjectImporter; class ProjectNode; class ProjectPrivate; -class Session; class Target; // Auto-registers with the DocumentManager if a callback is set! @@ -103,6 +102,7 @@ public: Core::IDocument *document() const; Utils::FileName projectFilePath() const; Utils::FileName projectDirectory() const; + Utils::FileName rootProjectDirectory() const; static Utils::FileName projectDirectory(const Utils::FileName &top); virtual ProjectNode *rootProjectNode() const; @@ -114,7 +114,7 @@ public: EditorConfiguration *editorConfiguration() const; // Target: - void addTarget(Target *target); + void addTarget(std::unique_ptr<Target> &&target); bool removeTarget(Target *target); QList<Target *> targets() const; @@ -124,9 +124,9 @@ public: Target *target(Kit *k) const; virtual QList<Task> projectIssues(const Kit *k) const; - Target *createTarget(Kit *k); + std::unique_ptr<Target> createTarget(Kit *k); static bool copySteps(Target *sourceTarget, Target *newTarget); - Target *restoreTarget(const QVariantMap &data); + std::unique_ptr<Target> restoreTarget(const QVariantMap &data); void saveSettings(); enum class RestoreResult { Ok, Error, UserAbort }; @@ -163,7 +163,7 @@ public: // of configuration. virtual bool knowsAllBuildExecutables() const; - void setup(QList<const BuildInfo *> infoList); + void setup(const QList<const BuildInfo *> &infoList); Utils::MacroExpander *macroExpander() const; bool isParsing() const; @@ -250,7 +250,6 @@ private: void setActiveTarget(Target *target); ProjectPrivate *d; - friend class Session; friend class ContainerNode; }; diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 56b30b3a99..37d57d18c7 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -31,6 +31,7 @@ #include "customwizard/customwizard.h" #include "deployablefile.h" #include "deployconfiguration.h" +#include "extraabi.h" #include "gcctoolchainfactories.h" #ifdef WITH_JOURNALD #include "journaldwatcher.h" @@ -446,6 +447,7 @@ public: #ifdef Q_OS_WIN WinDebugInterface m_winDebugInterface; MsvcToolChainFactory m_mscvToolChainFactory; + ClangClToolChainFactory m_clangClToolChainFactory; #else LinuxIccToolChainFactory m_linuxToolChainFactory; #endif @@ -524,6 +526,10 @@ ProjectExplorerPlugin::~ProjectExplorerPlugin() delete dd->m_toolChainManager; ProjectPanelFactory::destroyFactories(); delete dd; + dd = nullptr; + m_instance = nullptr; + + RunWorkerFactory::destroyRemainingRunWorkerFactories(); } ProjectExplorerPlugin *ProjectExplorerPlugin::instance() @@ -553,11 +559,11 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er IWizardFactory::registerFeatureProvider(new KitFeatureProvider); // Register KitInformation: - KitManager::registerKitInformation(new DeviceTypeKitInformation); - KitManager::registerKitInformation(new DeviceKitInformation); - KitManager::registerKitInformation(new ToolChainKitInformation); - KitManager::registerKitInformation(new SysRootKitInformation); - KitManager::registerKitInformation(new EnvironmentKitInformation); + KitManager::registerKitInformation<DeviceTypeKitInformation>(); + KitManager::registerKitInformation<DeviceKitInformation>(); + KitManager::registerKitInformation<ToolChainKitInformation>(); + KitManager::registerKitInformation<SysRootKitInformation>(); + KitManager::registerKitInformation<EnvironmentKitInformation>(); IWizardFactory::registerFactoryCreator([]() -> QList<IWizardFactory *> { QList<IWizardFactory *> result; @@ -647,17 +653,6 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er panelFactory->setCreateWidgetFunction([](Project *project) { return new DependenciesWidget(project); }); ProjectPanelFactory::registerFactory(panelFactory); - auto constraint = [](RunConfiguration *runConfiguration) { - const Runnable runnable = runConfiguration->runnable(); - const IDevice::ConstPtr device = runnable.device; - if (device && device->type() == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE) - return true; - Target *target = runConfiguration->target(); - Kit *kit = target ? target->kit() : nullptr; - return DeviceTypeKitInformation::deviceTypeId(kit) == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE; - }; - RunControl::registerWorker<SimpleTargetRunner>(Constants::NORMAL_RUN_MODE, constraint); - // context menus ActionContainer *msessionContextMenu = ActionManager::createMenu(Constants::M_SESSIONCONTEXT); @@ -1640,6 +1635,7 @@ void ProjectExplorerPlugin::extensionsInitialized() bool ProjectExplorerPlugin::delayedInitialize() { dd->determineSessionToRestoreAtStartup(); + ExtraAbi::load(); // Load this before Toolchains! DeviceManager::instance()->load(); ToolChainManager::restoreToolChains(); dd->m_kitManager->restoreKits(); @@ -1693,7 +1689,7 @@ void ProjectExplorerPluginPrivate::showSessionManager() updateActions(); - if (ModeManager::currentMode() == Core::Constants::MODE_WELCOME) + if (ModeManager::currentModeId() == Core::Constants::MODE_WELCOME) updateWelcomePage(); } @@ -1835,36 +1831,31 @@ ProjectExplorerPlugin::OpenProjectResult ProjectExplorerPlugin::openProjects(con } Utils::MimeType mt = Utils::mimeTypeForFile(fileName); - if (mt.isValid()) { - if (ProjectManager::canOpenProjectForMimeType(mt)) { - if (!QFileInfo(filePath).isFile()) { - appendError(errorString, - tr("Failed opening project \"%1\": Project is not a file.").arg(fileName)); - } else if (Project *pro = ProjectManager::openProject(mt, Utils::FileName::fromString(filePath))) { - QObject::connect(pro, &Project::parsingFinished, [pro]() { - emit SessionManager::instance()->projectFinishedParsing(pro); - }); - QString restoreError; - Project::RestoreResult restoreResult = pro->restoreSettings(&restoreError); - if (restoreResult == Project::RestoreResult::Ok) { - connect(pro, &Project::fileListChanged, - m_instance, &ProjectExplorerPlugin::fileListChanged); - SessionManager::addProject(pro); - openedPro += pro; - } else { - if (restoreResult == Project::RestoreResult::Error) - appendError(errorString, restoreError); - delete pro; - } + if (ProjectManager::canOpenProjectForMimeType(mt)) { + if (!QFileInfo(filePath).isFile()) { + appendError(errorString, + tr("Failed opening project \"%1\": Project is not a file.").arg(fileName)); + } else if (Project *pro = ProjectManager::openProject(mt, Utils::FileName::fromString(filePath))) { + QObject::connect(pro, &Project::parsingFinished, [pro]() { + emit SessionManager::instance()->projectFinishedParsing(pro); + }); + QString restoreError; + Project::RestoreResult restoreResult = pro->restoreSettings(&restoreError); + if (restoreResult == Project::RestoreResult::Ok) { + connect(pro, &Project::fileListChanged, + m_instance, &ProjectExplorerPlugin::fileListChanged); + SessionManager::addProject(pro); + openedPro += pro; + } else { + if (restoreResult == Project::RestoreResult::Error) + appendError(errorString, restoreError); + delete pro; } - } else { - appendError(errorString, tr("Failed opening project \"%1\": No plugin can open project type \"%2\".") - .arg(QDir::toNativeSeparators(fileName)) - .arg(mt.name())); } } else { - appendError(errorString, tr("Failed opening project \"%1\": Unknown project type.") - .arg(QDir::toNativeSeparators(fileName))); + appendError(errorString, tr("Failed opening project \"%1\": No plugin can open project type \"%2\".") + .arg(QDir::toNativeSeparators(fileName)) + .arg(mt.name())); } if (fileNames.size() > 1) SessionManager::reportProjectLoadingProgress(); @@ -2458,7 +2449,7 @@ void ProjectExplorerPluginPrivate::runProjectContextMenu() auto act = qobject_cast<QAction *>(sender()); if (!act) return; - RunConfiguration *rc = act->data().value<RunConfiguration *>(); + auto *rc = act->data().value<RunConfiguration *>(); if (!rc) return; m_instance->runRunConfiguration(rc, Constants::NORMAL_RUN_MODE); @@ -2888,7 +2879,7 @@ void ProjectExplorerPluginPrivate::updateUnloadProjectMenu() void ProjectExplorerPluginPrivate::updateRecentProjectMenu() { - typedef QList<QPair<QString, QString> >::const_iterator StringPairListConstIterator; + using StringPairListConstIterator = QList<QPair<QString, QString> >::const_iterator; ActionContainer *aci = ActionManager::actionContainer(Constants::M_RECENTPROJECTS); QMenu *menu = aci->menu(); menu->clear(); @@ -3005,7 +2996,7 @@ void ProjectExplorerPluginPrivate::updateContextMenuActions() } else if (runConfigs.count() > 1) { runMenu->menu()->menuAction()->setVisible(true); foreach (RunConfiguration *rc, runConfigs) { - QAction *act = new QAction(runMenu->menu()); + auto *act = new QAction(runMenu->menu()); act->setData(QVariant::fromValue(rc)); act->setText(tr("Run %1").arg(rc->displayName())); runMenu->menu()->addAction(act); @@ -3110,7 +3101,7 @@ void ProjectExplorerPluginPrivate::updateLocationSubMenus() for (const FolderNode::LocationInfo &li : locations) { const int line = li.line; const Utils::FileName path = li.path; - QAction *action = new QAction(li.displayName, nullptr); + auto *action = new QAction(li.displayName, nullptr); connect(action, &QAction::triggered, this, [line, path]() { Core::EditorManager::openEditorAt(path.toString(), line); }); @@ -3453,7 +3444,7 @@ void ProjectExplorerPluginPrivate::updateSessionMenu() m_sessionMenu->clear(); dd->m_sessionMenu->addAction(dd->m_sessionManagerAction); dd->m_sessionMenu->addSeparator(); - QActionGroup *ag = new QActionGroup(m_sessionMenu); + auto *ag = new QActionGroup(m_sessionMenu); connect(ag, &QActionGroup::triggered, this, &ProjectExplorerPluginPrivate::setSession); const QString activeSession = SessionManager::activeSession(); diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h index b4d71451d0..48281d2581 100644 --- a/src/plugins/projectexplorer/projectexplorer.h +++ b/src/plugins/projectexplorer/projectexplorer.h @@ -225,9 +225,10 @@ private slots: void testAbiRoundTrips(); void testAbiOfBinary_data(); void testAbiOfBinary(); - void testFlavorForOs(); void testAbiFromTargetTriplet_data(); void testAbiFromTargetTriplet(); + void testAbiUserOsFlavor_data(); + void testAbiUserOsFlavor(); void testDeviceManager(); diff --git a/src/plugins/projectexplorer/projectexplorer.pro b/src/plugins/projectexplorer/projectexplorer.pro index eecc3f0870..598e8ceddb 100644 --- a/src/plugins/projectexplorer/projectexplorer.pro +++ b/src/plugins/projectexplorer/projectexplorer.pro @@ -3,6 +3,10 @@ QT += qml include(../../qtcreatorplugin.pri) include(customwizard/customwizard.pri) include(jsonwizard/jsonwizard.pri) + +include(../../shared/clang/clang_installation.pri) +include(../../shared/clang/clang_defines.pri) + HEADERS += projectexplorer.h \ abi.h \ abiwidget.h \ @@ -12,6 +16,7 @@ HEADERS += projectexplorer.h \ configtaskhandler.h \ environmentaspect.h \ environmentaspectwidget.h \ + extraabi.h \ gcctoolchain.h \ importwidget.h \ userfileaccessor.h \ @@ -149,7 +154,8 @@ HEADERS += projectexplorer.h \ projectexplorer_global.h \ extracompiler.h \ customexecutablerunconfiguration.h \ - projectmacro.h + projectmacro.h \ + makestep.h SOURCES += projectexplorer.cpp \ abi.cpp \ @@ -160,6 +166,7 @@ SOURCES += projectexplorer.cpp \ configtaskhandler.cpp \ environmentaspect.cpp \ environmentaspectwidget.cpp \ + extraabi.cpp \ gcctoolchain.cpp \ importwidget.cpp \ projectconfigurationmodel.cpp \ @@ -284,7 +291,8 @@ SOURCES += projectexplorer.cpp \ projectexplorericons.cpp \ extracompiler.cpp \ customexecutablerunconfiguration.cpp \ - projectmacro.cpp + projectmacro.cpp \ + makestep.cpp FORMS += processstep.ui \ editorsettingspropertiespage.ui \ @@ -297,7 +305,8 @@ FORMS += processstep.ui \ devicesupport/devicesettingswidget.ui \ devicesupport/devicetestdialog.ui \ devicesupport/desktopdeviceconfigurationwidget.ui \ - customparserconfigdialog.ui + customparserconfigdialog.ui \ + makestep.ui WINSOURCES += \ windebuginterface.cpp \ diff --git a/src/plugins/projectexplorer/projectexplorer.qbs b/src/plugins/projectexplorer/projectexplorer.qbs index 973423e149..67f07840ac 100644 --- a/src/plugins/projectexplorer/projectexplorer.qbs +++ b/src/plugins/projectexplorer/projectexplorer.qbs @@ -15,6 +15,9 @@ Project { Depends { name: "TextEditor" } Depends { name: "app_version_header" } + Depends { name: "libclang"; required: false } + Depends { name: "clang_defines" } + Group { name: "General" files: [ @@ -63,6 +66,7 @@ Project { "environmentaspectwidget.cpp", "environmentaspectwidget.h", "environmentwidget.cpp", "environmentwidget.h", "expanddata.cpp", "expanddata.h", + "extraabi.cpp", "extraabi.h", "extracompiler.cpp", "extracompiler.h", "foldernavigationwidget.cpp", "foldernavigationwidget.h", "gccparser.cpp", "gccparser.h", @@ -87,6 +91,7 @@ Project { "ldparser.cpp", "ldparser.h", "linuxiccparser.cpp", "linuxiccparser.h", "localenvironmentaspect.cpp", "localenvironmentaspect.h", + "makestep.cpp", "makestep.h", "makestep.ui", "miniprojecttargetselector.cpp", "miniprojecttargetselector.h", "msvcparser.cpp", "msvcparser.h", "namedwidget.cpp", "namedwidget.h", diff --git a/src/plugins/projectexplorer/projectimporter.cpp b/src/plugins/projectexplorer/projectimporter.cpp index 25565015d8..d766f7965a 100644 --- a/src/plugins/projectexplorer/projectimporter.cpp +++ b/src/plugins/projectexplorer/projectimporter.cpp @@ -286,26 +286,27 @@ bool ProjectImporter::isTemporaryKit(Kit *k) const Kit *ProjectImporter::createTemporaryKit(const KitSetupFunction &setup) const { - Kit *k = new Kit; + auto k = std::make_unique<Kit>(); + Kit *kptr = k.get(); UpdateGuard guard(*this); { - KitGuard kitGuard(k); + KitGuard kitGuard(kptr); k->setUnexpandedDisplayName(QCoreApplication::translate("ProjectExplorer::ProjectImporter", "Imported Kit"));; // Set up values: foreach (KitInformation *ki, KitManager::kitInformation()) - ki->setup(k); + ki->setup(kptr); - setup(k); + setup(kptr); foreach (KitInformation *ki, KitManager::kitInformation()) - ki->fix(k); + ki->fix(kptr); - markKitAsTemporary(k); - addProject(k); + markKitAsTemporary(kptr); + addProject(kptr); } // ~KitGuard, sending kitUpdated - KitManager::registerKit(k); // potentially adds kits to other targetsetuppages - return k; + KitManager::registerKit(std::move(k)); // potentially adds kits to other targetsetuppages + return kptr; } bool ProjectImporter::findTemporaryHandler(Core::Id id) const diff --git a/src/plugins/projectexplorer/projectmodels.cpp b/src/plugins/projectexplorer/projectmodels.cpp index cbb375da61..a4d9e39d9b 100644 --- a/src/plugins/projectexplorer/projectmodels.cpp +++ b/src/plugins/projectexplorer/projectmodels.cpp @@ -178,7 +178,7 @@ QVariant FlatModel::data(const QModelIndex &index, int role) const Qt::ItemFlags FlatModel::flags(const QModelIndex &index) const { if (!index.isValid()) - return 0; + return nullptr; // We claim that everything is editable // That's slightly wrong // We control the only view, and that one does the checks diff --git a/src/plugins/projectexplorer/projecttree.cpp b/src/plugins/projectexplorer/projecttree.cpp index 206f158f22..fc3175a1bc 100644 --- a/src/plugins/projectexplorer/projecttree.cpp +++ b/src/plugins/projectexplorer/projecttree.cpp @@ -158,7 +158,10 @@ void ProjectTree::updateFromProjectTreeWidget(ProjectTreeWidget *widget) Node *currentNode = widget->currentNode(); Project *project = projectForNode(currentNode); - setCurrent(currentNode, project); + if (!project) + updateFromNode(nullptr); // Project was removed! + else + setCurrent(currentNode, project); } void ProjectTree::updateFromDocumentManager() @@ -227,12 +230,14 @@ void ProjectTree::setCurrent(Node *node, Project *project) void ProjectTree::sessionChanged() { - if (m_currentProject) + if (m_currentProject) { Core::DocumentManager::setDefaultLocationForNewFiles(m_currentProject->projectDirectory().toString()); - else if (SessionManager::startupProject()) - Core::DocumentManager::setDefaultLocationForNewFiles(SessionManager::startupProject()->projectDirectory().toString()); - else + } else if (Project *project = SessionManager::startupProject()) { + Core::DocumentManager::setDefaultLocationForNewFiles(project->projectDirectory().toString()); + updateFromNode(nullptr); // Make startup project current if there is no other current + } else { Core::DocumentManager::setDefaultLocationForNewFiles(QString()); + } update(); } diff --git a/src/plugins/projectexplorer/projecttreewidget.cpp b/src/plugins/projectexplorer/projecttreewidget.cpp index 688c7b245c..f2f94d9880 100644 --- a/src/plugins/projectexplorer/projecttreewidget.cpp +++ b/src/plugins/projectexplorer/projecttreewidget.cpp @@ -202,7 +202,7 @@ public: NavigationTreeView::setModel(newModel); } - ~ProjectTreeView() + ~ProjectTreeView() override { ICore::removeContextObject(m_context); delete m_context; @@ -423,7 +423,7 @@ void ProjectTreeWidget::editCurrentItem() const Node *node = m_model->nodeForIndex(currentIndex); if (!node) return; - QLineEdit *editor = qobject_cast<QLineEdit*>(m_view->indexWidget(currentIndex)); + auto *editor = qobject_cast<QLineEdit*>(m_view->indexWidget(currentIndex)); if (!editor) return; diff --git a/src/plugins/projectexplorer/projectwindow.cpp b/src/plugins/projectexplorer/projectwindow.cpp index 51e17e5610..85917bcdda 100644 --- a/src/plugins/projectexplorer/projectwindow.cpp +++ b/src/plugins/projectexplorer/projectwindow.cpp @@ -78,7 +78,7 @@ public: : m_factory(factory), m_project(project) {} - ~MiscSettingsPanelItem() { delete m_widget; } + ~MiscSettingsPanelItem() override { delete m_widget; } QVariant data(int column, int role) const override; Qt::ItemFlags flags(int column) const override; @@ -174,7 +174,7 @@ public: Q_UNUSED(column) if (role == ItemActivatedFromBelowRole) { - TreeItem *item = data.value<TreeItem *>(); + auto *item = data.value<TreeItem *>(); QTC_ASSERT(item, return false); m_currentPanelIndex = indexOf(item); QTC_ASSERT(m_currentPanelIndex != -1, return false); @@ -198,7 +198,7 @@ private: class ProjectItem : public TreeItem { public: - ProjectItem() {} + ProjectItem() = default; ProjectItem(Project *project, const std::function<void()> &changeListener) : m_project(project), m_changeListener(changeListener) @@ -279,7 +279,7 @@ public: QModelIndex activeIndex() const { - TreeItem *activeItem = data(0, ActiveItemRole).value<TreeItem *>(); + auto *activeItem = data(0, ActiveItemRole).value<TreeItem *>(); return activeItem ? activeItem->index() : QModelIndex(); } @@ -295,7 +295,7 @@ private: class SelectorDelegate : public QStyledItemDelegate { public: - SelectorDelegate() {} + SelectorDelegate() = default; QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const final; @@ -538,8 +538,8 @@ public: void handleImportBuild() { ProjectItem *projectItem = m_projectsModel.rootItem()->childAt(0); - Project *project = projectItem ? projectItem->project() : 0; - ProjectImporter *projectImporter = project ? project->projectImporter() : 0; + Project *project = projectItem ? projectItem->project() : nullptr; + ProjectImporter *projectImporter = project ? project->projectImporter() : nullptr; QTC_ASSERT(projectImporter, return); QString dir = project->projectDirectory().toString(); @@ -554,9 +554,10 @@ public: for (BuildInfo *info : toImport) { Target *target = project->target(info->kitId); if (!target) { - target = project->createTarget(KitManager::kit(info->kitId)); - if (target) - project->addTarget(target); + std::unique_ptr<Target> newTarget = project->createTarget(KitManager::kit(info->kitId)); + target = newTarget.get(); + if (newTarget) + project->addTarget(std::move(newTarget)); } if (target) { projectImporter->makePersistent(target->kit()); @@ -605,7 +606,7 @@ public: // ProjectWindow::ProjectWindow() - : d(new ProjectWindowPrivate(this)) + : d(std::make_unique<ProjectWindowPrivate>(this)) { setBackgroundRole(QPalette::Base); @@ -614,10 +615,7 @@ ProjectWindow::ProjectWindow() setContextMenuPolicy(Qt::CustomContextMenu); } -ProjectWindow::~ProjectWindow() -{ - delete d; -} +ProjectWindow::~ProjectWindow() = default; QSize SelectorDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { diff --git a/src/plugins/projectexplorer/projectwindow.h b/src/plugins/projectexplorer/projectwindow.h index c50e018620..1aeeb882f9 100644 --- a/src/plugins/projectexplorer/projectwindow.h +++ b/src/plugins/projectexplorer/projectwindow.h @@ -29,6 +29,8 @@ #include <utils/fancymainwindow.h> +#include <memory> + namespace ProjectExplorer { namespace Internal { @@ -59,7 +61,7 @@ public: ~ProjectWindow() override; private: - ProjectWindowPrivate *d; + const std::unique_ptr<ProjectWindowPrivate> d; }; } // namespace Internal diff --git a/src/plugins/projectexplorer/projectwizardpage.cpp b/src/plugins/projectexplorer/projectwizardpage.cpp index 062439db64..ee86abe895 100644 --- a/src/plugins/projectexplorer/projectwizardpage.cpp +++ b/src/plugins/projectexplorer/projectwizardpage.cpp @@ -68,8 +68,8 @@ public: AddNewTree(FolderNode *node, QList<AddNewTree *> children, const QString &displayName); AddNewTree(FolderNode *node, QList<AddNewTree *> children, const FolderNode::AddNewInformation &info); - QVariant data(int column, int role) const; - Qt::ItemFlags flags(int column) const; + QVariant data(int column, int role) const override; + Qt::ItemFlags flags(int column) const override; QString displayName() const { return m_displayName; } FolderNode *node() const { return m_node; } @@ -202,7 +202,7 @@ void BestNodeSelector::inspect(AddNewTree *tree, bool isContextNode) AddNewTree *BestNodeSelector::bestChoice() const { if (m_deploys) - return 0; + return nullptr; return m_bestChoice; } diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index 438d631c78..52cd91751e 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -466,8 +466,6 @@ Runnable RunConfiguration::runnable() const r.workingDirectory = aspect->workingDirectory().toString(); if (auto aspect = extraAspect<EnvironmentAspect>()) r.environment = aspect->environment(); - if (auto aspect = extraAspect<TerminalAspect>()) - r.runMode = aspect->runMode(); return r; } @@ -520,6 +518,8 @@ RunConfigurationFactory::RunConfigurationFactory() RunConfigurationFactory::~RunConfigurationFactory() { g_runConfigurationFactories.removeOne(this); + qDeleteAll(m_ownedRunWorkerFactories); + m_ownedRunWorkerFactories.clear(); } QString RunConfigurationFactory::decoratedTargetName(const QString targetName, Target *target) @@ -586,6 +586,16 @@ void RunConfigurationFactory::setDecorateDisplayNames(bool on) m_decorateDisplayNames = on; } +RunWorkerFactory *RunConfigurationFactory::addRunWorkerFactoryHelper + (Core::Id runMode, const std::function<RunWorker *(RunControl *)> &creator) +{ + auto factory = new RunWorkerFactory; + factory->addConstraint(m_ownTypeChecker); + factory->addSupportedRunMode(runMode); + factory->setProducer(creator); + return factory; +} + void RunConfigurationFactory::addSupportedProjectType(Core::Id id) { m_supportedProjectTypes.append(id); @@ -682,28 +692,60 @@ FixedRunConfigurationFactory::availableCreators(Target *parent) const // RunWorkerFactory -using RunWorkerFactories = std::vector<RunWorkerFactory>; +static QList<RunWorkerFactory *> g_runWorkerFactories; -static RunWorkerFactories &theWorkerFactories() +RunWorkerFactory::RunWorkerFactory() { - static RunWorkerFactories factories; - return factories; + g_runWorkerFactories.append(this); } -RunWorkerFactory::RunWorkerFactory(Core::Id mode, Constraint constr, const WorkerCreator &prod, int prio) - : m_runMode(mode), m_constraint(constr), m_producer(prod), m_priority(prio) -{} +RunWorkerFactory::~RunWorkerFactory() +{ + g_runWorkerFactories.removeOne(this); +} bool RunWorkerFactory::canRun(RunConfiguration *runConfiguration, Core::Id runMode) const { - if (runMode != this->m_runMode) + if (!m_supportedRunModes.contains(runMode)) return false; - if (!m_constraint) - return true; - return m_constraint(runConfiguration); + + for (const Constraint &constraint : m_constraints) { + if (!constraint(runConfiguration)) + return false; + } + + return true; +} + +void RunWorkerFactory::setPriority(int priority) +{ + m_priority = priority; +} + +void RunWorkerFactory::setProducer(const WorkerCreator &producer) +{ + m_producer = producer; +} + +void RunWorkerFactory::addConstraint(const Constraint &constraint) +{ + // Default constructed Constraints are not worth keeping. + // FIXME: Make it a QTC_ASSERT once there is no code path + // using this "feature" anymore. + if (!constraint) + return; + m_constraints.append(constraint); } +void RunWorkerFactory::addSupportedRunMode(Core::Id runMode) +{ + m_supportedRunModes.append(runMode); +} +void RunWorkerFactory::destroyRemainingRunWorkerFactories() +{ + qDeleteAll(g_runWorkerFactories); +} /*! \class ProjectExplorer::RunControl @@ -848,7 +890,7 @@ public: } } - ~RunControlPrivate() + ~RunControlPrivate() override { QTC_CHECK(state == RunControlState::Finished || state == RunControlState::Initialized); disconnect(); @@ -907,7 +949,7 @@ public: using namespace Internal; RunControl::RunControl(RunConfiguration *runConfiguration, Core::Id mode) : - d(new RunControlPrivate(this, runConfiguration, mode)) + d(std::make_unique<RunControlPrivate>(this, runConfiguration, mode)) { #ifdef WITH_JOURNALD JournaldWatcher::instance()->subscribe(this, [this](const JournaldWatcher::LogEntry &entry) { @@ -939,8 +981,6 @@ RunControl::~RunControl() #ifdef WITH_JOURNALD JournaldWatcher::instance()->unsubscribe(this); #endif - delete d; - d = nullptr; } void RunControl::initiateStart() @@ -967,7 +1007,7 @@ void RunControl::forceStop() void RunControl::initiateFinish() { - QTimer::singleShot(0, d, &RunControlPrivate::initiateFinish); + QTimer::singleShot(0, d.get(), &RunControlPrivate::initiateFinish); } using WorkerCreators = QHash<Core::Id, RunControl::WorkerCreator>; @@ -1001,22 +1041,17 @@ RunWorker *RunControl::createWorker(Core::Id id) RunWorkerFactory::WorkerCreator RunControl::producer(RunConfiguration *runConfig, Core::Id runMode) { const auto canRun = std::bind(&RunWorkerFactory::canRun, std::placeholders::_1, runConfig, runMode); - const RunWorkerFactories candidates = Utils::filtered(theWorkerFactories(), canRun); + const QList<RunWorkerFactory *> candidates = Utils::filtered(g_runWorkerFactories, canRun); if (candidates.empty()) return {}; - const auto higherPriority = std::bind(std::greater<int>(), + const auto higherPriority = std::bind(std::greater<>(), std::bind(&RunWorkerFactory::priority, std::placeholders::_1), std::bind(&RunWorkerFactory::priority, std::placeholders::_2)); const auto bestFactory = std::max_element(candidates.begin(), candidates.end(), higherPriority); - return bestFactory->producer(); -} - -void RunControl::addWorkerFactory(const RunWorkerFactory &workerFactory) -{ - theWorkerFactories().push_back(workerFactory); + return (*bestFactory)->producer(); } void RunControlPrivate::initiateStart() @@ -1406,17 +1441,6 @@ Project *RunControl::project() const return d->project.data(); } -bool RunControl::canReUseOutputPane(const RunControl *other) const -{ - if (!other || other->isRunning()) - return false; - - return d->runnable.executable == other->d->runnable.executable - && d->runnable.commandLineArguments == other->d->runnable.commandLineArguments - && d->runnable.workingDirectory == other->d->runnable.workingDirectory - && d->runnable.environment == other->d->runnable.environment; -} - /*! A handle to the application process. @@ -1616,12 +1640,17 @@ SimpleTargetRunner::SimpleTargetRunner(RunControl *runControl) setDisplayName("SimpleTargetRunner"); m_runnable = runControl->runnable(); // Default value. Can be overridden using setRunnable. m_device = runControl->device(); // Default value. Can be overridden using setDevice. + if (auto runConfig = runControl->runConfiguration()) { + if (auto terminalAspect = runConfig->extraAspect<TerminalAspect>()) + m_useTerminal = terminalAspect->useTerminal(); + } } void SimpleTargetRunner::start() { m_stopReported = false; m_launcher.disconnect(this); + m_launcher.setUseTerminal(m_useTerminal); const bool isDesktop = m_device.isNull() || m_device->type() == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE; @@ -1847,14 +1876,10 @@ void RunWorkerPrivate::timerEvent(QTimerEvent *ev) */ RunWorker::RunWorker(RunControl *runControl) - : d(new RunWorkerPrivate(this, runControl)) -{ -} + : d(std::make_unique<RunWorkerPrivate>(this, runControl)) +{ } -RunWorker::~RunWorker() -{ - delete d; -} +RunWorker::~RunWorker() = default; /*! * This function is called by the RunControl once all dependencies diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index d26a54cc19..08797804c0 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -59,6 +59,7 @@ class RunConfiguration; class RunConfigurationCreationInfo; class RunConfigWidget; class RunControl; +class RunWorkerFactory; class Target; namespace Internal { @@ -165,7 +166,6 @@ public: QString commandLineArguments; QString workingDirectory; Utils::Environment environment; - ApplicationLauncher::Mode runMode = ApplicationLauncher::Gui; IDevice::ConstPtr device; // Override the kit's device. Keep unset by default. // FIXME: Not necessarily a display name @@ -301,13 +301,25 @@ protected: return new RunConfig(t, runConfigBaseId); }; m_runConfigBaseId = runConfigBaseId; + m_ownTypeChecker = [](RunConfiguration *runConfig) { + return qobject_cast<RunConfig *>(runConfig) != nullptr; + }; } void addSupportedProjectType(Core::Id id); void addSupportedTargetDeviceType(Core::Id id); void setDecorateDisplayNames(bool on); + template<class Worker> + RunWorkerFactory *addRunWorkerFactory(Core::Id runMode) + { + return addRunWorkerFactoryHelper(runMode, [](RunControl *rc) { return new Worker(rc); }); + } + private: + RunWorkerFactory *addRunWorkerFactoryHelper + (Core::Id runMode, const std::function<RunWorker *(RunControl *)> &creator); + RunConfigurationFactory(const RunConfigurationFactory &) = delete; RunConfigurationFactory operator=(const RunConfigurationFactory &) = delete; @@ -319,6 +331,8 @@ private: QList<Core::Id> m_supportedProjectTypes; QList<Core::Id> m_supportedTargetDeviceTypes; bool m_decorateDisplayNames = false; + QList<RunWorkerFactory *> m_ownedRunWorkerFactories; + std::function<bool(RunConfiguration *)> m_ownTypeChecker; }; class PROJECTEXPLORER_EXPORT FixedRunConfigurationFactory : public RunConfigurationFactory @@ -403,7 +417,7 @@ protected: private: friend class Internal::RunControlPrivate; friend class Internal::RunWorkerPrivate; - Internal::RunWorkerPrivate *d; + const std::unique_ptr<Internal::RunWorkerPrivate> d; }; class PROJECTEXPLORER_EXPORT RunWorkerFactory @@ -412,17 +426,27 @@ public: using WorkerCreator = std::function<RunWorker *(RunControl *)>; using Constraint = std::function<bool(RunConfiguration *)>; - RunWorkerFactory(Core::Id mode, Constraint constr, const WorkerCreator &prod, - int prio = 0); + RunWorkerFactory(); + virtual ~RunWorkerFactory(); - bool canRun(RunConfiguration *runConfiguration, Core::Id m_runMode) const; + bool canRun(RunConfiguration *runConfiguration, Core::Id runMode) const; + + void setPriority(int priority); + void setProducer(const WorkerCreator &producer); + void addConstraint(const Constraint &constraint); + void addSupportedRunMode(Core::Id runMode); int priority() const { return m_priority; } WorkerCreator producer() const { return m_producer; } private: - Core::Id m_runMode; - Constraint m_constraint; + // FIXME: That's temporary until ownership has been transferred to + // the individual plugins. + friend class ProjectExplorerPlugin; + static void destroyRemainingRunWorkerFactories(); + + QList<Core::Id> m_supportedRunModes; + QList<Constraint> m_constraints; WorkerCreator m_producer; int m_priority = 0; }; @@ -473,7 +497,6 @@ public: RunConfiguration *runConfiguration() const; Project *project() const; - bool canReUseOutputPane(const RunControl *other) const; Utils::OutputFormatter *outputFormatter() const; Core::Id runMode() const; @@ -498,20 +521,19 @@ public: static void registerWorker(Core::Id runMode, const WorkerCreator &producer, const Constraint &constraint = {}) { - addWorkerFactory({runMode, constraint, producer}); + auto factory = new RunWorkerFactory; + factory->setProducer(producer); + factory->addSupportedRunMode(runMode); + factory->addConstraint(constraint); } template <class Worker> static void registerWorker(Core::Id runMode, const Constraint &constraint, int priority = 0) { - auto producer = [](RunControl *rc) { return new Worker(rc); }; - addWorkerFactory({runMode, constraint, producer, priority}); - } - template <class Config, class Worker> - static void registerWorker(Core::Id runMode, int priority = 0) - { - auto constraint = [](RunConfiguration *runConfig) { return qobject_cast<Config *>(runConfig) != nullptr; }; - auto producer = [](RunControl *rc) { return new Worker(rc); }; - addWorkerFactory({runMode, constraint, producer, priority}); + auto factory = new RunWorkerFactory; + factory->setProducer([](RunControl *rc) { return new Worker(rc); }); + factory->addSupportedRunMode(runMode); + factory->addConstraint(constraint); + factory->setPriority(priority); } static WorkerCreator producer(RunConfiguration *runConfiguration, Core::Id runMode); @@ -529,8 +551,7 @@ private: friend class RunWorker; friend class Internal::RunWorkerPrivate; - static void addWorkerFactory(const RunWorkerFactory &workerFactory); - Internal::RunControlPrivate *d; + const std::unique_ptr<Internal::RunControlPrivate> d; }; @@ -564,6 +585,7 @@ private: Runnable m_runnable; IDevice::ConstPtr m_device; bool m_stopReported = false; + bool m_useTerminal = false; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/runconfigurationaspects.cpp b/src/plugins/projectexplorer/runconfigurationaspects.cpp index f2f71a9ba6..6d9d51f48e 100644 --- a/src/plugins/projectexplorer/runconfigurationaspects.cpp +++ b/src/plugins/projectexplorer/runconfigurationaspects.cpp @@ -111,16 +111,6 @@ bool TerminalAspect::isUserSet() const return m_userSet; } -ApplicationLauncher::Mode TerminalAspect::runMode() const -{ - return m_useTerminal ? ApplicationLauncher::Console : ApplicationLauncher::Gui; -} - -void TerminalAspect::setRunMode(ApplicationLauncher::Mode runMode) -{ - setUseTerminal(runMode == ApplicationLauncher::Console); -} - /*! \class ProjectExplorer::WorkingDirectoryAspect */ diff --git a/src/plugins/projectexplorer/runconfigurationaspects.h b/src/plugins/projectexplorer/runconfigurationaspects.h index 8a393e4063..26d56b4080 100644 --- a/src/plugins/projectexplorer/runconfigurationaspects.h +++ b/src/plugins/projectexplorer/runconfigurationaspects.h @@ -55,9 +55,6 @@ public: bool useTerminal() const; void setUseTerminal(bool useTerminal); - ApplicationLauncher::Mode runMode() const; - void setRunMode(ApplicationLauncher::Mode runMode); - bool isUserSet() const; private: diff --git a/src/plugins/projectexplorer/selectablefilesmodel.cpp b/src/plugins/projectexplorer/selectablefilesmodel.cpp index a8fce7aee4..6895a6457e 100644 --- a/src/plugins/projectexplorer/selectablefilesmodel.cpp +++ b/src/plugins/projectexplorer/selectablefilesmodel.cpp @@ -700,7 +700,7 @@ void SelectableFilesWidget::parsingFinished() const Utils::FileNameList preservedFiles = m_model->preservedFiles(); m_preservedFilesLabel->setText(tr("Not showing %n files that are outside of the base directory.\n" - "These files are preserved.", 0, preservedFiles.count())); + "These files are preserved.", nullptr, preservedFiles.count())); enableWidgets(true); } diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp index 3f446f282e..29d5e2f945 100644 --- a/src/plugins/projectexplorer/session.cpp +++ b/src/plugins/projectexplorer/session.cpp @@ -140,9 +140,9 @@ SessionManager::SessionManager(QObject *parent) : QObject(parent) connect(this, &SessionManager::projectDisplayNameChanged, EditorManager::instance(), &EditorManager::updateWindowTitles); connect(EditorManager::instance(), &EditorManager::editorOpened, - this, [] { markSessionFileDirty(); }); + this, &SessionManager::markSessionFileDirty); connect(EditorManager::instance(), &EditorManager::editorsClosed, - this, [] { markSessionFileDirty(); }); + this, &SessionManager::markSessionFileDirty); EditorManager::setWindowTitleAdditionHandler(&SessionManagerPrivate::windowTitleAddition); EditorManager::setSessionTitleHandler(&SessionManagerPrivate::sessionTitle); @@ -153,6 +153,7 @@ SessionManager::~SessionManager() emit m_instance->aboutToUnloadSession(d->m_sessionName); delete d->m_writer; delete d; + d = nullptr; } SessionManager *SessionManager::instance() @@ -719,7 +720,6 @@ void SessionManager::setValue(const QString &name, const QVariant &value) if (d->m_values.value(name) == value) return; d->m_values.insert(name, value); - markSessionFileDirty(false); } QVariant SessionManager::value(const QString &name) @@ -1052,10 +1052,9 @@ void SessionManager::reportProjectLoadingProgress() d->sessionLoadingProgress(); } -void SessionManager::markSessionFileDirty(bool makeDefaultVirginDirty) +void SessionManager::markSessionFileDirty() { - if (makeDefaultVirginDirty) - d->m_virginSession = false; + d->m_virginSession = false; } void SessionManagerPrivate::sessionLoadingProgress() diff --git a/src/plugins/projectexplorer/session.h b/src/plugins/projectexplorer/session.h index 938a7bc5fe..489536cf75 100644 --- a/src/plugins/projectexplorer/session.h +++ b/src/plugins/projectexplorer/session.h @@ -136,7 +136,7 @@ signals: // for tests only private: static void saveActiveMode(Core::Id mode); static void configureEditor(Core::IEditor *editor, const QString &fileName); - static void markSessionFileDirty(bool makeDefaultVirginDirty = true); + static void markSessionFileDirty(); static void configureEditors(Project *project); }; diff --git a/src/plugins/projectexplorer/sessiondialog.cpp b/src/plugins/projectexplorer/sessiondialog.cpp index 5145bd0c7e..2dfb944a35 100644 --- a/src/plugins/projectexplorer/sessiondialog.cpp +++ b/src/plugins/projectexplorer/sessiondialog.cpp @@ -39,8 +39,8 @@ class SessionValidator : public QValidator { public: SessionValidator(QObject *parent, const QStringList &sessions); - void fixup(QString & input) const; - QValidator::State validate(QString & input, int & pos) const; + void fixup(QString & input) const override; + QValidator::State validate(QString & input, int & pos) const override; private: QStringList m_sessions; }; diff --git a/src/plugins/projectexplorer/sessionview.cpp b/src/plugins/projectexplorer/sessionview.cpp index 3f99aa6794..4e3bda6510 100644 --- a/src/plugins/projectexplorer/sessionview.cpp +++ b/src/plugins/projectexplorer/sessionview.cpp @@ -42,7 +42,7 @@ public: } protected: - void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; + void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; }; void RemoveItemFocusDelegate::paint(QPainter* painter, const QStyleOptionViewItem & option, const QModelIndex &index) const diff --git a/src/plugins/projectexplorer/subscription.cpp b/src/plugins/projectexplorer/subscription.cpp index 891a60adcb..3a84235132 100644 --- a/src/plugins/projectexplorer/subscription.cpp +++ b/src/plugins/projectexplorer/subscription.cpp @@ -27,6 +27,7 @@ #include "project.h" #include "projectconfiguration.h" +#include "session.h" #include "target.h" #include <utils/qtcassert.h> @@ -37,13 +38,8 @@ namespace Internal { Subscription::Subscription(const Subscription::Connector &s, const QObject *receiver, QObject *parent) : QObject(parent), m_subscriber(s) { - if (receiver != parent) { - connect(receiver, &QObject::destroyed, this, [this]() { - unsubscribeAll(); - m_subscriber = Connector(); // Reset subscriber - deleteLater(); - }); - } + if (receiver != parent) + connect(receiver, &QObject::destroyed, this, &Subscription::destroy); } Subscription::~Subscription() @@ -58,12 +54,7 @@ void Subscription::subscribe(ProjectConfiguration *pc) connectTo(pc); - if (auto p = qobject_cast<Project *>(pc)) { - for (Target *t : p->targets()) { - for (ProjectConfiguration *pc : t->projectConfigurations()) - connectTo(pc); - } - } else if (auto t = qobject_cast<Target *>(pc)) { + if (auto t = qobject_cast<Target *>(pc)) { for (ProjectConfiguration *pc : t->projectConfigurations()) connectTo(pc); } @@ -73,14 +64,9 @@ void Subscription::unsubscribe(ProjectConfiguration *pc) { disconnectFrom(pc); - if (auto p = qobject_cast<Project *>(pc)) { - for (Target *t : p->targets()) { - for (ProjectConfiguration *pc : t->projectConfigurations()) - unsubscribe(pc); - } - } else if (auto t = qobject_cast<Target *>(pc)) { + if (auto t = qobject_cast<Target *>(pc)) { for (ProjectConfiguration *pc : t->projectConfigurations()) - unsubscribe(pc); + disconnectFrom(pc); } } @@ -93,6 +79,9 @@ void Subscription::unsubscribeAll() void Subscription::connectTo(ProjectConfiguration *pc) { + if (!m_subscriber) + return; // May happen during shutdown of a subscription + QTC_ASSERT(!m_connections.contains(pc), return); QMetaObject::Connection conn = m_subscriber(pc); @@ -110,18 +99,27 @@ void Subscription::disconnectFrom(ProjectConfiguration *pc) m_connections.remove(pc); } +void Subscription::destroy() +{ + unsubscribeAll(); + m_subscriber = Connector(); // Reset subscriber + deleteLater(); +} + ProjectSubscription::ProjectSubscription(const Subscription::Connector &s, const QObject *r, Project *p) : Subscription(s, r, p) { - if (m_subscriber) { - for (const Target *t : p->targets()) { - for (ProjectConfiguration *pc : t->projectConfigurations()) - m_subscriber(pc); - } - connect(p, &Project::addedProjectConfiguration, this, &ProjectSubscription::subscribe); - connect(p, &Project::removedProjectConfiguration, this, &ProjectSubscription::unsubscribe); - } + QTC_ASSERT(m_subscriber, return); + + for (Target *t : p->targets()) + subscribe(t); + + // Disconnect on removal of a project, to make it save to remove/add a project: + connect(SessionManager::instance(), &SessionManager::projectRemoved, + this, [this, p](Project *reported) { if (p == reported) { destroy(); } }); + connect(p, &Project::addedProjectConfiguration, this, &ProjectSubscription::subscribe); + connect(p, &Project::removedProjectConfiguration, this, &ProjectSubscription::unsubscribe); } ProjectSubscription::~ProjectSubscription() = default; @@ -130,8 +128,13 @@ TargetSubscription::TargetSubscription(const Subscription::Connector &s, const Q Target *t) : Subscription(s, r, t) { - for (ProjectConfiguration *pc : t->projectConfigurations()) - m_subscriber(pc); + QTC_ASSERT(m_subscriber, return); + + subscribe(t); + + // Disconnect on removal of a target, to make it save to remove/add a target: + connect(t->project(), &Project::removedTarget, this, + [t, this](const Target *reportedTarget) { if (t == reportedTarget) { destroy(); } }); connect(t, &Target::addedProjectConfiguration, this, &TargetSubscription::subscribe); connect(t, &Target::removedProjectConfiguration, this, &TargetSubscription::unsubscribe); } diff --git a/src/plugins/projectexplorer/subscription.h b/src/plugins/projectexplorer/subscription.h index 819a11d1f1..71aa3596f3 100644 --- a/src/plugins/projectexplorer/subscription.h +++ b/src/plugins/projectexplorer/subscription.h @@ -57,6 +57,8 @@ protected: void connectTo(ProjectConfiguration *pc); void disconnectFrom(ProjectConfiguration *pc); + void destroy(); + Connector m_subscriber; QHash<ProjectConfiguration *, QMetaObject::Connection> m_connections; }; diff --git a/src/plugins/projectexplorer/target.cpp b/src/plugins/projectexplorer/target.cpp index 52afed0347..452fcce1b4 100644 --- a/src/plugins/projectexplorer/target.cpp +++ b/src/plugins/projectexplorer/target.cpp @@ -92,11 +92,11 @@ public: QIcon m_overlayIcon; QList<BuildConfiguration *> m_buildConfigurations; - BuildConfiguration *m_activeBuildConfiguration = 0; + BuildConfiguration *m_activeBuildConfiguration = nullptr; QList<DeployConfiguration *> m_deployConfigurations; - DeployConfiguration *m_activeDeployConfiguration = 0; + DeployConfiguration *m_activeDeployConfiguration = nullptr; QList<RunConfiguration *> m_runConfigurations; - RunConfiguration* m_activeRunConfiguration = 0; + RunConfiguration* m_activeRunConfiguration = nullptr; DeploymentData m_deploymentData; BuildTargetInfoList m_appTargets; QVariantMap m_pluginSettings; @@ -108,9 +108,9 @@ TargetPrivate::TargetPrivate(Kit *k) : m_kit(k) { } -Target::Target(Project *project, Kit *k) : +Target::Target(Project *project, Kit *k, _constructor_tag) : ProjectConfiguration(project, k->id()), - d(new TargetPrivate(k)) + d(std::make_unique<TargetPrivate>(k)) { QTC_CHECK(d->m_kit); connect(DeviceManager::instance(), &DeviceManager::updated, this, &Target::updateDeviceState); @@ -144,7 +144,6 @@ Target::~Target() qDeleteAll(d->m_buildConfigurations); qDeleteAll(d->m_deployConfigurations); qDeleteAll(d->m_runConfigurations); - delete d; } void Target::handleKitUpdates(Kit *k) @@ -358,9 +357,9 @@ BuildTargetInfoList Target::applicationTargets() const QList<ProjectConfiguration *> Target::projectConfigurations() const { QList<ProjectConfiguration *> result; - result.append(Utils::qobject_container_cast<ProjectConfiguration *>(buildConfigurations())); - result.append(Utils::qobject_container_cast<ProjectConfiguration *>(deployConfigurations())); - result.append(Utils::qobject_container_cast<ProjectConfiguration *>(runConfigurations())); + result.append(Utils::static_container_cast<ProjectConfiguration *>(buildConfigurations())); + result.append(Utils::static_container_cast<ProjectConfiguration *>(deployConfigurations())); + result.append(Utils::static_container_cast<ProjectConfiguration *>(runConfigurations())); return result; } diff --git a/src/plugins/projectexplorer/target.h b/src/plugins/projectexplorer/target.h index 8f4e544db2..233fc40b54 100644 --- a/src/plugins/projectexplorer/target.h +++ b/src/plugins/projectexplorer/target.h @@ -30,6 +30,8 @@ #include "subscription.h" +#include <memory> + QT_FORWARD_DECLARE_CLASS(QIcon) namespace Utils { class Environment; } @@ -54,7 +56,10 @@ class PROJECTEXPLORER_EXPORT Target : public ProjectConfiguration friend class SessionManager; // for setActiveBuild and setActiveDeployConfiguration Q_OBJECT + struct _constructor_tag { explicit _constructor_tag() = default; }; + public: + Target(Project *parent, Kit *k, _constructor_tag); ~Target() override; Project *project() const override; @@ -164,7 +169,6 @@ signals: void applicationTargetsChanged(); private: - Target(Project *parent, Kit *k); void setEnabled(bool); bool fromMap(const QVariantMap &map) override; @@ -178,7 +182,7 @@ private: void setActiveBuildConfiguration(BuildConfiguration *configuration); void setActiveDeployConfiguration(DeployConfiguration *configuration); - TargetPrivate *d; + const std::unique_ptr<TargetPrivate> d; friend class Project; }; diff --git a/src/plugins/projectexplorer/targetsettingspanel.cpp b/src/plugins/projectexplorer/targetsettingspanel.cpp index b6789293df..78d7daabc8 100644 --- a/src/plugins/projectexplorer/targetsettingspanel.cpp +++ b/src/plugins/projectexplorer/targetsettingspanel.cpp @@ -208,7 +208,7 @@ class TargetGroupItemPrivate : public QObject public: TargetGroupItemPrivate(TargetGroupItem *q, Project *project); - ~TargetGroupItemPrivate(); + ~TargetGroupItemPrivate() override; void handleRemovedKit(Kit *kit); void handleAddedKit(Kit *kit); @@ -302,7 +302,7 @@ public: Qt::ItemFlags flags(int column) const override { Q_UNUSED(column) - return m_kitErrorsForProject ? Qt::ItemFlags(0) + return m_kitErrorsForProject ? Qt::ItemFlags({}) : Qt::ItemFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); } @@ -375,7 +375,7 @@ public: Q_UNUSED(column) if (role == ContextMenuItemAdderRole) { - QMenu *menu = data.value<QMenu *>(); + auto *menu = data.value<QMenu *>(); addToContextMenu(menu); return true; } @@ -663,7 +663,7 @@ public: { Q_UNUSED(column) if (role == ContextMenuItemAdderRole) { - QMenu *menu = data.value<QMenu *>(); + auto *menu = data.value<QMenu *>(); auto enableAction = menu->addAction(tr("Enable Kit")); enableAction->setEnabled(!isEnabled()); QObject::connect(enableAction, &QAction::triggered, [this] { @@ -690,22 +690,19 @@ public: }; TargetGroupItem::TargetGroupItem(const QString &displayName, Project *project) - : d(new TargetGroupItemPrivate(this, project)) + : d(std::make_unique<TargetGroupItemPrivate>(this, project)) { d->m_displayName = displayName; QObject::connect(project, &Project::addedTarget, - d, &TargetGroupItemPrivate::handleTargetAdded, + d.get(), &TargetGroupItemPrivate::handleTargetAdded, Qt::QueuedConnection); QObject::connect(project, &Project::removedTarget, - d, &TargetGroupItemPrivate::handleTargetRemoved); + d.get(), &TargetGroupItemPrivate::handleTargetRemoved); QObject::connect(project, &Project::activeTargetChanged, - d, &TargetGroupItemPrivate::handleTargetChanged, Qt::QueuedConnection); + d.get(), &TargetGroupItemPrivate::handleTargetChanged, Qt::QueuedConnection); } -TargetGroupItem::~TargetGroupItem() -{ - delete d; -} +TargetGroupItem::~TargetGroupItem() = default; TargetGroupItemPrivate::TargetGroupItemPrivate(TargetGroupItem *q, Project *project) : q(q), m_project(project) @@ -805,7 +802,7 @@ void TargetItem::updateSubItems() if (childCount() == 0 && isEnabled()) m_currentChild = DefaultPage; // We will add children below. removeChildren(); - if (isEnabled()) { + if (isEnabled() && !m_kitErrorsForProject) { if (m_project->needsBuildConfigurations()) appendChild(new BuildOrRunItem(m_project, m_kitId, BuildOrRunItem::BuildPage)); appendChild(new BuildOrRunItem(m_project, m_kitId, BuildOrRunItem::RunPage)); diff --git a/src/plugins/projectexplorer/targetsettingspanel.h b/src/plugins/projectexplorer/targetsettingspanel.h index 120f112a09..2a6cb04461 100644 --- a/src/plugins/projectexplorer/targetsettingspanel.h +++ b/src/plugins/projectexplorer/targetsettingspanel.h @@ -31,6 +31,8 @@ #include <QCoreApplication> +#include <memory> + namespace ProjectExplorer { class Target; @@ -57,7 +59,7 @@ public: TargetItem *targetItem(Target *target) const; private: - TargetGroupItemPrivate *d; + const std::unique_ptr<TargetGroupItemPrivate> d; }; } // namespace Internal diff --git a/src/plugins/projectexplorer/targetsetuppage.cpp b/src/plugins/projectexplorer/targetsetuppage.cpp index bc99334c93..94185f7c8f 100644 --- a/src/plugins/projectexplorer/targetsetuppage.cpp +++ b/src/plugins/projectexplorer/targetsetuppage.cpp @@ -529,13 +529,13 @@ TargetSetupWidget *TargetSetupPage::addWidget(Kit *k) if (factory) return factory->availableSetups(k, m_projectPath); - BuildInfo *info = new BuildInfo(nullptr); + auto *info = new BuildInfo(nullptr); info->kitId = k->id(); return QList<BuildInfo *>({info}); }(); // Not all projects have BuildConfigurations, that is perfectly fine. - TargetSetupWidget *widget = new TargetSetupWidget(k, m_projectPath); + auto *widget = new TargetSetupWidget(k, m_projectPath); m_baseLayout->removeWidget(m_importWidget); foreach (QWidget *potentialWidget, m_potentialWidgets) diff --git a/src/plugins/projectexplorer/targetsetupwidget.cpp b/src/plugins/projectexplorer/targetsetupwidget.cpp index b59f3dbb56..9635128415 100644 --- a/src/plugins/projectexplorer/targetsetupwidget.cpp +++ b/src/plugins/projectexplorer/targetsetupwidget.cpp @@ -149,7 +149,7 @@ void TargetSetupWidget::addBuildInfo(BuildInfo *info, bool isImport) m_haveImported = true; } - const int pos = static_cast<int>(m_infoStore.size()); + const auto pos = static_cast<int>(m_infoStore.size()); BuildInfoStore store; store.buildInfo = info; @@ -233,7 +233,7 @@ QList<BuildInfo *> TargetSetupWidget::buildInfoList(const Kit *k, const QString if (factory) return factory->availableSetups(k, projectPath); - BuildInfo *info = new BuildInfo(nullptr); + auto *info = new BuildInfo(nullptr); info->kitId = k->id(); return QList<BuildInfo *>({info}); } @@ -303,7 +303,7 @@ void TargetSetupWidget::pathChanged() void TargetSetupWidget::reportIssues(int index) { - const int size = static_cast<int>(m_infoStore.size()); + const auto size = static_cast<int>(m_infoStore.size()); QTC_ASSERT(index >= 0 && index < size, return); BuildInfoStore &store = m_infoStore[static_cast<size_t>(index)]; diff --git a/src/plugins/projectexplorer/taskhub.cpp b/src/plugins/projectexplorer/taskhub.cpp index 726034f066..5ed8aa9677 100644 --- a/src/plugins/projectexplorer/taskhub.cpp +++ b/src/plugins/projectexplorer/taskhub.cpp @@ -76,12 +76,12 @@ public: setVisible(!task.icon.isNull()); } - bool isClickable() const; - void clicked(); + bool isClickable() const override; + void clicked() override; - void updateFileName(const FileName &fileName); - void updateLineNumber(int lineNumber); - void removedFromEditor(); + void updateFileName(const FileName &fileName) override; + void updateLineNumber(int lineNumber) override; + void removedFromEditor() override; private: unsigned int m_id; }; diff --git a/src/plugins/projectexplorer/taskmodel.cpp b/src/plugins/projectexplorer/taskmodel.cpp index 0b3381fadc..a7ac388487 100644 --- a/src/plugins/projectexplorer/taskmodel.cpp +++ b/src/plugins/projectexplorer/taskmodel.cpp @@ -161,7 +161,7 @@ void TaskModel::updateTaskLineNumber(unsigned int id, int line) void TaskModel::clearTasks(Core::Id categoryId) { - typedef QHash<Core::Id,CategoryData>::ConstIterator IdCategoryConstIt; + using IdCategoryConstIt = QHash<Core::Id,CategoryData>::ConstIterator; if (!categoryId.isValid()) { if (m_tasks.isEmpty()) diff --git a/src/plugins/projectexplorer/taskwindow.cpp b/src/plugins/projectexplorer/taskwindow.cpp index 79255cd367..9c9ca6e832 100644 --- a/src/plugins/projectexplorer/taskwindow.cpp +++ b/src/plugins/projectexplorer/taskwindow.cpp @@ -74,9 +74,9 @@ namespace Internal { class TaskView : public Utils::ListView { public: - TaskView(QWidget *parent = 0); - ~TaskView(); - void resizeEvent(QResizeEvent *e); + TaskView(QWidget *parent = nullptr); + ~TaskView() override; + void resizeEvent(QResizeEvent *e) override; }; class TaskWindowContext : public Core::IContext @@ -92,10 +92,10 @@ class TaskDelegate : public QStyledItemDelegate friend class TaskView; // for using Positions::minimumSize() public: - TaskDelegate(QObject * parent = 0); - ~TaskDelegate(); - void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; - QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; + TaskDelegate(QObject * parent = nullptr); + ~TaskDelegate() override; + void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; + QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override; // TaskView uses this method if the size of the taskview changes void emitSizeHintChanged(const QModelIndex &index); @@ -105,7 +105,7 @@ public: private: void generateGradientPixmap(int width, int height, QColor color, bool selected) const; - mutable int m_cachedHeight; + mutable int m_cachedHeight = 0; mutable QFont m_cachedFont; /* @@ -194,8 +194,7 @@ TaskView::TaskView(QWidget *parent) verticalScrollBar()->setSingleStep(vStepSize); } -TaskView::~TaskView() -{ } +TaskView::~TaskView() = default; void TaskView::resizeEvent(QResizeEvent *e) { @@ -243,7 +242,7 @@ static QToolButton *createFilterButton(const QIcon &icon, const QString &toolTip return button; } -TaskWindow::TaskWindow() : d(new TaskWindowPrivate) +TaskWindow::TaskWindow() : d(std::make_unique<TaskWindowPrivate>()) { d->m_model = new Internal::TaskModel(this); d->m_filter = new Internal::TaskFilterModel(d->m_model); @@ -253,7 +252,7 @@ TaskWindow::TaskWindow() : d(new TaskWindowPrivate) d->m_listview->setFrameStyle(QFrame::NoFrame); d->m_listview->setWindowTitle(displayName()); d->m_listview->setSelectionMode(QAbstractItemView::SingleSelection); - Internal::TaskDelegate *tld = new Internal::TaskDelegate(this); + auto *tld = new Internal::TaskDelegate(this); d->m_listview->setItemDelegate(tld); d->m_listview->setWindowIcon(Icons::WINDOW.icon()); d->m_listview->setContextMenuPolicy(Qt::ActionsContextMenu); @@ -322,7 +321,6 @@ TaskWindow::~TaskWindow() delete d->m_listview; delete d->m_filter; delete d->m_model; - delete d; } void TaskWindow::delayedInitialization() @@ -533,7 +531,7 @@ void TaskWindow::setShowWarnings(bool show) void TaskWindow::updateCategoriesMenu() { - typedef QMap<QString, Core::Id>::ConstIterator NameToIdsConstIt; + using NameToIdsConstIt = QMap<QString, Core::Id>::ConstIterator; d->m_categoriesMenu->clear(); @@ -670,13 +668,10 @@ bool TaskWindow::canNavigate() const ///// TaskDelegate::TaskDelegate(QObject *parent) : - QStyledItemDelegate(parent), - m_cachedHeight(0) + QStyledItemDelegate(parent) { } -TaskDelegate::~TaskDelegate() -{ -} +TaskDelegate::~TaskDelegate() = default; QSize TaskDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { diff --git a/src/plugins/projectexplorer/taskwindow.h b/src/plugins/projectexplorer/taskwindow.h index 267402ad1b..290927b47b 100644 --- a/src/plugins/projectexplorer/taskwindow.h +++ b/src/plugins/projectexplorer/taskwindow.h @@ -28,6 +28,8 @@ #include <coreplugin/id.h> #include <coreplugin/ioutputpane.h> +#include <memory> + QT_BEGIN_NAMESPACE class QAction; class QModelIndex; @@ -100,7 +102,7 @@ private: int sizeHintForColumn(int column) const; - TaskWindowPrivate *d; + const std::unique_ptr<TaskWindowPrivate> d; }; } // namespace Internal diff --git a/src/plugins/projectexplorer/toolchain.cpp b/src/plugins/projectexplorer/toolchain.cpp index 4cc3ee120d..e0c1b113a8 100644 --- a/src/plugins/projectexplorer/toolchain.cpp +++ b/src/plugins/projectexplorer/toolchain.cpp @@ -53,7 +53,7 @@ namespace Internal { class ToolChainPrivate { public: - typedef ToolChain::Detection Detection; + using Detection = ToolChain::Detection; explicit ToolChainPrivate(Core::Id typeId, Detection d) : m_id(QUuid::createUuid().toByteArray()), @@ -117,12 +117,11 @@ QString languageId(Language l) // -------------------------------------------------------------------------- ToolChain::ToolChain(Core::Id typeId, Detection d) : - d(new Internal::ToolChainPrivate(typeId, d)) + d(std::make_unique<Internal::ToolChainPrivate>(typeId, d)) { } -ToolChain::ToolChain(const ToolChain &other) : - d(new Internal::ToolChainPrivate(other.d->m_typeId, ManualDetection)) +ToolChain::ToolChain(const ToolChain &other) : ToolChain(other.d->m_typeId, ManualDetection) { d->m_language = other.d->m_language; @@ -140,10 +139,7 @@ void ToolChain::setLanguage(Core::Id language) d->m_language = language; } -ToolChain::~ToolChain() -{ - delete d; -} +ToolChain::~ToolChain() = default; QString ToolChain::displayName() const { diff --git a/src/plugins/projectexplorer/toolchain.h b/src/plugins/projectexplorer/toolchain.h index 59f3b7a402..0f463bf801 100644 --- a/src/plugins/projectexplorer/toolchain.h +++ b/src/plugins/projectexplorer/toolchain.h @@ -39,6 +39,7 @@ #include <QVariantMap> #include <functional> +#include <memory> namespace Utils { class Environment; } @@ -168,7 +169,7 @@ protected: private: void setDetection(Detection d); - Internal::ToolChainPrivate *const d; + const std::unique_ptr<Internal::ToolChainPrivate> d; friend class Internal::ToolChainSettingsAccessor; friend class ToolChainFactory; diff --git a/src/plugins/projectexplorer/toolchainmanager.cpp b/src/plugins/projectexplorer/toolchainmanager.cpp index acaeb8b7d7..2a5c899570 100644 --- a/src/plugins/projectexplorer/toolchainmanager.cpp +++ b/src/plugins/projectexplorer/toolchainmanager.cpp @@ -76,7 +76,7 @@ ToolChainManagerPrivate::~ToolChainManagerPrivate() } static ToolChainManager *m_instance = nullptr; -static ToolChainManagerPrivate *d; +static ToolChainManagerPrivate *d = nullptr; } // namespace Internal @@ -103,8 +103,9 @@ ToolChainManager::ToolChainManager(QObject *parent) : ToolChainManager::~ToolChainManager() { - delete d; m_instance = nullptr; + delete d; + d = nullptr; } ToolChainManager *ToolChainManager::instance() diff --git a/src/plugins/projectexplorer/toolchainoptionspage.cpp b/src/plugins/projectexplorer/toolchainoptionspage.cpp index 15ebda4998..562c7c6d62 100644 --- a/src/plugins/projectexplorer/toolchainoptionspage.cpp +++ b/src/plugins/projectexplorer/toolchainoptionspage.cpp @@ -75,7 +75,7 @@ public: } } - QVariant data(int column, int role) const + QVariant data(int column, int role) const override { switch (role) { case Qt::DisplayRole: diff --git a/src/plugins/projectexplorer/toolchainsettingsaccessor.cpp b/src/plugins/projectexplorer/toolchainsettingsaccessor.cpp index 301ab75071..39b465bea4 100644 --- a/src/plugins/projectexplorer/toolchainsettingsaccessor.cpp +++ b/src/plugins/projectexplorer/toolchainsettingsaccessor.cpp @@ -287,7 +287,7 @@ QList<ToolChain *> ToolChainSettingsAccessor::toolChains(const QVariantMap &data namespace ProjectExplorer { -typedef QList<ToolChain *> TCList; +using TCList = QList<ToolChain *>; class TTC : public ToolChain { diff --git a/src/plugins/projectexplorer/userfileaccessor.cpp b/src/plugins/projectexplorer/userfileaccessor.cpp index 8b40e798c3..84080445c4 100644 --- a/src/plugins/projectexplorer/userfileaccessor.cpp +++ b/src/plugins/projectexplorer/userfileaccessor.cpp @@ -52,159 +52,6 @@ const char OBSOLETE_VERSION_KEY[] = "ProjectExplorer.Project.Updater.FileVersion const char SHARED_SETTINGS[] = "SharedSettings"; const char USER_STICKY_KEYS_KEY[] = "UserStickyKeys"; -// Version 1 is used in master post Qt Creator 1.3.x. -// It was never used in any official release but is required for the -// transition to later versions (which introduce support for targets). -class UserFileVersion1Upgrader : public VersionUpgrader -{ -public: - UserFileVersion1Upgrader(UserFileAccessor *a) : VersionUpgrader(1, "1.3+git"), m_accessor(a) { } - QVariantMap upgrade(const QVariantMap &map); - -private: - struct TargetDescription - { - TargetDescription(const QString &tid, const QString &dn) : - id(tid), - displayName(dn) - { } - - QString id; - QString displayName; - }; - - UserFileAccessor *m_accessor; -}; - -// Version 2 is used in master post Qt Creator 2.0 alpha. -class UserFileVersion2Upgrader : public VersionUpgrader -{ -public: - UserFileVersion2Upgrader() : VersionUpgrader(2, "2.0-alpha+git") { } - QVariantMap upgrade(const QVariantMap &map) final; -}; - -// Version 3 reflect the move of symbian signing from run to build step. -class UserFileVersion3Upgrader : public VersionUpgrader -{ -public: - UserFileVersion3Upgrader() : VersionUpgrader(3, "2.0-alpha2+git") { } - QVariantMap upgrade(const QVariantMap &map) final; -}; - -// Version 4 reflects the introduction of deploy steps -class UserFileVersion4Upgrader : public VersionUpgrader -{ -public: - UserFileVersion4Upgrader() : VersionUpgrader(4, "2.1pre1") { } - QVariantMap upgrade(const QVariantMap &map) final; -}; - -// Version 5 reflects the introduction of new deploy steps for Symbian/Maemo -class UserFileVersion5Upgrader : public VersionUpgrader -{ -public: - UserFileVersion5Upgrader() : VersionUpgrader(5, "2.1pre2") { } - QVariantMap upgrade(const QVariantMap &map) final; -}; - -// Version 6 reflects the introduction of new deploy steps for Symbian/Maemo -class UserFileVersion6Upgrader : public VersionUpgrader -{ -public: - UserFileVersion6Upgrader() : VersionUpgrader(6, "2.1pre3") { } - QVariantMap upgrade(const QVariantMap &map) final; -}; - -// Version 7 reflects the introduction of new deploy configuration for Symbian -class UserFileVersion7Upgrader : public VersionUpgrader -{ -public: - UserFileVersion7Upgrader() : VersionUpgrader(7, "2.1pre4") { } - QVariantMap upgrade(const QVariantMap &map) final; -}; - -// Version 8 reflects the change of environment variable expansion rules, -// turning some env variables into expandos, the change of argument quoting rules, -// and the change of VariableManager's expansion syntax. -class UserFileVersion8Upgrader : public VersionUpgrader -{ -public: - // pre5 because we renamed 2.2 to 2.1 later, so people already have 2.2pre4 files - UserFileVersion8Upgrader() : VersionUpgrader(8, "2.2pre5") { } - QVariantMap upgrade(const QVariantMap &map) final; -}; - -// Version 9 reflects the refactoring of the Maemo deploy step. -class UserFileVersion9Upgrader : public VersionUpgrader -{ -public: - UserFileVersion9Upgrader() : VersionUpgrader(9, "2.3pre1") { } - QVariantMap upgrade(const QVariantMap &map) final; -}; - -// Version 10 introduces disabling buildsteps, and handles upgrading custom process steps -class UserFileVersion10Upgrader : public VersionUpgrader -{ -public: - UserFileVersion10Upgrader() : VersionUpgrader(10, "2.5pre1") { } - QVariantMap upgrade(const QVariantMap &map) final; -}; - -// Version 11 introduces kits -class UserFileVersion11Upgrader : public VersionUpgrader -{ -public: - UserFileVersion11Upgrader(UserFileAccessor *a) : VersionUpgrader(11, "2.6pre1"), m_accessor(a) { } - ~UserFileVersion11Upgrader() final; - - QVariantMap upgrade(const QVariantMap &map) final; - -private: - Kit *uniqueKit(Kit *k); - void addBuildConfiguration(Kit *k, const QVariantMap &bc, int bcPos, int bcCount); - void addDeployConfiguration(Kit *k, const QVariantMap &dc, int dcPos, int dcActive); - void addRunConfigurations(Kit *k, - const QMap<int, QVariantMap> &rcs, int activeRc, const QString &projectDir); - - void parseQtversionFile(); - void parseToolChainFile(); - - class ToolChainExtraData { - public: - explicit ToolChainExtraData(const QString &mks = QString(), const QString &d = QString()) : - m_mkspec(mks), m_debugger(d) - { } - - QString m_mkspec; - QString m_debugger; - }; - - QHash<QString, ToolChainExtraData> m_toolChainExtras; - QHash<int, QString> m_qtVersionExtras; - - QHash<Kit *, QVariantMap> m_targets; - UserFileAccessor *m_accessor; -}; - -// Version 12 reflects the move of environment settings from CMake/Qt4/Custom into -// LocalApplicationRunConfiguration -class UserFileVersion12Upgrader : public VersionUpgrader -{ -public: - UserFileVersion12Upgrader() : VersionUpgrader(12, "2.7pre1") { } - QVariantMap upgrade(const QVariantMap &map) final; -}; - -// Version 13 reflects the move of environment settings from LocalApplicationRunConfiguration -// into the EnvironmentAspect -class UserFileVersion13Upgrader : public VersionUpgrader -{ -public: - UserFileVersion13Upgrader() : VersionUpgrader(13, "2.8") { } - QVariantMap upgrade(const QVariantMap &map) final; -}; - // Version 14 Move builddir into BuildConfiguration class UserFileVersion14Upgrader : public VersionUpgrader { @@ -263,6 +110,18 @@ private: QVariantList m_sticky; }; +// Version 18 renames "AutotoolsProjectManager.MakeStep.AdditionalArguments" to +// "AutotoolsProjectManager.MakeStep.MakeArguments" to account for +// sharing the MakeStep implementation +class UserFileVersion18Upgrader : public VersionUpgrader +{ +public: + UserFileVersion18Upgrader() : VersionUpgrader(18, "4.8-pre1") { } + QVariantMap upgrade(const QVariantMap &map) final; + + static QVariant process(const QVariant &entry); +}; + } // namespace // @@ -421,7 +280,7 @@ public: FileNameList UserFileBackUpStrategy::readFileCandidates(const FileName &baseFileName) const { - const UserFileAccessor *const ac = static_cast<const UserFileAccessor *>(accessor()); + const auto *const ac = static_cast<const UserFileAccessor *>(accessor()); const FileName externalUser = ac->externalUserFile(); const FileName projectUser = ac->projectUserFile(); QTC_CHECK(!baseFileName.isEmpty()); @@ -458,23 +317,11 @@ UserFileAccessor::UserFileAccessor(Project *project) : setSettingsId(ProjectExplorerPlugin::projectExplorerSettings().environmentId.toByteArray()); // Register Upgraders: - addVersionUpgrader(std::make_unique<UserFileVersion1Upgrader>(this)); - addVersionUpgrader(std::make_unique<UserFileVersion2Upgrader>()); - addVersionUpgrader(std::make_unique<UserFileVersion3Upgrader>()); - addVersionUpgrader(std::make_unique<UserFileVersion4Upgrader>()); - addVersionUpgrader(std::make_unique<UserFileVersion5Upgrader>()); - addVersionUpgrader(std::make_unique<UserFileVersion6Upgrader>()); - addVersionUpgrader(std::make_unique<UserFileVersion7Upgrader>()); - addVersionUpgrader(std::make_unique<UserFileVersion8Upgrader>()); - addVersionUpgrader(std::make_unique<UserFileVersion9Upgrader>()); - addVersionUpgrader(std::make_unique<UserFileVersion10Upgrader>()); - addVersionUpgrader(std::make_unique<UserFileVersion11Upgrader>(this)); - addVersionUpgrader(std::make_unique<UserFileVersion12Upgrader>()); - addVersionUpgrader(std::make_unique<UserFileVersion13Upgrader>()); addVersionUpgrader(std::make_unique<UserFileVersion14Upgrader>()); addVersionUpgrader(std::make_unique<UserFileVersion15Upgrader>()); addVersionUpgrader(std::make_unique<UserFileVersion16Upgrader>()); addVersionUpgrader(std::make_unique<UserFileVersion17Upgrader>()); + addVersionUpgrader(std::make_unique<UserFileVersion18Upgrader>()); } Project *UserFileAccessor::project() const @@ -611,1291 +458,6 @@ QVariantMap UserFileAccessor::prepareToWriteSettings(const QVariantMap &data) co return result; } -// ------------------------------------------------------------------------- -// UserFileVersion1Upgrader: -// ------------------------------------------------------------------------- - -QVariantMap UserFileVersion1Upgrader::upgrade(const QVariantMap &map) -{ - QVariantMap result; - - // The only difference between version 1 and 2 of the user file is that - // we need to add targets. - - // Generate a list of all possible targets for the project: - Project *project = m_accessor->project(); - QList<TargetDescription> targets; - if (project->id() == "GenericProjectManager.GenericProject") - targets << TargetDescription(QString::fromLatin1("GenericProjectManager.GenericTarget"), - QCoreApplication::translate("GenericProjectManager::GenericTarget", - "Desktop", - "Generic desktop target display name")); - else if (project->id() == "CMakeProjectManager.CMakeProject") - targets << TargetDescription(QString::fromLatin1("CMakeProjectManager.DefaultCMakeTarget"), - QCoreApplication::translate("CMakeProjectManager::Internal::CMakeTarget", - "Desktop", - "CMake Default target display name")); - else if (project->id() == "Qt4ProjectManager.Qt4Project") - targets << TargetDescription(QString::fromLatin1("Qt4ProjectManager.Target.DesktopTarget"), - QCoreApplication::translate("QmakeProjectManager::Internal::Qt4Target", - "Desktop", - "Qt4 Desktop target display name")) - << TargetDescription(QString::fromLatin1("Qt4ProjectManager.Target.MaemoEmulatorTarget"), - QCoreApplication::translate("QmakeProjectManager::Internal::Qt4Target", - "Maemo Emulator", - "Qt4 Maemo Emulator target display name")) - << TargetDescription(QString::fromLatin1("Qt4ProjectManager.Target.MaemoDeviceTarget"), - QCoreApplication::translate("QmakeProjectManager::Internal::Qt4Target", - "Maemo Device", - "Qt4 Maemo Device target display name")); - else if (project->id() == "QmlProjectManager.QmlProject") - targets << TargetDescription(QString::fromLatin1("QmlProjectManager.QmlTarget"), - QCoreApplication::translate("QmlProjectManager::QmlTarget", - "QML Viewer", - "QML Viewer target display name")); - else - return QVariantMap(); // We do not know how to handle this. - - result.insert("ProjectExplorer.Project.ActiveTarget", 0); - result.insert("ProjectExplorer.Project.TargetCount", targets.count()); - int pos(0); - foreach (const TargetDescription &td, targets) { - QVariantMap targetMap; - // Do not set displayName or icon! - targetMap.insert("ProjectExplorer.ProjectConfiguration.Id", td.id); - - int count = map.value("ProjectExplorer.Project.BuildConfigurationCount").toInt(); - targetMap.insert("ProjectExplorer.Target.BuildConfigurationCount", count); - for (int i = 0; i < count; ++i) { - QString key(QString::fromLatin1("ProjectExplorer.Project.BuildConfiguration.") + QString::number(i)); - if (map.contains(key)) { - QVariantMap bcMap = map.value(key).toMap(); - if (!bcMap.contains("Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild")) - bcMap.insert("Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild", false); - targetMap.insert(QString::fromLatin1("ProjectExplorer.Target.BuildConfiguration.") + QString::number(i), - bcMap); - } - } - - count = map.value("ProjectExplorer.Project.RunConfigurationCount").toInt(); - for (int i = 0; i < count; ++i) { - QString key(QString::fromLatin1("ProjectExplorer.Project.RunConfiguration.") + QString::number(i)); - if (map.contains(key)) - targetMap.insert(QString::fromLatin1("ProjectExplorer.Target.RunConfiguration.") + QString::number(i), - map.value(key)); - } - - if (map.contains("ProjectExplorer.Project.ActiveBuildConfiguration")) - targetMap.insert("ProjectExplorer.Target.ActiveBuildConfiguration", - map.value("ProjectExplorer.Project.ActiveBuildConfiguration")); - if (map.contains("ProjectExplorer.Project.ActiveRunConfiguration")) - targetMap.insert("ProjectExplorer.Target.ActiveRunConfiguration", - map.value("ProjectExplorer.Project.ActiveRunConfiguration")); - if (map.contains("ProjectExplorer.Project.RunConfigurationCount")) - targetMap.insert("ProjectExplorer.Target.RunConfigurationCount", - map.value("ProjectExplorer.Project.RunConfigurationCount")); - - result.insert(QString::fromLatin1("ProjectExplorer.Project.Target.") + QString::number(pos), targetMap); - ++pos; - } - - // copy everything else: - for (QVariantMap::const_iterator i = map.constBegin(); i != map.constEnd(); ++i) { - if (i.key() == "ProjectExplorer.Project.ActiveBuildConfiguration" || - i.key() == "ProjectExplorer.Project.BuildConfigurationCount" || - i.key() == "ProjectExplorer.Project.ActiveRunConfiguration" || - i.key() == "ProjectExplorer.Project.RunConfigurationCount" || - i.key().startsWith("ProjectExplorer.Project.BuildConfiguration.") || - i.key().startsWith("ProjectExplorer.Project.RunConfiguration.")) - continue; - result.insert(i.key(), i.value()); - } - - return result; -} - -// ------------------------------------------------------------------------- -// UserFileVersion2Upgrader: -// ------------------------------------------------------------------------- - -QVariantMap UserFileVersion2Upgrader::upgrade(const QVariantMap &map) -{ - QList<Change> changes; - changes.append(qMakePair(QLatin1String("CMakeProjectManager.CMakeBuildConfiguration.UserEnvironmentChanges"), - QLatin1String("ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"))); - changes.append(qMakePair(QLatin1String("CMakeProjectManager.CMakeBuildConfiguration.ClearSystemEnvironment"), - QLatin1String("ProjectExplorer.BuildConfiguration.ClearSystemEnvironment"))); - changes.append(qMakePair(QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration.UserEnvironmentChanges"), - QLatin1String("ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"))); - changes.append(qMakePair(QLatin1String("Qt4ProjectManager.Qt4BuildConfiguration.ClearSystemEnvironment"), - QLatin1String("ProjectExplorer.BuildConfiguration.ClearSystemEnvironment"))); - - return renameKeys(changes, QVariantMap(map)); -} - -// ------------------------------------------------------------------------- -// UserFileVersion3Upgrader: -// ------------------------------------------------------------------------- - -// insert the additional build step: -//<valuemap key="ProjectExplorer.BuildConfiguration.BuildStep.2" type="QVariantMap"> -// <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Create sis Package</value> -// <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.S60SignBuildStep</value> -// <value key="Qt4ProjectManager.MakeStep.Clean" type="bool">false</value> -// <valuelist key="Qt4ProjectManager.MakeStep.MakeArguments" type="QVariantList"/> -// <value key="Qt4ProjectManager.MakeStep.MakeCommand" type="QString"></value> -// <value key="Qt4ProjectManager.S60CreatePackageStep.Certificate" type="QString"></value> -// <value key="Qt4ProjectManager.S60CreatePackageStep.Keyfile" type="QString"></value> -// <value key="Qt4ProjectManager.S60CreatePackageStep.SignMode" type="int">0</value> -//</valuemap> - -// remove the deprecated sign run settings from -//<valuemap key="ProjectExplorer.Target.RunConfiguration.0" type="QVariantMap"> -// <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">untitled1 on Symbian Device</value> -// <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.S60DeviceRunConfiguration</value> -// <valuelist key="Qt4ProjectManager.S60DeviceRunConfiguration.CommandLineArguments" type="QVariantList"/> -// <value key="Qt4ProjectManager.S60DeviceRunConfiguration.CustomKeyPath" type="QString"></value> -// <value key="Qt4ProjectManager.S60DeviceRunConfiguration.CustomSignaturePath" type="QString"></value> -// <value key="Qt4ProjectManager.S60DeviceRunConfiguration.ProFile" type="QString">untitled1.pro</value> -// <value key="Qt4ProjectManager.S60DeviceRunConfiguration.SerialPortName" type="QString">COM3</value> -// <value key="Qt4ProjectManager.S60DeviceRunConfiguration.SigningMode" type="int">0</value> -//</valuemap> - -QVariantMap UserFileVersion3Upgrader::upgrade(const QVariantMap &map) -{ - QVariantMap result; - QMapIterator<QString, QVariant> it(map); - while (it.hasNext()) { - it.next(); - const QString &targetKey = it.key(); - // check for target info - if (!targetKey.startsWith("ProjectExplorer.Project.Target.")) { - result.insert(targetKey, it.value()); - continue; - } - const QVariantMap &originalTarget = it.value().toMap(); - result.insert(targetKey, originalTarget); - } - return result; -} - -// ------------------------------------------------------------------------- -// UserFileVersion4Upgrader: -// ------------------------------------------------------------------------- - -// Move packaging steps from build steps into deploy steps -QVariantMap UserFileVersion4Upgrader::upgrade(const QVariantMap &map) -{ - QVariantMap result; - QMapIterator<QString, QVariant> it(map); - while (it.hasNext()) { - it.next(); - const QString &globalKey = it.key(); - // check for target info - if (!globalKey.startsWith("ProjectExplorer.Project.Target.")) { - result.insert(globalKey, it.value()); - continue; - } - const QVariantMap &originalTarget = it.value().toMap(); - // check for maemo device target - if (originalTarget.value("ProjectExplorer.ProjectConfiguration.Id") - != "Qt4ProjectManager.Target.MaemoDeviceTarget") - { - result.insert(globalKey, originalTarget); - continue; - } - - QVariantMap newTarget; - QMapIterator<QString, QVariant> targetIt(originalTarget); - while (targetIt.hasNext()) { - targetIt.next(); - const QString &targetKey = targetIt.key(); - - if (targetKey.startsWith("ProjectExplorer.Target.RunConfiguration.")) { - const QVariantMap &runConfigMap = targetIt.value().toMap(); - const QLatin1String maemoRcId("Qt4ProjectManager.MaemoRunConfiguration"); - if (runConfigMap.value("ProjectExplorer.ProjectConfiguration.Id").toString() - == maemoRcId) { - QVariantMap newRunConfigMap; - for (QVariantMap::ConstIterator rcMapIt = runConfigMap.constBegin(); - rcMapIt != runConfigMap.constEnd(); ++rcMapIt) { - const QLatin1String oldProFileKey(".ProFile"); - if (rcMapIt.key() == oldProFileKey) { - newRunConfigMap.insert(maemoRcId + oldProFileKey, - rcMapIt.value()); - } else { - newRunConfigMap.insert(rcMapIt.key(), - rcMapIt.value()); - } - } - newTarget.insert(targetKey, newRunConfigMap); - continue; - } - } - - if (!targetKey.startsWith("ProjectExplorer.Target.BuildConfiguration.")) { - newTarget.insert(targetKey, targetIt.value()); - continue; - } - - bool movedBs = false; - const QVariantMap &originalBc = targetIt.value().toMap(); - QVariantMap newBc; - QMapIterator<QString, QVariant> bcIt(originalBc); - while (bcIt.hasNext()) { - bcIt.next(); - const QString &bcKey = bcIt.key(); - if (!bcKey.startsWith("ProjectExplorer.BuildConfiguration.BuildStep.")) { - newBc.insert(bcKey, bcIt.value()); - continue; - } - - const QVariantMap &buildStep = bcIt.value().toMap(); - if ((buildStep.value("ProjectExplorer.ProjectConfiguration.Id").toString() == - "Qt4ProjectManager.S60SignBuildStep") - || (buildStep.value("ProjectExplorer.ProjectConfiguration.Id").toString() == - "Qt4ProjectManager.MaemoPackageCreationStep")) { - movedBs = true; - newBc.insert("ProjectExplorer.BuildConfiguration.DeployStep.0", buildStep); - } else { - newBc.insert(bcKey, buildStep); - } - } - if (movedBs) { - // adjust counts: - newBc.insert("ProjectExplorer.BuildConfiguration.DeployStepsCount", 1); - newBc.insert("ProjectExplorer.BuildConfiguration.BuildStepsCount", - newBc.value("ProjectExplorer.BuildConfiguration.BuildStepsCount").toInt() - 1); - } - newTarget.insert(targetKey, newBc); - } - result.insert(globalKey, newTarget); - } - return result; -} - -// ------------------------------------------------------------------------- -// UserFileVersion5Upgrader: -// ------------------------------------------------------------------------- - -// Move packaging steps from build steps into deploy steps -QVariantMap UserFileVersion5Upgrader::upgrade(const QVariantMap &map) -{ - QVariantMap result; - QMapIterator<QString, QVariant> it(map); - while (it.hasNext()) { - it.next(); - const QString &globalKey = it.key(); - // check for target info - if (!globalKey.startsWith("ProjectExplorer.Project.Target.")) { - result.insert(globalKey, it.value()); - continue; - } - const QVariantMap &originalTarget = it.value().toMap(); - // check for maemo device target - if (originalTarget.value("ProjectExplorer.ProjectConfiguration.Id") - != "Qt4ProjectManager.Target.MaemoDeviceTarget") { - result.insert(globalKey, originalTarget); - continue; - } - - QVariantMap newTarget; - QMapIterator<QString, QVariant> targetIt(originalTarget); - while (targetIt.hasNext()) { - targetIt.next(); - const QString &targetKey = targetIt.key(); - if (!targetKey.startsWith("ProjectExplorer.Target.BuildConfiguration.")) { - newTarget.insert(targetKey, targetIt.value()); - continue; - } - - const QVariantMap &originalBc = targetIt.value().toMap(); - QVariantMap newBc = originalBc; - QVariantMap newDeployStep; - - if (originalTarget.value("ProjectExplorer.ProjectConfiguration.Id") - == "Qt4ProjectManager.Target.S60DeviceTarget") { - newDeployStep.insert("ProjectExplorer.ProjectConfiguration.Id", - "Qt4ProjectManager.S60DeployStep"); - } else { - newDeployStep.insert("ProjectExplorer.ProjectConfiguration.Id", - "Qt4ProjectManager.MaemoDeployStep"); - } - - int deployCount = newBc.value("ProjectExplorer.BuildConfiguration.DeployStepsCount", 0).toInt(); - newBc.insert(QString::fromLatin1("ProjectExplorer.BuildConfiguration.DeployStep.") + QString::number(deployCount), - newDeployStep); - newBc.insert("ProjectExplorer.BuildConfiguration.DeployStepsCount", deployCount + 1); - - newTarget.insert(targetKey, newBc); - } - result.insert(globalKey, newTarget); - } - return result; -} - -// ------------------------------------------------------------------------- -// UserFileVersion6Upgrader: -// ------------------------------------------------------------------------- - -// Introduce DeployConfiguration and BuildStepLists -QVariantMap UserFileVersion6Upgrader::upgrade(const QVariantMap &map) -{ - QVariantMap result; - QMapIterator<QString, QVariant> it(map); - while (it.hasNext()) { - it.next(); - const QString &globalKey = it.key(); - // check for target info - if (!globalKey.startsWith("ProjectExplorer.Project.Target.")) { - result.insert(globalKey, it.value()); - continue; - } - - QVariantMap newDc; - const QVariantMap &originalTarget = it.value().toMap(); - QVariantMap newTarget; - QVariantMap deploySteps; - QString deploymentName = QCoreApplication::translate("ProjectExplorer::UserFileHandler", "No deployment"); - - QMapIterator<QString, QVariant> targetIt(originalTarget); - while (targetIt.hasNext()) { - targetIt.next(); - const QString &targetKey = targetIt.key(); - - if (targetKey == "ProjectExplorer.ProjectConfiguration.Id") { - if (targetIt.value().toString() == "Qt4ProjectManager.Target.MaemoDeviceTarget") - deploymentName = QCoreApplication::translate("ProjectExplorer::UserFileHandler", "Deploy to Maemo device"); - } - - if (!targetKey.startsWith("ProjectExplorer.Target.BuildConfiguration.")) { - newTarget.insert(targetKey, targetIt.value()); - continue; - } - - QVariantMap buildSteps; - QVariantMap cleanSteps; - const QVariantMap &originalBc = targetIt.value().toMap(); - QVariantMap newBc; - - QMapIterator<QString, QVariant> bcIt(originalBc); - while (bcIt.hasNext()) - { - bcIt.next(); - const QString &bcKey = bcIt.key(); - if (bcKey.startsWith("ProjectExplorer.BuildConfiguration.BuildStep.")) { - QString position = bcKey.mid(45); - buildSteps.insert(QString::fromLatin1("ProjectExplorer.BuildStepList.Step.") + position, bcIt.value()); - continue; - } - if (bcKey.startsWith("ProjectExplorer.BuildConfiguration.BuildStepsCount")) { - buildSteps.insert("ProjectExplorer.BuildStepList.StepsCount", bcIt.value()); - continue; - } - if (bcKey.startsWith("ProjectExplorer.BuildConfiguration.CleanStep.")) { - QString position = bcKey.mid(45); - cleanSteps.insert(QString::fromLatin1("ProjectExplorer.BuildStepList.Step.") + position, bcIt.value()); - continue; - } - if (bcKey.startsWith("ProjectExplorer.BuildConfiguration.CleanStepsCount")) { - cleanSteps.insert("ProjectExplorer.BuildStepList.StepsCount", bcIt.value()); - continue; - } - if (bcKey.startsWith("ProjectExplorer.BuildConfiguration.DeployStep.")) { - QString position = bcKey.mid(46); - deploySteps.insert(QString::fromLatin1("ProjectExplorer.BuildStepList.Step.") + position, bcIt.value()); - continue; - } - if (bcKey.startsWith("ProjectExplorer.BuildConfiguration.DeployStepsCount")) { - deploySteps.insert("ProjectExplorer.BuildStepList.StepsCount", bcIt.value()); - continue; - } - newBc.insert(bcKey, bcIt.value()); - } - buildSteps.insert("ProjectExplorer.ProjectConfiguration.DisplayName", "Build"); - buildSteps.insert("ProjectExplorer.ProjectConfiguration.Id", "ProjectExplorer.BuildSteps.Build"); - cleanSteps.insert("ProjectExplorer.ProjectConfiguration.DisplayName", "Clean"); - cleanSteps.insert("ProjectExplorer.ProjectConfiguration.Id", "ProjectExplorer.BuildSteps.Clean"); - newBc.insert("ProjectExplorer.BuildConfiguration.BuildStepList.0", buildSteps); - newBc.insert("ProjectExplorer.BuildConfiguration.BuildStepList.1", cleanSteps); - newBc.insert("ProjectExplorer.BuildConfiguration.BuildStepListCount", 2); - newTarget.insert(targetKey, newBc); - } - - // Only insert one deploy configuration: - deploySteps.insert("ProjectExplorer.ProjectConfiguration.DisplayName", "Deploy"); - deploySteps.insert("ProjectExplorer.ProjectConfiguration.Id", "ProjectExplorer.BuildSteps.Deploy"); - newDc.insert("ProjectExplorer.BuildConfiguration.BuildStepList.0", deploySteps); - newDc.insert("ProjectExplorer.BuildConfiguration.BuildStepListCount", 1); - newDc.insert("ProjectExplorer.ProjectConfiguration.DisplayName", deploymentName); - newDc.insert("ProjectExplorer.ProjectConfiguration.Id", "ProjectExplorer.DefaultDeployConfiguration"); - - newTarget.insert("ProjectExplorer.Target.DeployConfigurationCount", 1); - newTarget.insert("ProjectExplorer.Target.ActiveDeployConfiguration", 0); - newTarget.insert("ProjectExplorer.Target.DeployConfiguration.0", newDc); - result.insert(globalKey, newTarget); - } - return result; -} - -// ------------------------------------------------------------------------- -// UserFileVersion7Upgrader: -// ------------------------------------------------------------------------- - -// new implementation of DeployConfiguration -QVariantMap UserFileVersion7Upgrader::upgrade(const QVariantMap &map) -{ - QVariantMap result; - QMapIterator<QString, QVariant> it(map); - while (it.hasNext()) { - it.next(); - const QString &globalKey = it.key(); - // check for target info - if (!globalKey.startsWith("ProjectExplorer.Project.Target.")) { - result.insert(globalKey, it.value()); - continue; - } - const QVariantMap &originalTarget = it.value().toMap(); - result.insert(globalKey, originalTarget); - } - return result; -} - -// ------------------------------------------------------------------------- -// UserFileVersion8Upgrader: -// ------------------------------------------------------------------------- - -// Argument list reinterpretation - -static const char * const argListKeys[] = { - "ProjectExplorer.Project.Target.", - "ProjectExplorer.Target.BuildConfiguration.|ProjectExplorer.Target.DeployConfiguration.", - "ProjectExplorer.BuildConfiguration.BuildStepList.", - "ProjectExplorer.BuildStepList.Step.", - "GenericProjectManager.GenericMakeStep.MakeArguments", - "QtProjectManager.QMakeBuildStep.QMakeArguments", - "Qt4ProjectManager.MakeStep.MakeArguments", - "CMakeProjectManager.MakeStep.AdditionalArguments", - nullptr, - nullptr, - nullptr, - "ProjectExplorer.Target.RunConfiguration.", - "ProjectExplorer.CustomExecutableRunConfiguration.Arguments", - "Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments", - "CMakeProjectManager.CMakeRunConfiguration.Arguments", - nullptr, - nullptr, - nullptr -}; - -static const char * const lameArgListKeys[] = { - "ProjectExplorer.Project.Target.", - "ProjectExplorer.Target.BuildConfiguration.|ProjectExplorer.Target.DeployConfiguration.", - "ProjectExplorer.BuildConfiguration.BuildStepList.", - "ProjectExplorer.BuildStepList.Step.", - "ProjectExplorer.ProcessStep.Arguments", - nullptr, - nullptr, - nullptr, - "ProjectExplorer.Target.RunConfiguration.", - "Qt4ProjectManager.MaemoRunConfiguration.Arguments", - "Qt4ProjectManager.S60DeviceRunConfiguration.CommandLineArguments", - "QmlProjectManager.QmlRunConfiguration.QDeclarativeViewerArguments", - nullptr, - nullptr, - nullptr -}; - -inline static bool isSpecialChar(ushort c) -{ - // Chars that should be quoted (TM). This includes: - static const uchar iqm[] = { - 0xff, 0xff, 0xff, 0xff, 0xdf, 0x07, 0x00, 0xd8, - 0x00, 0x00, 0x00, 0x38, 0x01, 0x00, 0x00, 0x78 - }; // 0-32 \'"$`<>|;&(){}*?#!~[] - - return (c < sizeof(iqm) * 8) && (iqm[c / 8] & (1 << (c & 7))); -} - -inline static bool hasSpecialChars(const QString &arg) -{ - for (int x = arg.length() - 1; x >= 0; --x) - if (isSpecialChar(arg.unicode()[x].unicode())) - return true; - return false; -} - -// These were split according to sane (even if a bit arcane) rules -static QVariant version8ArgNodeHandler(const QVariant &var) -{ - QString ret; - foreach (const QVariant &svar, var.toList()) { - if (HostOsInfo::isAnyUnixHost()) { - // We don't just addArg, so we don't disarm existing env expansions. - // This is a bit fuzzy logic ... - QString s = svar.toString(); - s.replace('\\', "\\\\"); - s.replace('"', "\\\""); - s.replace('`', "\\`"); - if (s != svar.toString() || hasSpecialChars(s)) - s.prepend('"').append('"'); - QtcProcess::addArgs(&ret, s); - } else { - // Under windows, env expansions cannot be quoted anyway. - QtcProcess::addArg(&ret, svar.toString()); - } - } - return QVariant(ret); -} - -// These were just split on whitespace -static QVariant version8LameArgNodeHandler(const QVariant &var) -{ - QString ret; - foreach (const QVariant &svar, var.toList()) - QtcProcess::addArgs(&ret, svar.toString()); - return QVariant(ret); -} - -// Environment variable reinterpretation - -static const char * const envExpandedKeys[] = { - "ProjectExplorer.Project.Target.", - "ProjectExplorer.Target.BuildConfiguration." - "|ProjectExplorer.Target.DeployConfiguration.", - "ProjectExplorer.BuildConfiguration.BuildStepList.", - "ProjectExplorer.BuildStepList.Step.", - "ProjectExplorer.ProcessStep.WorkingDirectory", - "ProjectExplorer.ProcessStep.Command", - "ProjectExplorer.ProcessStep.Arguments", - "GenericProjectManager.GenericMakeStep.MakeCommand", - "GenericProjectManager.GenericMakeStep.MakeArguments", - "GenericProjectManager.GenericMakeStep.BuildTargets", - "QtProjectManager.QMakeBuildStep.QMakeArguments", - "Qt4ProjectManager.MakeStep.MakeCommand", - "Qt4ProjectManager.MakeStep.MakeArguments", - "CMakeProjectManager.MakeStep.AdditionalArguments", - "CMakeProjectManager.MakeStep.BuildTargets", - nullptr, - nullptr, - "Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory", - nullptr, - "ProjectExplorer.Target.RunConfiguration.", - "ProjectExplorer.CustomExecutableRunConfiguration.WorkingDirectory", - "ProjectExplorer.CustomExecutableRunConfiguration.Executable", - "ProjectExplorer.CustomExecutableRunConfiguration.Arguments", - "Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory", - "Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments", - "Qt4ProjectManager.MaemoRunConfiguration.Arguments", - "Qt4ProjectManager.S60DeviceRunConfiguration.CommandLineArguments", - "CMakeProjectManager.CMakeRunConfiguration.UserWorkingDirectory", - "CMakeProjectManager.CMakeRunConfiguration.Arguments", - 0, - 0, - 0 -}; - -static QString version8NewVar(const QString &old) -{ - QString ret = old; - if (HostOsInfo::isAnyUnixHost()) { - ret.prepend("${"); - ret.append('}'); - } else { - ret.prepend('%'); - ret.append('%'); - } - return ret; -} - -// Translate DOS-like env var expansions into Unix-like ones and vice versa. -// On the way, change {SOURCE,BUILD}DIR env expansions to %{}-expandos -static QVariant version8EnvNodeTransform(const QVariant &var) -{ - QString result = var.toString(); - - result.replace(QRegExp("%SOURCEDIR%|\\$(SOURCEDIR\\b|\\{SOURCEDIR\\})"), "%{sourceDir}"); - result.replace(QRegExp("%BUILDDIR%|\\$(BUILDDIR\\b|\\{BUILDDIR\\})"), "%{buildDir}"); - if (HostOsInfo::isAnyUnixHost()) { - for (int vStart = -1, i = 0; i < result.length(); ) { - QChar c = result.at(i++); - if (c == '%') { - if (vStart > 0 && vStart < i - 1) { - QString nv = version8NewVar(result.mid(vStart, i - 1 - vStart)); - result.replace(vStart - 1, i - vStart + 1, nv); - i = vStart - 1 + nv.length(); - vStart = -1; - } else { - vStart = i; - } - } else if (vStart > 0) { - // Sanity check so we don't catch too much garbage - if (!c.isLetterOrNumber() && c != '_') - vStart = -1; - } - } - } else { - enum { BASE, OPTIONALVARIABLEBRACE, VARIABLE, BRACEDVARIABLE } state = BASE; - int vStart = -1; - - for (int i = 0; i < result.length();) { - QChar c = result.at(i++); - if (state == BASE) { - if (c == '$') - state = OPTIONALVARIABLEBRACE; - } else if (state == OPTIONALVARIABLEBRACE) { - if (c == '{') { - state = BRACEDVARIABLE; - vStart = i; - } else if (c.isLetterOrNumber() || c == '_') { - state = VARIABLE; - vStart = i - 1; - } else { - state = BASE; - } - } else if (state == BRACEDVARIABLE) { - if (c == '}') { - QString nv = version8NewVar(result.mid(vStart, i - 1 - vStart)); - result.replace(vStart - 2, i - vStart + 2, nv); - i = vStart + nv.length(); - state = BASE; - } - } else if (state == VARIABLE) { - if (!c.isLetterOrNumber() && c != '_') { - QString nv = version8NewVar(result.mid(vStart, i - 1 - vStart)); - result.replace(vStart - 1, i - vStart, nv); - i = vStart - 1 + nv.length(); // On the same char - could be next expansion. - state = BASE; - } - } - } - if (state == VARIABLE) { - QString nv = version8NewVar(result.mid(vStart)); - result.truncate(vStart - 1); - result += nv; - } - } - - return QVariant(result); -} - -static QVariant version8EnvNodeHandler(const QVariant &var) -{ - if (var.type() != QVariant::List) - return version8EnvNodeTransform(var); - - QVariantList vl; - foreach (const QVariant &svar, var.toList()) - vl << version8EnvNodeTransform(svar); - return vl; -} - -// VariableManager expando reinterpretation - -static const char * const varExpandedKeys[] = { - "ProjectExplorer.Project.Target.", - "ProjectExplorer.Target.BuildConfiguration." - "|ProjectExplorer.Target.DeployConfiguration.", - "ProjectExplorer.BuildConfiguration.BuildStepList.", - "ProjectExplorer.BuildStepList.Step.", - "GenericProjectManager.GenericMakeStep.MakeCommand", - "GenericProjectManager.GenericMakeStep.MakeArguments", - "GenericProjectManager.GenericMakeStep.BuildTargets", - 0, - 0, - 0, - 0, - 0 -}; - -// Translate old-style ${} var expansions into new-style %{} ones -static QVariant version8VarNodeTransform(const QVariant &var) -{ - static const QSet<QString> map({ - "CURRENT_DOCUMENT:absoluteFilePath", - "CURRENT_DOCUMENT:absolutePath", - "CURRENT_DOCUMENT:baseName", - "CURRENT_DOCUMENT:canonicalPath", - "CURRENT_DOCUMENT:canonicalFilePath", - "CURRENT_DOCUMENT:completeBaseName", - "CURRENT_DOCUMENT:completeSuffix", - "CURRENT_DOCUMENT:fileName", - "CURRENT_DOCUMENT:filePath", - "CURRENT_DOCUMENT:path", - "CURRENT_DOCUMENT:suffix" - }); - - QString str = var.toString(); - int pos = 0; - forever { - int openPos = str.indexOf("${", pos); - if (openPos < 0) - break; - int varPos = openPos + 2; - int closePos = str.indexOf('}', varPos); - if (closePos < 0) - break; - if (map.contains(str.mid(varPos, closePos - varPos))) - str[openPos] = '%'; - pos = closePos + 1; - } - return QVariant(str); -} - -static QVariant version8VarNodeHandler(const QVariant &var) -{ - if (var.type() != QVariant::List) - return version8VarNodeTransform(var); - - QVariantList vl; - foreach (const QVariant &svar, var.toList()) - vl << version8VarNodeTransform(svar); - return vl; -} - -QVariantMap UserFileVersion8Upgrader::upgrade(const QVariantMap &map) -{ - const char * const *p1 = argListKeys; - QVariantMap rmap1 = processHandlerNodes(buildHandlerNodes(&p1), map, version8ArgNodeHandler); - const char * const *p2 = lameArgListKeys; - QVariantMap rmap2 = processHandlerNodes(buildHandlerNodes(&p2), rmap1, version8LameArgNodeHandler); - const char * const *p3 = envExpandedKeys; - QVariantMap rmap3 = processHandlerNodes(buildHandlerNodes(&p3), rmap2, version8EnvNodeHandler); - const char * const *p4 = varExpandedKeys; - return processHandlerNodes(buildHandlerNodes(&p4), rmap3, version8VarNodeHandler); -} - -// -------------------------------------------------------------------- -// UserFileVersion9Upgrader: -// -------------------------------------------------------------------- - -QVariantMap UserFileVersion9Upgrader::upgrade(const QVariantMap &map) -{ - QVariantMap result; - QMapIterator<QString, QVariant> globalIt(map); - while (globalIt.hasNext()) { - globalIt.next(); - const QString &globalKey = globalIt.key(); - // check for target info - if (!globalKey.startsWith("ProjectExplorer.Project.Target.")) { - result.insert(globalKey, globalIt.value()); - continue; - } - - const QVariantMap &origTargetMap = globalIt.value().toMap(); - const QString targetIdKey = "ProjectExplorer.ProjectConfiguration.Id"; - // check for maemo device target - if (origTargetMap.value(targetIdKey) != "Qt4ProjectManager.Target.MaemoDeviceTarget" - && origTargetMap.value(targetIdKey) != "Qt4ProjectManager.Target.HarmattanDeviceTarget" - && origTargetMap.value(targetIdKey) != "Qt4ProjectManager.Target.MeegoDeviceTarget") - { - result.insert(globalKey, origTargetMap); - continue; - } - - QVariantMap newTargetMap; - QMapIterator<QString, QVariant> targetIt(origTargetMap); - while (targetIt.hasNext()) { - targetIt.next(); - if (!targetIt.key().startsWith("ProjectExplorer.Target.DeployConfiguration.")) { - newTargetMap.insert(targetIt.key(), targetIt.value()); - continue; - } - - QVariantMap deployConfMap = targetIt.value().toMap(); - deployConfMap.insert("ProjectExplorer.ProjectConfiguration.Id", "2.2MaemoDeployConfig"); - newTargetMap.insert(targetIt.key(), deployConfMap); - } - result.insert(globalKey, newTargetMap); - } - return result; -} - -// -------------------------------------------------------------------- -// UserFileVersion10Upgrader: -// -------------------------------------------------------------------- - -QVariantMap UserFileVersion10Upgrader::upgrade(const QVariantMap &map) -{ - QList<Change> changes; - changes.append(qMakePair(QLatin1String("ProjectExplorer.ProcessStep.Enabled"), - QLatin1String("ProjectExplorer.BuildStep.Enabled"))); - return renameKeys(changes, QVariantMap(map)); -} - -// -------------------------------------------------------------------- -// UserFileVersion11Upgrader: -// -------------------------------------------------------------------- - -UserFileVersion11Upgrader::~UserFileVersion11Upgrader() -{ - QList<Kit *> knownKits = KitManager::kits(); - foreach (Kit *k, m_targets.keys()) { - if (!knownKits.contains(k)) - KitManager::deleteKit(k); - } - m_targets.clear(); -} - -static inline int targetId(const QString &targetKey) -{ - return targetKey.midRef(targetKey.lastIndexOf('.') + 1).toInt(); -} - -QVariantMap UserFileVersion11Upgrader::upgrade(const QVariantMap &map) -{ - // Read in old data to help with the transition: - parseQtversionFile(); - parseToolChainFile(); - - QVariantMap result; - foreach (Kit *k, KitManager::kits()) - m_targets.insert(k, QVariantMap()); - - QMapIterator<QString, QVariant> globalIt(map); - int activeTarget = map.value("ProjectExplorer.Project.ActiveTarget", 0).toInt(); - - while (globalIt.hasNext()) { - globalIt.next(); - const QString &globalKey = globalIt.key(); - // Keep everything but targets: - if (globalKey == "ProjectExplorer.Project.ActiveTarget") - continue; - if (!globalKey.startsWith("ProjectExplorer.Project.Target.")) { - result.insert(globalKey, globalIt.value()); - continue; - } - - // Update Targets: - const QVariantMap &target = globalIt.value().toMap(); - int targetPos = targetId(globalKey); - - QVariantMap extraTargetData; - QMap<int, QVariantMap> bcs; - int activeBc = -1; - QMap<int, QVariantMap> dcs; - int activeDc = -1; - QMap<int, QVariantMap> rcs; - int activeRc = -1; - - // Read old target: - QMapIterator<QString, QVariant> targetIt(target); - while (targetIt.hasNext()) { - targetIt.next(); - const QString &targetKey = targetIt.key(); - - // BuildConfigurations: - if (targetKey == "ProjectExplorer.Target.ActiveBuildConfiguration") - activeBc = targetIt.value().toInt(); - else if (targetKey == "ProjectExplorer.Target.BuildConfigurationCount") - continue; - else if (targetKey.startsWith("ProjectExplorer.Target.BuildConfiguration.")) - bcs.insert(targetId(targetKey), targetIt.value().toMap()); - else - - // DeployConfigurations: - if (targetKey == "ProjectExplorer.Target.ActiveDeployConfiguration") - activeDc = targetIt.value().toInt(); - else if (targetKey == "ProjectExplorer.Target.DeployConfigurationCount") - continue; - else if (targetKey.startsWith("ProjectExplorer.Target.DeployConfiguration.")) - dcs.insert(targetId(targetKey), targetIt.value().toMap()); - else - - // RunConfigurations: - if (targetKey == "ProjectExplorer.Target.ActiveRunConfiguration") - activeRc = targetIt.value().toInt(); - else if (targetKey == "ProjectExplorer.Target.RunConfigurationCount") - continue; - else if (targetKey.startsWith("ProjectExplorer.Target.RunConfiguration.")) - rcs.insert(targetId(targetKey), targetIt.value().toMap()); - - // Rest (the target's ProjectConfiguration settings only as there is nothing else): - else - extraTargetData.insert(targetKey, targetIt.value()); - } - const QString oldTargetId = extraTargetData.value("ProjectExplorer.ProjectConfiguration.Id").toString(); - - // Check each BCs/DCs and create profiles as needed - auto rawKit = new Kit; // Do not needlessly use Core::Ids - QMapIterator<int, QVariantMap> buildIt(bcs); - while (buildIt.hasNext()) { - buildIt.next(); - int bcPos = buildIt.key(); - const QVariantMap &bc = buildIt.value(); - Kit *tmpKit = rawKit; - - const auto desktopDeviceIcon = FileName::fromLatin1(":///DESKTOP///"); - - if (oldTargetId == "Qt4ProjectManager.Target.AndroidDeviceTarget") { - tmpKit->setIconPath(FileName::fromLatin1(":/android/images/QtAndroid.png")); - tmpKit->setValue("PE.Profile.DeviceType", QString::fromLatin1("Desktop")); - tmpKit->setValue("PE.Profile.Device", QString()); - } else if (oldTargetId == "RemoteLinux.EmbeddedLinuxTarget") { - tmpKit->setIconPath(desktopDeviceIcon); - tmpKit->setValue("PE.Profile.DeviceType", QString::fromLatin1("GenericLinuxOsType")); - tmpKit->setValue("PE.Profile.Device", QString()); - } else if (oldTargetId == "Qt4ProjectManager.Target.HarmattanDeviceTarget") { - tmpKit->setIconPath(FileName::fromLatin1(":/projectexplorer/images/MaemoDevice.png")); - tmpKit->setValue("PE.Profile.DeviceType", QString::fromLatin1("HarmattanOsType")); - tmpKit->setValue("PE.Profile.Device", QString()); - } else if (oldTargetId == "Qt4ProjectManager.Target.MaemoDeviceTarget") { - tmpKit->setIconPath(FileName::fromLatin1(":/projectexplorer/images/MaemoDevice.png")); - tmpKit->setValue("PE.Profile.DeviceType", QString::fromLatin1("Maemo5OsType")); - tmpKit->setValue("PE.Profile.Device", QString()); - } else if (oldTargetId == "Qt4ProjectManager.Target.MeegoDeviceTarget") { - tmpKit->setIconPath(FileName::fromLatin1(":/projectexplorer/images/MaemoDevice.png")); - tmpKit->setValue("PE.Profile.DeviceType", QString::fromLatin1("MeegoOsType")); - tmpKit->setValue("PE.Profile.Device", QString()); - } else if (oldTargetId == "Qt4ProjectManager.Target.S60DeviceTarget") { - tmpKit->setIconPath(FileName::fromLatin1(":/projectexplorer/images/SymbianDevice.png")); - tmpKit->setValue("PE.Profile.DeviceType", QString::fromLatin1("Qt4ProjectManager.SymbianDevice")); - tmpKit->setValue("PE.Profile.Device", QString::fromLatin1("Symbian Device")); - } else if (oldTargetId == "Qt4ProjectManager.Target.QtSimulatorTarget") { - tmpKit->setIconPath(FileName::fromLatin1(":/projectexplorer/images/Simulator.png")); - tmpKit->setValue("PE.Profile.DeviceType", QString::fromLatin1("Desktop")); - tmpKit->setValue("PE.Profile.Device", QString::fromLatin1("Desktop Device")); - } else { - tmpKit->setIconPath(desktopDeviceIcon); - tmpKit->setValue("PE.Profile.DeviceType", QString::fromLatin1("Desktop")); - tmpKit->setValue("PE.Profile.Device", QString::fromLatin1("Desktop Device")); - } - - // Tool chain - QString tcId = bc.value("CMakeProjectManager.CMakeBuildConfiguration.ToolChain").toString(); - if (tcId.isEmpty()) - tcId = bc.value("ProjectExplorer.BuildCOnfiguration.ToolChain").toString(); - const QString origTcId = tcId; - tcId.replace("Qt4ProjectManager.ToolChain.Maemo:", "ProjectExplorer.ToolChain.Gcc:"); // convert Maemo to GCC - QString data = tcId.mid(tcId.indexOf(':') + 1); - QStringList split = data.split('.', QString::KeepEmptyParts); - QString compilerPath; - QString debuggerPath; - Abi compilerAbi; - int debuggerEngine = 1; // GDB - for (int i = 1; i < split.count() - 1; ++i) { - compilerAbi = Abi(split.at(i)); - if (!compilerAbi.isValid()) - continue; - if (compilerAbi.os() == Abi::WindowsOS - && compilerAbi.osFlavor() != Abi::WindowsMSysFlavor) - debuggerEngine = 4; // CDB - compilerPath = split.at(0); - for (int j = 1; j < i; ++j) - compilerPath = compilerPath + '.' + split.at(j); - debuggerPath = split.at(i + 1); - for (int j = i + 2; j < split.count(); ++j) - debuggerPath = debuggerPath + '.' + split.at(j); - - ToolChain *tc = ToolChainManager::toolChain([cp = FileName::fromString(compilerPath), - compilerAbi](const ToolChain *t) { - return t->compilerCommand() == cp && t->targetAbi() == compilerAbi; - }); - if (tc) - tcId = QString::fromUtf8(tc->id()); - } - tmpKit->setValue("PE.Profile.ToolChain", tcId); - - // QtVersion - int qtVersionId = bc.value("Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId", -1).toInt(); - tmpKit->setValue("QtSupport.QtInformation", qtVersionId); - - // Debugger + mkspec - QVariantMap debugger; - QString mkspec; - if (m_toolChainExtras.contains(origTcId)) { - debuggerPath = m_toolChainExtras.value(origTcId).m_debugger; - if (!debuggerPath.isEmpty() && !QFileInfo(debuggerPath).isAbsolute()) - debuggerPath = Environment::systemEnvironment().searchInPath(debuggerPath).toString(); - if (debuggerPath.contains("cdb")) - debuggerEngine = 4; // CDB - mkspec = m_toolChainExtras.value(origTcId).m_mkspec; - } - debugger.insert("EngineType", debuggerEngine); - debugger.insert("Binary", debuggerPath); - tmpKit->setValue("Debugger.Information", debugger); - tmpKit->setValue("QtPM4.mkSpecInformation", mkspec); - - // SysRoot - tmpKit->setValue("PE.Profile.SysRoot", m_qtVersionExtras.value(qtVersionId)); - - QMapIterator<int, QVariantMap> deployIt(dcs); - while (deployIt.hasNext()) { - deployIt.next(); - int dcPos = deployIt.key(); - const QVariantMap &dc = deployIt.value(); - // Device - QByteArray devId = dc.value("Qt4ProjectManager.MaemoRunConfiguration.DeviceId").toByteArray(); - if (devId.isEmpty()) - devId = QByteArray("Desktop Device"); - if (!devId.isEmpty() && !DeviceManager::instance()->find(Core::Id::fromName(devId))) // We do not know that device - devId.clear(); - tmpKit->setValue("PE.Profile.Device", devId); - - // Set display name last: - tmpKit->setUnexpandedDisplayName(extraTargetData.value("ProjectExplorer.ProjectConfiguration.DisplayName").toString()); - - Kit *k = uniqueKit(tmpKit); - - addBuildConfiguration(k, bc, bcPos, activeBc); - addDeployConfiguration(k, dc, dcPos, activeDc); - addRunConfigurations(k, rcs, activeRc, m_accessor->project()->projectDirectory().toString()); - if (targetPos == activeTarget && bcPos == activeBc && dcPos == activeDc) - m_targets[k].insert("Update.IsActive", true); - } // dcs - } // bcs - KitManager::deleteKit(rawKit); - } // read in map data - - int newPos = 0; - // Generate new target data: - foreach (Kit *k, m_targets.keys()) { - QVariantMap data = m_targets.value(k); - if (data.isEmpty()) - continue; - - KitManager::registerKit(k); - - data.insert("ProjectExplorer.ProjectConfiguration.Id", k->id().name()); - data.insert("ProjectExplorer.Target.Profile", k->id().name()); - data.insert("ProjectExplorer.ProjectConfiguration.DisplayName", k->displayName()); - data.insert("ProjectExplorer.ProjectConfiguration.DefaultDisplayName", k->displayName()); - - result.insert(QString::fromLatin1("ProjectExplorer.Project.Target.") + QString::number(newPos), data); - if (data.value("Update.IsActive", false).toBool()) - result.insert("ProjectExplorer.Project.ActiveTarget", newPos); - ++newPos; - } - result.insert("ProjectExplorer.Project.TargetCount", newPos); - - return result; -} - -Kit *UserFileVersion11Upgrader::uniqueKit(Kit *k) -{ - const QString tc = k->value("PE.Profile.ToolChain").toString(); - const int qt = k->value("QtSupport.QtInformation").toInt(); - const QString debugger = k->value("Debugger.Information").toString(); - const QString mkspec = k->value("QtPM4.mkSpecInformation").toString(); - const QString deviceType = k->value("PE.Profile.DeviceType").toString(); - const QString device = k->value("PE.Profile.Device").toString(); - const QString sysroot = k->value("PE.Profile.SysRoot").toString(); - - foreach (Kit *i, m_targets.keys()) { - const QString currentTc = i->value("PE.Profile.ToolChain").toString(); - const int currentQt = i->value("QtSupport.QtInformation").toInt(); - const QString currentDebugger = i->value("Debugger.Information").toString(); - const QString currentMkspec = i->value("QtPM4.mkSpecInformation").toString(); - const QString currentDeviceType = i->value("PE.Profile.DeviceType").toString(); - const QString currentDevice = i->value("PE.Profile.Device").toString(); - const QString currentSysroot = i->value("PE.Profile.SysRoot").toString(); - - bool deviceTypeOk = deviceType == currentDeviceType; - bool deviceOk = device.isEmpty() || currentDevice == device; - bool tcOk = tc.isEmpty() || currentTc.isEmpty() || currentTc == tc; - bool qtOk = qt == -1 || currentQt == qt; - bool debuggerOk = debugger.isEmpty() || currentDebugger.isEmpty() || currentDebugger == debugger; - bool mkspecOk = mkspec.isEmpty() || currentMkspec.isEmpty() || currentMkspec == mkspec; - bool sysrootOk = sysroot.isEmpty() || currentSysroot == sysroot; - - if (deviceTypeOk && deviceOk && tcOk && qtOk && debuggerOk && mkspecOk && sysrootOk) - return i; - } - return k->clone(true); -} - -void UserFileVersion11Upgrader::addBuildConfiguration(Kit *k, const QVariantMap &bc, int bcPos, int bcActive) -{ - QVariantMap merged = m_targets.value(k); - int internalCount = merged.value("ProjectExplorer.Target.BuildConfigurationCount", 0).toInt(); - - for (int i = 0; i < internalCount; ++i) { - QVariantMap bcData = merged.value(QString::fromLatin1("ProjectExplorer.Target.BuildConfiguration.") + QString::number(i)).toMap(); - if (bcData.value("Update.BCPos", -1).toInt() == bcPos) - return; - } - QVariantMap data = bc; - data.insert("Update.BCPos", bcPos); - - merged.insert(QString::fromLatin1("ProjectExplorer.Target.BuildConfiguration.") + QString::number(internalCount), data); - if (bcPos == bcActive) - merged.insert("ProjectExplorer.Target.ActiveBuildConfiguration", internalCount); - merged.insert("ProjectExplorer.Target.BuildConfigurationCount", internalCount + 1); - - m_targets.insert(k, merged); -} - -void UserFileVersion11Upgrader::addDeployConfiguration(Kit *k, const QVariantMap &dc, int dcPos, int dcActive) -{ - QVariantMap merged = m_targets.value(k); - int internalCount = merged.value("ProjectExplorer.Target.DeployConfigurationCount", 0).toInt(); - - for (int i = 0; i < internalCount; ++i) { - QVariantMap dcData = merged.value(QString::fromLatin1("ProjectExplorer.Target.DeployConfiguration.") + QString::number(i)).toMap(); - if (dcData.value("Update.DCPos", -1).toInt() == dcPos) - return; - } - QVariantMap data = dc; - data.insert("Update.DCPos", dcPos); - - merged.insert(QString::fromLatin1("ProjectExplorer.Target.DeployConfiguration.") + QString::number(internalCount), data); - if (dcPos == dcActive) - merged.insert("ProjectExplorer.Target.ActiveDeployConfiguration", internalCount); - merged.insert("ProjectExplorer.Target.DeployConfigurationCount", internalCount + 1); - - m_targets.insert(k, merged); -} - -void UserFileVersion11Upgrader::addRunConfigurations(Kit *k, - const QMap<int, QVariantMap> &rcs, int activeRc, - const QString &projectDir) -{ - QVariantMap data = m_targets.value(k); - data.insert("ProjectExplorer.Target.RunConfigurationCount", rcs.count()); - QMapIterator<int, QVariantMap> runIt(rcs); - while (runIt.hasNext()) { - runIt.next(); - QVariantMap rcData = runIt.value(); - QString proFile = rcData.value("Qt4ProjectManager.MaemoRunConfiguration.ProFile").toString(); - if (proFile.isEmpty()) - proFile = rcData.value("Qt4ProjectManager.Qt4RunConfiguration.ProFile").toString(); - if (!proFile.isEmpty()) { - QString newId = rcData.value("ProjectExplorer.ProjectConfiguration.Id").toString(); - newId.append(':'); - FileName fn = FileName::fromString(projectDir); - fn.appendPath(proFile); - newId.append(fn.toString()); - rcData.insert("ProjectExplorer.ProjectConfiguration.Id", newId); - } - data.insert(QString::fromLatin1("ProjectExplorer.Target.RunConfiguration.") + QString::number(runIt.key()), rcData); - } - data.insert("ProjectExplorer.Target.ActiveRunConfiguration", activeRc); - - m_targets.insert(k, data); -} - -static QString targetRoot(const QString &qmakePath) -{ - return QDir::cleanPath(qmakePath).remove("/bin/qmake" QTC_HOST_EXE_SUFFIX, - HostOsInfo::fileNameCaseSensitivity()); -} - -static QString maddeRoot(const QString &qmakePath) -{ - QDir dir(targetRoot(qmakePath)); - dir.cdUp(); dir.cdUp(); - return dir.absolutePath(); -} - -void UserFileVersion11Upgrader::parseQtversionFile() -{ - PersistentSettingsReader reader; - reader.load(FileName::fromString(Core::ICore::userResourcePath() + "/../qtversion.xml")); - QVariantMap data = reader.restoreValues(); - - int count = data.value("QtVersion.Count", 0).toInt(); - for (int i = 0; i < count; ++i) { - const QString key = QString::fromLatin1("QtVersion.") + QString::number(i); - if (!data.contains(key)) - continue; - const QVariantMap qtversionMap = data.value(key).toMap(); - - QString sysRoot = qtversionMap.value("SystemRoot").toString(); - const QString type = qtversionMap.value("QtVersion.Type").toString(); - const QString qmake = qtversionMap.value("QMakePath").toString(); - - if (type == "Qt4ProjectManager.QtVersion.Maemo") { - QFile file(QDir::cleanPath(targetRoot(qmake)) + "/information"); - if (file.exists() && file.open(QIODevice::ReadOnly | QIODevice::Text)) { - QTextStream stream(&file); - while (!stream.atEnd()) { - const QString &line = stream.readLine().trimmed(); - const QStringList &list = line.split(' '); - if (list.count() <= 1) - continue; - if (list.at(0) == "sysroot") - sysRoot = maddeRoot(qmake) + "/sysroots/" + list.at(1); - } - } - } - - int id = qtversionMap.value("Id").toInt(); - if (id > -1 && !sysRoot.isEmpty()) - m_qtVersionExtras.insert(id, sysRoot); - } -} - -void UserFileVersion11Upgrader::parseToolChainFile() -{ - PersistentSettingsReader reader; - reader.load(FileName::fromString(Core::ICore::userResourcePath() + "/../toolChains.xml")); - QVariantMap data = reader.restoreValues(); - int count = data.value("ToolChain.Count", 0).toInt(); - for (int i = 0; i < count; ++i) { - const QString key = QString::fromLatin1("ToolChain.") + QString::number(i); - if (!data.contains(key)) - continue; - - const QVariantMap tcMap = data.value(key).toMap(); - QString id = tcMap.value("ProjectExplorer.ToolChain.Id").toString(); - if (id.isEmpty()) - continue; - QString mkspec = tcMap.value("ProjectExplorer.ToolChain.MkSpecOverride").toString(); - QString debugger = tcMap.value("ProjectExplorer.GccToolChain.Debugger").toString(); - - m_toolChainExtras.insert(id, ToolChainExtraData(mkspec, debugger)); - } -} - -// -------------------------------------------------------------------- -// UserFileVersion12Upgrader: -// -------------------------------------------------------------------- - -QVariantMap UserFileVersion12Upgrader::upgrade(const QVariantMap &map) -{ - QVariantMap result; - QMapIterator<QString, QVariant> it(map); - while (it.hasNext()) { - it.next(); - if (it.value().type() == QVariant::Map) - result.insert(it.key(), upgrade(it.value().toMap())); - else if (it.key() == "CMakeProjectManager.CMakeRunConfiguration.UserEnvironmentChanges" - || it.key() == "ProjectExplorer.CustomExecutableRunConfiguration.UserEnvironmentChanges" - || it.key() == "Qt4ProjectManager.Qt4RunConfiguration.UserEnvironmentChanges" - || it.key() == "Qt4ProjectManager.MaemoRunConfiguration.UserEnvironmentChanges") - result.insert("PE.UserEnvironmentChanges", it.value()); - else if (it.key() == "CMakeProjectManager.BaseEnvironmentBase" - || it.key() == "ProjectExplorer.CustomExecutableRunConfiguration.BaseEnvironmentBase" - || it.key() == "Qt4ProjectManager.MaemoRunConfiguration.BaseEnvironmentBase") - result.insert("PE.BaseEnvironmentBase", it.value()); - else - result.insert(it.key(), it.value()); - } - return result; -} - -// -------------------------------------------------------------------- -// UserFileVersion13Upgrader: -// -------------------------------------------------------------------- - -QVariantMap UserFileVersion13Upgrader::upgrade(const QVariantMap &map) -{ - QVariantMap result; - QMapIterator<QString, QVariant> it(map); - while (it.hasNext()) { - it.next(); - if (it.value().type() == QVariant::Map) - result.insert(it.key(), upgrade(it.value().toMap())); - else if (it.key() == "PE.UserEnvironmentChanges") - result.insert("PE.EnvironmentAspect.Changes", it.value()); - else if (it.key() == "PE.BaseEnvironmentBase") - result.insert("PE.EnvironmentAspect.Base", it.value()); - else - result.insert(it.key(), it.value()); - } - return result; -} - // -------------------------------------------------------------------- // UserFileVersion14Upgrader: // -------------------------------------------------------------------- @@ -2187,6 +749,30 @@ QVariant UserFileVersion17Upgrader::process(const QVariant &entry) } } +QVariantMap UserFileVersion18Upgrader::upgrade(const QVariantMap &map) +{ + return process(map).toMap(); +} + +QVariant UserFileVersion18Upgrader::process(const QVariant &entry) +{ + switch (entry.type()) { + case QVariant::List: + return Utils::transform(entry.toList(), &UserFileVersion18Upgrader::process); + case QVariant::Map: + return Utils::transform<QMap<QString, QVariant>>( + entry.toMap().toStdMap(), [](const std::pair<const QString, QVariant> &item) { + const QString key = (item.first + == "AutotoolsProjectManager.MakeStep.AdditionalArguments" + ? QString("AutotoolsProjectManager.MakeStep.MakeArguments") + : item.first); + return qMakePair(key, UserFileVersion18Upgrader::process(item.second)); + }); + default: + return entry; + } +} + #if defined(WITH_TESTS) #include <QTest> @@ -2201,7 +787,7 @@ public: TestUserFileAccessor(Project *project) : UserFileAccessor(project) { } void storeSharedSettings(const QVariantMap &data) const { m_storedSettings = data; } - QVariant retrieveSharedSettings() const { return m_storedSettings; } + QVariant retrieveSharedSettings() const override { return m_storedSettings; } using UserFileAccessor::preprocessReadSettings; using UserFileAccessor::prepareToWriteSettings; diff --git a/src/plugins/projectexplorer/windebuginterface.cpp b/src/plugins/projectexplorer/windebuginterface.cpp index 985fec933f..ce3950acb9 100644 --- a/src/plugins/projectexplorer/windebuginterface.cpp +++ b/src/plugins/projectexplorer/windebuginterface.cpp @@ -81,31 +81,31 @@ WinDebugInterface::~WinDebugInterface() void WinDebugInterface::run() { - m_waitHandles[DataReadyEventHandle] = m_waitHandles[TerminateEventHandle] = 0; - m_bufferReadyEvent = 0; - m_sharedFile = 0; - m_sharedMem = 0; + m_waitHandles[DataReadyEventHandle] = m_waitHandles[TerminateEventHandle] = nullptr; + m_bufferReadyEvent = nullptr; + m_sharedFile = nullptr; + m_sharedMem = nullptr; if (!runLoop()) emit cannotRetrieveDebugOutput(); if (m_sharedMem) { UnmapViewOfFile(m_sharedMem); - m_sharedMem = 0; + m_sharedMem = nullptr; } if (m_sharedFile) { CloseHandle(m_sharedFile); - m_sharedFile = 0; + m_sharedFile = nullptr; } if (m_waitHandles[TerminateEventHandle]) { CloseHandle(m_waitHandles[TerminateEventHandle]); - m_waitHandles[TerminateEventHandle] = 0; + m_waitHandles[TerminateEventHandle] = nullptr; } if (m_waitHandles[DataReadyEventHandle]) { CloseHandle(m_waitHandles[DataReadyEventHandle]); - m_waitHandles[DataReadyEventHandle] = 0; + m_waitHandles[DataReadyEventHandle] = nullptr; } if (m_bufferReadyEvent) { CloseHandle(m_bufferReadyEvent); - m_bufferReadyEvent = 0; + m_bufferReadyEvent = nullptr; } } @@ -130,7 +130,7 @@ bool WinDebugInterface::runLoop() return false; LPSTR message = reinterpret_cast<LPSTR>(m_sharedMem) + sizeof(DWORD); - LPDWORD processId = reinterpret_cast<LPDWORD>(m_sharedMem); + auto processId = reinterpret_cast<LPDWORD>(m_sharedMem); SetEvent(m_bufferReadyEvent); diff --git a/src/plugins/projectexplorer/xcodebuildparser.cpp b/src/plugins/projectexplorer/xcodebuildparser.cpp index 470cb7fcae..a96d4bb097 100644 --- a/src/plugins/projectexplorer/xcodebuildparser.cpp +++ b/src/plugins/projectexplorer/xcodebuildparser.cpp @@ -270,8 +270,8 @@ void ProjectExplorerPlugin::testXcodebuildParserParsing_data() void ProjectExplorerPlugin::testXcodebuildParserParsing() { OutputParserTester testbench; - XcodebuildParser *childParser = new XcodebuildParser; - XcodebuildParserTester *tester = new XcodebuildParserTester(childParser); + auto *childParser = new XcodebuildParser; + auto *tester = new XcodebuildParserTester(childParser); connect(&testbench, &OutputParserTester::aboutToDeleteParser, tester, &XcodebuildParserTester::onAboutToDeleteParser); diff --git a/src/plugins/pythoneditor/pythoneditorplugin.cpp b/src/plugins/pythoneditor/pythoneditorplugin.cpp index f3375a67c9..ee20e088c9 100644 --- a/src/plugins/pythoneditor/pythoneditorplugin.cpp +++ b/src/plugins/pythoneditor/pythoneditorplugin.cpp @@ -299,7 +299,6 @@ Runnable PythonRunConfiguration::runnable() const QtcProcess::addArg(&r.commandLineArguments, mainScript()); QtcProcess::addArgs(&r.commandLineArguments, extraAspect<ArgumentsAspect>()->arguments()); r.executable = extraAspect<InterpreterAspect>()->value(); - r.runMode = extraAspect<TerminalAspect>()->runMode(); r.environment = extraAspect<EnvironmentAspect>()->environment(); return r; } @@ -311,6 +310,7 @@ public: { registerRunConfiguration<PythonRunConfiguration>("PythonEditor.RunConfiguration."); addSupportedProjectType(PythonProjectId); + addRunWorkerFactory<SimpleTargetRunner>(ProjectExplorer::Constants::NORMAL_RUN_MODE); } }; @@ -623,12 +623,6 @@ bool PythonEditorPlugin::initialize(const QStringList &arguments, QString *error ProjectManager::registerProjectType<PythonProject>(PythonMimeType); - auto constraint = [](RunConfiguration *runConfiguration) { - auto aspect = runConfiguration->extraAspect<InterpreterAspect>(); - return aspect && !aspect->value().isEmpty(); - }; - RunControl::registerWorker<SimpleTargetRunner>(ProjectExplorer::Constants::NORMAL_RUN_MODE, constraint); - return true; } diff --git a/src/plugins/qbsprojectmanager/customqbspropertiesdialog.cpp b/src/plugins/qbsprojectmanager/customqbspropertiesdialog.cpp index e78308514c..ab88086fd5 100644 --- a/src/plugins/qbsprojectmanager/customqbspropertiesdialog.cpp +++ b/src/plugins/qbsprojectmanager/customqbspropertiesdialog.cpp @@ -45,10 +45,10 @@ CustomQbsPropertiesDialog::CustomQbsPropertiesDialog(const QVariantMap &properti int currentRow = 0; for (QVariantMap::ConstIterator it = properties.constBegin(); it != properties.constEnd(); ++it) { - QTableWidgetItem * const nameItem = new QTableWidgetItem; + auto * const nameItem = new QTableWidgetItem; nameItem->setData(Qt::DisplayRole, it.key()); m_ui->propertiesTable->setItem(currentRow, 0, nameItem); - QTableWidgetItem * const valueItem = new QTableWidgetItem; + auto * const valueItem = new QTableWidgetItem; valueItem->setData(Qt::DisplayRole, qbs::settingsValueToRepresentation(it.value())); m_ui->propertiesTable->setItem(currentRow, 1, valueItem); ++currentRow; diff --git a/src/plugins/qbsprojectmanager/customqbspropertiesdialog.h b/src/plugins/qbsprojectmanager/customqbspropertiesdialog.h index cbbc757945..dccfd28609 100644 --- a/src/plugins/qbsprojectmanager/customqbspropertiesdialog.h +++ b/src/plugins/qbsprojectmanager/customqbspropertiesdialog.h @@ -37,10 +37,10 @@ class CustomQbsPropertiesDialog : public QDialog Q_OBJECT public: - explicit CustomQbsPropertiesDialog(const QVariantMap &properties, QWidget *parent = 0); + explicit CustomQbsPropertiesDialog(const QVariantMap &properties, QWidget *parent = nullptr); QVariantMap properties() const; - ~CustomQbsPropertiesDialog(); + ~CustomQbsPropertiesDialog() override; private: void addProperty(); diff --git a/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp b/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp index 5ff0cece06..2bc05d1335 100644 --- a/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp +++ b/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp @@ -296,7 +296,7 @@ QVariantMap DefaultPropertyProvider::autoGeneratedProperties(const ProjectExplor } data.insert(QLatin1String(CPP_TOOLCHAINPATH), mainFileInfo.absolutePath()); - if (ProjectExplorer::GccToolChain *gcc = dynamic_cast<ProjectExplorer::GccToolChain *>(mainTc)) { + if (auto gcc = dynamic_cast<ProjectExplorer::GccToolChain *>(mainTc)) { QStringList compilerFlags = gcc->platformCodeGenFlags(); filterCompilerLinkerFlags(targetAbi, compilerFlags); data.insert(QLatin1String(CPP_PLATFORMCOMMONCOMPILERFLAGS), compilerFlags); diff --git a/src/plugins/qbsprojectmanager/defaultpropertyprovider.h b/src/plugins/qbsprojectmanager/defaultpropertyprovider.h index 9e7d36f628..03c3ddaa6b 100644 --- a/src/plugins/qbsprojectmanager/defaultpropertyprovider.h +++ b/src/plugins/qbsprojectmanager/defaultpropertyprovider.h @@ -35,8 +35,9 @@ class DefaultPropertyProvider : public PropertyProvider Q_OBJECT public: - bool canHandle(const ProjectExplorer::Kit *k) const { return k; } - QVariantMap properties(const ProjectExplorer::Kit *k, const QVariantMap &defaultData) const; + bool canHandle(const ProjectExplorer::Kit *k) const override { return k; } + QVariantMap properties(const ProjectExplorer::Kit *k, + const QVariantMap &defaultData) const override; private: QVariantMap autoGeneratedProperties(const ProjectExplorer::Kit *k, diff --git a/src/plugins/qbsprojectmanager/propertyprovider.h b/src/plugins/qbsprojectmanager/propertyprovider.h index 7d6e94f897..fe27f751b7 100644 --- a/src/plugins/qbsprojectmanager/propertyprovider.h +++ b/src/plugins/qbsprojectmanager/propertyprovider.h @@ -40,7 +40,7 @@ class QBSPROJECTMANAGER_EXPORT PropertyProvider : public QObject public: PropertyProvider(); - ~PropertyProvider(); + ~PropertyProvider() override; virtual bool canHandle(const ProjectExplorer::Kit *k) const = 0; virtual QVariantMap properties(const ProjectExplorer::Kit *k, const QVariantMap &defaultData) const = 0; diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp index d80a64fb4b..af4d0bf0e1 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp @@ -85,7 +85,7 @@ void QbsBuildConfiguration::initialize(const BuildInfo *info) { BuildConfiguration::initialize(info); - const QbsBuildInfo * const bi = static_cast<const QbsBuildInfo *>(info); + const auto * const bi = static_cast<const QbsBuildInfo *>(info); QVariantMap configData = bi->config; configData.insert(QLatin1String(Constants::QBS_CONFIG_VARIANT_KEY), (info->buildType == BuildConfiguration::Debug) @@ -136,7 +136,7 @@ bool QbsBuildConfiguration::fromMap(const QVariantMap &map) BuildStepList *bsl = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); // Fix up the existing build steps: for (int i = 0; i < bsl->count(); ++i) { - QbsBuildStep *bs = qobject_cast<QbsBuildStep *>(bsl->at(i)); + auto bs = qobject_cast<QbsBuildStep *>(bsl->at(i)); if (bs) connect(bs, &QbsBuildStep::qbsConfigurationChanged, this, &QbsBuildConfiguration::qbsConfigurationChanged); } @@ -178,7 +178,7 @@ Internal::QbsProject *QbsBuildConfiguration::project() const IOutputParser *QbsBuildConfiguration::createOutputParser() const { ToolChain *tc = ToolChainKitInformation::toolChain(target()->kit(), ProjectExplorer::Constants::CXX_LANGUAGE_ID); - return tc ? tc->outputParser() : 0; + return tc ? tc->outputParser() : nullptr; } bool QbsBuildConfiguration::isEnabled() const diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfigurationwidget.cpp b/src/plugins/qbsprojectmanager/qbsbuildconfigurationwidget.cpp index e87e18752f..057280a21a 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildconfigurationwidget.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildconfigurationwidget.cpp @@ -49,16 +49,16 @@ QbsBuildConfigurationWidget::QbsBuildConfigurationWidget(QbsProjectManager::Inte connect(bc, &ProjectExplorer::BuildConfiguration::environmentChanged, this, &QbsBuildConfigurationWidget::environmentHasChanged); - QVBoxLayout *vbox = new QVBoxLayout(this); + auto vbox = new QVBoxLayout(this); vbox->setMargin(0); - Utils::DetailsWidget *container = new Utils::DetailsWidget(this); + auto container = new Utils::DetailsWidget(this); container->setState(Utils::DetailsWidget::NoSummary); vbox->addWidget(container); QWidget *details = new QWidget(container); container->setWidget(details); - QGridLayout *layout = new QGridLayout(details); + auto layout = new QGridLayout(details); layout->setMargin(0); layout->addWidget(new QLabel(tr("Build directory:")), 0, 0); diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp index c01db641e3..e5ddbc42f7 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp @@ -67,9 +67,9 @@ class QbsBuildStepConfigWidget : public ProjectExplorer::BuildStepConfigWidget Q_OBJECT public: QbsBuildStepConfigWidget(QbsBuildStep *step); - ~QbsBuildStepConfigWidget(); - QString summaryText() const; - QString displayName() const; + ~QbsBuildStepConfigWidget() override; + QString summaryText() const override; + QString displayName() const override; private: void updateState(); @@ -137,7 +137,7 @@ QbsBuildStep::~QbsBuildStep() cancel(); if (m_job) { m_job->deleteLater(); - m_job = 0; + m_job = nullptr; } delete m_parser; } @@ -148,9 +148,7 @@ bool QbsBuildStep::init(QList<const BuildStep *> &earlierSteps) if (project()->isParsing() || m_job) return false; - QbsBuildConfiguration *bc = static_cast<QbsBuildConfiguration *>(buildConfiguration()); - if (!bc) - bc = static_cast<QbsBuildConfiguration *>(target()->activeBuildConfiguration()); + auto bc = static_cast<QbsBuildConfiguration *>(buildConfiguration()); if (!bc) return false; @@ -222,7 +220,7 @@ QVariantMap QbsBuildStep::qbsConfiguration(VariableHandling variableHandling) co void QbsBuildStep::setQbsConfiguration(const QVariantMap &config) { - QbsProject *pro = static_cast<QbsProject *>(project()); + auto pro = static_cast<QbsProject *>(project()); QVariantMap tmp = config; tmp.insert(Constants::QBS_CONFIG_PROFILE_KEY, pro->profileForTarget(target())); @@ -233,7 +231,7 @@ void QbsBuildStep::setQbsConfiguration(const QVariantMap &config) if (tmp == m_qbsConfiguration) return; m_qbsConfiguration = tmp; - QbsBuildConfiguration *bc = static_cast<QbsBuildConfiguration *>(buildConfiguration()); + auto bc = static_cast<QbsBuildConfiguration *>(buildConfiguration()); if (bc) bc->emitBuildTypeChanged(); emit qbsConfigurationChanged(); @@ -332,7 +330,7 @@ void QbsBuildStep::buildingDone(bool success) createTaskAndOutput(ProjectExplorer::Task::Error, item.description(), item.codeLocation().filePath(), item.codeLocation().line()); - QbsProject *pro = static_cast<QbsProject *>(project()); + auto pro = static_cast<QbsProject *>(project()); // Building can uncover additional target artifacts. pro->updateAfterBuild(); @@ -426,7 +424,7 @@ void QbsBuildStep::setBuildVariant(const QString &variant) return; m_qbsConfiguration.insert(Constants::QBS_CONFIG_VARIANT_KEY, variant); emit qbsConfigurationChanged(); - QbsBuildConfiguration *bc = static_cast<QbsBuildConfiguration *>(buildConfiguration()); + auto bc = static_cast<QbsBuildConfiguration *>(buildConfiguration()); if (bc) bc->emitBuildTypeChanged(); } @@ -519,10 +517,10 @@ void QbsBuildStep::finish() { QTC_ASSERT(m_fi, return); reportRunResult(*m_fi, m_lastWasSuccess); - m_fi = 0; // do not delete, it is not ours + m_fi = nullptr; // do not delete, it is not ours if (m_job) { m_job->deleteLater(); - m_job = 0; + m_job = nullptr; } } @@ -549,7 +547,7 @@ QbsBuildStepConfigWidget::QbsBuildStepConfigWidget(QbsBuildStep *step) : this, &QbsBuildStepConfigWidget::updateState); step->target()->subscribeSignal(&ProjectExplorer::BuildConfiguration::buildDirectoryChanged, this, [this]() { - if (m_step->target()->activeBuildConfiguration() == sender()) + if (m_step->buildConfiguration() == sender()) updateState(); }); @@ -834,7 +832,7 @@ bool QbsBuildStepConfigWidget::validateProperties(Utils::FancyLineEdit *edit, QS QbsBuildStepFactory::QbsBuildStepFactory() { registerStep<QbsBuildStep>(Constants::QBS_BUILDSTEP_ID); - setDisplayName(tr("Qbs Build")); + setDisplayName(QbsBuildStep::tr("Qbs Build")); setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); setSupportedConfiguration(Constants::QBS_BC_ID); setSupportedProjectType(Constants::PROJECT_ID); diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.h b/src/plugins/qbsprojectmanager/qbsbuildstep.h index f104152627..07076439b6 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildstep.h +++ b/src/plugins/qbsprojectmanager/qbsbuildstep.h @@ -143,8 +143,6 @@ private: class QbsBuildStepFactory : public ProjectExplorer::BuildStepFactory { - Q_OBJECT - public: QbsBuildStepFactory(); }; diff --git a/src/plugins/qbsprojectmanager/qbscleanstep.cpp b/src/plugins/qbsprojectmanager/qbscleanstep.cpp index b47610a446..9ddf533395 100644 --- a/src/plugins/qbsprojectmanager/qbscleanstep.cpp +++ b/src/plugins/qbsprojectmanager/qbscleanstep.cpp @@ -59,7 +59,7 @@ QbsCleanStep::~QbsCleanStep() cancel(); if (m_job) { m_job->deleteLater(); - m_job = 0; + m_job = nullptr; } } @@ -69,9 +69,7 @@ bool QbsCleanStep::init(QList<const BuildStep *> &earlierSteps) if (project()->isParsing() || m_job) return false; - QbsBuildConfiguration *bc = static_cast<QbsBuildConfiguration *>(buildConfiguration()); - if (!bc) - bc = static_cast<QbsBuildConfiguration *>(target()->activeBuildConfiguration()); + auto bc = static_cast<QbsBuildConfiguration *>(buildConfiguration()); if (!bc) return false; @@ -84,7 +82,7 @@ void QbsCleanStep::run(QFutureInterface<bool> &fi) { m_fi = &fi; - QbsProject *pro = static_cast<QbsProject *>(project()); + auto pro = static_cast<QbsProject *>(project()); qbs::CleanOptions options(m_qbsCleanOptions); QString error; @@ -166,9 +164,9 @@ void QbsCleanStep::cleaningDone(bool success) QTC_ASSERT(m_fi, return); reportRunResult(*m_fi, success); - m_fi = 0; // do not delete, it is not ours + m_fi = nullptr; // do not delete, it is not ours m_job->deleteLater(); - m_job = 0; + m_job = nullptr; } void QbsCleanStep::handleTaskStarted(const QString &desciption, int max) @@ -297,7 +295,7 @@ QbsCleanStepFactory::QbsCleanStepFactory() registerStep<QbsCleanStep>(Constants::QBS_CLEANSTEP_ID); setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); setSupportedConfiguration(Constants::QBS_BC_ID); - setDisplayName(tr("Qbs Clean")); + setDisplayName(QbsCleanStep::tr("Qbs Clean")); } } // namespace Internal diff --git a/src/plugins/qbsprojectmanager/qbscleanstep.h b/src/plugins/qbsprojectmanager/qbscleanstep.h index b7f84a1d5b..04d557aba4 100644 --- a/src/plugins/qbsprojectmanager/qbscleanstep.h +++ b/src/plugins/qbsprojectmanager/qbscleanstep.h @@ -95,9 +95,9 @@ class QbsCleanStepConfigWidget : public ProjectExplorer::BuildStepConfigWidget Q_OBJECT public: QbsCleanStepConfigWidget(QbsCleanStep *step); - ~QbsCleanStepConfigWidget(); - QString summaryText() const; - QString displayName() const; + ~QbsCleanStepConfigWidget() override; + QString summaryText() const override; + QString displayName() const override; private: void updateState(); @@ -114,8 +114,6 @@ private: class QbsCleanStepFactory : public ProjectExplorer::BuildStepFactory { - Q_OBJECT - public: QbsCleanStepFactory(); }; diff --git a/src/plugins/qbsprojectmanager/qbsinstallstep.cpp b/src/plugins/qbsprojectmanager/qbsinstallstep.cpp index fdd3af1dfe..a5a8430c0c 100644 --- a/src/plugins/qbsprojectmanager/qbsinstallstep.cpp +++ b/src/plugins/qbsprojectmanager/qbsinstallstep.cpp @@ -76,7 +76,7 @@ QbsInstallStep::~QbsInstallStep() cancel(); if (m_job) m_job->deleteLater(); - m_job = 0; + m_job = nullptr; } bool QbsInstallStep::init(QList<const BuildStep *> &earlierSteps) @@ -90,7 +90,7 @@ void QbsInstallStep::run(QFutureInterface<bool> &fi) { m_fi = &fi; - QbsProject *pro = static_cast<QbsProject *>(project()); + auto pro = static_cast<QbsProject *>(project()); m_job = pro->install(m_qbsInstallOptions); if (!m_job) { @@ -146,8 +146,7 @@ bool QbsInstallStep::keepGoing() const const QbsBuildConfiguration *QbsInstallStep::buildConfig() const { - return static_cast<QbsBuildConfiguration *>( - deployConfiguration()->target()->activeBuildConfiguration()); + return static_cast<QbsBuildConfiguration *>(buildConfiguration()); } bool QbsInstallStep::fromMap(const QVariantMap &map) @@ -188,9 +187,9 @@ void QbsInstallStep::installDone(bool success) QTC_ASSERT(m_fi, return); reportRunResult(*m_fi, success); - m_fi = 0; // do not delete, it is not ours + m_fi = nullptr; // do not delete, it is not ours m_job->deleteLater(); - m_job = 0; + m_job = nullptr; } void QbsInstallStep::handleTaskStarted(const QString &desciption, int max) @@ -261,7 +260,7 @@ QbsInstallStepConfigWidget::QbsInstallStepConfigWidget(QbsInstallStep *step) : setContentsMargins(0, 0, 0, 0); - QbsProject *project = static_cast<QbsProject *>(m_step->project()); + auto project = static_cast<QbsProject *>(m_step->project()); m_ui = new Ui::QbsInstallStepConfigWidget; m_ui->setupUi(this); @@ -339,7 +338,7 @@ QbsInstallStepFactory::QbsInstallStepFactory() setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY); setSupportedDeviceType(ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE); setSupportedProjectType(Constants::PROJECT_ID); - setDisplayName(tr("Qbs Install")); + setDisplayName(QbsInstallStep::tr("Qbs Install")); } } // namespace Internal diff --git a/src/plugins/qbsprojectmanager/qbsinstallstep.h b/src/plugins/qbsprojectmanager/qbsinstallstep.h index 74e930570a..e76763b2a7 100644 --- a/src/plugins/qbsprojectmanager/qbsinstallstep.h +++ b/src/plugins/qbsprojectmanager/qbsinstallstep.h @@ -98,9 +98,9 @@ class QbsInstallStepConfigWidget : public ProjectExplorer::BuildStepConfigWidget Q_OBJECT public: QbsInstallStepConfigWidget(QbsInstallStep *step); - ~QbsInstallStepConfigWidget(); - QString summaryText() const; - QString displayName() const; + ~QbsInstallStepConfigWidget() override; + QString summaryText() const override; + QString displayName() const override; private: void updateState(); @@ -119,8 +119,6 @@ private: class QbsInstallStepFactory : public ProjectExplorer::BuildStepFactory { - Q_OBJECT - public: QbsInstallStepFactory(); }; diff --git a/src/plugins/qbsprojectmanager/qbslogsink.h b/src/plugins/qbsprojectmanager/qbslogsink.h index f3f07f6513..e6c7403ad9 100644 --- a/src/plugins/qbsprojectmanager/qbslogsink.h +++ b/src/plugins/qbsprojectmanager/qbslogsink.h @@ -40,7 +40,7 @@ class QbsLogSink : public QObject, public qbs::ILogSink { Q_OBJECT public: - QbsLogSink(QObject *parent = 0); + QbsLogSink(QObject *parent = nullptr); signals: void newTask(const ProjectExplorer::Task &task); @@ -48,8 +48,9 @@ signals: private: Q_INVOKABLE void sendMessages(); - void doPrintWarning(const qbs::ErrorInfo &warning); - void doPrintMessage(qbs::LoggerLevel level, const QString &message, const QString &tag); + void doPrintWarning(const qbs::ErrorInfo &warning) override; + void doPrintMessage(qbs::LoggerLevel level, const QString &message, + const QString &tag) override; QStringList m_messages; QMutex m_mutex; diff --git a/src/plugins/qbsprojectmanager/qbsnodes.cpp b/src/plugins/qbsprojectmanager/qbsnodes.cpp index 9a0091cf88..847cec3782 100644 --- a/src/plugins/qbsprojectmanager/qbsnodes.cpp +++ b/src/plugins/qbsprojectmanager/qbsnodes.cpp @@ -56,21 +56,21 @@ namespace Internal { static const QbsProjectNode *parentQbsProjectNode(const ProjectExplorer::Node *node) { for (const ProjectExplorer::FolderNode *pn = node->managingProject(); pn; pn = pn->parentProjectNode()) { - const QbsProjectNode *prjNode = dynamic_cast<const QbsProjectNode *>(pn); + const auto prjNode = dynamic_cast<const QbsProjectNode *>(pn); if (prjNode) return prjNode; } - return 0; + return nullptr; } static const QbsProductNode *parentQbsProductNode(const ProjectExplorer::Node *node) { for (; node; node = node->parentFolderNode()) { - const QbsProductNode *prdNode = dynamic_cast<const QbsProductNode *>(node); + const auto prdNode = dynamic_cast<const QbsProductNode *>(node); if (prdNode) return prdNode; } - return 0; + return nullptr; } static qbs::GroupData findMainQbsGroup(const qbs::ProductData &productData) @@ -84,7 +84,7 @@ static qbs::GroupData findMainQbsGroup(const qbs::ProductData &productData) class FileTreeNode { public: - explicit FileTreeNode(const QString &n = QString(), FileTreeNode *p = 0, bool f = false) : + explicit FileTreeNode(const QString &n = QString(), FileTreeNode *p = nullptr, bool f = false) : parent(p), name(n), m_isFile(f) { if (p) @@ -109,14 +109,14 @@ public: static FileTreeNode *moveChildrenUp(FileTreeNode *node) { - QTC_ASSERT(node, return 0); + QTC_ASSERT(node, return nullptr); FileTreeNode *newParent = node->parent; if (!newParent) - return 0; + return nullptr; // disconnect node and parent: - node->parent = 0; + node->parent = nullptr; newParent->children.removeOne(node); foreach (FileTreeNode *c, node->children) { @@ -163,7 +163,7 @@ public: // Clean up node: node->children.clear(); node->parent->children.removeOne(node); - node->parent = 0; + node->parent = nullptr; delete node; return; @@ -184,7 +184,7 @@ public: if (node->children.isEmpty() && !node->isFile()) { // Clean up empty folder nodes: node->parent->children.removeOne(node); - node->parent = 0; + node->parent = nullptr; delete node; } else if (node->children.count() == 1 && !node->children.at(0)->isFile()) { // Compact folder nodes with one child only: diff --git a/src/plugins/qbsprojectmanager/qbsnodes.h b/src/plugins/qbsprojectmanager/qbsnodes.h index 16987a875b..8d57c8cf60 100644 --- a/src/plugins/qbsprojectmanager/qbsnodes.h +++ b/src/plugins/qbsprojectmanager/qbsnodes.h @@ -82,8 +82,8 @@ public: QbsGroupNode(const qbs::GroupData &grp, const QString &productPath); bool supportsAction(ProjectExplorer::ProjectAction action, const Node *node) const final; - bool addFiles(const QStringList &filePaths, QStringList *notAdded = 0) override; - bool removeFiles(const QStringList &filePaths, QStringList *notRemoved = 0) override; + bool addFiles(const QStringList &filePaths, QStringList *notAdded = nullptr) override; + bool removeFiles(const QStringList &filePaths, QStringList *notRemoved = nullptr) override; bool renameFile(const QString &filePath, const QString &newFilePath) override; qbs::GroupData qbsGroupData() const { return m_qbsGroupData; } @@ -106,8 +106,8 @@ public: bool showInSimpleTree() const override; bool supportsAction(ProjectExplorer::ProjectAction action, const Node *node) const final; - bool addFiles(const QStringList &filePaths, QStringList *notAdded = 0) override; - bool removeFiles(const QStringList &filePaths, QStringList *notRemoved = 0) override; + bool addFiles(const QStringList &filePaths, QStringList *notAdded = nullptr) override; + bool removeFiles(const QStringList &filePaths, QStringList *notRemoved = nullptr) override; bool renameFile(const QString &filePath, const QString &newFilePath) override; const qbs::ProductData qbsProductData() const { return m_qbsProductData; } diff --git a/src/plugins/qbsprojectmanager/qbsparser.h b/src/plugins/qbsprojectmanager/qbsparser.h index 22b3fd1f32..44bfb133ba 100644 --- a/src/plugins/qbsprojectmanager/qbsparser.h +++ b/src/plugins/qbsprojectmanager/qbsparser.h @@ -42,8 +42,8 @@ public: explicit QbsParser(); private: - void setWorkingDirectory(const QString &workingDirectory); - void taskAdded(const ProjectExplorer::Task &task, int linkedLines, int skipLines); + void setWorkingDirectory(const QString &workingDirectory) override; + void taskAdded(const ProjectExplorer::Task &task, int linkedLines, int skipLines) override; QDir m_workingDirectory; }; diff --git a/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp b/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp index 4b7387039f..418f30e211 100644 --- a/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp +++ b/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp @@ -52,7 +52,7 @@ class QbsProfilesSettingsWidget : public QWidget { Q_OBJECT public: - QbsProfilesSettingsWidget(QWidget *parent = 0); + QbsProfilesSettingsWidget(QWidget *parent = nullptr); void apply(); @@ -66,7 +66,6 @@ private: QbsProfilesSettingsPage::QbsProfilesSettingsPage(QObject *parent) : Core::IOptionsPage(parent) - , m_widget(0) , m_useQtcSettingsDirPersistent(QbsProjectManagerSettings::useCreatorSettingsDirForQbs()) { @@ -92,7 +91,7 @@ void QbsProfilesSettingsPage::apply() void QbsProfilesSettingsPage::finish() { delete m_widget; - m_widget = 0; + m_widget = nullptr; QbsProjectManagerSettings::setUseCreatorSettingsDirForQbs(m_useQtcSettingsDirPersistent); QbsProjectManagerSettings::writeSettings(); } @@ -131,7 +130,7 @@ void QbsProfilesSettingsWidget::apply() void QbsProfilesSettingsWidget::refreshKitsList() { m_ui.kitsComboBox->disconnect(this); - m_ui.propertiesView->setModel(0); + m_ui.propertiesView->setModel(nullptr); m_model.reload(); m_ui.profileValueLabel->clear(); Core::Id currentId; @@ -159,7 +158,7 @@ void QbsProfilesSettingsWidget::refreshKitsList() void QbsProfilesSettingsWidget::displayCurrentProfile() { - m_ui.propertiesView->setModel(0); + m_ui.propertiesView->setModel(nullptr); if (m_ui.kitsComboBox->currentIndex() == -1) return; const Core::Id kitId = Core::Id::fromSetting(m_ui.kitsComboBox->currentData()); diff --git a/src/plugins/qbsprojectmanager/qbsprofilessettingspage.h b/src/plugins/qbsprojectmanager/qbsprofilessettingspage.h index 9c851daa0d..f146b92c72 100644 --- a/src/plugins/qbsprojectmanager/qbsprofilessettingspage.h +++ b/src/plugins/qbsprojectmanager/qbsprofilessettingspage.h @@ -34,14 +34,14 @@ class QbsProfilesSettingsWidget; class QbsProfilesSettingsPage : public Core::IOptionsPage { public: - QbsProfilesSettingsPage(QObject *parent = 0); + QbsProfilesSettingsPage(QObject *parent = nullptr); private: QWidget *widget() override; void apply() override; void finish() override; - QbsProfilesSettingsWidget *m_widget; + QbsProfilesSettingsWidget *m_widget = nullptr; bool m_useQtcSettingsDirPersistent; }; diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index fe94dedb16..22fcfc9dfa 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -120,13 +120,8 @@ private: // -------------------------------------------------------------------- QbsProject::QbsProject(const FileName &fileName) : - Project(Constants::MIME_TYPE, fileName, [this]() { delayParsing(); }), - m_qbsProjectParser(0), - m_qbsUpdateFutureInterface(0), - m_parsingScheduled(false), - m_cancelStatus(CancelStatusNone), - m_cppCodeModelUpdater(new CppTools::CppProjectUpdater(this)), - m_extraCompilersPending(false) + Project(Constants::MIME_TYPE, fileName, [this] { delayParsing(); }), + m_cppCodeModelUpdater(new CppTools::CppProjectUpdater(this)) { m_parsingDelay.setInterval(1000); // delay parsing by 1s. @@ -174,7 +169,7 @@ QbsProject::~QbsProject() m_qbsUpdateFutureInterface->reportCanceled(); m_qbsUpdateFutureInterface->reportFinished(); delete m_qbsUpdateFutureInterface; - m_qbsUpdateFutureInterface = 0; + m_qbsUpdateFutureInterface = nullptr; } qDeleteAll(m_extraCompilers); std::for_each(m_qbsDocuments.cbegin(), m_qbsDocuments.cend(), @@ -210,7 +205,7 @@ class ChangeExpector { public: ChangeExpector(const QString &filePath, const QSet<IDocument *> &documents) - : m_document(0) + : m_document(nullptr) { foreach (IDocument * const doc, documents) { if (doc->filePath().toString() == filePath) { @@ -362,8 +357,8 @@ template<typename Options> qbs::AbstractJob *QbsProject::buildOrClean(const Options &opts, const QStringList &productNames, QString &error) { - QTC_ASSERT(qbsProject().isValid(), return 0); - QTC_ASSERT(!isParsing(), return 0); + QTC_ASSERT(qbsProject().isValid(), return nullptr); + QTC_ASSERT(!isParsing(), return nullptr); QList<qbs::ProductData> products; foreach (const QString &productName, productNames) { @@ -400,7 +395,7 @@ qbs::CleanJob *QbsProject::clean(const qbs::CleanOptions &opts, const QStringLis qbs::InstallJob *QbsProject::install(const qbs::InstallOptions &opts) { if (!qbsProject().isValid()) - return 0; + return nullptr; return qbsProject().installAllProducts(opts); } @@ -437,7 +432,7 @@ bool QbsProject::checkCancelStatus() return false; qCDebug(qbsPmLog) << "Cancel request while parsing, starting re-parse"; m_qbsProjectParser->deleteLater(); - m_qbsProjectParser = 0; + m_qbsProjectParser = nullptr; emitParsingFinished(false); parseCurrentBuildConfiguration(); return true; @@ -514,10 +509,10 @@ void QbsProject::handleQbsParsingDone(bool success) } m_qbsProjectParser->deleteLater(); - m_qbsProjectParser = 0; + m_qbsProjectParser = nullptr; m_qbsUpdateFutureInterface->reportFinished(); delete m_qbsUpdateFutureInterface; - m_qbsUpdateFutureInterface = 0; + m_qbsUpdateFutureInterface = nullptr; if (dataChanged) updateAfterParse(); @@ -539,10 +534,10 @@ void QbsProject::handleRuleExecutionDone() return; m_qbsProjectParser->deleteLater(); - m_qbsProjectParser = 0; + m_qbsProjectParser = nullptr; m_qbsUpdateFutureInterface->reportFinished(); delete m_qbsUpdateFutureInterface; - m_qbsUpdateFutureInterface = 0; + m_qbsUpdateFutureInterface = nullptr; QTC_ASSERT(m_qbsProject.isValid(), return); m_projectData = m_qbsProject.projectData(); @@ -588,7 +583,7 @@ void QbsProject::parseCurrentBuildConfiguration() if (!activeTarget()) return; - QbsBuildConfiguration *bc = qobject_cast<QbsBuildConfiguration *>(activeTarget()->activeBuildConfiguration()); + auto bc = qobject_cast<QbsBuildConfiguration *>(activeTarget()->activeBuildConfiguration()); if (!bc) return; @@ -719,7 +714,7 @@ void QbsProject::prepareForParsing() m_qbsUpdateFutureInterface->reportFinished(); } delete m_qbsUpdateFutureInterface; - m_qbsUpdateFutureInterface = 0; + m_qbsUpdateFutureInterface = nullptr; m_qbsUpdateFutureInterface = new QFutureInterface<bool>(); m_qbsUpdateFutureInterface->setProgressRange(0, 0); diff --git a/src/plugins/qbsprojectmanager/qbsproject.h b/src/plugins/qbsprojectmanager/qbsproject.h index c373ee8b0f..5d8c057a9c 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.h +++ b/src/plugins/qbsprojectmanager/qbsproject.h @@ -146,16 +146,16 @@ private: qbs::ProjectData m_projectData; // Cached m_qbsProject.projectData() QSet<Core::IDocument *> m_qbsDocuments; - QbsProjectParser *m_qbsProjectParser; + QbsProjectParser *m_qbsProjectParser = nullptr; - QFutureInterface<bool> *m_qbsUpdateFutureInterface; - bool m_parsingScheduled; + QFutureInterface<bool> *m_qbsUpdateFutureInterface = nullptr; + bool m_parsingScheduled = false; enum CancelStatus { CancelStatusNone, CancelStatusCancelingForReparse, CancelStatusCancelingAltoghether - } m_cancelStatus; + } m_cancelStatus = CancelStatusNone; CppTools::CppProjectUpdater *m_cppCodeModelUpdater = nullptr; CppTools::ProjectInfo m_cppCodeModelProjectInfo; @@ -164,7 +164,7 @@ private: QTimer m_parsingDelay; QList<ProjectExplorer::ExtraCompiler *> m_extraCompilers; - bool m_extraCompilersPending; + bool m_extraCompilersPending = false; }; } // namespace Internal diff --git a/src/plugins/qbsprojectmanager/qbsprojectimporter.cpp b/src/plugins/qbsprojectmanager/qbsprojectimporter.cpp index f483000395..8978631d6c 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectimporter.cpp +++ b/src/plugins/qbsprojectmanager/qbsprojectimporter.cpp @@ -231,7 +231,7 @@ QList<BuildInfo *> QbsProjectImporter::buildInfoListForKit(const Kit *k, void *d return result; } const auto * const bgData = static_cast<BuildGraphData *>(directoryData); - QbsBuildInfo * const buildInfo = new QbsBuildInfo(factory); + auto * const buildInfo = new QbsBuildInfo(factory); buildInfo->displayName = bgData->bgFilePath.toFileInfo().completeBaseName(); buildInfo->buildType = bgData->buildVariant == "debug" ? BuildConfiguration::Debug : BuildConfiguration::Release; diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanager.h b/src/plugins/qbsprojectmanager/qbsprojectmanager.h index 7dae3ed297..c16aedb7a3 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanager.h +++ b/src/plugins/qbsprojectmanager/qbsprojectmanager.h @@ -46,7 +46,7 @@ class QbsManager : public QObject public: QbsManager(); - ~QbsManager(); + ~QbsManager() override; // QBS profiles management: static QString profileForKit(const ProjectExplorer::Kit *k); diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp index d75efe0186..b235d7e359 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp +++ b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp @@ -114,7 +114,7 @@ bool QbsProjectManagerPlugin::initialize(const QStringList &arguments, QString * Core::HelpManager::registerDocumentation({Core::ICore::documentationPath() + "/qbs.qch"}); ProjectManager::registerProjectType<QbsProject>(QmlJSTools::Constants::QBS_MIMETYPE); - KitManager::registerKitInformation(new QbsKitInformation); + KitManager::registerKitInformation<QbsKitInformation>(); //menus // Build Menu: @@ -301,7 +301,7 @@ void QbsProjectManagerPlugin::extensionsInitialized() void QbsProjectManagerPlugin::projectWasAdded(Project *project) { - QbsProject *qbsProject = qobject_cast<QbsProject *>(project); + auto qbsProject = qobject_cast<QbsProject *>(project); if (!qbsProject) return; @@ -314,7 +314,7 @@ void QbsProjectManagerPlugin::projectWasAdded(Project *project) void QbsProjectManagerPlugin::updateContextActions() { - QbsProject *project = qobject_cast<Internal::QbsProject *>(ProjectTree::currentProject()); + auto project = qobject_cast<Internal::QbsProject *>(ProjectTree::currentProject()); const Node *node = ProjectTree::findCurrentNode(); bool isEnabled = !BuildManager::isBuilding(project) && project && !project->isParsing() @@ -322,7 +322,7 @@ void QbsProjectManagerPlugin::updateContextActions() bool isFile = project && node && (node->nodeType() == NodeType::File); const bool isProduct = project && node && dynamic_cast<const QbsProductNode *>(node); - const QbsProjectNode *subproject = dynamic_cast<const QbsProjectNode *>(node); + const auto subproject = dynamic_cast<const QbsProjectNode *>(node); bool isSubproject = project && subproject && subproject != project->rootProjectNode(); m_reparseQbsCtx->setEnabled(isEnabled); @@ -337,7 +337,7 @@ void QbsProjectManagerPlugin::updateContextActions() void QbsProjectManagerPlugin::updateReparseQbsAction() { - QbsProject *project = qobject_cast<QbsProject *>(SessionManager::startupProject()); + auto project = qobject_cast<QbsProject *>(SessionManager::startupProject()); m_reparseQbs->setEnabled(project && !BuildManager::isBuilding(project) && !project->isParsing()); @@ -363,14 +363,14 @@ void QbsProjectManagerPlugin::updateBuildActions() fileName = editorNode->filePath().fileName(); fileVisible = editorProject && editorNode && dynamic_cast<QbsBaseProjectNode *>(editorNode->parentProjectNode()); - QbsProductNode *productNode = - dynamic_cast<QbsProductNode *>(editorNode ? editorNode->parentProjectNode() : 0); + auto productNode = + dynamic_cast<QbsProductNode *>(editorNode ? editorNode->parentProjectNode() : nullptr); if (productNode) { productVisible = true; productName = productNode->displayName(); } - QbsProjectNode *subprojectNode = - dynamic_cast<QbsProjectNode *>(productNode ? productNode->parentFolderNode() : 0); + auto subprojectNode = + dynamic_cast<QbsProjectNode *>(productNode ? productNode->parentFolderNode() : nullptr); if (subprojectNode && editorProject && subprojectNode != editorProject->rootProjectNode()) { subprojectVisible = true; subprojectName = subprojectNode->displayName(); @@ -404,7 +404,7 @@ void QbsProjectManagerPlugin::updateBuildActions() void QbsProjectManagerPlugin::projectChanged() { - QbsProject *project = qobject_cast<QbsProject *>(sender()); + auto project = qobject_cast<QbsProject *>(sender()); if (!project || project == SessionManager::startupProject()) updateReparseQbsAction(); @@ -420,7 +420,7 @@ void QbsProjectManagerPlugin::buildFileContextMenu() { const Node *node = ProjectTree::findCurrentNode(); QTC_ASSERT(node, return); - QbsProject *project = dynamic_cast<QbsProject *>(ProjectTree::currentProject()); + auto project = dynamic_cast<QbsProject *>(ProjectTree::currentProject()); QTC_ASSERT(project, return); buildSingleFile(project, node->filePath().toString()); } @@ -457,10 +457,10 @@ void QbsProjectManagerPlugin::runStepsForProductContextMenu(const QList<Core::Id { const Node *node = ProjectTree::findCurrentNode(); QTC_ASSERT(node, return); - QbsProject *project = dynamic_cast<QbsProject *>(ProjectTree::currentProject()); + auto project = dynamic_cast<QbsProject *>(ProjectTree::currentProject()); QTC_ASSERT(project, return); - const QbsProductNode * const productNode = dynamic_cast<const QbsProductNode *>(node); + const auto * const productNode = dynamic_cast<const QbsProductNode *>(node); QTC_ASSERT(productNode, return); runStepsForProducts(project, {QbsProject::uniqueProductName(productNode->qbsProductData())}, @@ -490,7 +490,7 @@ void QbsProjectManagerPlugin::runStepsForProduct(const QList<Core::Id> &stepType Node *node = currentEditorNode(); if (!node) return; - QbsProductNode *product = dynamic_cast<QbsProductNode *>(node->parentProjectNode()); + auto product = dynamic_cast<QbsProductNode *>(node->parentProjectNode()); if (!product) return; QbsProject *project = currentEditorProject(); @@ -522,10 +522,10 @@ void QbsProjectManagerPlugin::runStepsForSubprojectContextMenu(const QList<Core: { const Node *node = ProjectTree::findCurrentNode(); QTC_ASSERT(node, return); - QbsProject *project = dynamic_cast<QbsProject *>(ProjectTree::currentProject()); + auto project = dynamic_cast<QbsProject *>(ProjectTree::currentProject()); QTC_ASSERT(project, return); - const QbsProjectNode *subProject = dynamic_cast<const QbsProjectNode *>(node); + const auto subProject = dynamic_cast<const QbsProjectNode *>(node); QTC_ASSERT(subProject, return); QStringList toBuild; @@ -560,10 +560,10 @@ void QbsProjectManagerPlugin::runStepsForSubproject(const QList<Core::Id> &stepT if (!editorNode || !editorProject) return; - QbsProjectNode *subproject = 0; - QbsBaseProjectNode *start = dynamic_cast<QbsBaseProjectNode *>(editorNode->parentProjectNode()); + QbsProjectNode *subproject = nullptr; + auto start = dynamic_cast<QbsBaseProjectNode *>(editorNode->parentProjectNode()); while (start && start != editorProject->rootProjectNode()) { - QbsProjectNode *tmp = dynamic_cast<QbsProjectNode *>(start); + auto tmp = dynamic_cast<QbsProjectNode *>(start); if (tmp) { subproject = tmp; break; @@ -590,7 +590,7 @@ void QbsProjectManagerPlugin::buildFiles(QbsProject *project, const QStringList Target *t = project->activeTarget(); if (!t) return; - QbsBuildConfiguration *bc = qobject_cast<QbsBuildConfiguration *>(t->activeBuildConfiguration()); + auto bc = qobject_cast<QbsBuildConfiguration *>(t->activeBuildConfiguration()); if (!bc) return; @@ -623,7 +623,7 @@ void QbsProjectManagerPlugin::runStepsForProducts(QbsProject *project, Target *t = project->activeTarget(); if (!t) return; - QbsBuildConfiguration *bc = qobject_cast<QbsBuildConfiguration *>(t->activeBuildConfiguration()); + auto bc = qobject_cast<QbsBuildConfiguration *>(t->activeBuildConfiguration()); if (!bc) return; diff --git a/src/plugins/qbsprojectmanager/qbsprojectparser.cpp b/src/plugins/qbsprojectmanager/qbsprojectparser.cpp index f823175d3d..3d67a087e3 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectparser.cpp +++ b/src/plugins/qbsprojectmanager/qbsprojectparser.cpp @@ -49,10 +49,7 @@ namespace Internal { // -------------------------------------------------------------------- QbsProjectParser::QbsProjectParser(QbsProject *project, QFutureInterface<bool> *fi) : - m_qbsSetupProjectJob(0), - m_ruleExecutionJob(0), - m_fi(fi), - m_currentProgressBase(0) + m_fi(fi) { m_project = project->qbsProject(); m_projectFilePath = project->projectFilePath().toString(); @@ -75,7 +72,7 @@ QbsProjectParser::~QbsProjectParser() }; deleteJob(m_qbsSetupProjectJob); deleteJob(m_ruleExecutionJob); - m_fi = 0; // we do not own m_fi, do not delete + m_fi = nullptr; // we do not own m_fi, do not delete } void QbsProjectParser::parse(const QVariantMap &config, const Environment &env, const QString &dir, @@ -114,7 +111,7 @@ void QbsProjectParser::parse(const QVariantMap &config, const Environment &env, params.setPropertyCheckingMode(qbs::ErrorHandlingMode::Relaxed); params.setLogElapsedTime(!qEnvironmentVariableIsEmpty(Constants::QBS_PROFILING_ENV)); - m_qbsSetupProjectJob = m_project.setupProject(params, QbsManager::logSink(), 0); + m_qbsSetupProjectJob = m_project.setupProject(params, QbsManager::logSink(), nullptr); connect(m_qbsSetupProjectJob, &qbs::AbstractJob::finished, this, &QbsProjectParser::handleQbsParsingDone); diff --git a/src/plugins/qbsprojectmanager/qbsprojectparser.h b/src/plugins/qbsprojectmanager/qbsprojectparser.h index 2ae45c8f9c..4c54d08b3b 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectparser.h +++ b/src/plugins/qbsprojectmanager/qbsprojectparser.h @@ -44,7 +44,7 @@ class QbsProjectParser : public QObject public: QbsProjectParser(QbsProjectManager::Internal::QbsProject *project, QFutureInterface<bool> *fi); - ~QbsProjectParser(); + ~QbsProjectParser() override; void parse(const QVariantMap &config, const Utils::Environment &env, const QString &dir, const QString &configName); @@ -70,14 +70,14 @@ private: void handleRuleExecutionDone(); QString m_projectFilePath; - qbs::SetupProjectJob *m_qbsSetupProjectJob; - qbs::BuildJob *m_ruleExecutionJob; + qbs::SetupProjectJob *m_qbsSetupProjectJob = nullptr; + qbs::BuildJob *m_ruleExecutionJob = nullptr; qbs::ErrorInfo m_error; qbs::Project m_project; bool m_dryRun; - QFutureInterface<bool> *m_fi; - int m_currentProgressBase; + QFutureInterface<bool> *m_fi = nullptr; + int m_currentProgressBase = 0; }; } // namespace Internal diff --git a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp index 83c6ea4a6e..e2d2f56d35 100644 --- a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp @@ -69,6 +69,12 @@ QbsRunConfiguration::QbsRunConfiguration(Target *target, Core::Id id) addExtraAspect(libAspect); connect(libAspect, &UseLibraryPathsAspect::changed, envAspect, &EnvironmentAspect::environmentChanged); + if (HostOsInfo::isMacHost()) { + auto dyldAspect = new UseDyldSuffixAspect(this, "Qbs.RunConfiguration.UseDyldImageSuffix"); + addExtraAspect(dyldAspect); + connect(dyldAspect, &UseDyldSuffixAspect::changed, + envAspect, &EnvironmentAspect::environmentChanged); + } connect(project(), &Project::parsingFinished, this, [envAspect]() { envAspect->buildEnvironmentHasChanged(); }); @@ -81,7 +87,7 @@ QbsRunConfiguration::QbsRunConfiguration(Target *target, Core::Id id) connect(target, &Target::kitChanged, this, &QbsRunConfiguration::updateTargetInformation); - QbsProject *qbsProject = static_cast<QbsProject *>(target->project()); + auto qbsProject = static_cast<QbsProject *>(target->project()); connect(qbsProject, &QbsProject::dataChanged, this, [this] { m_envCache.clear(); }); connect(qbsProject, &Project::parsingFinished, this, &QbsRunConfiguration::updateTargetInformation); @@ -109,6 +115,10 @@ void QbsRunConfiguration::doAdditionalSetup(const RunConfigurationCreationInfo & void QbsRunConfiguration::addToBaseEnvironment(Utils::Environment &env) const { + if (auto dyldAspect = extraAspect<UseDyldSuffixAspect>()) { + if (dyldAspect->value()) + env.set("DYLD_IMAGE_SUFFIX", "_debug"); + } bool usingLibraryPaths = extraAspect<UseLibraryPathsAspect>()->value(); const auto key = qMakePair(env.toStringList(), usingLibraryPaths); @@ -177,6 +187,8 @@ QbsRunConfigurationFactory::QbsRunConfigurationFactory() registerRunConfiguration<QbsRunConfiguration>("Qbs.RunConfiguration:"); addSupportedProjectType(Constants::PROJECT_ID); addSupportedTargetDeviceType(ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE); + + addRunWorkerFactory<SimpleTargetRunner>(ProjectExplorer::Constants::NORMAL_RUN_MODE); } } // namespace Internal diff --git a/src/plugins/qmakeandroidsupport/androidqmakebuildconfigurationfactory.cpp b/src/plugins/qmakeandroidsupport/androidqmakebuildconfigurationfactory.cpp index 1100a7e7e4..308caa4719 100644 --- a/src/plugins/qmakeandroidsupport/androidqmakebuildconfigurationfactory.cpp +++ b/src/plugins/qmakeandroidsupport/androidqmakebuildconfigurationfactory.cpp @@ -24,26 +24,22 @@ ****************************************************************************/ #include "androidqmakebuildconfigurationfactory.h" -#include "qmakeandroidbuildapkstep.h" +#include <android/androidbuildapkstep.h> #include <android/androidconfigurations.h> #include <android/androidconstants.h> #include <android/androidmanager.h> #include <android/androidpackageinstallationstep.h> -#include <projectexplorer/buildmanager.h> #include <projectexplorer/buildsteplist.h> -#include <projectexplorer/projectexplorer.h> +#include <projectexplorer/project.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/target.h> -#include <qmakeprojectmanager/qmakebuildinfo.h> -#include <qmakeprojectmanager/qmakeproject.h> #include <qmakeprojectmanager/qmakeprojectmanagerconstants.h> using namespace Android; using namespace ProjectExplorer; -using namespace QmakeProjectManager; namespace QmakeAndroidSupport { namespace Internal { @@ -74,34 +70,15 @@ void AndroidQmakeBuildConfiguration::initialize(const BuildInfo *info) BuildStepList *buildSteps = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); buildSteps->appendStep(new AndroidPackageInstallationStep(buildSteps)); - buildSteps->appendStep(new QmakeAndroidBuildApkStep(buildSteps)); + buildSteps->appendStep(new Android::AndroidBuildApkStep(buildSteps)); updateCacheAndEmitEnvironmentChanged(); } void AndroidQmakeBuildConfiguration::addToEnvironment(Utils::Environment &env) const { - m_androidNdkPlatform = AndroidConfigurations::currentConfig().bestNdkPlatformMatch(AndroidManager::minimumSDK(target())); - env.set(QLatin1String("ANDROID_NDK_PLATFORM"), m_androidNdkPlatform); -} - -void AndroidQmakeBuildConfiguration::manifestSaved() -{ QString androidNdkPlatform = AndroidConfigurations::currentConfig().bestNdkPlatformMatch(AndroidManager::minimumSDK(target())); - if (m_androidNdkPlatform == androidNdkPlatform) - return; - - updateCacheAndEmitEnvironmentChanged(); - - QMakeStep *qs = qmakeStep(); - if (!qs) - return; - - qs->setForced(true); - - BuildManager::buildList(stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN)); - BuildManager::appendStep(qs, ProjectExplorerPlugin::displayNameForStepId(ProjectExplorer::Constants::BUILDSTEPS_CLEAN)); - setSubNodeBuild(0); + env.set(QLatin1String("ANDROID_NDK_PLATFORM"), androidNdkPlatform); } } // namespace Internal diff --git a/src/plugins/qmakeandroidsupport/androidqmakebuildconfigurationfactory.h b/src/plugins/qmakeandroidsupport/androidqmakebuildconfigurationfactory.h index 71d727adb9..361cf9b80d 100644 --- a/src/plugins/qmakeandroidsupport/androidqmakebuildconfigurationfactory.h +++ b/src/plugins/qmakeandroidsupport/androidqmakebuildconfigurationfactory.h @@ -45,10 +45,6 @@ public: void initialize(const ProjectExplorer::BuildInfo *info) override; void addToEnvironment(Utils::Environment &env) const override; - void manifestSaved(); - -private: - mutable QString m_androidNdkPlatform; }; } // namespace Internal diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.cpp b/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.cpp deleted file mode 100644 index 1f409ebd3a..0000000000 --- a/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.cpp +++ /dev/null @@ -1,213 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 BogDan Vatra <bog_dan_ro@yahoo.com> -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "qmakeandroidbuildapkstep.h" -#include "qmakeandroidbuildapkwidget.h" - -#include <android/androidconfigurations.h> -#include <android/androidconstants.h> -#include <android/androidmanager.h> -#include <android/androidqtsupport.h> - -#include <projectexplorer/buildconfiguration.h> -#include <projectexplorer/buildsteplist.h> -#include <projectexplorer/project.h> -#include <projectexplorer/projectexplorer.h> -#include <projectexplorer/target.h> -#include <qtsupport/qtkitinformation.h> - -#include <qmakeprojectmanager/qmakeprojectmanagerconstants.h> - -#include <utils/qtcprocess.h> - -using namespace Android; - -namespace QmakeAndroidSupport { -namespace Internal { - -const Core::Id ANDROID_BUILD_APK_ID("QmakeProjectManager.AndroidBuildApkStep"); - - -// QmakeAndroidBuildApkStepFactory - -QmakeAndroidBuildApkStepFactory::QmakeAndroidBuildApkStepFactory() -{ - registerStep<QmakeAndroidBuildApkStep>(ANDROID_BUILD_APK_ID); - setSupportedProjectType(QmakeProjectManager::Constants::QMAKEPROJECT_ID); - setSupportedDeviceType(Constants::ANDROID_DEVICE_TYPE); - setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); - setDisplayName(tr("Build Android APK")); - setRepeatable(false); -} - -// QmakeAndroidBuildApkStep - -QmakeAndroidBuildApkStep::QmakeAndroidBuildApkStep(ProjectExplorer::BuildStepList *bc) - : AndroidBuildApkStep(bc, ANDROID_BUILD_APK_ID) -{ -} - -Utils::FileName QmakeAndroidBuildApkStep::proFilePathForInputFile() const -{ - ProjectExplorer::RunConfiguration *rc = target()->activeRunConfiguration(); - if (rc) - return Utils::FileName::fromString(rc->buildKey()); - return Utils::FileName(); -} - -bool QmakeAndroidBuildApkStep::init(QList<const BuildStep *> &earlierSteps) -{ - if (AndroidManager::checkForQt51Files(project()->projectDirectory())) - emit addOutput(tr("Found old folder \"android\" in source directory. Qt 5.2 does not use that folder by default."), OutputFormat::Stderr); - - if (!AndroidBuildApkStep::init(earlierSteps)) - return false; - - QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(target()->kit()); - if (!version) - return false; - - QString command = version->qmakeProperty("QT_HOST_BINS"); - if (!command.endsWith('/')) - command += '/'; - command += "androiddeployqt"; - if (Utils::HostOsInfo::isWindowsHost()) - command += ".exe"; - - ProjectExplorer::BuildConfiguration *bc = buildConfiguration(); - QString outputDir = bc->buildDirectory().appendPath(Constants::ANDROID_BUILDDIRECTORY).toString(); - - QString inputFile = AndroidManager::androidQtSupport(target())->deploySettingsFile(target()); - if (inputFile.isEmpty()) { - m_skipBuilding = true; - return true; - } - - QString buildTargetSdk = AndroidManager::buildTargetSDK(target()); - if (buildTargetSdk.isEmpty()) { - emit addOutput(tr("Android build SDK not defined. Check Android settings."), - OutputFormat::Stderr); - return false; - } - - QStringList arguments = {"--input", inputFile, - "--output", outputDir, - "--android-platform", AndroidManager::buildTargetSDK(target()), - "--jdk", AndroidConfigurations::currentConfig().openJDKLocation().toString()}; - - if (m_verbose) - arguments << "--verbose"; - - arguments << "--gradle"; - - if (m_useMinistro) - arguments << "--deployment" << "ministro"; - - QStringList argumentsPasswordConcealed = arguments; - - if (m_signPackage) { - arguments << "--sign" << m_keystorePath.toString() << m_certificateAlias - << "--storepass" << m_keystorePasswd; - argumentsPasswordConcealed << "--sign" << "******" - << "--storepass" << "******"; - if (!m_certificatePasswd.isEmpty()) { - arguments << "--keypass" << m_certificatePasswd; - argumentsPasswordConcealed << "--keypass" << "******"; - } - - } - - // Must be the last option, otherwise androiddeployqt might use the other - // params (e.g. --sign) to choose not to add gdbserver - if (version->qtVersion() >= QtSupport::QtVersionNumber(5, 6, 0)) { - if (m_addDebugger || bc->buildType() == ProjectExplorer::BuildConfiguration::Debug) - arguments << "--gdbserver"; - else - arguments << "--no-gdbserver"; - } - - ProjectExplorer::ProcessParameters *pp = processParameters(); - setupProcessParameters(pp, bc, arguments, command); - - // Generate arguments with keystore password concealed - ProjectExplorer::ProcessParameters pp2; - setupProcessParameters(&pp2, bc, argumentsPasswordConcealed, command); - m_command = pp2.effectiveCommand(); - m_argumentsPasswordConcealed = pp2.prettyArguments(); - - return true; -} - -void QmakeAndroidBuildApkStep::run(QFutureInterface<bool> &fi) -{ - if (m_skipBuilding) { - emit addOutput(tr("No application .pro file found, not building an APK."), BuildStep::OutputFormat::ErrorMessage); - reportRunResult(fi, true); - return; - } - AndroidBuildApkStep::run(fi); -} - -void QmakeAndroidBuildApkStep::setupProcessParameters(ProjectExplorer::ProcessParameters *pp, - ProjectExplorer::BuildConfiguration *bc, - const QStringList &arguments, - const QString &command) -{ - pp->setMacroExpander(bc->macroExpander()); - pp->setWorkingDirectory(bc->buildDirectory().toString()); - Utils::Environment env = bc->environment(); - pp->setEnvironment(env); - pp->setCommand(command); - pp->setArguments(Utils::QtcProcess::joinArgs(arguments)); - pp->resolveAll(); -} - -void QmakeAndroidBuildApkStep::processStarted() -{ - emit addOutput(tr("Starting: \"%1\" %2") - .arg(QDir::toNativeSeparators(m_command), - m_argumentsPasswordConcealed), - BuildStep::OutputFormat::NormalMessage); -} - -ProjectExplorer::BuildStepConfigWidget *QmakeAndroidBuildApkStep::createConfigWidget() -{ - return new QmakeAndroidBuildApkWidget(this); -} - -bool QmakeAndroidBuildApkStep::fromMap(const QVariantMap &map) -{ - return AndroidBuildApkStep::fromMap(map); -} - -QVariantMap QmakeAndroidBuildApkStep::toMap() const -{ - QVariantMap map = AndroidBuildApkStep::toMap(); - return map; -} - -} // namespace Internal -} // namespace QmakeAndroidSupport diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.h b/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.h deleted file mode 100644 index 6435a8486a..0000000000 --- a/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkstep.h +++ /dev/null @@ -1,67 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 BogDan Vatra <bog_dan_ro@yahoo.com> -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include <android/androidbuildapkstep.h> - -namespace QmakeAndroidSupport { -namespace Internal { - -class QmakeAndroidBuildApkStepFactory : public ProjectExplorer::BuildStepFactory -{ - Q_OBJECT - -public: - QmakeAndroidBuildApkStepFactory(); -}; - -class QmakeAndroidBuildApkStep : public Android::AndroidBuildApkStep -{ - Q_OBJECT -public: - QmakeAndroidBuildApkStep(ProjectExplorer::BuildStepList *bc); - Utils::FileName proFilePathForInputFile() const; - -protected: - bool init(QList<const BuildStep *> &earlierSteps) override; - void run(QFutureInterface<bool> &fi) override; - void processStarted() override; - ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override; - bool fromMap(const QVariantMap &map) override; - QVariantMap toMap() const override; - -private: - void setupProcessParameters(ProjectExplorer::ProcessParameters *pp, - ProjectExplorer::BuildConfiguration *bc, - const QStringList &arguments, const QString &command); - QString m_command; - QString m_argumentsPasswordConcealed; - bool m_skipBuilding = false; -}; - -} // namespace Internal -} // namespace QmakeAndroidSupport diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkwidget.cpp b/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkwidget.cpp deleted file mode 100644 index 2ab00a54f1..0000000000 --- a/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkwidget.cpp +++ /dev/null @@ -1,145 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 BogDan Vatra <bog_dan_ro@yahoo.com> -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "createandroidmanifestwizard.h" -#include "qmakeandroidbuildapkstep.h" -#include "qmakeandroidbuildapkwidget.h" -#include "ui_qmakeandroidbuildapkwidget.h" - -#include <android/androidbuildapkwidget.h> -#include <android/androidmanager.h> - -#include <projectexplorer/project.h> - -#include <utils/utilsicons.h> - -#include <QFileDialog> -#include <QLabel> - -namespace QmakeAndroidSupport { -namespace Internal { - -QmakeAndroidBuildApkWidget::QmakeAndroidBuildApkWidget(Android::AndroidBuildApkStep *step) : - m_ui(new Ui::QmakeAndroidBuildApkWidget), - m_step(step) -{ - QVBoxLayout *topLayout = new QVBoxLayout; - - QHBoxLayout *qt51WarningLayout = new QHBoxLayout(); - QLabel *oldFilesWarningIcon = new QLabel(this); - oldFilesWarningIcon->setObjectName(QStringLiteral("oldFilesWarningIcon")); - QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); - sizePolicy.setHorizontalStretch(0); - sizePolicy.setVerticalStretch(0); - sizePolicy.setHeightForWidth(oldFilesWarningIcon->sizePolicy().hasHeightForWidth()); - oldFilesWarningIcon->setSizePolicy(sizePolicy); - oldFilesWarningIcon->setPixmap(Utils::Icons::WARNING.pixmap()); - oldFilesWarningIcon->setAlignment(Qt::Alignment(Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop)); - qt51WarningLayout->addWidget(oldFilesWarningIcon); - - QLabel *oldFilesWarningLabel = new QLabel(this); - oldFilesWarningLabel->setObjectName(QStringLiteral("oldFilesWarningLabel")); - oldFilesWarningLabel->setWordWrap(true); - qt51WarningLayout->addWidget(oldFilesWarningLabel); - - topLayout->addWidget(new Android::AndroidBuildApkWidget(step)); - - QWidget *widget = new QWidget(this); - m_ui->setupUi(widget); - topLayout->addWidget(widget); - setLayout(topLayout); - - bool oldFiles = Android::AndroidManager::checkForQt51Files(m_step->project()->projectDirectory()); - oldFilesWarningIcon->setVisible(oldFiles); - oldFilesWarningLabel->setVisible(oldFiles); - - m_extraLibraryListModel = new AndroidExtraLibraryListModel(m_step->target(), this); - m_ui->androidExtraLibsListView->setModel(m_extraLibraryListModel); - - connect(m_ui->createAndroidTemplatesButton, &QAbstractButton::clicked, - this, &QmakeAndroidBuildApkWidget::createAndroidTemplatesButton); - - connect(m_ui->addAndroidExtraLibButton, &QAbstractButton::clicked, - this, &QmakeAndroidBuildApkWidget::addAndroidExtraLib); - - connect(m_ui->removeAndroidExtraLibButton, &QAbstractButton::clicked, - this, &QmakeAndroidBuildApkWidget::removeAndroidExtraLib); - - connect(m_ui->androidExtraLibsListView->selectionModel(), &QItemSelectionModel::selectionChanged, - this, &QmakeAndroidBuildApkWidget::checkEnableRemoveButton); - - connect(m_extraLibraryListModel, &AndroidExtraLibraryListModel::enabledChanged, - m_ui->additionalLibrariesGroupBox, &QWidget::setEnabled); - - m_ui->additionalLibrariesGroupBox->setEnabled(m_extraLibraryListModel->isEnabled()); -} - -QmakeAndroidBuildApkWidget::~QmakeAndroidBuildApkWidget() -{ - delete m_ui; -} - -void QmakeAndroidBuildApkWidget::createAndroidTemplatesButton() -{ - CreateAndroidManifestWizard wizard(m_step->target()); - wizard.exec(); -} - -void QmakeAndroidBuildApkWidget::addAndroidExtraLib() -{ - QStringList fileNames = QFileDialog::getOpenFileNames(this, - tr("Select additional libraries"), - QDir::homePath(), - tr("Libraries (*.so)")); - - if (!fileNames.isEmpty()) - m_extraLibraryListModel->addEntries(fileNames); -} - -void QmakeAndroidBuildApkWidget::removeAndroidExtraLib() -{ - QModelIndexList removeList = m_ui->androidExtraLibsListView->selectionModel()->selectedIndexes(); - m_extraLibraryListModel->removeEntries(removeList); -} - -void QmakeAndroidBuildApkWidget::checkEnableRemoveButton() -{ - m_ui->removeAndroidExtraLibButton->setEnabled(m_ui->androidExtraLibsListView->selectionModel()->hasSelection()); -} - -QString QmakeAndroidBuildApkWidget::summaryText() const -{ - return tr("<b>Build Android APK</b>"); -} - -QString QmakeAndroidBuildApkWidget::displayName() const -{ - return summaryText(); -} - -} // namespace Internal -} // namespace QmakeAndroidSupport - - diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkwidget.h b/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkwidget.h deleted file mode 100644 index d61d6a8c26..0000000000 --- a/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkwidget.h +++ /dev/null @@ -1,66 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 BogDan Vatra <bog_dan_ro@yahoo.com> -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include "androidextralibrarylistmodel.h" - -#include <projectexplorer/buildstep.h> -#include <android/androidbuildapkstep.h> - -#include <QWidget> - -namespace QmakeAndroidSupport { -namespace Internal { - -namespace Ui { class QmakeAndroidBuildApkWidget; } - -class QmakeAndroidBuildApkWidget : public ProjectExplorer::BuildStepConfigWidget -{ - Q_OBJECT - -public: - explicit QmakeAndroidBuildApkWidget(Android::AndroidBuildApkStep *step); - ~QmakeAndroidBuildApkWidget(); - -private: - void createAndroidTemplatesButton(); - void addAndroidExtraLib(); - void removeAndroidExtraLib(); - void checkEnableRemoveButton(); - -private: - Ui::QmakeAndroidBuildApkWidget *m_ui = nullptr; - Android::AndroidBuildApkStep *m_step = nullptr; - AndroidExtraLibraryListModel *m_extraLibraryListModel = nullptr; - bool m_ignoreChange = false; - - // BuildStepConfigWidget interface - QString summaryText() const final; - QString displayName() const final; -}; - -} // namespace Internal -} // namespace QmakeAndroidSupport diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkwidget.ui b/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkwidget.ui deleted file mode 100644 index 894a4bb689..0000000000 --- a/src/plugins/qmakeandroidsupport/qmakeandroidbuildapkwidget.ui +++ /dev/null @@ -1,135 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>QmakeAndroidSupport::Internal::QmakeAndroidBuildApkWidget</class> - <widget class="QWidget" name="QmakeAndroidSupport::Internal::QmakeAndroidBuildApkWidget"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>680</width> - <height>435</height> - </rect> - </property> - <property name="windowTitle"> - <string/> - </property> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <item> - <widget class="QGroupBox" name="additionalLibrariesGroupBox_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Minimum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="title"> - <string>Android</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <widget class="QPushButton" name="createAndroidTemplatesButton"> - <property name="text"> - <string>Create Templates</string> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QGroupBox" name="additionalLibrariesGroupBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="title"> - <string>Additional Libraries</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout_3"> - <item> - <layout class="QHBoxLayout" name="androidExtraLibsLayout"> - <item> - <widget class="QListView" name="androidExtraLibsListView"> - <property name="toolTip"> - <string>List of extra libraries to include in Android package and load on startup.</string> - </property> - <property name="selectionMode"> - <enum>QAbstractItemView::ExtendedSelection</enum> - </property> - </widget> - </item> - <item> - <layout class="QVBoxLayout" name="androidExtraLibsButtonLayout"> - <item> - <widget class="QToolButton" name="addAndroidExtraLibButton"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="toolTip"> - <string>Select library to include in package.</string> - </property> - <property name="text"> - <string>Add...</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextOnly</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="removeAndroidExtraLibButton"> - <property name="toolTip"> - <string>Remove currently selected library from list.</string> - </property> - <property name="text"> - <string>Remove</string> - </property> - </widget> - </item> - <item> - <spacer name="verticalSpacer_2"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - </layout> - </item> - </layout> - </widget> - </item> - </layout> - </widget> - <resources/> - <connections/> -</ui> diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.cpp b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.cpp index 63d7d50fd5..ffd1ef7243 100644 --- a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.cpp +++ b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.cpp @@ -23,10 +23,10 @@ ** ****************************************************************************/ -#include "qmakeandroidbuildapkstep.h" #include "qmakeandroidsupport.h" #include "androidqmakebuildconfigurationfactory.h" +#include <android/androidbuildapkstep.h> #include <android/androidconstants.h> #include <android/androidglobal.h> @@ -36,6 +36,8 @@ #include <qtsupport/qtkitinformation.h> #include <qmakeprojectmanager/qmakeproject.h> +#include <utils/qtcassert.h> + #include <QJsonDocument> #include <QJsonObject> #include <QRegularExpression> @@ -52,6 +54,84 @@ bool QmakeAndroidSupport::canHandle(const ProjectExplorer::Target *target) const return qobject_cast<QmakeProject*>(target->project()); } +QVariant QmakeAndroidSupport::targetData(Core::Id role, const Target *target) const +{ + RunConfiguration *rc = target->activeRunConfiguration(); + if (!rc) + return {}; + + const FileName projectFilePath = FileName::fromString(rc->buildKey()); + const QmakeProject *pro = qobject_cast<QmakeProject *>(target->project()); + QTC_ASSERT(pro, return {}); + QTC_ASSERT(pro->rootProjectNode(), return {}); + const QmakeProFileNode *profileNode = pro->rootProjectNode()->findProFileFor(projectFilePath); + QTC_ASSERT(profileNode, return {}); + + if (role == Android::Constants::AndroidPackageSourceDir) + return profileNode->singleVariableValue(Variable::AndroidPackageSourceDir); + if (role == Android::Constants::AndroidDeploySettingsFile) + return profileNode->singleVariableValue(Variable::AndroidDeploySettingsFile); + if (role == Android::Constants::AndroidExtraLibs) + return profileNode->variableValue(Variable::AndroidExtraLibs); + if (role == Android::Constants::AndroidArch) + return profileNode->singleVariableValue(Variable::AndroidArch); + + QTC_CHECK(false); + return {}; +} + +static QmakeProFile *applicationProFile(const Target *target) +{ + ProjectExplorer::RunConfiguration *rc = target->activeRunConfiguration(); + if (!rc) + return nullptr; + auto project = static_cast<QmakeProject *>(target->project()); + return project->rootProFile()->findProFile(FileName::fromString(rc->buildKey())); +} + +bool QmakeAndroidSupport::parseInProgress(const Target *target) const +{ + QmakeProjectManager::QmakeProFile *pro = applicationProFile(target); + return !pro || pro->parseInProgress(); +} + +bool QmakeAndroidSupport::validParse(const Target *target) const +{ + QmakeProjectManager::QmakeProFile *pro = applicationProFile(target); + return pro->validParse() && pro->projectType() == ProjectType::ApplicationTemplate; +} + +bool QmakeAndroidSupport::extraLibraryEnabled(const Target *target) const +{ + QmakeProFile *pro = applicationProFile(target); + return pro && !pro->parseInProgress(); +} + +FileName QmakeAndroidSupport::projectFilePath(const Target *target) const +{ + QmakeProFile *pro = applicationProFile(target); + return pro ? pro->filePath() : FileName(); +} + +bool QmakeAndroidSupport::setTargetData(Core::Id role, const QVariant &value, const Target *target) const +{ + QmakeProFile *pro = applicationProFile(target); + if (!pro) + return false; + + const QString arch = pro->singleVariableValue(Variable::AndroidArch); + const QString scope = "contains(ANDROID_TARGET_ARCH," + arch + ')'; + auto flags = QmakeProjectManager::Internal::ProWriter::ReplaceValues + | QmakeProjectManager::Internal::ProWriter::MultiLine; + + if (role == Android::Constants::AndroidExtraLibs) + return pro->setProVariable("ANDROID_EXTRA_LIBS", value.toStringList(), scope, flags); + if (role == Android::Constants::AndroidPackageSourceDir) + return pro->setProVariable("ANDROID_PACKAGE_SOURCE_DIR", {value.toString()}, scope, flags); + + return false; +} + QStringList QmakeAndroidSupport::soLibSearchPath(const ProjectExplorer::Target *target) const { QSet<QString> res; @@ -70,7 +150,9 @@ QStringList QmakeAndroidSupport::soLibSearchPath(const ProjectExplorer::Target * + '/' + destDir.toString())); res.insert(destDir.toString()); } - QFile deploymentSettings(androiddeployJsonPath(target).toString()); + + const QString jsonFile = targetData(Android::Constants::AndroidDeploySettingsFile, target).toString(); + QFile deploymentSettings(jsonFile); if (deploymentSettings.open(QIODevice::ReadOnly)) { QJsonParseError error; QJsonDocument doc = QJsonDocument::fromJson(deploymentSettings.readAll(), &error); @@ -86,17 +168,6 @@ QStringList QmakeAndroidSupport::soLibSearchPath(const ProjectExplorer::Target * return res.toList(); } -QStringList QmakeAndroidSupport::androidExtraLibs(const ProjectExplorer::Target *target) const -{ - ProjectExplorer::RunConfiguration *rc = target->activeRunConfiguration(); - if (!rc) - return QStringList(); - auto project = static_cast<QmakeProject *>(target->project()); - QmakeProFileNode *node = - project->rootProjectNode()->findProFileFor(Utils::FileName::fromString(rc->buildKey())); - return node->variableValue(QmakeProjectManager::Variable::AndroidExtraLibs); -} - QStringList QmakeAndroidSupport::projectTargetApplications(const ProjectExplorer::Target *target) const { QStringList apps; @@ -116,91 +187,14 @@ QStringList QmakeAndroidSupport::projectTargetApplications(const ProjectExplorer return apps; } -Utils::FileName QmakeAndroidSupport::androiddeployqtPath(const ProjectExplorer::Target *target) const -{ - QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(target->kit()); - if (!version) - return Utils::FileName(); - - QString command = version->qmakeProperty("QT_HOST_BINS"); - if (!command.endsWith(QLatin1Char('/'))) - command += QLatin1Char('/'); - command += Utils::HostOsInfo::withExecutableSuffix(QLatin1String("androiddeployqt")); - return Utils::FileName::fromString(command); -} - -Utils::FileName QmakeAndroidSupport::androiddeployJsonPath(const ProjectExplorer::Target *target) const -{ - const auto *pro = static_cast<QmakeProject *>(target->project()); - QmakeAndroidBuildApkStep *buildApkStep - = Android::AndroidGlobal::buildStep<QmakeAndroidBuildApkStep>(target->activeBuildConfiguration()); - - if (!buildApkStep) // should never happen - return Utils::FileName(); - - const QmakeProFileNode *node = - pro->rootProjectNode()->findProFileFor(buildApkStep->proFilePathForInputFile()); - if (!node) // should never happen - return Utils::FileName(); - - QString inputFile = node->singleVariableValue(Variable::AndroidDeploySettingsFile); - if (inputFile.isEmpty()) // should never happen - return Utils::FileName(); - - return Utils::FileName::fromString(inputFile); -} - -void QmakeAndroidSupport::manifestSaved(const ProjectExplorer::Target *target) +void QmakeAndroidSupport::addFiles(const ProjectExplorer::Target *target, + const QString &buildKey, + const QStringList &addedFiles) const { - ProjectExplorer::BuildConfiguration *bc = target->activeBuildConfiguration(); - if (auto qbc = qobject_cast<AndroidQmakeBuildConfiguration *>(bc)) - qbc->manifestSaved(); -} - -Utils::FileName QmakeAndroidSupport::manifestSourcePath(const ProjectExplorer::Target *target) -{ - if (ProjectExplorer::RunConfiguration *rc = target->activeRunConfiguration()) { - const auto project = static_cast<QmakeProjectManager::QmakeProject *>(target->project()); - if (project->rootProjectNode()) { - const QmakeProFileNode *node = - project->rootProjectNode()->findProFileFor(Utils::FileName::fromString(rc->buildKey())); - if (node) { - QString packageSource = node->singleVariableValue(Variable::AndroidPackageSourceDir); - if (!packageSource.isEmpty()) { - const auto manifest = Utils::FileName::fromUserInput(packageSource + - "/AndroidManifest.xml"); - if (manifest.exists()) - return manifest; - } - } - } - } - return Utils::FileName(); -} - -static QmakeProFileNode *activeNodeForTarget(const Target *target) -{ - FileName proFilePathForInputFile; - if (RunConfiguration *rc = target->activeRunConfiguration()) - proFilePathForInputFile = FileName::fromString(rc->buildKey()); - const auto pro = static_cast<QmakeProject *>(target->project()); - return pro->rootProjectNode()->findProFileFor(proFilePathForInputFile); -} - -QString QmakeAndroidSupport::deploySettingsFile(const Target *target) const -{ - if (QmakeProFileNode *node = activeNodeForTarget(target)) - return node->singleVariableValue(Variable::AndroidDeploySettingsFile); - return QString(); -} - -FileName QmakeAndroidSupport::packageSourceDir(const Target *target) const -{ - if (QmakeProFileNode *node = activeNodeForTarget(target)) { - QFileInfo sourceDirInfo(node->singleVariableValue(Variable::AndroidPackageSourceDir)); - return FileName::fromString(sourceDirInfo.canonicalFilePath()); - } - return FileName(); + QmakeProject *project = static_cast<QmakeProject *>(target->project()); + QmakeProFile *currentRunNode = project->rootProFile()->findProFile(FileName::fromString(buildKey)); + QTC_ASSERT(currentRunNode, return); + currentRunNode->addFiles(addedFiles); } } // namespace Internal diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.h b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.h index 51ac390702..21d10a8153 100644 --- a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.h +++ b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.h @@ -37,15 +37,19 @@ class QmakeAndroidSupport : public Android::AndroidQtSupport public: bool canHandle(const ProjectExplorer::Target *target) const override; QStringList soLibSearchPath(const ProjectExplorer::Target *target) const override; - QStringList androidExtraLibs(const ProjectExplorer::Target *target) const override; QStringList projectTargetApplications(const ProjectExplorer::Target *target) const override; - Utils::FileName androiddeployqtPath(const ProjectExplorer::Target *target) const override; - Utils::FileName androiddeployJsonPath(const ProjectExplorer::Target *target) const override; - void manifestSaved(const ProjectExplorer::Target *target) override; - Utils::FileName manifestSourcePath(const ProjectExplorer::Target *target) override; - Utils::FileName packageSourceDir(const ProjectExplorer::Target *target) const override; - QString deploySettingsFile(const ProjectExplorer::Target *target) const override; + QVariant targetData(Core::Id role, const ProjectExplorer::Target *target) const override; + bool setTargetData(Core::Id role, const QVariant &value, + const ProjectExplorer::Target *target) const override; + + bool parseInProgress(const ProjectExplorer::Target *target) const override; + bool validParse(const ProjectExplorer::Target *target) const override; + bool extraLibraryEnabled(const ProjectExplorer::Target *target) const override; + Utils::FileName projectFilePath(const ProjectExplorer::Target *target) const override; + + void addFiles(const ProjectExplorer::Target *target, const QString &buildKey, + const QStringList &addedFiles) const override; }; } // namespace Internal diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.pro b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.pro index 36c2699c02..a98219e66e 100644 --- a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.pro +++ b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.pro @@ -5,21 +5,11 @@ DEFINES += \ QMAKEANDROID_LIBRARY HEADERS += \ - androidextralibrarylistmodel.h \ - createandroidmanifestwizard.h \ qmakeandroidsupport.h \ - qmakeandroidbuildapkstep.h \ - qmakeandroidbuildapkwidget.h \ androidqmakebuildconfigurationfactory.h \ qmakeandroidsupportplugin.h SOURCES += \ - androidextralibrarylistmodel.cpp \ - createandroidmanifestwizard.cpp \ qmakeandroidsupport.cpp \ - qmakeandroidbuildapkstep.cpp \ - qmakeandroidbuildapkwidget.cpp \ androidqmakebuildconfigurationfactory.cpp \ qmakeandroidsupportplugin.cpp - -FORMS += qmakeandroidbuildapkwidget.ui diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.qbs b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.qbs index 81f1fbd09d..8a0af145d1 100644 --- a/src/plugins/qmakeandroidsupport/qmakeandroidsupport.qbs +++ b/src/plugins/qmakeandroidsupport/qmakeandroidsupport.qbs @@ -16,15 +16,6 @@ QtcPlugin { Depends { name: "Qt.widgets" } files: [ - "androidextralibrarylistmodel.cpp", - "androidextralibrarylistmodel.h", - "createandroidmanifestwizard.cpp", - "createandroidmanifestwizard.h", - "qmakeandroidbuildapkstep.cpp", - "qmakeandroidbuildapkstep.h", - "qmakeandroidbuildapkwidget.cpp", - "qmakeandroidbuildapkwidget.h", - "qmakeandroidbuildapkwidget.ui", "androidqmakebuildconfigurationfactory.cpp", "androidqmakebuildconfigurationfactory.h", "qmakeandroidsupport.cpp", diff --git a/src/plugins/qmakeandroidsupport/qmakeandroidsupportplugin.cpp b/src/plugins/qmakeandroidsupport/qmakeandroidsupportplugin.cpp index e532ef5632..28d486dda3 100644 --- a/src/plugins/qmakeandroidsupport/qmakeandroidsupportplugin.cpp +++ b/src/plugins/qmakeandroidsupport/qmakeandroidsupportplugin.cpp @@ -26,7 +26,6 @@ #include "qmakeandroidsupportplugin.h" #include "androidqmakebuildconfigurationfactory.h" -#include "qmakeandroidbuildapkstep.h" #include "qmakeandroidsupport.h" using namespace ProjectExplorer; @@ -38,7 +37,6 @@ class QmakeAndroidSupportPluginPrivate { public: AndroidQmakeBuildConfigurationFactory buildConfigFactory; - QmakeAndroidBuildApkStepFactory buildApkStepFactory; QmakeAndroidSupport androidSupport; }; diff --git a/src/plugins/qmakeprojectmanager/addlibrarywizard.cpp b/src/plugins/qmakeprojectmanager/addlibrarywizard.cpp index aa0806705b..94f7d7b70d 100644 --- a/src/plugins/qmakeprojectmanager/addlibrarywizard.cpp +++ b/src/plugins/qmakeprojectmanager/addlibrarywizard.cpp @@ -87,9 +87,7 @@ AddLibraryWizard::AddLibraryWizard(const QString &fileName, QWidget *parent) : addPage(m_summaryPage); } -AddLibraryWizard::~AddLibraryWizard() -{ -} +AddLibraryWizard::~AddLibraryWizard() = default; QString AddLibraryWizard::proFile() const { @@ -114,7 +112,7 @@ LibraryTypePage::LibraryTypePage(AddLibraryWizard *parent) setTitle(tr("Library Type")); setSubTitle(tr("Choose the type of the library to link to")); - QVBoxLayout *layout = new QVBoxLayout(this); + auto *layout = new QVBoxLayout(this); m_internalRadio = new QRadioButton(tr("Internal library"), this); layout->addWidget(m_internalRadio); @@ -221,7 +219,7 @@ void DetailsPage::initializePage() { if (m_libraryDetailsController) { delete m_libraryDetailsController; - m_libraryDetailsController = 0; + m_libraryDetailsController = nullptr; } QString title; QString subTitle; @@ -269,7 +267,7 @@ SummaryPage::SummaryPage(AddLibraryWizard *parent) setTitle(tr("Summary")); setFinalPage(true); - QVBoxLayout *layout = new QVBoxLayout(this); + auto *layout = new QVBoxLayout(this); m_summaryLabel = new QLabel(this); m_snippetLabel = new QLabel(this); m_snippetLabel->setWordWrap(true); diff --git a/src/plugins/qmakeprojectmanager/addlibrarywizard.h b/src/plugins/qmakeprojectmanager/addlibrarywizard.h index 0c4cb4b760..196d31885c 100644 --- a/src/plugins/qmakeprojectmanager/addlibrarywizard.h +++ b/src/plugins/qmakeprojectmanager/addlibrarywizard.h @@ -76,8 +76,8 @@ public: Q_DECLARE_FLAGS(Platforms, Platform) - explicit AddLibraryWizard(const QString &fileName, QWidget *parent = 0); - ~AddLibraryWizard(); + explicit AddLibraryWizard(const QString &fileName, QWidget *parent = nullptr); + ~AddLibraryWizard() override; LibraryKind libraryKind() const; QString proFile() const; @@ -113,8 +113,8 @@ class DetailsPage : public QWizardPage Q_OBJECT public: DetailsPage(AddLibraryWizard *parent); - virtual void initializePage(); - virtual bool isComplete() const; + void initializePage() override; + bool isComplete() const override; QString snippet() const; private: @@ -128,7 +128,7 @@ class SummaryPage : public QWizardPage Q_OBJECT public: SummaryPage(AddLibraryWizard *parent); - virtual void initializePage(); + void initializePage() override; QString snippet() const; private: AddLibraryWizard *m_libraryWizard = nullptr; diff --git a/src/plugins/qmakeprojectmanager/customwidgetwizard/classlist.cpp b/src/plugins/qmakeprojectmanager/customwidgetwizard/classlist.cpp index 2adb36d3a6..6c6a3ad7c6 100644 --- a/src/plugins/qmakeprojectmanager/customwidgetwizard/classlist.cpp +++ b/src/plugins/qmakeprojectmanager/customwidgetwizard/classlist.cpp @@ -42,8 +42,8 @@ namespace Internal { // refuses placeholders and invalid characters. class ClassModel : public QStandardItemModel { public: - explicit ClassModel(QObject *parent = 0); - virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); + explicit ClassModel(QObject *parent = nullptr); + bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; void appendPlaceHolder() { appendClass(m_newClassPlaceHolder); } @@ -68,7 +68,7 @@ ClassModel::ClassModel(QObject *parent) : void ClassModel::appendClass(const QString &c) { - QStandardItem *item = new QStandardItem(c); + auto *item = new QStandardItem(c); item->setFlags(Qt::ItemIsEnabled|Qt::ItemIsEditable); appendRow(item); } diff --git a/src/plugins/qmakeprojectmanager/customwidgetwizard/customwidgetwidgetswizardpage.cpp b/src/plugins/qmakeprojectmanager/customwidgetwizard/customwidgetwidgetswizardpage.cpp index 3a39af6a18..c41c7fc22d 100644 --- a/src/plugins/qmakeprojectmanager/customwidgetwizard/customwidgetwidgetswizardpage.cpp +++ b/src/plugins/qmakeprojectmanager/customwidgetwizard/customwidgetwidgetswizardpage.cpp @@ -53,7 +53,7 @@ CustomWidgetWidgetsWizardPage::CustomWidgetWidgetsWizardPage(QWidget *parent) : m_ui->deleteButton->setEnabled(false); // Disabled dummy for <new class> column>. - ClassDefinition *dummy = new ClassDefinition; + auto *dummy = new ClassDefinition; dummy->setFileNamingParameters(m_fileNamingParameters); dummy->setEnabled(false); m_tabStackLayout->addWidget(dummy); @@ -89,7 +89,7 @@ void CustomWidgetWidgetsWizardPage::slotCurrentRowChanged(int row) void CustomWidgetWidgetsWizardPage::on_classList_classAdded(const QString &name) { - ClassDefinition *cdef = new ClassDefinition; + auto *cdef = new ClassDefinition; cdef->setFileNamingParameters(m_fileNamingParameters); const int index = m_uiClassDefs.count(); m_tabStackLayout->insertWidget(index, cdef); diff --git a/src/plugins/qmakeprojectmanager/customwidgetwizard/customwidgetwizard.cpp b/src/plugins/qmakeprojectmanager/customwidgetwizard/customwidgetwizard.cpp index 436866146a..30007d802a 100644 --- a/src/plugins/qmakeprojectmanager/customwidgetwizard/customwidgetwizard.cpp +++ b/src/plugins/qmakeprojectmanager/customwidgetwizard/customwidgetwizard.cpp @@ -62,7 +62,7 @@ Core::BaseFileWizard *CustomWidgetWizard::create(QWidget *parent, const Core::Wi Core::GeneratedFiles CustomWidgetWizard::generateFiles(const QWizard *w, QString *errorMessage) const { - const CustomWidgetWizardDialog *cw = qobject_cast<const CustomWidgetWizardDialog *>(w); + const auto *cw = qobject_cast<const CustomWidgetWizardDialog *>(w); Q_ASSERT(w); GenerationParameters p; p.fileName = cw->projectName(); diff --git a/src/plugins/qmakeprojectmanager/customwidgetwizard/plugingenerator.h b/src/plugins/qmakeprojectmanager/customwidgetwizard/plugingenerator.h index a2ed5ef749..9e49c43712 100644 --- a/src/plugins/qmakeprojectmanager/customwidgetwizard/plugingenerator.h +++ b/src/plugins/qmakeprojectmanager/customwidgetwizard/plugingenerator.h @@ -56,7 +56,7 @@ public: QString *errorMessage); private: - typedef QMap<QString,QString> SubstitutionMap; + using SubstitutionMap = QMap<QString, QString>; static QString processTemplate(const QString &tmpl, const SubstitutionMap &substMap, QString *errorMessage); static QString cStringQuote(QString s); }; diff --git a/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp b/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp index 57830403ca..2bb5febf0d 100644 --- a/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp +++ b/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp @@ -173,6 +173,8 @@ DesktopQmakeRunConfigurationFactory::DesktopQmakeRunConfigurationFactory() registerRunConfiguration<DesktopQmakeRunConfiguration>("Qt4ProjectManager.Qt4RunConfiguration:"); addSupportedProjectType(QmakeProjectManager::Constants::QMAKEPROJECT_ID); addSupportedTargetDeviceType(ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE); + + addRunWorkerFactory<SimpleTargetRunner>(ProjectExplorer::Constants::NORMAL_RUN_MODE); } } // namespace Internal diff --git a/src/plugins/qmakeprojectmanager/externaleditors.h b/src/plugins/qmakeprojectmanager/externaleditors.h index b7441501c4..422b0ca31d 100644 --- a/src/plugins/qmakeprojectmanager/externaleditors.h +++ b/src/plugins/qmakeprojectmanager/externaleditors.h @@ -110,7 +110,7 @@ private: void processTerminated(const QString &binary); // A per-binary entry containing the socket - typedef QMap<QString, QTcpSocket*> ProcessCache; + using ProcessCache = QMap<QString, QTcpSocket*>; ProcessCache m_processCache; }; diff --git a/src/plugins/qmakeprojectmanager/librarydetailscontroller.cpp b/src/plugins/qmakeprojectmanager/librarydetailscontroller.cpp index d4b6226e53..12bc0e69fc 100644 --- a/src/plugins/qmakeprojectmanager/librarydetailscontroller.cpp +++ b/src/plugins/qmakeprojectmanager/librarydetailscontroller.cpp @@ -98,7 +98,7 @@ AddLibraryWizard::MacLibraryType LibraryDetailsController::macLibraryType() cons void LibraryDetailsController::updateGui() { // read values from gui - m_platforms = 0; + m_platforms = nullptr; if (libraryDetailsWidget()->linCheckBox->isChecked()) m_platforms |= AddLibraryWizard::LinuxPlatform; if (libraryDetailsWidget()->macCheckBox->isChecked()) @@ -424,7 +424,7 @@ static QString generateLibsSnippet(AddLibraryWizard::Platforms platforms, | AddLibraryWizard::WindowsMSVCPlatform); AddLibraryWizard::Platforms diffPlatforms = platforms ^ commonPlatforms; - AddLibraryWizard::Platforms generatedPlatforms = 0; + AddLibraryWizard::Platforms generatedPlatforms = nullptr; QString snippetMessage; QTextStream str(&snippetMessage); @@ -510,7 +510,7 @@ static QString generatePreTargetDepsSnippet(AddLibraryWizard::Platforms platform QString snippetMessage; QTextStream str(&snippetMessage); str << "\n"; - AddLibraryWizard::Platforms generatedPlatforms = 0; + AddLibraryWizard::Platforms generatedPlatforms = nullptr; AddLibraryWizard::Platforms windowsPlatforms = platforms & (AddLibraryWizard::WindowsMinGWPlatform | AddLibraryWizard::WindowsMSVCPlatform); AddLibraryWizard::Platforms commonPlatforms = platforms; @@ -843,7 +843,7 @@ bool PackageLibraryDetailsController::isLinkPackageGenerated() const if (!project) return false; - const QmakeProFileNode *rootProject = dynamic_cast<const QmakeProFileNode *>(project->rootProjectNode()); + const auto *rootProject = dynamic_cast<const QmakeProFileNode *>(project->rootProjectNode()); if (!rootProject) return false; diff --git a/src/plugins/qmakeprojectmanager/librarydetailscontroller.h b/src/plugins/qmakeprojectmanager/librarydetailscontroller.h index 91505a3e13..7aab3b0cc5 100644 --- a/src/plugins/qmakeprojectmanager/librarydetailscontroller.h +++ b/src/plugins/qmakeprojectmanager/librarydetailscontroller.h @@ -39,7 +39,7 @@ class LibraryDetailsController : public QObject public: explicit LibraryDetailsController(Ui::LibraryDetailsWidget *libraryDetails, const QString &proFile, - QObject *parent = 0); + QObject *parent = nullptr); virtual bool isComplete() const = 0; virtual QString snippet() const = 0; @@ -116,14 +116,14 @@ class NonInternalLibraryDetailsController : public LibraryDetailsController public: explicit NonInternalLibraryDetailsController(Ui::LibraryDetailsWidget *libraryDetails, const QString &proFile, - QObject *parent = 0); - virtual bool isComplete() const; - virtual QString snippet() const; + QObject *parent = nullptr); + bool isComplete() const override; + QString snippet() const override; protected: - virtual AddLibraryWizard::LinkageType suggestedLinkageType() const; - virtual AddLibraryWizard::MacLibraryType suggestedMacLibraryType() const; - virtual QString suggestedIncludePath() const; - virtual void updateWindowsOptionsEnablement(); + AddLibraryWizard::LinkageType suggestedLinkageType() const override; + AddLibraryWizard::MacLibraryType suggestedMacLibraryType() const override; + QString suggestedIncludePath() const override; + void updateWindowsOptionsEnablement() override; private: void slotLinkageTypeChanged(); void slotRemoveSuffixChanged(bool ena); @@ -135,10 +135,10 @@ class PackageLibraryDetailsController : public NonInternalLibraryDetailsControll Q_OBJECT public: explicit PackageLibraryDetailsController(Ui::LibraryDetailsWidget *libraryDetails, - const QString &proFile, - QObject *parent = 0); - virtual bool isComplete() const; - virtual QString snippet() const; + const QString &proFile, + QObject *parent = nullptr); + bool isComplete() const override; + QString snippet() const override; private: bool isLinkPackageGenerated() const; }; @@ -149,7 +149,7 @@ class SystemLibraryDetailsController : public NonInternalLibraryDetailsControlle public: explicit SystemLibraryDetailsController(Ui::LibraryDetailsWidget *libraryDetails, const QString &proFile, - QObject *parent = 0); + QObject *parent = nullptr); }; class ExternalLibraryDetailsController : public NonInternalLibraryDetailsController @@ -158,9 +158,9 @@ class ExternalLibraryDetailsController : public NonInternalLibraryDetailsControl public: explicit ExternalLibraryDetailsController(Ui::LibraryDetailsWidget *libraryDetails, const QString &proFile, - QObject *parent = 0); + QObject *parent = nullptr); protected: - virtual void updateWindowsOptionsEnablement(); + void updateWindowsOptionsEnablement() override; }; class InternalLibraryDetailsController : public LibraryDetailsController @@ -169,14 +169,14 @@ class InternalLibraryDetailsController : public LibraryDetailsController public: explicit InternalLibraryDetailsController(Ui::LibraryDetailsWidget *libraryDetails, const QString &proFile, - QObject *parent = 0); - virtual bool isComplete() const; - virtual QString snippet() const; + QObject *parent = nullptr); + bool isComplete() const override; + QString snippet() const override; protected: - virtual AddLibraryWizard::LinkageType suggestedLinkageType() const; - virtual AddLibraryWizard::MacLibraryType suggestedMacLibraryType() const; - virtual QString suggestedIncludePath() const; - virtual void updateWindowsOptionsEnablement(); + AddLibraryWizard::LinkageType suggestedLinkageType() const override; + AddLibraryWizard::MacLibraryType suggestedMacLibraryType() const override; + QString suggestedIncludePath() const override; + void updateWindowsOptionsEnablement() override; private: void slotCurrentLibraryChanged(); void updateProFile(); diff --git a/src/plugins/qmakeprojectmanager/makefileparse.cpp b/src/plugins/qmakeprojectmanager/makefileparse.cpp index 358fb05bc9..6eda5cbfdb 100644 --- a/src/plugins/qmakeprojectmanager/makefileparse.cpp +++ b/src/plugins/qmakeprojectmanager/makefileparse.cpp @@ -516,7 +516,7 @@ void QmakeProjectManagerPlugin::testMakefileParser() QCOMPARE(Utils::QtcProcess::splitArgs(parser.unparsedArguments()), Utils::QtcProcess::splitArgs(unparsedArguments)); - QCOMPARE(parser.effectiveBuildConfig(0), effectiveBuildConfig); + QCOMPARE(parser.effectiveBuildConfig(nullptr), effectiveBuildConfig); const QMakeStepConfig qmsc = parser.config(); QCOMPARE(qmsc.archConfig, static_cast<QMakeStepConfig::TargetArchConfig>(archConfig)); diff --git a/src/plugins/qmakeprojectmanager/makestep.cpp b/src/plugins/qmakeprojectmanager/makestep.cpp deleted file mode 100644 index 5195bba0a0..0000000000 --- a/src/plugins/qmakeprojectmanager/makestep.cpp +++ /dev/null @@ -1,464 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "makestep.h" -#include "ui_makestep.h" - -#include "qmakeparser.h" -#include "qmakeproject.h" -#include "qmakenodes.h" -#include "qmakebuildconfiguration.h" -#include "qmakeprojectmanagerconstants.h" - -#include <coreplugin/variablechooser.h> -#include <projectexplorer/target.h> -#include <projectexplorer/toolchain.h> -#include <projectexplorer/buildsteplist.h> -#include <projectexplorer/gnumakeparser.h> -#include <projectexplorer/projectexplorer.h> -#include <projectexplorer/kitinformation.h> -#include <projectexplorer/xcodebuildparser.h> -#include <utils/qtcprocess.h> - -#include <QDir> -#include <QFileInfo> - -using ExtensionSystem::PluginManager; -using namespace ProjectExplorer; -using namespace QmakeProjectManager; -using namespace QmakeProjectManager::Internal; - -namespace { -const char MAKESTEP_BS_ID[] = "Qt4ProjectManager.MakeStep"; -const char MAKE_ARGUMENTS_KEY[] = "Qt4ProjectManager.MakeStep.MakeArguments"; -const char AUTOMATICLY_ADDED_MAKE_ARGUMENTS_KEY[] = "Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"; -const char MAKE_COMMAND_KEY[] = "Qt4ProjectManager.MakeStep.MakeCommand"; -const char CLEAN_KEY[] = "Qt4ProjectManager.MakeStep.Clean"; -} - -MakeStep::MakeStep(BuildStepList *bsl) - : AbstractProcessStep(bsl, MAKESTEP_BS_ID) -{ - setDefaultDisplayName(tr("Make", "Qt MakeStep display name.")); - m_clean = bsl->id() == ProjectExplorer::Constants::BUILDSTEPS_CLEAN; - if (m_clean) - m_userArgs = "clean"; -} - -void MakeStep::setMakeCommand(const QString &make) -{ - m_makeCmd = make; -} - -QmakeBuildConfiguration *MakeStep::qmakeBuildConfiguration() const -{ - return static_cast<QmakeBuildConfiguration *>(buildConfiguration()); -} - -QString MakeStep::makeCommand() const -{ - return m_makeCmd; -} - -QString MakeStep::effectiveMakeCommand() const -{ - QString makeCmd = m_makeCmd; - if (makeCmd.isEmpty()) { - QmakeBuildConfiguration *bc = qmakeBuildConfiguration(); - if (!bc) - bc = qobject_cast<QmakeBuildConfiguration *>(target()->activeBuildConfiguration()); - ToolChain *tc = ToolChainKitInformation::toolChain(target()->kit(), ProjectExplorer::Constants::CXX_LANGUAGE_ID); - - if (bc && tc) - makeCmd = tc->makeCommand(bc->environment()); - } - return makeCmd; -} - -QVariantMap MakeStep::toMap() const -{ - QVariantMap map(AbstractProcessStep::toMap()); - map.insert(MAKE_ARGUMENTS_KEY, m_userArgs); - map.insert(MAKE_COMMAND_KEY, m_makeCmd); - map.insert(CLEAN_KEY, m_clean); - map.insert(AUTOMATICLY_ADDED_MAKE_ARGUMENTS_KEY, automaticallyAddedArguments()); - return map; -} - -QStringList MakeStep::automaticallyAddedArguments() const -{ - ToolChain *tc = ToolChainKitInformation::toolChain(target()->kit(), ProjectExplorer::Constants::CXX_LANGUAGE_ID); - if (!tc || tc->targetAbi().binaryFormat() == Abi::PEFormat) - return QStringList(); - return QStringList() << "-w" << "-r"; -} - -bool MakeStep::fromMap(const QVariantMap &map) -{ - m_makeCmd = map.value(MAKE_COMMAND_KEY).toString(); - m_userArgs = map.value(MAKE_ARGUMENTS_KEY).toString(); - m_clean = map.value(CLEAN_KEY).toBool(); - QStringList oldAddedArgs - = map.value(AUTOMATICLY_ADDED_MAKE_ARGUMENTS_KEY).toStringList(); - foreach (const QString &newArg, automaticallyAddedArguments()) { - if (oldAddedArgs.contains(newArg)) - continue; - m_userArgs.prepend(newArg + ' '); - } - - return AbstractProcessStep::fromMap(map); -} - -bool MakeStep::init(QList<const BuildStep *> &earlierSteps) -{ - QmakeBuildConfiguration *bc = qmakeBuildConfiguration(); - if (!bc) - bc = qobject_cast<QmakeBuildConfiguration *>(target()->activeBuildConfiguration()); - if (!bc) - emit addTask(Task::buildConfigurationMissingTask()); - - ToolChain *tc = ToolChainKitInformation::toolChain(target()->kit(), ProjectExplorer::Constants::CXX_LANGUAGE_ID); - if (!tc) - emit addTask(Task::compilerMissingTask()); - - if (!bc || !tc) { - emitFaultyConfigurationMessage(); - return false; - } - - ProcessParameters *pp = processParameters(); - pp->setMacroExpander(bc->macroExpander()); - - QString workingDirectory; - if (bc->subNodeBuild()) - workingDirectory = bc->subNodeBuild()->buildDir(); - else - workingDirectory = bc->buildDirectory().toString(); - pp->setWorkingDirectory(workingDirectory); - - pp->setCommand(effectiveMakeCommand()); - - // If we are cleaning, then make can fail with a error code, but that doesn't mean - // we should stop the clean queue - // That is mostly so that rebuild works on a already clean project - setIgnoreReturnValue(m_clean); - - QString args; - - QmakeProjectManager::QmakeProFileNode *subNode = bc->subNodeBuild(); - QmakeProjectManager::QmakeProFile *subProFile = subNode ? subNode->proFile() : nullptr; - if (subProFile) { - QString makefile = subProFile->makefile(); - if (makefile.isEmpty()) - makefile = "Makefile"; - // Use Makefile.Debug and Makefile.Release - // for file builds, since the rules for that are - // only in those files. - if (subProFile->isDebugAndRelease() && bc->fileNodeBuild()) { - if (bc->buildType() == QmakeBuildConfiguration::Debug) - makefile += ".Debug"; - else - makefile += ".Release"; - } - if (makefile != "Makefile") { - Utils::QtcProcess::addArg(&args, "-f"); - Utils::QtcProcess::addArg(&args, makefile); - } - m_makeFileToCheck = QDir(workingDirectory).filePath(makefile); - } else { - if (!bc->makefile().isEmpty()) { - Utils::QtcProcess::addArg(&args, "-f"); - Utils::QtcProcess::addArg(&args, bc->makefile()); - m_makeFileToCheck = QDir(workingDirectory).filePath(bc->makefile()); - } else { - m_makeFileToCheck = QDir(workingDirectory).filePath("Makefile"); - } - } - - Utils::QtcProcess::addArgs(&args, m_userArgs); - if (bc->fileNodeBuild() && subProFile) { - QString objectsDir = subProFile->objectsDirectory(); - if (objectsDir.isEmpty()) { - objectsDir = subProFile->buildDir(bc).toString(); - if (subProFile->isDebugAndRelease()) { - if (bc->buildType() == QmakeBuildConfiguration::Debug) - objectsDir += "/debug"; - else - objectsDir += "/release"; - } - } - QString relObjectsDir = QDir(pp->workingDirectory()).relativeFilePath(objectsDir); - if (relObjectsDir == ".") - relObjectsDir.clear(); - if (!relObjectsDir.isEmpty()) - relObjectsDir += '/'; - QString objectFile = relObjectsDir + - bc->fileNodeBuild()->filePath().toFileInfo().baseName() + - subProFile->objectExtension(); - Utils::QtcProcess::addArg(&args, objectFile); - } - Utils::Environment env = bc->environment(); - Utils::Environment::setupEnglishOutput(&env); - // We also prepend "L" to the MAKEFLAGS, so that nmake / jom are less verbose - if (tc && makeCommand().isEmpty()) { - if (tc->targetAbi().os() == Abi::WindowsOS - && tc->targetAbi().osFlavor() != Abi::WindowsMSysFlavor) { - const QString makeFlags = "MAKEFLAGS"; - env.set(makeFlags, 'L' + env.value(makeFlags)); - } - } - - pp->setEnvironment(env); - pp->setArguments(args); - pp->resolveAll(); - - setOutputParser(new ProjectExplorer::GnuMakeParser()); - if (tc && tc->targetAbi().os() == Abi::DarwinOS) - appendOutputParser(new XcodebuildParser); - IOutputParser *parser = target()->kit()->createOutputParser(); - if (parser) - appendOutputParser(parser); - outputParser()->setWorkingDirectory(pp->effectiveWorkingDirectory()); - appendOutputParser(new QMakeParser); // make may cause qmake to be run, add last to make sure - // it has a low priority. - - m_scriptTarget = (static_cast<QmakeProject *>(bc->target()->project())->rootProjectNode()->projectType() == ProjectType::ScriptTemplate); - - return AbstractProcessStep::init(earlierSteps); -} - -void MakeStep::run(QFutureInterface<bool> & fi) -{ - if (m_scriptTarget) { - reportRunResult(fi, true); - return; - } - - if (!QFileInfo::exists(m_makeFileToCheck)) { - if (!ignoreReturnValue()) - emit addOutput(tr("Cannot find Makefile. Check your build settings."), BuildStep::OutputFormat::NormalMessage); - const bool success = ignoreReturnValue(); - reportRunResult(fi, success); - return; - } - - AbstractProcessStep::run(fi); -} - -bool MakeStep::immutable() const -{ - return false; -} - -BuildStepConfigWidget *MakeStep::createConfigWidget() -{ - return new MakeStepConfigWidget(this); -} - -QString MakeStep::userArguments() -{ - return m_userArgs; -} - -void MakeStep::setUserArguments(const QString &arguments) -{ - m_userArgs = arguments; - emit userArgumentsChanged(); -} - -MakeStepConfigWidget::MakeStepConfigWidget(MakeStep *makeStep) - : BuildStepConfigWidget(), m_ui(new Internal::Ui::MakeStep), m_makeStep(makeStep) -{ - m_ui->setupUi(this); - - m_ui->makePathChooser->setExpectedKind(Utils::PathChooser::ExistingCommand); - m_ui->makePathChooser->setBaseDirectory(Utils::PathChooser::homePath()); - m_ui->makePathChooser->setHistoryCompleter("PE.MakeCommand.History"); - - const QString &makeCmd = m_makeStep->makeCommand(); - m_ui->makePathChooser->setPath(makeCmd); - m_ui->makeArgumentsLineEdit->setText(m_makeStep->userArguments()); - - updateDetails(); - - connect(m_ui->makePathChooser, &Utils::PathChooser::rawPathChanged, - this, &MakeStepConfigWidget::makeEdited); - connect(m_ui->makeArgumentsLineEdit, &QLineEdit::textEdited, - this, &MakeStepConfigWidget::makeArgumentsLineEdited); - - connect(makeStep, &MakeStep::userArgumentsChanged, - this, &MakeStepConfigWidget::userArgumentsChanged); - - BuildConfiguration *bc = makeStep->buildConfiguration(); - if (!bc) { - // That means the step is in the deploylist, so we listen to the active build config - // changed signal and react to the buildDirectoryChanged() signal of the buildconfiguration - bc = makeStep->target()->activeBuildConfiguration(); - m_bc = bc; - connect (makeStep->target(), &Target::activeBuildConfigurationChanged, - this, &MakeStepConfigWidget::activeBuildConfigurationChanged); - } - - if (bc) { - connect(bc, &BuildConfiguration::buildDirectoryChanged, - this, &MakeStepConfigWidget::updateDetails); - connect(bc, &BuildConfiguration::environmentChanged, - this, &MakeStepConfigWidget::updateDetails); - } - - connect(ProjectExplorerPlugin::instance(), &ProjectExplorerPlugin::settingsChanged, - this, &MakeStepConfigWidget::updateDetails); - connect(m_makeStep->target(), &Target::kitChanged, this, &MakeStepConfigWidget::updateDetails); - - Core::VariableChooser::addSupportForChildWidgets(this, m_makeStep->macroExpander()); -} - -void MakeStepConfigWidget::activeBuildConfigurationChanged() -{ - if (m_bc) { - disconnect(m_bc, &BuildConfiguration::buildDirectoryChanged, - this, &MakeStepConfigWidget::updateDetails); - disconnect(m_bc, &BuildConfiguration::environmentChanged, - this, &MakeStepConfigWidget::updateDetails); - } - - m_bc = m_makeStep->target()->activeBuildConfiguration(); - updateDetails(); - - if (m_bc) { - connect(m_bc, &BuildConfiguration::buildDirectoryChanged, - this, &MakeStepConfigWidget::updateDetails); - connect(m_bc, &BuildConfiguration::environmentChanged, - this, &MakeStepConfigWidget::updateDetails); - } -} - -void MakeStepConfigWidget::setSummaryText(const QString &text) -{ - if (text == m_summaryText) - return; - m_summaryText = text; - emit updateSummary(); -} - -MakeStepConfigWidget::~MakeStepConfigWidget() -{ - delete m_ui; -} - -void MakeStepConfigWidget::updateDetails() -{ - ToolChain *tc - = ToolChainKitInformation::toolChain(m_makeStep->target()->kit(), ProjectExplorer::Constants::CXX_LANGUAGE_ID); - QmakeBuildConfiguration *bc = m_makeStep->qmakeBuildConfiguration(); - if (!bc) - bc = qobject_cast<QmakeBuildConfiguration *>(m_makeStep->target()->activeBuildConfiguration()); - - if (tc && bc) - m_ui->makeLabel->setText(tr("Override %1:").arg(QDir::toNativeSeparators(tc->makeCommand(bc->environment())))); - else - m_ui->makeLabel->setText(tr("Make:")); - - if (!tc) { - setSummaryText(tr("<b>Make:</b> %1").arg(ProjectExplorer::ToolChainKitInformation::msgNoToolChainInTarget())); - return; - } - if (!bc) { - setSummaryText(tr("<b>Make:</b> No Qt build configuration.")); - return; - } - - ProcessParameters param; - param.setMacroExpander(bc->macroExpander()); - param.setWorkingDirectory(bc->buildDirectory().toString()); - QString makeCmd = tc->makeCommand(bc->environment()); - if (!m_makeStep->makeCommand().isEmpty()) - makeCmd = m_makeStep->makeCommand(); - param.setCommand(makeCmd); - - QString args = m_makeStep->userArguments(); - - Utils::Environment env = bc->environment(); - Utils::Environment::setupEnglishOutput(&env); - // We prepend "L" to the MAKEFLAGS, so that nmake / jom are less verbose - // FIXME doing this without the user having a way to override this is rather bad - if (tc && m_makeStep->makeCommand().isEmpty()) { - if (tc->targetAbi().os() == Abi::WindowsOS - && tc->targetAbi().osFlavor() != Abi::WindowsMSysFlavor) { - const QString makeFlags = "MAKEFLAGS"; - env.set(makeFlags, 'L' + env.value(makeFlags)); - } - } - param.setArguments(args); - param.setEnvironment(env); - - if (param.commandMissing()) - setSummaryText(tr("<b>Make:</b> %1 not found in the environment.").arg(makeCmd)); // Override display text - else - setSummaryText(param.summaryInWorkdir(displayName())); -} - -QString MakeStepConfigWidget::summaryText() const -{ - return m_summaryText; -} - -QString MakeStepConfigWidget::displayName() const -{ - return m_makeStep->displayName(); -} - -void MakeStepConfigWidget::userArgumentsChanged() -{ - if (m_ignoreChange) - return; - m_ui->makeArgumentsLineEdit->setText(m_makeStep->userArguments()); - updateDetails(); -} - -void MakeStepConfigWidget::makeEdited() -{ - m_makeStep->setMakeCommand(m_ui->makePathChooser->rawPath()); - updateDetails(); -} - -void MakeStepConfigWidget::makeArgumentsLineEdited() -{ - m_ignoreChange = true; - m_makeStep->setUserArguments(m_ui->makeArgumentsLineEdit->text()); - m_ignoreChange = false; - updateDetails(); -} - -/// -// MakeStepFactory -/// - -MakeStepFactory::MakeStepFactory() -{ - registerStep<MakeStep>(MAKESTEP_BS_ID); - setSupportedProjectType(Constants::QMAKEPROJECT_ID); - setDisplayName(tr("Make")); -} diff --git a/src/plugins/qmakeprojectmanager/makestep.h b/src/plugins/qmakeprojectmanager/makestep.h deleted file mode 100644 index 075b50e1b7..0000000000 --- a/src/plugins/qmakeprojectmanager/makestep.h +++ /dev/null @@ -1,119 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include "qmakeprojectmanager_global.h" - -#include <projectexplorer/abstractprocessstep.h> - -namespace QmakeProjectManager { - -class QmakeBuildConfiguration; -class MakeStepConfigWidget; - -namespace Internal { - -namespace Ui { class MakeStep; } - -class MakeStepFactory : public ProjectExplorer::BuildStepFactory -{ - Q_OBJECT - -public: - MakeStepFactory(); -}; - -} //namespace Internal - -class QmakeProject; - -class QMAKEPROJECTMANAGER_EXPORT MakeStep : public ProjectExplorer::AbstractProcessStep -{ - Q_OBJECT - friend class Internal::MakeStepFactory; - friend class MakeStepConfigWidget; - -public: - explicit MakeStep(ProjectExplorer::BuildStepList *bsl); - - QmakeBuildConfiguration *qmakeBuildConfiguration() const; - - bool init(QList<const BuildStep *> &earlierSteps) override; - void run(QFutureInterface<bool> &) override; - - ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override; - bool immutable() const override; - QString userArguments(); - void setUserArguments(const QString &arguments); - bool isClean() const; - QString makeCommand() const; - - QString effectiveMakeCommand() const; - - QVariantMap toMap() const override; - -signals: - void userArgumentsChanged(); - -private: - bool fromMap(const QVariantMap &map) override; - - void setMakeCommand(const QString &make); - QStringList automaticallyAddedArguments() const; - bool m_clean = false; - bool m_scriptTarget = false; - QString m_makeFileToCheck; - QString m_userArgs; - QString m_makeCmd; -}; - -class MakeStepConfigWidget : public ProjectExplorer::BuildStepConfigWidget -{ - Q_OBJECT -public: - explicit MakeStepConfigWidget(MakeStep *makeStep); - virtual ~MakeStepConfigWidget(); - - QString displayName() const; - QString summaryText() const; -private: - // User changes to our widgets - void makeEdited(); - void makeArgumentsLineEdited(); - - void updateDetails(); - void userArgumentsChanged(); - void activeBuildConfigurationChanged(); - void setSummaryText(const QString &text); - - Internal::Ui::MakeStep *m_ui = nullptr; - MakeStep *m_makeStep = nullptr; - QString m_summaryText; - ProjectExplorer::BuildConfiguration *m_bc = nullptr; - bool m_ignoreChange = false; -}; - -} // QmakeProjectManager diff --git a/src/plugins/qmakeprojectmanager/makestep.ui b/src/plugins/qmakeprojectmanager/makestep.ui deleted file mode 100644 index 7c706054a8..0000000000 --- a/src/plugins/qmakeprojectmanager/makestep.ui +++ /dev/null @@ -1,50 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>QmakeProjectManager::Internal::MakeStep</class> - <widget class="QWidget" name="QmakeProjectManager::Internal::MakeStep"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>220</width> - <height>62</height> - </rect> - </property> - <layout class="QGridLayout" name="gridLayout"> - <item row="0" column="0"> - <widget class="QLabel" name="makeLabel"> - <property name="text"> - <string>Override %1:</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="Utils::PathChooser" name="makePathChooser" native="true"/> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="makeArgumentsLabel"> - <property name="text"> - <string>Make arguments:</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QLineEdit" name="makeArgumentsLineEdit"/> - </item> - </layout> - </widget> - <customwidgets> - <customwidget> - <class>Utils::PathChooser</class> - <extends>QWidget</extends> - <header location="global">utils/pathchooser.h</header> - <container>1</container> - <slots> - <signal>editingFinished()</signal> - <signal>browsingFinished()</signal> - </slots> - </customwidget> - </customwidgets> - <resources/> - <connections/> -</ui> diff --git a/src/plugins/qmakeprojectmanager/profilehighlighter.h b/src/plugins/qmakeprojectmanager/profilehighlighter.h index 9d85861af8..d76852435a 100644 --- a/src/plugins/qmakeprojectmanager/profilehighlighter.h +++ b/src/plugins/qmakeprojectmanager/profilehighlighter.h @@ -43,7 +43,7 @@ public: }; ProFileHighlighter(); - void highlightBlock(const QString &text); + void highlightBlock(const QString &text) override; private: const TextEditor::Keywords m_keywords; diff --git a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp index b5f51bc46f..e2b3c5cbf1 100644 --- a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp +++ b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp @@ -32,26 +32,29 @@ #include "qmakeprojectmanagerconstants.h" #include "qmakenodes.h" #include "qmakestep.h" -#include "makestep.h" +#include "qmakemakestep.h" #include "makefileparse.h" #include <coreplugin/documentmanager.h> #include <coreplugin/icore.h> +#include <projectexplorer/buildmanager.h> #include <projectexplorer/buildsteplist.h> #include <projectexplorer/kit.h> +#include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectmacroexpander.h> #include <projectexplorer/target.h> #include <projectexplorer/toolchain.h> #include <projectexplorer/toolchainmanager.h> + #include <qtsupport/qtkitinformation.h> #include <qtsupport/qtversionmanager.h> + #include <utils/mimetypes/mimedatabase.h> #include <utils/qtcassert.h> #include <utils/qtcprocess.h> #include <utils/qtcassert.h> -#include <android/androidmanager.h> #include <QDebug> #include <QInputDialog> @@ -127,12 +130,12 @@ void QmakeBuildConfiguration::initialize(const BuildInfo *info) BuildStepList *buildSteps = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); auto qmakeStep = new QMakeStep(buildSteps); buildSteps->appendStep(qmakeStep); - buildSteps->appendStep(new MakeStep(buildSteps)); + buildSteps->appendStep(new QmakeMakeStep(buildSteps)); BuildStepList *cleanSteps = stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); - cleanSteps->appendStep(new MakeStep(cleanSteps)); + cleanSteps->appendStep(new QmakeMakeStep(cleanSteps)); - const QmakeBuildInfo *qmakeInfo = static_cast<const QmakeBuildInfo *>(info); + const auto *qmakeInfo = static_cast<const QmakeBuildInfo *>(info); BaseQtVersion *version = QtKitInformation::qtVersion(target()->kit()); BaseQtVersion::QmakeBuildConfigs config = version->defaultBuildConfig(); @@ -160,9 +163,7 @@ void QmakeBuildConfiguration::initialize(const BuildInfo *info) updateCacheAndEmitEnvironmentChanged(); } -QmakeBuildConfiguration::~QmakeBuildConfiguration() -{ -} +QmakeBuildConfiguration::~QmakeBuildConfiguration() = default; QVariantMap QmakeBuildConfiguration::toMap() const { @@ -306,24 +307,24 @@ QStringList QmakeBuildConfiguration::configCommandLineArguments() const QMakeStep *QmakeBuildConfiguration::qmakeStep() const { - QMakeStep *qs = 0; + QMakeStep *qs = nullptr; BuildStepList *bsl = stepList(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_BUILD)); Q_ASSERT(bsl); for (int i = 0; i < bsl->count(); ++i) - if ((qs = qobject_cast<QMakeStep *>(bsl->at(i))) != 0) + if ((qs = qobject_cast<QMakeStep *>(bsl->at(i))) != nullptr) return qs; - return 0; + return nullptr; } -MakeStep *QmakeBuildConfiguration::makeStep() const +QmakeMakeStep *QmakeBuildConfiguration::makeStep() const { - MakeStep *ms = 0; + QmakeMakeStep *ms = nullptr; BuildStepList *bsl = stepList(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_BUILD)); Q_ASSERT(bsl); for (int i = 0; i < bsl->count(); ++i) - if ((ms = qobject_cast<MakeStep *>(bsl->at(i))) != 0) + if ((ms = qobject_cast<QmakeMakeStep *>(bsl->at(i))) != nullptr) return ms; - return 0; + return nullptr; } // Returns true if both are equal. @@ -560,7 +561,7 @@ QmakeBuildInfo *QmakeBuildConfigurationFactory::createBuildInfo(const Kit *k, BuildConfiguration::BuildType type) const { BaseQtVersion *version = QtKitInformation::qtVersion(k); - QmakeBuildInfo *info = new QmakeBuildInfo(this); + auto *info = new QmakeBuildInfo(this); QString suffix; if (type == BuildConfiguration::Release) { //: The name of the release build configuration created by default for a qmake project. @@ -672,7 +673,7 @@ void QmakeBuildConfiguration::setupBuildEnvironment(Kit *k, Environment &env) env.prependOrSetPath(qt->binPath().toString()); } -QmakeBuildConfiguration::LastKitState::LastKitState() { } +QmakeBuildConfiguration::LastKitState::LastKitState() = default; QmakeBuildConfiguration::LastKitState::LastKitState(Kit *k) : m_qtVersion(QtKitInformation::qtVersionId(k)), @@ -696,4 +697,24 @@ bool QmakeBuildConfiguration::LastKitState::operator !=(const LastKitState &othe return !operator ==(other); } +bool QmakeBuildConfiguration::regenerateBuildFiles(Node *node) +{ + QMakeStep *qs = qmakeStep(); + if (!qs) + return false; + + qs->setForced(true); + + BuildManager::buildList(stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN)); + BuildManager::appendStep(qs, ProjectExplorerPlugin::displayNameForStepId(ProjectExplorer::Constants::BUILDSTEPS_CLEAN)); + + QmakeProFileNode *proFile = nullptr; + if (node && node != target()->project()->rootProjectNode()) + proFile = dynamic_cast<QmakeProFileNode *>(node); + + setSubNodeBuild(proFile); + + return true; +} + } // namespace QmakeProjectManager diff --git a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h index b772123771..d7a0996a44 100644 --- a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h +++ b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h @@ -36,7 +36,7 @@ namespace QmakeProjectManager { class QmakeBuildInfo; class QMakeStep; -class MakeStep; +class QmakeMakeStep; class QmakeBuildConfigurationFactory; class QmakeProFileNode; @@ -81,7 +81,7 @@ public: // QmakeProject * // So that we can later enable people to build qmake the way they would like QMakeStep *qmakeStep() const; - MakeStep *makeStep() const; + QmakeMakeStep *makeStep() const; QString makefile() const; @@ -113,6 +113,7 @@ signals: protected: bool fromMap(const QVariantMap &map) override; + bool regenerateBuildFiles(ProjectExplorer::Node *node = nullptr) override; private: void kitChanged(); diff --git a/src/plugins/qmakeprojectmanager/qmakemakestep.cpp b/src/plugins/qmakeprojectmanager/qmakemakestep.cpp new file mode 100644 index 0000000000..4cf4d12327 --- /dev/null +++ b/src/plugins/qmakeprojectmanager/qmakemakestep.cpp @@ -0,0 +1,202 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "qmakemakestep.h" + +#include "qmakeparser.h" +#include "qmakeproject.h" +#include "qmakenodes.h" +#include "qmakebuildconfiguration.h" +#include "qmakeprojectmanagerconstants.h" + +#include <coreplugin/variablechooser.h> +#include <projectexplorer/target.h> +#include <projectexplorer/toolchain.h> +#include <projectexplorer/buildsteplist.h> +#include <projectexplorer/gnumakeparser.h> +#include <projectexplorer/projectexplorer.h> +#include <projectexplorer/kitinformation.h> +#include <projectexplorer/xcodebuildparser.h> +#include <utils/qtcprocess.h> + +#include <QDir> +#include <QFileInfo> + +using ExtensionSystem::PluginManager; +using namespace ProjectExplorer; +using namespace QmakeProjectManager; +using namespace QmakeProjectManager::Internal; + +const char MAKESTEP_BS_ID[] = "Qt4ProjectManager.MakeStep"; + +QmakeMakeStep::QmakeMakeStep(BuildStepList *bsl) + : MakeStep(bsl, MAKESTEP_BS_ID) +{ + if (bsl->id() == ProjectExplorer::Constants::BUILDSTEPS_CLEAN) { + setClean(true); + setUserArguments("clean"); + } +} + +QmakeBuildConfiguration *QmakeMakeStep::qmakeBuildConfiguration() const +{ + return static_cast<QmakeBuildConfiguration *>(buildConfiguration()); +} + +bool QmakeMakeStep::init(QList<const BuildStep *> &earlierSteps) +{ + QmakeBuildConfiguration *bc = qmakeBuildConfiguration(); + if (!bc) + emit addTask(Task::buildConfigurationMissingTask()); + + const QString make = effectiveMakeCommand(); + if (make.isEmpty()) + emit addTask(makeCommandMissingTask()); + + if (!bc || make.isEmpty()) { + emitFaultyConfigurationMessage(); + return false; + } + + ProcessParameters *pp = processParameters(); + pp->setMacroExpander(bc->macroExpander()); + + QString workingDirectory; + if (bc->subNodeBuild()) + workingDirectory = bc->subNodeBuild()->buildDir(); + else + workingDirectory = bc->buildDirectory().toString(); + pp->setWorkingDirectory(workingDirectory); + + pp->setCommand(make); + + // If we are cleaning, then make can fail with a error code, but that doesn't mean + // we should stop the clean queue + // That is mostly so that rebuild works on a already clean project + setIgnoreReturnValue(isClean()); + + QString args; + + QmakeProjectManager::QmakeProFileNode *subNode = bc->subNodeBuild(); + QmakeProjectManager::QmakeProFile *subProFile = subNode ? subNode->proFile() : nullptr; + if (subProFile) { + QString makefile = subProFile->makefile(); + if (makefile.isEmpty()) + makefile = "Makefile"; + // Use Makefile.Debug and Makefile.Release + // for file builds, since the rules for that are + // only in those files. + if (subProFile->isDebugAndRelease() && bc->fileNodeBuild()) { + if (bc->buildType() == QmakeBuildConfiguration::Debug) + makefile += ".Debug"; + else + makefile += ".Release"; + } + if (makefile != "Makefile") { + Utils::QtcProcess::addArg(&args, "-f"); + Utils::QtcProcess::addArg(&args, makefile); + } + m_makeFileToCheck = QDir(workingDirectory).filePath(makefile); + } else { + if (!bc->makefile().isEmpty()) { + Utils::QtcProcess::addArg(&args, "-f"); + Utils::QtcProcess::addArg(&args, bc->makefile()); + m_makeFileToCheck = QDir(workingDirectory).filePath(bc->makefile()); + } else { + m_makeFileToCheck = QDir(workingDirectory).filePath("Makefile"); + } + } + + Utils::QtcProcess::addArgs(&args, userArguments()); + if (bc->fileNodeBuild() && subProFile) { + QString objectsDir = subProFile->objectsDirectory(); + if (objectsDir.isEmpty()) { + objectsDir = subProFile->buildDir(bc).toString(); + if (subProFile->isDebugAndRelease()) { + if (bc->buildType() == QmakeBuildConfiguration::Debug) + objectsDir += "/debug"; + else + objectsDir += "/release"; + } + } + QString relObjectsDir = QDir(pp->workingDirectory()).relativeFilePath(objectsDir); + if (relObjectsDir == ".") + relObjectsDir.clear(); + if (!relObjectsDir.isEmpty()) + relObjectsDir += '/'; + QString objectFile = relObjectsDir + + bc->fileNodeBuild()->filePath().toFileInfo().baseName() + + subProFile->objectExtension(); + Utils::QtcProcess::addArg(&args, objectFile); + } + pp->setEnvironment(environment(bc)); + pp->setArguments(args); + pp->resolveAll(); + + setOutputParser(new ProjectExplorer::GnuMakeParser()); + ToolChain *tc = ToolChainKitInformation::toolChain(target()->kit(), + ProjectExplorer::Constants::CXX_LANGUAGE_ID); + if (tc && tc->targetAbi().os() == Abi::DarwinOS) + appendOutputParser(new XcodebuildParser); + IOutputParser *parser = target()->kit()->createOutputParser(); + if (parser) + appendOutputParser(parser); + outputParser()->setWorkingDirectory(pp->effectiveWorkingDirectory()); + appendOutputParser(new QMakeParser); // make may cause qmake to be run, add last to make sure + // it has a low priority. + + m_scriptTarget = (static_cast<QmakeProject *>(bc->target()->project())->rootProjectNode()->projectType() == ProjectType::ScriptTemplate); + + return AbstractProcessStep::init(earlierSteps); +} + +void QmakeMakeStep::run(QFutureInterface<bool> & fi) +{ + if (m_scriptTarget) { + reportRunResult(fi, true); + return; + } + + if (!QFileInfo::exists(m_makeFileToCheck)) { + if (!ignoreReturnValue()) + emit addOutput(tr("Cannot find Makefile. Check your build settings."), BuildStep::OutputFormat::NormalMessage); + const bool success = ignoreReturnValue(); + reportRunResult(fi, success); + return; + } + + AbstractProcessStep::run(fi); +} + +/// +// QmakeMakeStepFactory +/// + +QmakeMakeStepFactory::QmakeMakeStepFactory() +{ + registerStep<QmakeMakeStep>(MAKESTEP_BS_ID); + setSupportedProjectType(Constants::QMAKEPROJECT_ID); + setDisplayName(MakeStep::defaultDisplayName()); +} diff --git a/src/plugins/qmakeprojectmanager/qmakemakestep.h b/src/plugins/qmakeprojectmanager/qmakemakestep.h new file mode 100644 index 0000000000..a61806eb51 --- /dev/null +++ b/src/plugins/qmakeprojectmanager/qmakemakestep.h @@ -0,0 +1,65 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include "qmakeprojectmanager_global.h" + +#include <projectexplorer/makestep.h> + +namespace QmakeProjectManager { + +class QmakeBuildConfiguration; + +namespace Internal { + +class QmakeMakeStepFactory : public ProjectExplorer::BuildStepFactory +{ +public: + QmakeMakeStepFactory(); +}; + +} //namespace Internal + +class QmakeProject; + +class QMAKEPROJECTMANAGER_EXPORT QmakeMakeStep : public ProjectExplorer::MakeStep +{ + Q_OBJECT + +public: + explicit QmakeMakeStep(ProjectExplorer::BuildStepList *bsl); + + QmakeBuildConfiguration *qmakeBuildConfiguration() const; + + bool init(QList<const BuildStep *> &earlierSteps) override; + void run(QFutureInterface<bool> &) override; + +private: + bool m_scriptTarget = false; + QString m_makeFileToCheck; +}; + +} // QmakeProjectManager diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp index 72d5ba53cf..002c39cae4 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp @@ -203,7 +203,7 @@ QmakeProFileNode *QmakeProFileNode::findProFileFor(const FileName &fileName) con if (fileName == filePath()) return const_cast<QmakeProFileNode *>(this); for (Node *node : nodes()) { - if (QmakeProFileNode *qmakeProFileNode = dynamic_cast<QmakeProFileNode *>(node)) + if (auto *qmakeProFileNode = dynamic_cast<QmakeProFileNode *>(node)) if (QmakeProFileNode *result = qmakeProFileNode->findProFileFor(fileName)) return result; } diff --git a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp index 66448835cf..cc26d880e2 100644 --- a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp @@ -340,7 +340,7 @@ void QmakePriFile::processValues(QmakePriFileEvalResult &result) } for (int i = 0; i < static_cast<int>(FileType::FileTypeSize); ++i) { - FileType type = static_cast<FileType>(i); + auto type = static_cast<FileType>(i); QSet<FileName> &foundFiles = result.foundFiles[type]; result.recursiveEnumerateFiles.subtract(foundFiles); QSet<FileName> newFilePaths = filterFilesProVariables(type, foundFiles); @@ -355,7 +355,7 @@ void QmakePriFile::update(const Internal::QmakePriFileEvalResult &result) watchFolders(result.folders); for (int i = 0; i < static_cast<int>(FileType::FileTypeSize); ++i) { - const FileType type = static_cast<FileType>(i); + const auto type = static_cast<FileType>(i); m_files[type] = result.foundFiles.value(type); } } @@ -403,7 +403,7 @@ bool QmakePriFile::folderChanged(const QString &changedFolder, const QSet<FileNa // Apply the differences per file type for (int i = 0; i < static_cast<int>(FileType::FileTypeSize); ++i) { - FileType type = static_cast<FileType>(i); + auto type = static_cast<FileType>(i); QSet<FileName> add = filterFilesRecursiveEnumerata(type, addedFiles); QSet<FileName> remove = filterFilesRecursiveEnumerata(type, removedFiles); @@ -508,7 +508,7 @@ bool QmakePriFile::addFiles(const QStringList &filePaths, QStringList *notAdded) // So it's obviously a bit limited, but in those cases you need to edit the // project files manually anyway. - typedef QMap<QString, QStringList> TypeFileMap; + using TypeFileMap = QMap<QString, QStringList>; // Split into lists by file type and bulk-add them. TypeFileMap typeFileMap; foreach (const QString &file, filePaths) { @@ -555,7 +555,7 @@ bool QmakePriFile::removeFiles(const QStringList &filePaths, QStringList *notRemoved) { QStringList failedFiles; - typedef QMap<QString, QStringList> TypeFileMap; + using TypeFileMap = QMap<QString, QStringList>; // Split into lists by file type and bulk-add them. TypeFileMap typeFileMap; foreach (const QString &file, filePaths) { @@ -1176,7 +1176,7 @@ void QmakeProFile::setValidParseRecursive(bool b) { m_validParse = b; foreach (QmakePriFile *c, children()) { - if (QmakeProFile *node = dynamic_cast<QmakeProFile *>(c)) + if (auto *node = dynamic_cast<QmakeProFile *>(c)) node->setValidParseRecursive(b); } } @@ -1275,7 +1275,7 @@ static bool evaluateOne(const QmakeEvalInput &input, ProFile *pro, QmakeEvalResult *QmakeProFile::evaluate(const QmakeEvalInput &input) { - QmakeEvalResult *result = new QmakeEvalResult; + auto *result = new QmakeEvalResult; QtSupport::ProFileReader *exactBuildPassReader = nullptr; QtSupport::ProFileReader *cumulativeBuildPassReader = nullptr; ProFile *pro; @@ -1387,7 +1387,7 @@ QmakeEvalResult *QmakeProFile::evaluate(const QmakeEvalInput &input) = baseVPaths(cumulativeReader, input.projectDir, input.buildDirectory.toString()); for (int i = 0; i < static_cast<int>(FileType::FileTypeSize); ++i) { - const FileType type = static_cast<FileType>(i); + const auto type = static_cast<FileType>(i); const QStringList qmakeVariables = varNames(type, exactReader); foreach (const QString &qmakeVariable, qmakeVariables) { QHash<ProString, bool> handled; @@ -1587,14 +1587,14 @@ void QmakeProFile::applyEvaluate(QmakeEvalResult *evalResult) continue; // Do nothing if (priFile->proFile) { - QmakePriFile *qmakePriFileNode = new QmakePriFile(m_project, this, priFile->name); + auto *qmakePriFileNode = new QmakePriFile(m_project, this, priFile->name); pn->addChild(qmakePriFileNode); qmakePriFileNode->setIncludedInExactParse( (result->state == QmakeEvalResult::EvalOk) && pn->includedInExactParse()); qmakePriFileNode->update(priFile->result); toCompare.append(qMakePair(qmakePriFileNode, priFile)); } else { - QmakeProFile *qmakeProFileNode = new QmakeProFile(m_project, priFile->name); + auto *qmakeProFileNode = new QmakeProFile(m_project, priFile->name); pn->addChild(qmakeProFileNode); qmakeProFileNode->setIncludedInExactParse( result->exactSubdirs.contains(qmakeProFileNode->filePath()) diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp index 26e6217bbd..f368b09e28 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp @@ -624,7 +624,7 @@ static FolderNode *folderOf(FolderNode *in, const FileName &fileName) static FileNode *fileNodeOf(FolderNode *in, const FileName &fileName) { for (FolderNode *folder = folderOf(in, fileName); folder; folder = folder->parentFolderNode()) { - if (QmakeProFileNode *proFile = dynamic_cast<QmakeProFileNode *>(folder)) { + if (auto *proFile = dynamic_cast<QmakeProFileNode *>(folder)) { foreach (FileNode *fileNode, proFile->fileNodes()) { if (fileNode->filePath() == fileName) return fileNode; @@ -1062,15 +1062,11 @@ void QmakeProject::updateBuildSystemData() else workingDir = destDir; } else { - destDir = ti.buildDir.toString(); workingDir = ti.buildDir.toString(); } - if (HostOsInfo::isMacHost() && config.contains("app_bundle")) { - const QString infix = '/' + ti.target + ".app/Contents/MacOS"; - workingDir += infix; - destDir += infix; - } + if (HostOsInfo::isMacHost() && config.contains("app_bundle")) + workingDir += '/' + ti.target + ".app/Contents/MacOS"; BuildTargetInfo bti; bti.targetFilePath = FileName::fromString(executableFor(proFile)); @@ -1292,30 +1288,38 @@ void QmakeProject::testToolChain(ToolChain *tc, const Utils::FileName &path) con const Utils::FileName expected = tc->compilerCommand(); Environment env = Environment::systemEnvironment(); + Kit *k = nullptr; if (Target *t = activeTarget()) { + k = t->kit(); if (BuildConfiguration *bc = t->activeBuildConfiguration()) env = bc->environment(); else - t->kit()->addToEnvironment(env); + k->addToEnvironment(env); } + QTC_ASSERT(k, return); - if (!env.isSameExecutable(path.toString(), expected.toString())) { - const QPair<Utils::FileName, Utils::FileName> pair = qMakePair(expected, path); - if (!m_toolChainWarnings.contains(pair)) { - // Suppress warnings on Apple machines where compilers in /usr/bin point into Xcode. - // This will suppress some valid warnings, but avoids annoying Apple users with - // spurious warnings all the time! - if (!pair.first.toString().startsWith("/usr/bin/") - || !pair.second.toString().contains("/Contents/Developer/Toolchains/")) { - TaskHub::addTask(Task(Task::Warning, - QCoreApplication::translate("QmakeProjectManager", "\"%1\" is used by qmake, but \"%2\" is configured in the kit.\n" - "Please update your kit or choose a mkspec for qmake that matches your target environment better."). - arg(path.toUserOutput()).arg(expected.toUserOutput()), - Utils::FileName(), -1, ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM)); - m_toolChainWarnings.insert(pair); - } - } + if (env.isSameExecutable(path.toString(), expected.toString())) + return; + const QPair<Utils::FileName, Utils::FileName> pair = qMakePair(expected, path); + if (m_toolChainWarnings.contains(pair)) + return; + // Suppress warnings on Apple machines where compilers in /usr/bin point into Xcode. + // This will suppress some valid warnings, but avoids annoying Apple users with + // spurious warnings all the time! + if (pair.first.toString().startsWith("/usr/bin/") + && pair.second.toString().contains("/Contents/Developer/Toolchains/")) { + return; } + TaskHub::addTask( + Task(Task::Warning, + QCoreApplication::translate( + "QmakeProjectManager", + "\"%1\" is used by qmake, but \"%2\" is configured in the kit.\n" + "Please update your kit (%3) or choose a mkspec for qmake that matches " + "your target environment better.") + .arg(path.toUserOutput()).arg(expected.toUserOutput()).arg(k->displayName()), + Utils::FileName(), -1, ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM)); + m_toolChainWarnings.insert(pair); } void QmakeProject::warnOnToolChainMismatch(const QmakeProFile *pro) const diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp index e9c04ae2bd..241bd5a4f5 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp @@ -53,7 +53,7 @@ QmakeProjectConfigWidget::QmakeProjectConfigWidget(QmakeBuildConfiguration *bc) Utils::FileUtils::qmakeFriendlyName(bc->displayName()), bc->buildType()); - QVBoxLayout *vbox = new QVBoxLayout(this); + auto *vbox = new QVBoxLayout(this); vbox->setMargin(0); m_detailsContainer = new Utils::DetailsWidget(this); m_detailsContainer->setState(Utils::DetailsWidget::NoSummary); @@ -97,7 +97,7 @@ QmakeProjectConfigWidget::QmakeProjectConfigWidget(QmakeBuildConfiguration *bc) connect(m_ui->shadowBuildDirEdit, &Utils::PathChooser::rawPathChanged, this, &QmakeProjectConfigWidget::shadowBuildEdited); - QmakeProject *project = static_cast<QmakeProject *>(bc->target()->project()); + auto *project = static_cast<QmakeProject *>(bc->target()->project()); project->subscribeSignal(&BuildConfiguration::environmentChanged, this, [this]() { if (static_cast<BuildConfiguration *>(sender())->isActive()) environmentChanged(); @@ -216,7 +216,7 @@ void QmakeProjectConfigWidget::updateProblemLabel() return; } - QmakeProject *p = static_cast<QmakeProject *>(m_buildConfiguration->target()->project()); + auto *p = static_cast<QmakeProject *>(m_buildConfiguration->target()->project()); if (p->rootProFile()->parseInProgress() || !p->rootProFile()->validParse()) { setProblemLabel(QString()); return; diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.h b/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.h index a698653d7e..0c5c0ef6fd 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.h +++ b/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.h @@ -44,7 +44,7 @@ class QmakeProjectConfigWidget : public ProjectExplorer::NamedWidget Q_OBJECT public: QmakeProjectConfigWidget(QmakeBuildConfiguration *bc); - ~QmakeProjectConfigWidget(); + ~QmakeProjectConfigWidget() override; private: // User changes in our widgets diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp index f76953d179..bc4a340827 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp @@ -198,7 +198,7 @@ QList<void *> QmakeProjectImporter::examineDirectory(const FileName &importPath) bool QmakeProjectImporter::matchKit(void *directoryData, const Kit *k) const { - DirectoryData *data = static_cast<DirectoryData *>(directoryData); + auto *data = static_cast<DirectoryData *>(directoryData); const QLoggingCategory &logs = MakeFileParse::logging(); BaseQtVersion *kitVersion = QtKitInformation::qtVersion(k); @@ -225,14 +225,14 @@ bool QmakeProjectImporter::matchKit(void *directoryData, const Kit *k) const Kit *QmakeProjectImporter::createKit(void *directoryData) const { - DirectoryData *data = static_cast<DirectoryData *>(directoryData); + auto *data = static_cast<DirectoryData *>(directoryData); return createTemporaryKit(data->qtVersionData, data->parsedSpec, data->archConfig, data->osType); } QList<BuildInfo *> QmakeProjectImporter::buildInfoListForKit(const Kit *k, void *directoryData) const { QList<BuildInfo *> result; - DirectoryData *data = static_cast<DirectoryData *>(directoryData); + auto *data = static_cast<DirectoryData *>(directoryData); auto factory = qobject_cast<QmakeBuildConfigurationFactory *>( IBuildConfigurationFactory::find(k, projectFilePath().toString())); if (!factory) diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp index bfb7402bbb..6e3a3e43ad 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp @@ -148,13 +148,13 @@ void QmakeManager::runQMakeImpl(ProjectExplorer::Project *p, ProjectExplorer::No { if (!ProjectExplorerPlugin::saveModifiedFiles()) return; - QmakeProject *qmakeProject = qobject_cast<QmakeProject *>(p); + auto *qmakeProject = qobject_cast<QmakeProject *>(p); QTC_ASSERT(qmakeProject, return); if (!qmakeProject->activeTarget() || !qmakeProject->activeTarget()->activeBuildConfiguration()) return; - QmakeBuildConfiguration *bc = static_cast<QmakeBuildConfiguration *>(qmakeProject->activeTarget()->activeBuildConfiguration()); + auto *bc = static_cast<QmakeBuildConfiguration *>(qmakeProject->activeTarget()->activeBuildConfiguration()); QMakeStep *qs = bc->qmakeStep(); if (!qs) return; @@ -163,11 +163,11 @@ void QmakeManager::runQMakeImpl(ProjectExplorer::Project *p, ProjectExplorer::No qs->setForced(true); if (node && node != qmakeProject->rootProjectNode()) - if (QmakeProFileNode *profile = dynamic_cast<QmakeProFileNode *>(node)) + if (auto *profile = dynamic_cast<QmakeProFileNode *>(node)) bc->setSubNodeBuild(profile); BuildManager::appendStep(qs, tr("QMake")); - bc->setSubNodeBuild(0); + bc->setSubNodeBuild(nullptr); } void QmakeManager::buildSubDirContextMenu() @@ -218,14 +218,14 @@ void QmakeManager::handleSubDirContextMenu(QmakeManager::Action action, bool isF if (!target) return; - QmakeBuildConfiguration *bc = qobject_cast<QmakeBuildConfiguration *>(target->activeBuildConfiguration()); + auto *bc = qobject_cast<QmakeBuildConfiguration *>(target->activeBuildConfiguration()); if (!bc) return; if (!contextNode || !buildableFile) isFileBuild = false; - if (QmakePriFileNode *prifile = dynamic_cast<QmakePriFileNode *>(contextNode)) { + if (auto *prifile = dynamic_cast<QmakePriFileNode *>(contextNode)) { if (QmakeProFileNode *profile = prifile->proFileNode()) { if (profile != contextProject->rootProjectNode() || isFileBuild) bc->setSubNodeBuild(profile->proFileNode()); @@ -252,8 +252,8 @@ void QmakeManager::handleSubDirContextMenu(QmakeManager::Action action, bool isF } } - bc->setSubNodeBuild(0); - bc->setFileNodeBuild(0); + bc->setSubNodeBuild(nullptr); + bc->setFileNodeBuild(nullptr); } } // namespace QmakeProjectManager diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanager.pro b/src/plugins/qmakeprojectmanager/qmakeprojectmanager.pro index d2da5d86b9..b831a594d0 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectmanager.pro +++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanager.pro @@ -31,7 +31,6 @@ HEADERS += \ wizards/subdirsprojectwizarddialog.h \ wizards/simpleprojectwizard.h \ qmakeprojectmanagerconstants.h \ - makestep.h \ qmakestep.h \ qtmodulesinfo.h \ qmakeprojectconfigwidget.h \ @@ -43,7 +42,8 @@ HEADERS += \ qmakeprojectmanager_global.h \ desktopqmakerunconfiguration.h \ profilecompletionassist.h \ - makefileparse.h + makefileparse.h \ + qmakemakestep.h SOURCES += \ qmakekitconfigwidget.cpp \ @@ -70,7 +70,6 @@ SOURCES += \ wizards/subdirsprojectwizard.cpp \ wizards/subdirsprojectwizarddialog.cpp \ wizards/simpleprojectwizard.cpp \ - makestep.cpp \ qmakestep.cpp \ qtmodulesinfo.cpp \ qmakeprojectconfigwidget.cpp \ @@ -81,9 +80,10 @@ SOURCES += \ librarydetailscontroller.cpp \ desktopqmakerunconfiguration.cpp \ profilecompletionassist.cpp \ - makefileparse.cpp + makefileparse.cpp \ + qmakemakestep.cpp -FORMS += makestep.ui \ +FORMS += \ qmakestep.ui \ qmakeprojectconfigwidget.ui \ librarydetailswidget.ui diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanager.qbs b/src/plugins/qmakeprojectmanager/qmakeprojectmanager.qbs index ddeeb8c53a..2b0e99f353 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectmanager.qbs +++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanager.qbs @@ -30,7 +30,6 @@ Project { "externaleditors.cpp", "externaleditors.h", "librarydetailscontroller.cpp", "librarydetailscontroller.h", "librarydetailswidget.ui", - "makestep.cpp", "makestep.h", "makestep.ui", "makefileparse.cpp", "makefileparse.h", "profilecompletionassist.cpp", "profilecompletionassist.h", "profileeditor.cpp", "profileeditor.h", @@ -39,6 +38,7 @@ Project { "qmakebuildinfo.h", "qmakekitconfigwidget.cpp", "qmakekitconfigwidget.h", "qmakekitinformation.cpp", "qmakekitinformation.h", + "qmakemakestep.cpp", "qmakemakestep.h", "qmakeparser.cpp", "qmakeparser.h", "qmakeparsernodes.cpp", "qmakeparsernodes.h", "qmakeprojectimporter.cpp", "qmakeprojectimporter.h", diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp index f52917ab20..46ffcec047 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp @@ -29,7 +29,7 @@ #include "qmakeprojectmanager.h" #include "qmakenodes.h" #include "qmakestep.h" -#include "makestep.h" +#include "qmakemakestep.h" #include "qmakebuildconfiguration.h" #include "desktopqmakerunconfiguration.h" #include "wizards/guiappwizard.h" @@ -76,7 +76,7 @@ namespace Internal { class QmakeProjectManagerPluginPrivate : public QObject { public: - ~QmakeProjectManagerPluginPrivate(); + ~QmakeProjectManagerPluginPrivate() override; void projectChanged(); void activeTargetChanged(); @@ -95,7 +95,7 @@ public: qmakeProjectWizard{"qmakeproject", IWizardFactory::ProjectWizard}; QMakeStepFactory qmakeStepFactory; - MakeStepFactory makeStepFactory; + QmakeMakeStepFactory makeStepFactory; QmakeBuildConfigurationFactory buildConfigFactory; DesktopQmakeRunConfigurationFactory runConfigFactory; @@ -140,7 +140,7 @@ bool QmakeProjectManagerPlugin::initialize(const QStringList &arguments, QString //create and register objects ProjectManager::registerProjectType<QmakeProject>(QmakeProjectManager::Constants::PROFILE_MIMETYPE); - ProjectExplorer::KitManager::registerKitInformation(new QmakeKitInformation); + ProjectExplorer::KitManager::registerKitInformation<QmakeKitInformation>(); IWizardFactory::registerFactoryCreator([] { return QList<IWizardFactory *> { @@ -371,10 +371,10 @@ void QmakeProjectManagerPluginPrivate::updateContextActions() Project *project = ProjectTree::currentProject(); const ContainerNode *containerNode = node ? node->asContainerNode() : nullptr; - const QmakeProFileNode *proFileNode = dynamic_cast<const QmakeProFileNode *>(containerNode ? containerNode->rootProjectNode() : node); + const auto *proFileNode = dynamic_cast<const QmakeProFileNode *>(containerNode ? containerNode->rootProjectNode() : node); m_addLibraryActionContextMenu->setEnabled(proFileNode); - QmakeProject *qmakeProject = qobject_cast<QmakeProject *>(QmakeManager::contextProject()); + auto *qmakeProject = qobject_cast<QmakeProject *>(QmakeManager::contextProject()); QmakeProFileNode *subProjectNode = nullptr; disableBuildFileMenus(); if (node) { diff --git a/src/plugins/qmakeprojectmanager/qmakestep.cpp b/src/plugins/qmakeprojectmanager/qmakestep.cpp index 129535de92..aa4c6ba267 100644 --- a/src/plugins/qmakeprojectmanager/qmakestep.cpp +++ b/src/plugins/qmakeprojectmanager/qmakestep.cpp @@ -26,7 +26,7 @@ #include "qmakestep.h" #include "ui_qmakestep.h" -#include "makestep.h" +#include "qmakemakestep.h" #include "qmakebuildconfiguration.h" #include "qmakekitinformation.h" #include "qmakenodes.h" @@ -187,19 +187,6 @@ bool QMakeStep::init(QList<const BuildStep *> &earlierSteps) m_qmakeExecutable = qtVersion->qmakeCommand().toString(); m_qmakeArguments = allArguments(qtVersion); m_runMakeQmake = (qtVersion->qtVersion() >= QtVersionNumber(5, 0 ,0)); - if (m_runMakeQmake) { - m_makeExecutable = makeCommand(); - if (m_makeExecutable.isEmpty()) { - emit addOutput(tr("Could not determine which \"make\" command to run. " - "Check the \"make\" step in the build configuration."), - BuildStep::OutputFormat::ErrorMessage); - return false; - } - m_makeArguments = makeArguments(); - } else { - m_makeExecutable.clear(); - m_makeArguments.clear(); - } QString makefile = workingDirectory + '/'; @@ -215,6 +202,20 @@ bool QMakeStep::init(QList<const BuildStep *> &earlierSteps) makefile.append("Makefile"); } + if (m_runMakeQmake) { + m_makeExecutable = makeCommand(); + if (m_makeExecutable.isEmpty()) { + emit addOutput(tr("Could not determine which \"make\" command to run. " + "Check the \"make\" step in the build configuration."), + BuildStep::OutputFormat::ErrorMessage); + return false; + } + m_makeArguments = makeArguments(makefile); + } else { + m_makeExecutable.clear(); + m_makeArguments.clear(); + } + // Check whether we need to run qmake bool makefileOutDated = (qmakeBc->compareToImportFrom(makefile) != QmakeBuildConfiguration::MakefileMatches); if (m_forced || makefileOutDated) @@ -305,7 +306,7 @@ bool QMakeStep::processSucceeded(int exitCode, QProcess::ExitStatus status) bool result = AbstractProcessStep::processSucceeded(exitCode, status); if (!result) m_needToRunQMake = true; - QmakeProject *project = static_cast<QmakeProject *>(qmakeBuildConfiguration()->target()->project()); + auto *project = static_cast<QmakeProject *>(qmakeBuildConfiguration()->target()->project()); project->emitBuildDirectoryInitialized(); return result; } @@ -353,7 +354,7 @@ void QMakeStep::runNextCommand() return; case State::RUN_MAKE_QMAKE_ALL: { - GnuMakeParser *parser = new GnuMakeParser; + auto *parser = new GnuMakeParser; parser->setWorkingDirectory(processParameters()->workingDirectory()); setOutputParser(parser); m_nextState = State::POST_PROCESS; @@ -450,19 +451,16 @@ void QMakeStep::setSeparateDebugInfo(bool enable) QString QMakeStep::makeCommand() const { - MakeStep *ms = qobject_cast<BuildStepList *>(parent())->firstOfType<MakeStep>(); + auto *ms = qobject_cast<BuildStepList *>(parent())->firstOfType<MakeStep>(); return ms ? ms->effectiveMakeCommand() : QString(); } -QString QMakeStep::makeArguments() const +QString QMakeStep::makeArguments(const QString &makefile) const { QString args; - if (QmakeBuildConfiguration *qmakeBc = qmakeBuildConfiguration()) { - const QString makefile = qmakeBc->makefile(); - if (!makefile.isEmpty()) { - Utils::QtcProcess::addArg(&args, "-f"); - Utils::QtcProcess::addArg(&args, makefile); - } + if (!makefile.isEmpty()) { + Utils::QtcProcess::addArg(&args, "-f"); + Utils::QtcProcess::addArg(&args, makefile); } Utils::QtcProcess::addArg(&args, "qmake_all"); return args; @@ -480,9 +478,11 @@ QString QMakeStep::effectiveQMakeCall() const QString result = qmake; if (qtVersion) { + QmakeBuildConfiguration *qmakeBc = qmakeBuildConfiguration(); + const QString makefile = qmakeBc ? qmakeBc->makefile() : QString(); result += ' ' + allArguments(qtVersion, ArgumentFlag::Expand); if (qtVersion->qtVersion() >= QtVersionNumber(5, 0, 0)) - result.append(QString::fromLatin1(" && %1 %2").arg(make).arg(makeArguments())); + result.append(QString::fromLatin1(" && %1 %2").arg(make).arg(makeArguments(makefile))); } return result; } @@ -735,7 +735,7 @@ void QMakeStepConfigWidget::linkQmlDebuggingLibraryChecked(bool checked) void QMakeStepConfigWidget::askForRebuild(const QString &title) { - QMessageBox *question = new QMessageBox(Core::ICore::mainWindow()); + auto *question = new QMessageBox(Core::ICore::mainWindow()); question->setWindowTitle(title); question->setText(tr("The option will only take effect if the project is recompiled. Do you want to recompile now?")); question->setStandardButtons(QMessageBox::Yes | QMessageBox::No); @@ -860,7 +860,7 @@ QMakeStepFactory::QMakeStepFactory() registerStep<QMakeStep>(QMAKE_BS_ID); setSupportedConfiguration(Constants::QMAKE_BC_ID); setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); - setDisplayName(tr("qmake")); + setDisplayName(QMakeStep::tr("qmake")); setFlags(BuildStepInfo::UniqueStep); } diff --git a/src/plugins/qmakeprojectmanager/qmakestep.h b/src/plugins/qmakeprojectmanager/qmakestep.h index b4b9c42ae0..c83f453dae 100644 --- a/src/plugins/qmakeprojectmanager/qmakestep.h +++ b/src/plugins/qmakeprojectmanager/qmakestep.h @@ -44,7 +44,6 @@ namespace QtSupport { class BaseQtVersion; } namespace QmakeProjectManager { class QmakeBuildConfiguration; -class QmakeProject; namespace Internal { @@ -52,8 +51,6 @@ namespace Ui { class QMakeStep; } class QMakeStepFactory : public ProjectExplorer::BuildStepFactory { - Q_OBJECT - public: QMakeStepFactory(); }; @@ -147,7 +144,7 @@ public: void setSeparateDebugInfo(bool enable); QString makeCommand() const; - QString makeArguments() const; + QString makeArguments(const QString &makefile) const; QString effectiveQMakeCall() const; QVariantMap toMap() const override; diff --git a/src/plugins/qmakeprojectmanager/qtmodulesinfo.cpp b/src/plugins/qmakeprojectmanager/qtmodulesinfo.cpp index a10899a2a3..202261bd7f 100644 --- a/src/plugins/qmakeprojectmanager/qtmodulesinfo.cpp +++ b/src/plugins/qmakeprojectmanager/qtmodulesinfo.cpp @@ -169,7 +169,7 @@ static inline const item *itemForModule(const QString &module) foreach (const item *i, staticQtModuleInfo()->items) if (QLatin1String(i->config) == module) return i; - return 0; + return nullptr; } QString QtModulesInfo::moduleName(const QString &module) diff --git a/src/plugins/qmakeprojectmanager/wizards/filespage.cpp b/src/plugins/qmakeprojectmanager/wizards/filespage.cpp index 5de4eeb625..520f2d03b2 100644 --- a/src/plugins/qmakeprojectmanager/wizards/filespage.cpp +++ b/src/plugins/qmakeprojectmanager/wizards/filespage.cpp @@ -46,7 +46,7 @@ FilesPage::FilesPage(QWidget *parent) : "for which you want to generate skeleton source code files.")); label->setWordWrap(true); - QVBoxLayout *vlayout = new QVBoxLayout; + auto *vlayout = new QVBoxLayout; vlayout->addWidget(label); vlayout->addItem(new QSpacerItem(0, 20)); diff --git a/src/plugins/qmakeprojectmanager/wizards/filespage.h b/src/plugins/qmakeprojectmanager/wizards/filespage.h index 96d7145ace..dbfefb3927 100644 --- a/src/plugins/qmakeprojectmanager/wizards/filespage.h +++ b/src/plugins/qmakeprojectmanager/wizards/filespage.h @@ -41,8 +41,8 @@ class FilesPage : public QWizardPage Q_OBJECT public: - explicit FilesPage(QWidget *parent = 0); - virtual bool isComplete() const; + explicit FilesPage(QWidget *parent = nullptr); + bool isComplete() const override; QString className() const; void setClassName(const QString &suggestedClassName); diff --git a/src/plugins/qmakeprojectmanager/wizards/guiappwizard.cpp b/src/plugins/qmakeprojectmanager/wizards/guiappwizard.cpp index fd6cbc475e..907964b6fe 100644 --- a/src/plugins/qmakeprojectmanager/wizards/guiappwizard.cpp +++ b/src/plugins/qmakeprojectmanager/wizards/guiappwizard.cpp @@ -132,7 +132,7 @@ static inline bool generateFormClass(const GuiAppParameters ¶ms, Core::GeneratedFiles GuiAppWizard::generateFiles(const QWizard *w, QString *errorMessage) const { - const GuiAppWizardDialog *dialog = qobject_cast<const GuiAppWizardDialog *>(w); + const auto *dialog = qobject_cast<const GuiAppWizardDialog *>(w); const QtProjectParameters projectParams = dialog->projectParameters(); const QString projectPath = projectParams.projectPath(); const GuiAppParameters params = dialog->parameters(); diff --git a/src/plugins/qmakeprojectmanager/wizards/guiappwizard.h b/src/plugins/qmakeprojectmanager/wizards/guiappwizard.h index 82369889e9..31eb5b7ce9 100644 --- a/src/plugins/qmakeprojectmanager/wizards/guiappwizard.h +++ b/src/plugins/qmakeprojectmanager/wizards/guiappwizard.h @@ -40,9 +40,9 @@ public: GuiAppWizard(); private: - Core::BaseFileWizard *create(QWidget *parent, const Core::WizardDialogParameters ¶meters) const; + Core::BaseFileWizard *create(QWidget *parent, const Core::WizardDialogParameters ¶meters) const override; - Core::GeneratedFiles generateFiles(const QWizard *w, QString *errorMessage) const; + Core::GeneratedFiles generateFiles(const QWizard *w, QString *errorMessage) const override; private: static bool parametrizeTemplate(const QString &templatePath, const QString &templateName, diff --git a/src/plugins/qmakeprojectmanager/wizards/librarywizard.cpp b/src/plugins/qmakeprojectmanager/wizards/librarywizard.cpp index e420502a45..20b2c669a7 100644 --- a/src/plugins/qmakeprojectmanager/wizards/librarywizard.cpp +++ b/src/plugins/qmakeprojectmanager/wizards/librarywizard.cpp @@ -76,7 +76,7 @@ Core::GeneratedFiles LibraryWizard::generateFiles(const QWizard *w, QString *errorMessage) const { Q_UNUSED(errorMessage) - const LibraryWizardDialog *dialog = qobject_cast<const LibraryWizardDialog *>(w); + const auto *dialog = qobject_cast<const LibraryWizardDialog *>(w); const QtProjectParameters projectParams = dialog->parameters(); const QString projectPath = projectParams.projectPath(); const LibraryParameters params = dialog->libraryParameters(); diff --git a/src/plugins/qmakeprojectmanager/wizards/librarywizard.h b/src/plugins/qmakeprojectmanager/wizards/librarywizard.h index d96df97df6..f7edeb5330 100644 --- a/src/plugins/qmakeprojectmanager/wizards/librarywizard.h +++ b/src/plugins/qmakeprojectmanager/wizards/librarywizard.h @@ -39,9 +39,9 @@ public: LibraryWizard(); protected: - Core::BaseFileWizard *create(QWidget *parent, const Core::WizardDialogParameters ¶meters) const; + Core::BaseFileWizard *create(QWidget *parent, const Core::WizardDialogParameters ¶meters) const override; - Core::GeneratedFiles generateFiles(const QWizard *w, QString *errorMessage) const; + Core::GeneratedFiles generateFiles(const QWizard *w, QString *errorMessage) const override; }; } // namespace Internal diff --git a/src/plugins/qmakeprojectmanager/wizards/librarywizarddialog.cpp b/src/plugins/qmakeprojectmanager/wizards/librarywizarddialog.cpp index ef0bd79ed0..96941d8862 100644 --- a/src/plugins/qmakeprojectmanager/wizards/librarywizarddialog.cpp +++ b/src/plugins/qmakeprojectmanager/wizards/librarywizarddialog.cpp @@ -53,15 +53,15 @@ struct PluginBaseClasses { static const PluginBaseClasses pluginBaseClasses[] = { {"QAccessiblePlugin", "QtGui", "QtCore", "accessible", "QAccessibleFactoryInterface"}, - {"QDecorationPlugin", "QtGui", "QtCore", 0, 0}, // Qt 4 only. + {"QDecorationPlugin", "QtGui", "QtCore", nullptr, nullptr}, // Qt 4 only. {"QGenericPlugin", "QtGui", "QtCore", "generic", "QGenericPluginFactoryInterface"}, - {"QIconEnginePluginV2", "QtGui", "QtCore", "imageformats", 0}, // Qt 4 only. + {"QIconEnginePluginV2", "QtGui", "QtCore", "imageformats", nullptr}, // Qt 4 only. {"QIconEnginePlugin", "QtGui", "QtCore", "imageformats", "QIconEngineFactoryInterface"}, {"QImageIOPlugin", "QtGui", "QtCore", "imageformats", "QImageIOHandlerFactoryInterface"}, - {"QScriptExtensionPlugin", "QtScript", "QtCore", 0, "QScriptExtensionInterface"}, + {"QScriptExtensionPlugin", "QtScript", "QtCore", nullptr, "QScriptExtensionInterface"}, {"QSqlDriverPlugin", "QtSql", "QtCore", "sqldrivers", "QSqlDriverFactoryInterface"}, {"QStylePlugin", "QtGui", "QtCore", "styles", "QStyleFactoryInterface"}, - {"QTextCodecPlugin", "QtCore", 0, "codecs", 0} // Qt 4 only. + {"QTextCodecPlugin", "QtCore", nullptr, "codecs", nullptr} // Qt 4 only. }; enum { defaultPluginBaseClass = 2 }; @@ -72,7 +72,7 @@ static const PluginBaseClasses *findPluginBaseClass(const QString &name) for (int i = 0; i < pluginBaseClassCount; i++) if (name == QLatin1String(pluginBaseClasses[i].name)) return pluginBaseClasses + i; - return 0; + return nullptr; } // return dependencies of a plugin as a line ready for the 'QT=' line in a pro @@ -96,7 +96,7 @@ static QStringList pluginDependencies(const PluginBaseClasses *plb) class LibraryIntroPage : public Utils::ProjectIntroPage { public: - explicit LibraryIntroPage(QWidget *parent = 0); + explicit LibraryIntroPage(QWidget *parent = nullptr); QtProjectParameters::Type type() const; @@ -154,7 +154,7 @@ LibraryWizardDialog::LibraryWizardDialog(const Core::BaseFileWizardFactory *fact m_filesPageId = addPage(m_filesPage); Utils::WizardProgressItem *introItem = wizardProgress()->item(startId()); - Utils::WizardProgressItem *targetItem = 0; + Utils::WizardProgressItem *targetItem = nullptr; if (m_targetPageId != -1) targetItem = wizardProgress()->item(m_targetPageId); Utils::WizardProgressItem *modulesItem = wizardProgress()->item(m_modulesPageId); @@ -165,11 +165,11 @@ LibraryWizardDialog::LibraryWizardDialog(const Core::BaseFileWizardFactory *fact if (m_targetPageId != -1) { targetItem->setNextItems(QList<Utils::WizardProgressItem *>() << modulesItem << filesItem); - targetItem->setNextShownItem(0); + targetItem->setNextShownItem(nullptr); } else { introItem->setNextItems(QList<Utils::WizardProgressItem *>() << modulesItem << filesItem); - introItem->setNextShownItem(0); + introItem->setNextShownItem(nullptr); } } @@ -238,7 +238,7 @@ void LibraryWizardDialog::cleanupPage(int id) { if (m_targetPageId != -1 && id == m_targetPageId) { Utils::WizardProgressItem *targetsItem = wizardProgress()->item(m_targetPageId); - targetsItem->setNextShownItem(0); + targetsItem->setNextShownItem(nullptr); } BaseQmakeProjectWizardDialog::cleanupPage(id); } diff --git a/src/plugins/qmakeprojectmanager/wizards/modulespage.cpp b/src/plugins/qmakeprojectmanager/wizards/modulespage.cpp index a26485a2e6..a9b5e1bb31 100644 --- a/src/plugins/qmakeprojectmanager/wizards/modulespage.cpp +++ b/src/plugins/qmakeprojectmanager/wizards/modulespage.cpp @@ -48,11 +48,11 @@ ModulesPage::ModulesPage(QWidget *parent) "project. The recommended modules for this project are selected by default.")); label->setWordWrap(true); - QVBoxLayout *vlayout = new QVBoxLayout(); + auto *vlayout = new QVBoxLayout(); vlayout->addWidget(label); vlayout->addItem(new QSpacerItem(0, 20)); - QGridLayout *layout = new QGridLayout; + auto *layout = new QGridLayout; const QStringList &modulesList = QtModulesInfo::modules(); int moduleId = 0; diff --git a/src/plugins/qmakeprojectmanager/wizards/modulespage.h b/src/plugins/qmakeprojectmanager/wizards/modulespage.h index 394326d1df..b867a434a4 100644 --- a/src/plugins/qmakeprojectmanager/wizards/modulespage.h +++ b/src/plugins/qmakeprojectmanager/wizards/modulespage.h @@ -41,7 +41,7 @@ class ModulesPage : public QWizardPage Q_OBJECT public: - explicit ModulesPage(QWidget* parent = 0); + explicit ModulesPage(QWidget* parent = nullptr); QStringList selectedModulesList() const; QStringList deselectedModulesList() const; diff --git a/src/plugins/qmakeprojectmanager/wizards/qtprojectparameters.cpp b/src/plugins/qmakeprojectmanager/wizards/qtprojectparameters.cpp index 1c87994374..c11ce81d1d 100644 --- a/src/plugins/qmakeprojectmanager/wizards/qtprojectparameters.cpp +++ b/src/plugins/qmakeprojectmanager/wizards/qtprojectparameters.cpp @@ -36,10 +36,7 @@ namespace QmakeProjectManager { namespace Internal { // ----------- QtProjectParameters -QtProjectParameters::QtProjectParameters() - : type(ConsoleApp), flags(0), qtVersionSupport(SupportQt4And5) -{ -} +QtProjectParameters::QtProjectParameters() = default; QString QtProjectParameters::projectPath() const { diff --git a/src/plugins/qmakeprojectmanager/wizards/qtprojectparameters.h b/src/plugins/qmakeprojectmanager/wizards/qtprojectparameters.h index e82e2fb3ed..eb678d1311 100644 --- a/src/plugins/qmakeprojectmanager/wizards/qtprojectparameters.h +++ b/src/plugins/qmakeprojectmanager/wizards/qtprojectparameters.h @@ -57,9 +57,9 @@ struct QtProjectParameters { // Shared library: name of #define indicating compilation within library static QString libraryMacro(const QString &projectName); - Type type; - unsigned flags; - QtVersionSupport qtVersionSupport; + Type type = ConsoleApp; + unsigned flags = 0; + QtVersionSupport qtVersionSupport = SupportQt4And5; QString fileName; QString target; QString path; diff --git a/src/plugins/qmakeprojectmanager/wizards/qtwizard.cpp b/src/plugins/qmakeprojectmanager/wizards/qtwizard.cpp index f740378580..9ed1939f1a 100644 --- a/src/plugins/qmakeprojectmanager/wizards/qtwizard.cpp +++ b/src/plugins/qmakeprojectmanager/wizards/qtwizard.cpp @@ -88,7 +88,7 @@ bool QtWizard::qt4ProjectPostGenerateFiles(const QWizard *w, const Core::GeneratedFiles &generatedFiles, QString *errorMessage) { - const BaseQmakeProjectWizardDialog *dialog = qobject_cast<const BaseQmakeProjectWizardDialog *>(w); + const auto *dialog = qobject_cast<const BaseQmakeProjectWizardDialog *>(w); // Generate user settings foreach (const Core::GeneratedFile &file, generatedFiles) @@ -118,14 +118,12 @@ bool QtWizard::lowerCaseFiles() } // ------------ CustomQmakeProjectWizard -CustomQmakeProjectWizard::CustomQmakeProjectWizard() -{ -} +CustomQmakeProjectWizard::CustomQmakeProjectWizard() = default; Core::BaseFileWizard *CustomQmakeProjectWizard::create(QWidget *parent, const Core::WizardDialogParameters ¶meters) const { - BaseQmakeProjectWizardDialog *wizard = new BaseQmakeProjectWizardDialog(this, false, parent, + auto *wizard = new BaseQmakeProjectWizardDialog(this, false, parent, parameters); if (!parameters.extraValues().contains(QLatin1String(ProjectExplorer::Constants::PROJECT_KIT_IDS))) @@ -146,8 +144,6 @@ BaseQmakeProjectWizardDialog::BaseQmakeProjectWizardDialog(const Core::BaseFileW bool showModulesPage, QWidget *parent, const Core::WizardDialogParameters ¶meters) : ProjectExplorer::BaseProjectWizardDialog(factory, parent, parameters), - m_modulesPage(0), - m_targetSetupPage(0), m_profileIds(parameters.extraValues().value(QLatin1String(ProjectExplorer::Constants::PROJECT_KIT_IDS)) .value<QList<Core::Id> >()) { @@ -160,8 +156,6 @@ BaseQmakeProjectWizardDialog::BaseQmakeProjectWizardDialog(const Core::BaseFileW int introId, QWidget *parent, const Core::WizardDialogParameters ¶meters) : ProjectExplorer::BaseProjectWizardDialog(factory, introPage, introId, parent, parameters), - m_modulesPage(0), - m_targetSetupPage(0), m_profileIds(parameters.extraValues().value(QLatin1String(ProjectExplorer::Constants::PROJECT_KIT_IDS)) .value<QList<Core::Id> >()) { diff --git a/src/plugins/qmakeprojectmanager/wizards/qtwizard.h b/src/plugins/qmakeprojectmanager/wizards/qtwizard.h index a6469cf7bc..1196c92a2a 100644 --- a/src/plugins/qmakeprojectmanager/wizards/qtwizard.h +++ b/src/plugins/qmakeprojectmanager/wizards/qtwizard.h @@ -134,8 +134,8 @@ private: inline void init(bool showModulesPage); - ModulesPage *m_modulesPage; - ProjectExplorer::TargetSetupPage *m_targetSetupPage; + ModulesPage *m_modulesPage = nullptr; + ProjectExplorer::TargetSetupPage *m_targetSetupPage = nullptr; QStringList m_selectedModules; QStringList m_deselectedModules; QList<Core::Id> m_profileIds; diff --git a/src/plugins/qmakeprojectmanager/wizards/subdirsprojectwizard.cpp b/src/plugins/qmakeprojectmanager/wizards/subdirsprojectwizard.cpp index b85254fd46..306a2438a4 100644 --- a/src/plugins/qmakeprojectmanager/wizards/subdirsprojectwizard.cpp +++ b/src/plugins/qmakeprojectmanager/wizards/subdirsprojectwizard.cpp @@ -68,7 +68,7 @@ Core::BaseFileWizard *SubdirsProjectWizard::create(QWidget *parent, Core::GeneratedFiles SubdirsProjectWizard::generateFiles(const QWizard *w, QString * /*errorMessage*/) const { - const SubdirsProjectWizardDialog *wizard = qobject_cast< const SubdirsProjectWizardDialog *>(w); + const auto *wizard = qobject_cast< const SubdirsProjectWizardDialog *>(w); const QtProjectParameters params = wizard->parameters(); const QString projectPath = params.projectPath(); const QString profileName = Core::BaseFileWizardFactory::buildFileName(projectPath, params.fileName, profileSuffix()); @@ -82,7 +82,7 @@ Core::GeneratedFiles SubdirsProjectWizard::generateFiles(const QWizard *w, bool SubdirsProjectWizard::postGenerateFiles(const QWizard *w, const Core::GeneratedFiles &files, QString *errorMessage) const { - const SubdirsProjectWizardDialog *wizard = qobject_cast< const SubdirsProjectWizardDialog *>(w); + const auto *wizard = qobject_cast< const SubdirsProjectWizardDialog *>(w); if (QtWizard::qt4ProjectPostGenerateFiles(wizard, files, errorMessage)) { const QtProjectParameters params = wizard->parameters(); const QString projectPath = params.projectPath(); diff --git a/src/plugins/qmldesigner/components/componentcore/abstractaction.cpp b/src/plugins/qmldesigner/components/componentcore/abstractaction.cpp index 05e33a2ce7..e4546b5230 100644 --- a/src/plugins/qmldesigner/components/componentcore/abstractaction.cpp +++ b/src/plugins/qmldesigner/components/componentcore/abstractaction.cpp @@ -74,7 +74,7 @@ SelectionContext AbstractAction::selectionContext() const } DefaultAction::DefaultAction(const QString &description) - : QAction(description, 0) + : QAction(description, nullptr) { connect(this, &QAction::triggered, this, &DefaultAction::actionTriggered); } diff --git a/src/plugins/qmldesigner/components/componentcore/actioninterface.h b/src/plugins/qmldesigner/components/componentcore/actioninterface.h index ff6ddadb95..ee120131f7 100644 --- a/src/plugins/qmldesigner/components/componentcore/actioninterface.h +++ b/src/plugins/qmldesigner/components/componentcore/actioninterface.h @@ -52,7 +52,7 @@ public: LowestPriority = ComponentCoreConstants::priorityLast }; - virtual ~ActionInterface() {} + virtual ~ActionInterface() = default; virtual QAction *action() const = 0; virtual QByteArray category() const = 0; diff --git a/src/plugins/qmldesigner/components/componentcore/addimagesdialog.cpp b/src/plugins/qmldesigner/components/componentcore/addimagesdialog.cpp index 5f69750e8a..10a992ae1b 100644 --- a/src/plugins/qmldesigner/components/componentcore/addimagesdialog.cpp +++ b/src/plugins/qmldesigner/components/componentcore/addimagesdialog.cpp @@ -39,7 +39,7 @@ static QTableWidget* createFilesTable(const QStringList &fileNames) { - QTableWidget *table = new QTableWidget(0, 2); + auto table = new QTableWidget(0, 2); table->setSelectionMode(QAbstractItemView::NoSelection); QStringList labels({ @@ -55,7 +55,7 @@ static QTableWidget* createFilesTable(const QStringList &fileNames) const QString toolTip = QDir::toNativeSeparators(filePath); const QString fileName = QFileInfo(filePath).fileName(); const qint64 size = QFileInfo(filePath).size() / 1024; - QTableWidgetItem *fileNameItem = new QTableWidgetItem(fileName); + auto fileNameItem = new QTableWidgetItem(fileName); fileNameItem->setToolTip(toolTip); fileNameItem->setFlags(fileNameItem->flags() ^ Qt::ItemIsEditable); QTableWidgetItem *sizeItem = new QTableWidgetItem(QString::number(size) + " KB"); @@ -74,7 +74,7 @@ static QTableWidget* createFilesTable(const QStringList &fileNames) QComboBox *createDirectoryComboBox(const QString &defaultDirectory) { - QComboBox *comboBox = new QComboBox; + auto comboBox = new QComboBox; comboBox->addItem(defaultDirectory); comboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); @@ -99,7 +99,7 @@ QString AddImagesDialog::getDirectory(const QStringList &fileNames, const QStrin dialog->setWindowTitle(QCoreApplication::translate("AddImageToResources","Add Resources")); QTableWidget *table = createFilesTable(fileNames); table->setParent(dialog); - QGridLayout *mainLayout = new QGridLayout(dialog); + auto mainLayout = new QGridLayout(dialog); mainLayout->addWidget(table, 0, 0, 1, 4); QComboBox *directoryComboBox = createDirectoryComboBox(defaultDirectory); diff --git a/src/plugins/qmldesigner/components/componentcore/changestyleaction.cpp b/src/plugins/qmldesigner/components/componentcore/changestyleaction.cpp index 41901e6e9d..fa77acccb9 100644 --- a/src/plugins/qmldesigner/components/componentcore/changestyleaction.cpp +++ b/src/plugins/qmldesigner/components/componentcore/changestyleaction.cpp @@ -61,7 +61,7 @@ const char disbledTooltip[] = QT_TRANSLATE_NOOP("ChangeStyleWidgetAction", QWidget *ChangeStyleWidgetAction::createWidget(QWidget *parent) { - QComboBox *comboBox = new QComboBox(parent); + auto comboBox = new QComboBox(parent); comboBox->setToolTip(tr(enabledTooltip)); comboBox->addItem("Default"); comboBox->addItem("Fusion"); diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index 3fd96d7bd5..6bc247d143 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -71,7 +71,7 @@ DesignerActionManagerView *DesignerActionManager::view() DesignerActionToolBar *DesignerActionManager::createToolBar(QWidget *parent) const { - DesignerActionToolBar *toolBar = new DesignerActionToolBar(parent); + auto toolBar = new DesignerActionToolBar(parent); QList<ActionInterface* > categories = Utils::filtered(designerActions(), [](ActionInterface *action) { return action->type() == ActionInterface::ContextMenu; @@ -149,13 +149,13 @@ QGraphicsWidget *DesignerActionManager::createFormEditorToolBar(QGraphicsItem *p QGraphicsWidget *toolbar = new QGraphicsWidget(parent); - QGraphicsLinearLayout *layout = new QGraphicsLinearLayout; + auto layout = new QGraphicsLinearLayout; layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); toolbar->setLayout(layout); for (ActionInterface *action : actions) { - FormEditorToolButton *button = new FormEditorToolButton(action->action(), toolbar); + auto button = new FormEditorToolButton(action->action(), toolbar); layout->addItem(button); } @@ -199,7 +199,7 @@ public: ModelNodeContextMenuAction(id, description, category, key, priority, action, enabled, visibility) {} - virtual void updateContext() + void updateContext() override { defaultAction()->setSelectionContext(selectionContext()); if (selectionContext().isValid()) { @@ -225,7 +225,7 @@ public: SelectionContextPredicate visibility = &SelectionContextFunctors::always) : ModelNodeContextMenuAction(id, description, category, key, priority, action, enabled, visibility) {} - virtual void updateContext() + void updateContext() override { defaultAction()->setSelectionContext(selectionContext()); if (selectionContext().isValid()) { @@ -285,7 +285,7 @@ public: {} - virtual void updateContext() + void updateContext() override { menu()->clear(); if (selectionContext().isValid()) { @@ -1036,9 +1036,7 @@ DesignerActionManager::DesignerActionManager(DesignerActionManagerView *designer { } -DesignerActionManager::~DesignerActionManager() -{ -} +DesignerActionManager::~DesignerActionManager() = default; DesignerActionToolBar::DesignerActionToolBar(QWidget *parentWidget) : Utils::StyledBar(parentWidget), m_toolBar(new QToolBar("ActionToolBar", this)) @@ -1048,7 +1046,7 @@ DesignerActionToolBar::DesignerActionToolBar(QWidget *parentWidget) : Utils::Sty m_toolBar->setMovable(true); m_toolBar->setOrientation(Qt::Horizontal); - QHBoxLayout *horizontalLayout = new QHBoxLayout(this); + auto horizontalLayout = new QHBoxLayout(this); horizontalLayout->setMargin(0); horizontalLayout->setSpacing(0); @@ -1066,7 +1064,7 @@ void DesignerActionToolBar::registerAction(ActionInterface *action) void DesignerActionToolBar::addSeparator() { - QAction *separatorAction = new QAction(m_toolBar); + auto separatorAction = new QAction(m_toolBar); separatorAction->setSeparator(true); m_toolBar->addAction(separatorAction); } diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h index b84bbb71af..7997ef07e2 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h @@ -42,7 +42,7 @@ namespace QmlDesigner { class DesignerActionManagerView; -typedef std::function<bool (const QStringList &filenames, const QString &defaulTargetDirectory)> AddResourceOperation; +using AddResourceOperation = std::function<bool (const QStringList&, const QString&)>; struct AddResourceHandler { diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.cpp index 4e97cb75ca..dcdf960cf4 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanagerview.cpp @@ -32,7 +32,7 @@ namespace QmlDesigner { DesignerActionManagerView::DesignerActionManagerView() - : AbstractView(0), + : AbstractView(nullptr), m_designerActionManager(this), m_isInRewriterTransaction(false), m_setupContextDirty(false) diff --git a/src/plugins/qmldesigner/components/componentcore/findimplementation.cpp b/src/plugins/qmldesigner/components/componentcore/findimplementation.cpp index a22a72498f..a3a33f0140 100644 --- a/src/plugins/qmldesigner/components/componentcore/findimplementation.cpp +++ b/src/plugins/qmldesigner/components/componentcore/findimplementation.cpp @@ -42,9 +42,9 @@ using namespace QmlJS; class FindImplementationVisitor: protected AST::Visitor { public: - typedef QList<AST::SourceLocation> Results; + using Results = QList<AST::SourceLocation>; - FindImplementationVisitor(Document::Ptr doc, const ContextPtr &context) + FindImplementationVisitor(const Document::Ptr &doc, const ContextPtr &context) : m_document(doc) , m_context(context) , m_scopeChain(doc, context) @@ -82,7 +82,7 @@ protected: using AST::Visitor::visit; - virtual bool visit(AST::UiPublicMember *node) + bool visit(AST::UiPublicMember *node) override { if (node->memberTypeName() == m_typeName){ const ObjectValue * objectValue = m_context->lookupType(m_document.data(), QStringList(m_typeName)); @@ -98,7 +98,7 @@ protected: return true; } - virtual bool visit(AST::UiObjectDefinition *node) + bool visit(AST::UiObjectDefinition *node) override { bool oldInside = m_insideObject; if (checkTypeName(node->qualifiedTypeNameId)) @@ -111,7 +111,7 @@ protected: return false; } - virtual bool visit(AST::UiObjectBinding *node) + bool visit(AST::UiObjectBinding *node) override { bool oldInside = m_insideObject; if (checkTypeName(node->qualifiedTypeNameId)) @@ -125,7 +125,7 @@ protected: return false; } - virtual bool visit(AST::UiScriptBinding *node) + bool visit(AST::UiScriptBinding *node) override { if (m_insideObject) { QStringList stringList = textAt(node->qualifiedId->firstSourceLocation(), @@ -147,7 +147,7 @@ protected: return true; } - virtual bool visit(AST::IdentifierExpression *node) + bool visit(AST::IdentifierExpression *node) override { if (node->name != m_typeName) return false; @@ -159,7 +159,7 @@ protected: return false; } - virtual bool visit(AST::FieldMemberExpression *node) + bool visit(AST::FieldMemberExpression *node) override { if (node->name != m_typeName) return true; @@ -173,12 +173,12 @@ protected: return true; } - virtual bool visit(AST::FunctionDeclaration *node) + bool visit(AST::FunctionDeclaration *node) override { return visit(static_cast<AST::FunctionExpression *>(node)); } - virtual bool visit(AST::FunctionExpression *node) + bool visit(AST::FunctionExpression *node) override { AST::Node::accept(node->formals, this); m_scopeBuilder.push(node); @@ -187,13 +187,13 @@ protected: return false; } - virtual bool visit(AST::VariableDeclaration *node) + bool visit(AST::VariableDeclaration *node) override { AST::Node::accept(node->expression, this); return false; } - virtual bool visit(AST::UiImport *ast) + bool visit(AST::UiImport *ast) override { if (ast && ast->importId == m_typeName) { const Imports *imp = m_context->imports(m_document.data()); @@ -248,9 +248,7 @@ QString matchingLine(unsigned position, const QString &source) } //namespace -FindImplementation::FindImplementation() -{ -} +FindImplementation::FindImplementation() = default; QList<QmlJSEditor::FindReferences::Usage> FindImplementation::run(const QString &fileName, const QString &typeName, @@ -263,7 +261,7 @@ QList<QmlJSEditor::FindReferences::Usage> FindImplementation::run(const QString //Parse always the latest version of document QmlJS::Dialect dialect = QmlJS::ModelManagerInterface::guessLanguageOfFile(fileName); QmlJS::Document::MutablePtr documentUpdate = QmlJS::Document::create(fileName, dialect); - documentUpdate->setSource(modelManager->workingCopy().source(fileName)); + documentUpdate->setSource(QmlJS::ModelManagerInterface::workingCopy().source(fileName)); if (documentUpdate->parseQml()) modelManager->updateDocument(documentUpdate); diff --git a/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp b/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp index ed05faba12..5ec3ea557b 100644 --- a/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp +++ b/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp @@ -119,7 +119,7 @@ static void setUpperLeftPostionToNode(const ModelNode &layoutNode, const QList<M { QPointF upperLeftPosition = getUpperLeftPosition(modelNodeList); layoutNode.variantProperty("x").setValue(qRound(upperLeftPosition.x())); - layoutNode.variantProperty("y") .setValue(qRound(upperLeftPosition.y())); + layoutNode.variantProperty("y").setValue(qRound(upperLeftPosition.y())); } void LayoutInGridLayout::reparentToNodeAndRemovePositionForModelNodes(const ModelNode &parentModelNode, diff --git a/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.h b/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.h index 4acc4291a6..ba7d5991e9 100644 --- a/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.h +++ b/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.h @@ -46,7 +46,7 @@ public: const QList<ModelNode> &modelNodeList); static void setSizeAsPreferredSize(const QList<ModelNode> &modelNodeList); private: - typedef std::function<bool(const ModelNode &node1, const ModelNode &node2)> LessThan; + using LessThan = std::function<bool (const ModelNode&, const ModelNode&)>; LayoutInGridLayout(const SelectionContext &selectionContext); void doIt(); diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu.cpp index de2733893a..415127cb52 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu.cpp @@ -91,7 +91,7 @@ void populateMenu(QSet<ActionInterface* > &actionInterfaces, void ModelNodeContextMenu::execute(const QPoint &position, bool selectionMenuBool) { - QMenu* mainMenu = new QMenu(); + auto mainMenu = new QMenu(); m_selectionContext.setShowSelectionTools(selectionMenuBool); m_selectionContext.setScenePosition(m_scenePos); diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.h b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.h index 79f344d9b5..6d9f904149 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.h +++ b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.h @@ -41,8 +41,8 @@ namespace QmlDesigner { -typedef std::function<bool (const SelectionContext &context)> SelectionContextPredicate; -typedef std::function<void (const SelectionContext &context)> SelectionContextOperation; +using SelectionContextPredicate = std::function<bool (const SelectionContext&)>; +using SelectionContextOperation = std::function<void (const SelectionContext&)>; namespace SelectionContextFunctors { diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp index bc43ca6515..f5b701e44d 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp @@ -379,7 +379,7 @@ void resetZ(const SelectionContext &selectionState) } } -static inline void backupPropertyAndRemove(ModelNode node, const PropertyName &propertyName) +static inline void backupPropertyAndRemove(const ModelNode &node, const PropertyName &propertyName) { if (node.hasVariantProperty(propertyName)) { node.setAuxiliaryData(auxDataString + propertyName, node.variantProperty(propertyName).value()); @@ -444,7 +444,7 @@ void anchorsReset(const SelectionContext &selectionState) } } -typedef std::function<bool(const ModelNode &node1, const ModelNode &node2)> LessThan; +using LessThan = std::function<bool (const ModelNode &, const ModelNode&)>; bool compareByX(const ModelNode &node1, const ModelNode &node2) { @@ -480,7 +480,7 @@ bool compareByGrid(const ModelNode &node1, const ModelNode &node2) static void layoutHelperFunction(const SelectionContext &selectionContext, - TypeName layoutType, + const TypeName &layoutType, LessThan lessThan) { if (!selectionContext.view() @@ -578,7 +578,7 @@ static PropertyNameList sortedPropertyNameList(const PropertyNameList &nameList) return sortedPropertyNameList; } -static QString toUpper(const QString signal) +static QString toUpper(const QString &signal) { QString ret = signal; ret[0] = signal.at(0).toUpper(); @@ -588,9 +588,9 @@ static QString toUpper(const QString signal) static void addSignal(const QString &typeName, const QString &itemId, const QString &signalName, bool isRootModelNode) { QScopedPointer<Model> model(Model::create("Item", 2, 0)); - RewriterView rewriterView(RewriterView::Amend, 0); + RewriterView rewriterView(RewriterView::Amend, nullptr); - TextEditor::TextEditorWidget *textEdit = qobject_cast<TextEditor::TextEditorWidget*> + auto textEdit = qobject_cast<TextEditor::TextEditorWidget*> (Core::EditorManager::currentEditor()->widget()); BaseTextEditModifier modifier(textEdit); @@ -699,7 +699,7 @@ void addSignalHandlerOrGotoImplementation(const SelectionContext &selectionState Core::EditorManager::openEditorAt(usages.constFirst().path, usages.constFirst().line, usages.constFirst().col); if (!signalNames.isEmpty()) { - AddSignalHandlerDialog *dialog = new AddSignalHandlerDialog(Core::ICore::dialogParent()); + auto dialog = new AddSignalHandlerDialog(Core::ICore::dialogParent()); dialog->setSignals(signalNames); AddSignalHandlerDialog::connect(dialog, &AddSignalHandlerDialog::signalSelected, [=] { diff --git a/src/plugins/qmldesigner/components/componentcore/theme.cpp b/src/plugins/qmldesigner/components/componentcore/theme.cpp index 586419910e..d7eba033ca 100644 --- a/src/plugins/qmldesigner/components/componentcore/theme.cpp +++ b/src/plugins/qmldesigner/components/componentcore/theme.cpp @@ -53,7 +53,7 @@ QColor Theme::evaluateColorAtThemeInstance(const QString &themeColorName) } qWarning() << Q_FUNC_INFO << "error while evaluating" << themeColorName; - return QColor(); + return {}; } Theme *Theme::instance() diff --git a/src/plugins/qmldesigner/components/componentcore/zoomaction.cpp b/src/plugins/qmldesigner/components/componentcore/zoomaction.cpp index b0aae5d911..e18a472241 100644 --- a/src/plugins/qmldesigner/components/componentcore/zoomaction.cpp +++ b/src/plugins/qmldesigner/components/componentcore/zoomaction.cpp @@ -71,7 +71,7 @@ void ZoomAction::setZoomLevel(double zoomLevel) QWidget *ZoomAction::createWidget(QWidget *parent) { - QComboBox *comboBox = new QComboBox(parent); + auto comboBox = new QComboBox(parent); if (m_comboBoxModel.isNull()) { m_comboBoxModel = comboBox->model(); diff --git a/src/plugins/qmldesigner/components/debugview/debugview.cpp b/src/plugins/qmldesigner/components/debugview/debugview.cpp index 59afd1172f..60f4fc6283 100644 --- a/src/plugins/qmldesigner/components/debugview/debugview.cpp +++ b/src/plugins/qmldesigner/components/debugview/debugview.cpp @@ -298,7 +298,7 @@ void DebugView::rewriterEndTransaction() WidgetInfo DebugView::widgetInfo() { - return createWidgetInfo(m_debugViewWidget.data(), 0, QStringLiteral("DebugView"), WidgetInfo::LeftPane, 0, tr("Debug View")); + return createWidgetInfo(m_debugViewWidget.data(), nullptr, QStringLiteral("DebugView"), WidgetInfo::LeftPane, 0, tr("Debug View")); } bool DebugView::hasWidget() const @@ -316,7 +316,7 @@ void DebugView::instancePropertyChanged(const QList<QPair<ModelNode, PropertyNam QString string; message.setString(&string); - typedef QPair<ModelNode, PropertyName> Pair; + using Pair = QPair<ModelNode, PropertyName>; foreach (const Pair &pair, propertyList) { message << pair.first; diff --git a/src/plugins/qmldesigner/components/formeditor/abstractcustomtool.cpp b/src/plugins/qmldesigner/components/formeditor/abstractcustomtool.cpp index 05741879d8..61f15a88f5 100644 --- a/src/plugins/qmldesigner/components/formeditor/abstractcustomtool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/abstractcustomtool.cpp @@ -30,7 +30,7 @@ namespace QmlDesigner { AbstractCustomTool::AbstractCustomTool() - : AbstractFormEditorTool(0) + : AbstractFormEditorTool(nullptr) { } diff --git a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp index e4f76d5858..a76406dd31 100644 --- a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp @@ -42,11 +42,7 @@ AbstractFormEditorTool::AbstractFormEditorTool(FormEditorView *editorView) : m_v { } - -AbstractFormEditorTool::~AbstractFormEditorTool() -{ - -} +AbstractFormEditorTool::~AbstractFormEditorTool() = default; FormEditorView* AbstractFormEditorTool::view() const { @@ -79,7 +75,7 @@ QList<FormEditorItem *> AbstractFormEditorTool::toFormEditorItemList(const QList QList<FormEditorItem *> formEditorItemList; foreach (QGraphicsItem *graphicsItem, itemList) { - FormEditorItem *formEditorItem = qgraphicsitem_cast<FormEditorItem*>(graphicsItem); + auto formEditorItem = qgraphicsitem_cast<FormEditorItem*>(graphicsItem); if (formEditorItem) formEditorItemList.append(formEditorItem); } @@ -90,13 +86,13 @@ QList<FormEditorItem *> AbstractFormEditorTool::toFormEditorItemList(const QList bool AbstractFormEditorTool::topItemIsMovable(const QList<QGraphicsItem*> & itemList) { QGraphicsItem *firstSelectableItem = topMovableGraphicsItem(itemList); - if (firstSelectableItem == 0) + if (firstSelectableItem == nullptr) return false; FormEditorItem *formEditorItem = FormEditorItem::fromQGraphicsItem(firstSelectableItem); QList<ModelNode> selectedNodes = view()->selectedModelNodes(); - if (formEditorItem != 0 + if (formEditorItem != nullptr && selectedNodes.contains(formEditorItem->qmlItemNode())) return true; @@ -170,7 +166,7 @@ QGraphicsItem *AbstractFormEditorTool::topMovableGraphicsItem(const QList<QGraph return item; } - return 0; + return nullptr; } FormEditorItem *AbstractFormEditorTool::topMovableFormEditorItem(const QList<QGraphicsItem*> &itemList, bool selectOnlyContentItems) @@ -186,12 +182,12 @@ FormEditorItem *AbstractFormEditorTool::topMovableFormEditorItem(const QList<QGr return formEditorItem; } - return 0; + return nullptr; } FormEditorItem* AbstractFormEditorTool::nearestFormEditorItem(const QPointF &point, const QList<QGraphicsItem*> & itemList) { - FormEditorItem* nearestItem = 0; + FormEditorItem* nearestItem = nullptr; foreach (QGraphicsItem *item, itemList) { FormEditorItem *formEditorItem = FormEditorItem::fromQGraphicsItem(item); @@ -345,7 +341,7 @@ FormEditorItem *AbstractFormEditorTool::containerFormEditorItem(const QList<QGra return formEditorItem; } - return 0; + return nullptr; } void AbstractFormEditorTool::clear() diff --git a/src/plugins/qmldesigner/components/formeditor/anchorindicator.cpp b/src/plugins/qmldesigner/components/formeditor/anchorindicator.cpp index 6cd4be56f8..81bd86e1f6 100644 --- a/src/plugins/qmldesigner/components/formeditor/anchorindicator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/anchorindicator.cpp @@ -37,9 +37,7 @@ AnchorIndicator::AnchorIndicator(LayerItem *layerItem) { } -AnchorIndicator::AnchorIndicator() -{ -} +AnchorIndicator::AnchorIndicator() = default; AnchorIndicator::~AnchorIndicator() { diff --git a/src/plugins/qmldesigner/components/formeditor/backgroundaction.cpp b/src/plugins/qmldesigner/components/formeditor/backgroundaction.cpp index f763aa9b5a..356fbf4f32 100644 --- a/src/plugins/qmldesigner/components/formeditor/backgroundaction.cpp +++ b/src/plugins/qmldesigner/components/formeditor/backgroundaction.cpp @@ -55,7 +55,7 @@ QIcon iconForColor(const QColor &color) { QWidget *BackgroundAction::createWidget(QWidget *parent) { - QComboBox *comboBox = new QComboBox(parent); + auto comboBox = new QComboBox(parent); comboBox->setFixedWidth(42); for (int i = 0; i < colors().count(); ++i) { diff --git a/src/plugins/qmldesigner/components/formeditor/bindingindicator.cpp b/src/plugins/qmldesigner/components/formeditor/bindingindicator.cpp index 766458ec59..709f197d5b 100644 --- a/src/plugins/qmldesigner/components/formeditor/bindingindicator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/bindingindicator.cpp @@ -36,9 +36,7 @@ BindingIndicator::BindingIndicator(LayerItem *layerItem) { } -BindingIndicator::BindingIndicator() -{ -} +BindingIndicator::BindingIndicator() = default; BindingIndicator::~BindingIndicator() { diff --git a/src/plugins/qmldesigner/components/formeditor/bindingindicatorgraphicsitem.cpp b/src/plugins/qmldesigner/components/formeditor/bindingindicatorgraphicsitem.cpp index c6b4ca6fd0..8a863d1931 100644 --- a/src/plugins/qmldesigner/components/formeditor/bindingindicatorgraphicsitem.cpp +++ b/src/plugins/qmldesigner/components/formeditor/bindingindicatorgraphicsitem.cpp @@ -46,10 +46,10 @@ void BindingIndicatorGraphicsItem::paint(QPainter *painter, const QStyleOptionGr QRectF BindingIndicatorGraphicsItem::boundingRect() const { - return QRectF(m_bindingLine.x1(), + return {m_bindingLine.x1(), m_bindingLine.y1(), m_bindingLine.x2() - m_bindingLine.x1() + 3, - m_bindingLine.y2() - m_bindingLine.y1() + 3); + m_bindingLine.y2() - m_bindingLine.y1() + 3}; } void BindingIndicatorGraphicsItem::updateBindingIndicator(const QLineF &bindingLine) diff --git a/src/plugins/qmldesigner/components/formeditor/contentnoteditableindicator.cpp b/src/plugins/qmldesigner/components/formeditor/contentnoteditableindicator.cpp index ef24dea8a3..26c1390217 100644 --- a/src/plugins/qmldesigner/components/formeditor/contentnoteditableindicator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/contentnoteditableindicator.cpp @@ -37,9 +37,7 @@ ContentNotEditableIndicator::ContentNotEditableIndicator(LayerItem *layerItem) } -ContentNotEditableIndicator::ContentNotEditableIndicator() -{ -} +ContentNotEditableIndicator::ContentNotEditableIndicator() = default; ContentNotEditableIndicator::~ContentNotEditableIndicator() { @@ -92,7 +90,7 @@ void ContentNotEditableIndicator::addAddiationEntries(const QList<FormEditorItem if (modelNode.metaInfo().isValid() && modelNode.metaInfo().isSubclassOf("QtQuick.Loader")) { if (!m_entryList.contains(EntryPair(formEditorItem, 0))) { - QGraphicsRectItem *indicatorShape = new QGraphicsRectItem(m_layerItem); + auto indicatorShape = new QGraphicsRectItem(m_layerItem); QPen linePen; linePen.setCosmetic(true); linePen.setColor(QColor(0xa0, 0xa0, 0xa0)); diff --git a/src/plugins/qmldesigner/components/formeditor/contentnoteditableindicator.h b/src/plugins/qmldesigner/components/formeditor/contentnoteditableindicator.h index beb57fae4d..c07f86b625 100644 --- a/src/plugins/qmldesigner/components/formeditor/contentnoteditableindicator.h +++ b/src/plugins/qmldesigner/components/formeditor/contentnoteditableindicator.h @@ -35,7 +35,7 @@ namespace QmlDesigner { class ContentNotEditableIndicator { public: - typedef QPair<FormEditorItem*, QGraphicsRectItem *> EntryPair; + using EntryPair = QPair<FormEditorItem*, QGraphicsRectItem *>; ContentNotEditableIndicator(LayerItem *layerItem); ContentNotEditableIndicator(); diff --git a/src/plugins/qmldesigner/components/formeditor/dragtool.cpp b/src/plugins/qmldesigner/components/formeditor/dragtool.cpp index 64c10e06a3..2629250ee7 100644 --- a/src/plugins/qmldesigner/components/formeditor/dragtool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/dragtool.cpp @@ -52,10 +52,7 @@ DragTool::DragTool(FormEditorView *editorView) { } - -DragTool::~DragTool() -{ -} +DragTool::~DragTool() = default; void DragTool::clear() { diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.cpp index c51918047e..dfb5cdd956 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.cpp @@ -67,7 +67,7 @@ bool FormEditorGraphicsView::eventFilter(QObject *watched, QEvent *event) stopPanning(event); } if (event->type() == QEvent::MouseMove) { - QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event); + auto mouseEvent = static_cast<QMouseEvent*>(event); if (!m_panningStartPosition.isNull()) { horizontalScrollBar()->setValue(horizontalScrollBar()->value() - (mouseEvent->x() - m_panningStartPosition.x())); @@ -112,8 +112,8 @@ void FormEditorGraphicsView::mouseReleaseEvent(QMouseEvent *event) bool isTextInputItem(QGraphicsItem* item) { if (item && item->isWidget()) { - QGraphicsWidget *graphicsWidget = static_cast<QGraphicsWidget *>(item); - QGraphicsProxyWidget * textInputProxyWidget = qobject_cast<QGraphicsProxyWidget *>(graphicsWidget); + auto graphicsWidget = static_cast<QGraphicsWidget *>(item); + auto textInputProxyWidget = qobject_cast<QGraphicsProxyWidget *>(graphicsWidget); if (textInputProxyWidget && textInputProxyWidget->widget() && ( strcmp(textInputProxyWidget->widget()->metaObject()->className(), "QLineEdit") == 0 || strcmp(textInputProxyWidget->widget()->metaObject()->className(), "QTextEdit") == 0)) { diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp index c8e7ed1fa2..045aec9007 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp @@ -86,7 +86,7 @@ void FormEditorScene::resetScene() FormEditorItem* FormEditorScene::itemForQmlItemNode(const QmlItemNode &qmlItemNode) const { - QTC_ASSERT(qmlItemNode.isValid(), return 0); + QTC_ASSERT(qmlItemNode.isValid(), return nullptr); return m_qmlItemNodeItemHash.value(qmlItemNode); } @@ -140,7 +140,7 @@ FormEditorItem* FormEditorScene::calulateNewParent(FormEditorItem *formEditorIte } } - return 0; + return nullptr; } void FormEditorScene::synchronizeTransformation(FormEditorItem *item) @@ -182,7 +182,7 @@ void FormEditorScene::synchronizeOtherProperty(FormEditorItem *item, const QByte FormEditorItem *FormEditorScene::addFormEditorItem(const QmlItemNode &qmlItemNode) { - FormEditorItem *formEditorItem = new FormEditorItem(qmlItemNode, this); + auto formEditorItem = new FormEditorItem(qmlItemNode, this); Q_ASSERT(!m_qmlItemNodeItemHash.contains(qmlItemNode)); m_qmlItemNodeItemHash.insert(qmlItemNode, formEditorItem); @@ -382,7 +382,7 @@ void FormEditorScene::hoverLeaveEvent(QGraphicsSceneHoverEvent * /*event*/) void FormEditorScene::reparentItem(const QmlItemNode &node, const QmlItemNode &newParent) { if (FormEditorItem *item = itemForQmlItemNode(node)) { - item->setParentItem(0); + item->setParentItem(nullptr); if (newParent.isValid()) { if (FormEditorItem *parentItem = itemForQmlItemNode(newParent)) item->setParentItem(parentItem); @@ -407,7 +407,7 @@ void FormEditorScene::clearFormEditorItems() const QList<FormEditorItem*> formEditorItems = Utils::filtered(formEditorItemsTransformed, [](FormEditorItem *item) { return item; }); foreach (FormEditorItem *item, formEditorItems) - item->setParentItem(0); + item->setParentItem(nullptr); foreach (FormEditorItem *item, formEditorItems) delete item; diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp index cd19255683..f964b80458 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp @@ -50,6 +50,7 @@ #include <QPair> #include <QString> #include <QTimer> +#include <memory> namespace QmlDesigner { @@ -148,14 +149,14 @@ void FormEditorView::createFormEditorWidget() m_formEditorWidget = QPointer<FormEditorWidget>(new FormEditorWidget(this)); m_scene = QPointer<FormEditorScene>(new FormEditorScene(m_formEditorWidget.data(), this)); - m_moveTool.reset(new MoveTool(this)); - m_selectionTool.reset(new SelectionTool(this)); - m_resizeTool.reset(new ResizeTool(this)); - m_dragTool.reset(new DragTool(this)); + m_moveTool = std::make_unique<MoveTool>(this); + m_selectionTool = std::make_unique<SelectionTool>(this); + m_resizeTool = std::make_unique<ResizeTool>(this); + m_dragTool = std::make_unique<DragTool>(this); m_currentTool = m_selectionTool.get(); - Internal::FormEditorContext *formEditorContext = new Internal::FormEditorContext(m_formEditorWidget.data()); + auto formEditorContext = new Internal::FormEditorContext(m_formEditorWidget.data()); Core::ICore::addContextObject(formEditorContext); connect(formEditorWidget()->zoomAction(), &ZoomAction::zoomLevelChanged, [this]() { @@ -168,7 +169,7 @@ void FormEditorView::createFormEditorWidget() void FormEditorView::temporaryBlockView() { formEditorWidget()->graphicsView()->setUpdatesEnabled(false); - static QTimer *timer = new QTimer(qApp); + static auto timer = new QTimer(qApp); timer->setSingleShot(true); timer->start(1000); @@ -277,7 +278,7 @@ WidgetInfo FormEditorView::widgetInfo() if (!m_formEditorWidget) createFormEditorWidget(); - return createWidgetInfo(m_formEditorWidget.data(), 0, "FormEditor", WidgetInfo::CentralPane, 0, tr("Form Editor"), DesignerWidgetFlags::IgnoreErrors); + return createWidgetInfo(m_formEditorWidget.data(), nullptr, "FormEditor", WidgetInfo::CentralPane, 0, tr("Form Editor"), DesignerWidgetFlags::IgnoreErrors); } FormEditorWidget *FormEditorView::formEditorWidget() @@ -395,7 +396,7 @@ void FormEditorView::changeToCustomTool() { if (hasSelectedModelNodes()) { int handlingRank = 0; - AbstractCustomTool *selectedCustomTool = 0; + AbstractCustomTool *selectedCustomTool = nullptr; const ModelNode selectedModelNode = selectedModelNodes().constFirst(); diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp index 059261c3a2..954f8fee66 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp @@ -55,13 +55,12 @@ namespace QmlDesigner { -FormEditorWidget::FormEditorWidget(FormEditorView *view) - : QWidget(), +FormEditorWidget::FormEditorWidget(FormEditorView *view) : m_formEditorView(view) { setStyleSheet(Theme::replaceCssColors(QString::fromUtf8(Utils::FileReader::fetchQrc(QLatin1String(":/qmldesigner/formeditorstylesheet.css"))))); - QVBoxLayout *fillLayout = new QVBoxLayout(this); + auto fillLayout = new QVBoxLayout(this); fillLayout->setMargin(0); fillLayout->setSpacing(0); setLayout(fillLayout); @@ -70,7 +69,7 @@ FormEditorWidget::FormEditorWidget(FormEditorView *view) m_toolActionGroup = new QActionGroup(this); - QActionGroup *layoutActionGroup = new QActionGroup(this); + auto layoutActionGroup = new QActionGroup(this); layoutActionGroup->setExclusive(true); m_noSnappingAction = layoutActionGroup->addAction(tr("No snapping (T).")); @@ -98,7 +97,7 @@ FormEditorWidget::FormEditorWidget(FormEditorView *view) addActions(layoutActionGroup->actions()); upperActions.append(layoutActionGroup->actions()); - QAction *separatorAction = new QAction(this); + auto separatorAction = new QAction(this); separatorAction->setSeparator(true); addAction(separatorAction); upperActions.append(separatorAction); diff --git a/src/plugins/qmldesigner/components/formeditor/layeritem.cpp b/src/plugins/qmldesigner/components/formeditor/layeritem.cpp index 77b6b37a5a..993e6c382c 100644 --- a/src/plugins/qmldesigner/components/formeditor/layeritem.cpp +++ b/src/plugins/qmldesigner/components/formeditor/layeritem.cpp @@ -31,7 +31,6 @@ namespace QmlDesigner { LayerItem::LayerItem(FormEditorScene* scene) - : QGraphicsObject() { scene->addItem(this); setZValue(1); @@ -39,9 +38,7 @@ LayerItem::LayerItem(FormEditorScene* scene) setAcceptedMouseButtons(Qt::NoButton); } -LayerItem::~LayerItem() -{ -} +LayerItem::~LayerItem() = default; void LayerItem::paint(QPainter * /*painter*/, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/) { diff --git a/src/plugins/qmldesigner/components/formeditor/lineeditaction.cpp b/src/plugins/qmldesigner/components/formeditor/lineeditaction.cpp index 4e07f3519e..5f9e7f571b 100644 --- a/src/plugins/qmldesigner/components/formeditor/lineeditaction.cpp +++ b/src/plugins/qmldesigner/components/formeditor/lineeditaction.cpp @@ -48,7 +48,7 @@ void LineEditAction::clearLineEditText() QWidget *LineEditAction::createWidget(QWidget *parent) { - QLineEdit *lineEdit = new QLineEdit(parent); + auto lineEdit = new QLineEdit(parent); lineEdit->setPlaceholderText(m_placeHolderText); lineEdit->setFixedWidth(100); diff --git a/src/plugins/qmldesigner/components/formeditor/movetool.cpp b/src/plugins/qmldesigner/components/formeditor/movetool.cpp index 4b6a21694b..75bce105a4 100644 --- a/src/plugins/qmldesigner/components/formeditor/movetool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/movetool.cpp @@ -51,10 +51,7 @@ MoveTool::MoveTool(FormEditorView *editorView) m_selectionIndicator.setCursor(Qt::SizeAllCursor); } -MoveTool::~MoveTool() -{ - -} +MoveTool::~MoveTool() = default; void MoveTool::clear() { @@ -316,7 +313,7 @@ bool MoveTool::isAncestorOfAllItems(FormEditorItem* maybeAncestorItem, FormEditorItem* MoveTool::ancestorIfOtherItemsAreChild(const QList<FormEditorItem*> &itemList) { if (itemList.isEmpty()) - return 0; + return nullptr; foreach (FormEditorItem* item, itemList) @@ -325,7 +322,7 @@ FormEditorItem* MoveTool::ancestorIfOtherItemsAreChild(const QList<FormEditorIte return item; } - return 0; + return nullptr; } void MoveTool::updateMoveManipulator() @@ -369,13 +366,13 @@ QList<FormEditorItem*> MoveTool::movingItems(const QList<FormEditorItem*> &selec FormEditorItem* ancestorItem = ancestorIfOtherItemsAreChild(filteredItemList); - if (ancestorItem != 0 && ancestorItem->qmlItemNode().isRootNode()) { + if (ancestorItem != nullptr && ancestorItem->qmlItemNode().isRootNode()) { // view()->changeToSelectionTool(); return QList<FormEditorItem*>(); } - if (ancestorItem != 0 && ancestorItem->parentItem() != 0) { + if (ancestorItem != nullptr && ancestorItem->parentItem() != nullptr) { QList<FormEditorItem*> ancestorItemList; ancestorItemList.append(ancestorItem); return ancestorItemList; diff --git a/src/plugins/qmldesigner/components/formeditor/numberseriesaction.cpp b/src/plugins/qmldesigner/components/formeditor/numberseriesaction.cpp index ae651f99f1..0ce0a995ba 100644 --- a/src/plugins/qmldesigner/components/formeditor/numberseriesaction.cpp +++ b/src/plugins/qmldesigner/components/formeditor/numberseriesaction.cpp @@ -42,7 +42,7 @@ void NumberSeriesAction::addEntry(const QString &text, const QVariant &value) if (m_comboBoxModel.isNull()) m_comboBoxModel = new QStandardItemModel(this); - QStandardItem *newItem = new QStandardItem(text); + auto newItem = new QStandardItem(text); newItem->setData(value); m_comboBoxModel->appendRow(newItem); } @@ -54,7 +54,7 @@ QVariant NumberSeriesAction::currentValue() const QWidget *NumberSeriesAction::createWidget(QWidget *parent) { - QComboBox *comboBox = new QComboBox(parent); + auto comboBox = new QComboBox(parent); comboBox->setModel(m_comboBoxModel.data()); diff --git a/src/plugins/qmldesigner/components/formeditor/resizecontroller.cpp b/src/plugins/qmldesigner/components/formeditor/resizecontroller.cpp index 63930defed..e7f9d0b6c4 100644 --- a/src/plugins/qmldesigner/components/formeditor/resizecontroller.cpp +++ b/src/plugins/qmldesigner/components/formeditor/resizecontroller.cpp @@ -58,30 +58,19 @@ public: ResizeControllerData::ResizeControllerData(LayerItem *layerItem, FormEditorItem *formEditorItem) : layerItem(layerItem), formEditorItem(formEditorItem), - topLeftItem(0), - topRightItem(0), - bottomLeftItem(0), - bottomRightItem(0), - topItem(0), - leftItem(0), - rightItem(0), - bottomItem(0) + topLeftItem(nullptr), + topRightItem(nullptr), + bottomLeftItem(nullptr), + bottomRightItem(nullptr), + topItem(nullptr), + leftItem(nullptr), + rightItem(nullptr), + bottomItem(nullptr) { } -ResizeControllerData::ResizeControllerData(const ResizeControllerData &other) - : layerItem(other.layerItem), - formEditorItem(other.formEditorItem), - topLeftItem(other.topLeftItem), - topRightItem(other.topRightItem), - bottomLeftItem(other.bottomLeftItem), - bottomRightItem(other.bottomRightItem), - topItem(other.topItem), - leftItem(other.leftItem), - rightItem(other.rightItem), - bottomItem(other.bottomItem) -{} +ResizeControllerData::ResizeControllerData(const ResizeControllerData &other) = default; ResizeControllerData::~ResizeControllerData() { @@ -100,7 +89,7 @@ ResizeControllerData::~ResizeControllerData() ResizeController::ResizeController() - : m_data(new ResizeControllerData(0, 0)) + : m_data(new ResizeControllerData(nullptr, nullptr)) { } @@ -149,20 +138,14 @@ ResizeController::ResizeController(LayerItem *layerItem, FormEditorItem *formEdi updatePosition(); } -ResizeController::ResizeController(const ResizeController &other) - : m_data(other.m_data) -{ - -} +ResizeController::ResizeController(const ResizeController &other) = default; ResizeController::ResizeController(const WeakResizeController &resizeController) : m_data(resizeController.m_data.toStrongRef()) { } -ResizeController::~ResizeController() -{ -} +ResizeController::~ResizeController() = default; ResizeController &ResizeController::operator =(const ResizeController &other) { @@ -203,22 +186,22 @@ void ResizeController::hide() static QPointF topCenter(const QRectF &rect) { - return QPointF(rect.center().x(), rect.top()); + return {rect.center().x(), rect.top()}; } static QPointF leftCenter(const QRectF &rect) { - return QPointF(rect.left(), rect.center().y()); + return {rect.left(), rect.center().y()}; } static QPointF rightCenter(const QRectF &rect) { - return QPointF(rect.right(), rect.center().y()); + return {rect.right(), rect.center().y()}; } static QPointF bottomCenter(const QRectF &rect) { - return QPointF(rect.center().x(), rect.bottom()); + return {rect.center().x(), rect.bottom()}; } @@ -310,24 +293,16 @@ WeakResizeController ResizeController::toWeakResizeController() const return WeakResizeController(*this); } -WeakResizeController::WeakResizeController() -{ - -} +WeakResizeController::WeakResizeController() = default; -WeakResizeController::WeakResizeController(const WeakResizeController &resizeController) - : m_data(resizeController.m_data) -{ -} +WeakResizeController::WeakResizeController(const WeakResizeController &resizeController) = default; WeakResizeController::WeakResizeController(const ResizeController &resizeController) : m_data(resizeController.m_data.toWeakRef()) { } -WeakResizeController::~WeakResizeController() -{ -} +WeakResizeController::~WeakResizeController() = default; WeakResizeController &WeakResizeController::operator =(const WeakResizeController &other) { diff --git a/src/plugins/qmldesigner/components/formeditor/resizehandleitem.cpp b/src/plugins/qmldesigner/components/formeditor/resizehandleitem.cpp index d40e4067f9..a44bbadcda 100644 --- a/src/plugins/qmldesigner/components/formeditor/resizehandleitem.cpp +++ b/src/plugins/qmldesigner/components/formeditor/resizehandleitem.cpp @@ -38,9 +38,7 @@ ResizeHandleItem::ResizeHandleItem(QGraphicsItem *parent, const ResizeController setAcceptedMouseButtons(Qt::NoButton); } -ResizeHandleItem::~ResizeHandleItem() -{ -} +ResizeHandleItem::~ResizeHandleItem() = default; void ResizeHandleItem::setHandlePosition(const QPointF & globalPosition, const QPointF & itemSpacePosition) { @@ -50,7 +48,7 @@ void ResizeHandleItem::setHandlePosition(const QPointF & globalPosition, const Q QRectF ResizeHandleItem::boundingRect() const { - return QRectF(- 5., - 5., 9., 9.); + return {- 5., - 5., 9., 9.}; } void ResizeHandleItem::paint(QPainter *painter, const QStyleOptionGraphicsItem * /* option */, QWidget * /* widget */) diff --git a/src/plugins/qmldesigner/components/formeditor/resizemanipulator.cpp b/src/plugins/qmldesigner/components/formeditor/resizemanipulator.cpp index d5f197997f..2c21e1952c 100644 --- a/src/plugins/qmldesigner/components/formeditor/resizemanipulator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/resizemanipulator.cpp @@ -42,7 +42,7 @@ ResizeManipulator::ResizeManipulator(LayerItem *layerItem, FormEditorView *view) m_beginRightMargin(0.0), m_beginBottomMargin(0.0), m_layerItem(layerItem), - m_resizeHandle(0), + m_resizeHandle(nullptr), m_isActive(false) { } @@ -65,7 +65,7 @@ void ResizeManipulator::setHandle(ResizeHandleItem *resizeHandle) void ResizeManipulator::removeHandle() { m_resizeController = ResizeController(); - m_resizeHandle = 0; + m_resizeHandle = nullptr; } void ResizeManipulator::begin(const QPointF &/*beginPoint*/) diff --git a/src/plugins/qmldesigner/components/formeditor/resizetool.cpp b/src/plugins/qmldesigner/components/formeditor/resizetool.cpp index 96b960867c..8b4e5c552a 100644 --- a/src/plugins/qmldesigner/components/formeditor/resizetool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/resizetool.cpp @@ -46,10 +46,7 @@ ResizeTool::ResizeTool(FormEditorView *editorView) { } - -ResizeTool::~ResizeTool() -{ -} +ResizeTool::~ResizeTool() = default; void ResizeTool::mousePressEvent(const QList<QGraphicsItem*> &itemList, QGraphicsSceneMouseEvent *event) diff --git a/src/plugins/qmldesigner/components/formeditor/rubberbandselectionmanipulator.cpp b/src/plugins/qmldesigner/components/formeditor/rubberbandselectionmanipulator.cpp index b2969ed810..05d13e29e7 100644 --- a/src/plugins/qmldesigner/components/formeditor/rubberbandselectionmanipulator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/rubberbandselectionmanipulator.cpp @@ -32,7 +32,7 @@ namespace QmlDesigner { RubberBandSelectionManipulator::RubberBandSelectionManipulator(LayerItem *layerItem, FormEditorView *editorView) : m_selectionRectangleElement(layerItem), m_editorView(editorView), - m_beginFormEditorItem(0), + m_beginFormEditorItem(nullptr), m_isActive(false) { m_selectionRectangleElement.hide(); diff --git a/src/plugins/qmldesigner/components/formeditor/scalemanipulator.cpp b/src/plugins/qmldesigner/components/formeditor/scalemanipulator.cpp index 7dd8077c92..4cfd9ca35b 100644 --- a/src/plugins/qmldesigner/components/formeditor/scalemanipulator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/scalemanipulator.cpp @@ -34,8 +34,6 @@ ScaleManipulator::ScaleManipulator(LayerItem *layerItem, FormEditorItem *formEdi { } -ScaleManipulator::~ScaleManipulator() -{ -} +ScaleManipulator::~ScaleManipulator() = default; } diff --git a/src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp b/src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp index d76e51977c..aea970df1b 100644 --- a/src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp @@ -30,6 +30,7 @@ #include <QPen> #include <QGraphicsScene> #include <QGraphicsTextItem> +#include <memory> #include <abstractview.h> @@ -98,7 +99,7 @@ void SelectionIndicator::setItems(const QList<FormEditorItem*> &itemList) if (!item->qmlItemNode().isValid()) continue; - QGraphicsPolygonItem *newSelectionIndicatorGraphicsItem = new QGraphicsPolygonItem(m_layerItem.data()); + auto newSelectionIndicatorGraphicsItem = new QGraphicsPolygonItem(m_layerItem.data()); m_indicatorShapeHash.insert(item, newSelectionIndicatorGraphicsItem); newSelectionIndicatorGraphicsItem->setPolygon(boundingRectInLayerItemSpaceForItem(item, m_layerItem.data())); newSelectionIndicatorGraphicsItem->setFlag(QGraphicsItem::ItemIsSelectable, false); @@ -113,7 +114,7 @@ void SelectionIndicator::setItems(const QList<FormEditorItem*> &itemList) if (checkSingleSelection(itemList)) { FormEditorItem *selectedItem = itemList.constFirst(); - m_labelItem.reset(new QGraphicsPolygonItem(m_layerItem.data())); + m_labelItem = std::make_unique<QGraphicsPolygonItem>(m_layerItem.data()); QGraphicsWidget *toolbar = DesignerActionManager::instance().createFormEditorToolBar(m_labelItem.get()); toolbar->setPos(1, -1); diff --git a/src/plugins/qmldesigner/components/formeditor/selectionrectangle.cpp b/src/plugins/qmldesigner/components/formeditor/selectionrectangle.cpp index 9aa2aaea3f..e74f43c4f7 100644 --- a/src/plugins/qmldesigner/components/formeditor/selectionrectangle.cpp +++ b/src/plugins/qmldesigner/components/formeditor/selectionrectangle.cpp @@ -64,7 +64,7 @@ void SelectionRectangle::show() void SelectionRectangle::hide() { - m_controlShape->setParentItem(0); + m_controlShape->setParentItem(nullptr); m_controlShape->hide(); } diff --git a/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp b/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp index 52bcae4ff5..c9dd841157 100644 --- a/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp @@ -54,10 +54,7 @@ SelectionTool::SelectionTool(FormEditorView *editorView) m_selectionIndicator.setCursor(Qt::ArrowCursor); } - -SelectionTool::~SelectionTool() -{ -} +SelectionTool::~SelectionTool() = default; void SelectionTool::mousePressEvent(const QList<QGraphicsItem*> &itemList, QGraphicsSceneMouseEvent *event) diff --git a/src/plugins/qmldesigner/components/formeditor/snapper.cpp b/src/plugins/qmldesigner/components/formeditor/snapper.cpp index 4cf2209774..eec5c3ab1e 100644 --- a/src/plugins/qmldesigner/components/formeditor/snapper.cpp +++ b/src/plugins/qmldesigner/components/formeditor/snapper.cpp @@ -38,8 +38,8 @@ namespace QmlDesigner { Snapper::Snapper() - : m_containerFormEditorItem(0), - m_transformtionSpaceFormEditorItem(0), + : m_containerFormEditorItem(nullptr), + m_transformtionSpaceFormEditorItem(nullptr), m_snappingDistance(5.0) { } @@ -289,7 +289,7 @@ QLineF Snapper::createSnapLine(Qt::Orientation orientation, if (orientation == Qt::Horizontal) { double lowerX(qMin(lowerLimit, double(itemRect.left()))); double upperX(qMax(upperLimit, double(itemRect.right()))); - return QLineF(lowerX, snapLine, upperX, snapLine); + return {lowerX, snapLine, upperX, snapLine}; } else { double lowerY(qMin(lowerLimit, double(itemRect.top()))); double upperY(qMax(upperLimit, double(itemRect.bottom()))); @@ -321,7 +321,7 @@ QList<QLineF> Snapper::findSnappingLines(const SnapLineMap &snappingLineMap, lowerLimit, upperLimit, snappingLineIterator.value().first); - if (boundingRects != 0) + if (boundingRects != nullptr) boundingRects->append(snappingLineIterator.value().first); } } @@ -363,7 +363,7 @@ QList<QLineF> Snapper::findSnappingOffsetLines(const SnapLineMap &snappingOffset lowerLimit, upperLimit, formEditorItemRect); - if (boundingRects != 0) + if (boundingRects != nullptr) boundingRects->append(snappingOffsetIterator.value().first); } } @@ -461,7 +461,7 @@ static QLineF mergedHorizontalLine(const QList<QLineF> &lineList) } double y(lineList.constFirst().y1()); - return QLineF(minimumX, y, maximumX, y); + return {minimumX, y, maximumX, y}; } static QLineF mergedVerticalLine(const QList<QLineF> &lineList) @@ -479,7 +479,7 @@ static QLineF mergedVerticalLine(const QList<QLineF> &lineList) } double x(lineList.constFirst().x1()); - return QLineF(x, minimumY, x, maximumY); + return {x, minimumY, x, maximumY}; } static QList<QLineF> mergedHorizontalLines(const QList<QLineF> &lineList) @@ -715,7 +715,7 @@ QList<QGraphicsItem*> Snapper::generateSnappingLines(const QList<QRectF> &boundi foreach (const QLineF &line, lineList) { QLineF lineInTransformationSpace = transform.map(line); - QGraphicsLineItem * lineItem = new QGraphicsLineItem(lineInTransformationSpace, layerItem); + auto lineItem = new QGraphicsLineItem(lineInTransformationSpace, layerItem); lineItem->setZValue(40); QPen linePen; linePen.setCosmetic(true); diff --git a/src/plugins/qmldesigner/components/formeditor/snappinglinecreator.h b/src/plugins/qmldesigner/components/formeditor/snappinglinecreator.h index fb7d43e26c..aba0a52444 100644 --- a/src/plugins/qmldesigner/components/formeditor/snappinglinecreator.h +++ b/src/plugins/qmldesigner/components/formeditor/snappinglinecreator.h @@ -31,8 +31,8 @@ namespace QmlDesigner { class FormEditorItem; -typedef QMultiMap<double, QPair<QRectF, FormEditorItem*> > SnapLineMap; -typedef QMapIterator<double, QPair<QRectF, FormEditorItem*> > SnapLineMapIterator; +using SnapLineMap = QMultiMap<double, QPair<QRectF, FormEditorItem*> >; +using SnapLineMapIterator = QMapIterator<double, QPair<QRectF, FormEditorItem*> >; class FormEditorItem; diff --git a/src/plugins/qmldesigner/components/formeditor/toolbox.cpp b/src/plugins/qmldesigner/components/formeditor/toolbox.cpp index 9b343ec7d7..3c64139748 100644 --- a/src/plugins/qmldesigner/components/formeditor/toolbox.cpp +++ b/src/plugins/qmldesigner/components/formeditor/toolbox.cpp @@ -42,11 +42,11 @@ ToolBox::ToolBox(QWidget *parentWidget) m_leftToolBar->setMovable(true); m_leftToolBar->setOrientation(Qt::Horizontal); - QHBoxLayout *horizontalLayout = new QHBoxLayout(this); + auto horizontalLayout = new QHBoxLayout(this); horizontalLayout->setMargin(0); horizontalLayout->setSpacing(0); - QToolBar *stretchToolbar = new QToolBar(this); + auto stretchToolbar = new QToolBar(this); m_leftToolBar->setProperty("panelwidget", true); m_leftToolBar->setProperty("panelwidget_singlerow", false); diff --git a/src/plugins/qmldesigner/components/importmanager/importlabel.cpp b/src/plugins/qmldesigner/components/importmanager/importlabel.cpp index d0e61d3702..cd19246009 100644 --- a/src/plugins/qmldesigner/components/importmanager/importlabel.cpp +++ b/src/plugins/qmldesigner/components/importmanager/importlabel.cpp @@ -35,7 +35,7 @@ namespace QmlDesigner { ImportLabel::ImportLabel(QWidget *parent) : QWidget(parent) { - QHBoxLayout *layout = new QHBoxLayout(this); + auto layout = new QHBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); diff --git a/src/plugins/qmldesigner/components/importmanager/importmanagerview.cpp b/src/plugins/qmldesigner/components/importmanager/importmanagerview.cpp index 94b1277a1c..6e1c6a5015 100644 --- a/src/plugins/qmldesigner/components/importmanager/importmanagerview.cpp +++ b/src/plugins/qmldesigner/components/importmanager/importmanagerview.cpp @@ -33,15 +33,12 @@ namespace QmlDesigner { ImportManagerView::ImportManagerView(QObject *parent) : AbstractView(parent), - m_importsWidget(0) + m_importsWidget(nullptr) { } -ImportManagerView::~ImportManagerView() -{ - -} +ImportManagerView::~ImportManagerView() = default; bool ImportManagerView::hasWidget() const { @@ -50,7 +47,7 @@ bool ImportManagerView::hasWidget() const WidgetInfo ImportManagerView::widgetInfo() { - if (m_importsWidget == 0) { + if (m_importsWidget == nullptr) { m_importsWidget = new ImportsWidget; connect(m_importsWidget.data(), &ImportsWidget::removeImport, this, &ImportManagerView::removeImport); connect(m_importsWidget.data(), &ImportsWidget::addImport, this, &ImportManagerView::addImport); @@ -59,7 +56,7 @@ WidgetInfo ImportManagerView::widgetInfo() m_importsWidget->setImports(model()->imports()); } - return createWidgetInfo(m_importsWidget, 0, QLatin1String("ImportManager"), WidgetInfo::LeftPane, 1); + return createWidgetInfo(m_importsWidget, nullptr, QLatin1String("ImportManager"), WidgetInfo::LeftPane, 1); } void ImportManagerView::modelAttached(Model *model) diff --git a/src/plugins/qmldesigner/components/importmanager/importswidget.cpp b/src/plugins/qmldesigner/components/importmanager/importswidget.cpp index f9fe8540a1..0d2218a42b 100644 --- a/src/plugins/qmldesigner/components/importmanager/importswidget.cpp +++ b/src/plugins/qmldesigner/components/importmanager/importswidget.cpp @@ -124,7 +124,7 @@ void ImportsWidget::setImports(const QList<Import> &imports) Utils::sort(sortedImports, importLess); foreach (const Import &import, sortedImports) { - ImportLabel *importLabel = new ImportLabel(this); + auto importLabel = new ImportLabel(this); importLabel->setImport(import); m_importLabels.append(importLabel); connect(importLabel, &ImportLabel::removeImport, this, &ImportsWidget::removeImport); @@ -138,7 +138,7 @@ void ImportsWidget::updateLayout() { delete layout(); - QVBoxLayout *layout = new QVBoxLayout(this); + auto layout = new QVBoxLayout(this); layout->setSpacing(0); layout->addWidget(m_addImportComboBox); diff --git a/src/plugins/qmldesigner/components/integration/componentaction.cpp b/src/plugins/qmldesigner/components/integration/componentaction.cpp index 59226d78d3..daedbe8d7d 100644 --- a/src/plugins/qmldesigner/components/integration/componentaction.cpp +++ b/src/plugins/qmldesigner/components/integration/componentaction.cpp @@ -48,7 +48,7 @@ void ComponentAction::setCurrentIndex(int index) QWidget *ComponentAction::createWidget(QWidget *parent) { - QComboBox *comboBox = new QComboBox(parent); + auto comboBox = new QComboBox(parent); comboBox->setMinimumWidth(120); comboBox->setToolTip(tr("Edit sub components defined in this file.")); comboBox->setModel(m_componentView->standardItemModel()); diff --git a/src/plugins/qmldesigner/components/integration/componentview.cpp b/src/plugins/qmldesigner/components/integration/componentview.cpp index e31b59d911..06aa47c7a5 100644 --- a/src/plugins/qmldesigner/components/integration/componentview.cpp +++ b/src/plugins/qmldesigner/components/integration/componentview.cpp @@ -203,7 +203,7 @@ void ComponentView::searchForComponentAndAddToList(const ModelNode &node) if (!hasEntryForNode(node)) { QString description = descriptionForNode(node); - QStandardItem *item = new QStandardItem(description); + auto item = new QStandardItem(description); item->setData(QVariant::fromValue(node.internalId()), ModelNodeRole); item->setEditable(false); removeSingleNodeFromList(node); //remove node if already present diff --git a/src/plugins/qmldesigner/components/integration/designdocument.cpp b/src/plugins/qmldesigner/components/integration/designdocument.cpp index d4fd3b0147..01ede20d09 100644 --- a/src/plugins/qmldesigner/components/integration/designdocument.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocument.cpp @@ -77,13 +77,11 @@ DesignDocument::DesignDocument(QObject *parent) : m_subComponentManager(new SubComponentManager(m_documentModel.data(), this)), m_rewriterView (new RewriterView(RewriterView::Amend, m_documentModel.data())), m_documentLoaded(false), - m_currentKit(0) + m_currentKit(nullptr) { } -DesignDocument::~DesignDocument() -{ -} +DesignDocument::~DesignDocument() = default; Model *DesignDocument::currentModel() const { @@ -590,7 +588,7 @@ QPlainTextEdit *DesignDocument::plainTextEdit() const if (editor()) return qobject_cast<QPlainTextEdit*>(editor()->widget()); - return 0; + return nullptr; } ModelNode DesignDocument::rootModelNode() const @@ -622,7 +620,7 @@ static inline Kit *getActiveKit(DesignDocument *designDocument) currentProject = ProjectExplorer::ProjectTree::currentProject(); if (!currentProject) - return 0; + return nullptr; QObject::connect(ProjectTree::instance(), &ProjectTree::currentProjectChanged, @@ -641,10 +639,10 @@ static inline Kit *getActiveKit(DesignDocument *designDocument) Target *target = currentProject->activeTarget(); if (!target) - return 0; + return nullptr; if (!target->kit() || !target->kit()->isValid()) - return 0; + return nullptr; QObject::connect(target, &Target::kitChanged, designDocument, &DesignDocument::updateActiveQtVersion, Qt::UniqueConnection); diff --git a/src/plugins/qmldesigner/components/integration/designdocumentview.cpp b/src/plugins/qmldesigner/components/integration/designdocumentview.cpp index ef4e900d0f..4b7c5772d8 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentview.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocumentview.cpp @@ -49,9 +49,7 @@ DesignDocumentView::DesignDocumentView(QObject *parent) { } -DesignDocumentView::~DesignDocumentView() -{ -} +DesignDocumentView::~DesignDocumentView() = default; ModelNode DesignDocumentView::insertModel(const ModelNode &modelNode) { @@ -81,7 +79,7 @@ void DesignDocumentView::toClipboard() const { QClipboard *clipboard = QApplication::clipboard(); - QMimeData *data = new QMimeData; + auto data = new QMimeData; data->setText(toText()); QStringList imports; @@ -121,7 +119,7 @@ QString DesignDocumentView::toText() const textEdit.setPlainText(imports + QStringLiteral("Item {\n}\n")); NotIndentingTextEditModifier modifier(&textEdit); - QScopedPointer<RewriterView> rewriterView(new RewriterView(RewriterView::Amend, 0)); + QScopedPointer<RewriterView> rewriterView(new RewriterView(RewriterView::Amend, nullptr)); rewriterView->setCheckSemanticErrors(false); rewriterView->setTextModifier(&modifier); outputModel->setRewriterView(rewriterView.data()); @@ -137,7 +135,7 @@ QString DesignDocumentView::toText() const //get the text of the root item without imports } -void DesignDocumentView::fromText(QString text) +void DesignDocumentView::fromText(const QString &text) { QScopedPointer<Model> inputModel(Model::create("QtQuick.Rectangle", 1, 0, model())); inputModel->setFileUrl(model()->fileUrl()); @@ -149,7 +147,7 @@ void DesignDocumentView::fromText(QString text) textEdit.setPlainText(imports + text); NotIndentingTextEditModifier modifier(&textEdit); - QScopedPointer<RewriterView> rewriterView(new RewriterView(RewriterView::Amend, 0)); + QScopedPointer<RewriterView> rewriterView(new RewriterView(RewriterView::Amend, nullptr)); rewriterView->setCheckSemanticErrors(false); rewriterView->setTextModifier(&modifier); inputModel->setRewriterView(rewriterView.data()); @@ -172,7 +170,7 @@ static Model *currentModel() if (document) return document->currentModel(); - return 0; + return nullptr; } Model *DesignDocumentView::pasteToModel() diff --git a/src/plugins/qmldesigner/components/integration/designdocumentview.h b/src/plugins/qmldesigner/components/integration/designdocumentview.h index 9e841c743a..7c008e222c 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentview.h +++ b/src/plugins/qmldesigner/components/integration/designdocumentview.h @@ -47,7 +47,7 @@ public: void fromClipboard(); QString toText() const; - void fromText(QString text); + void fromText(const QString &text); static Model *pasteToModel(); static void copyModelNodes(const QList<ModelNode> &nodesToCopy); diff --git a/src/plugins/qmldesigner/components/integration/utilitypanelcontroller.cpp b/src/plugins/qmldesigner/components/integration/utilitypanelcontroller.cpp index d74aeaebbb..a1921f493d 100644 --- a/src/plugins/qmldesigner/components/integration/utilitypanelcontroller.cpp +++ b/src/plugins/qmldesigner/components/integration/utilitypanelcontroller.cpp @@ -35,9 +35,7 @@ UtilityPanelController::UtilityPanelController(QObject* parent): { } -UtilityPanelController::~UtilityPanelController() -{ -} +UtilityPanelController::~UtilityPanelController() = default; QWidget* UtilityPanelController::widget() { diff --git a/src/plugins/qmldesigner/components/itemlibrary/customfilesystemmodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/customfilesystemmodel.cpp index 45ff279512..4a9147ae4e 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/customfilesystemmodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/customfilesystemmodel.cpp @@ -41,11 +41,9 @@ namespace QmlDesigner { class ItemLibraryFileIconProvider : public QFileIconProvider { public: - ItemLibraryFileIconProvider() - { - } + ItemLibraryFileIconProvider() = default; - QIcon icon( const QFileInfo & info ) const + QIcon icon( const QFileInfo & info ) const override { QIcon icon; @@ -90,7 +88,7 @@ void CustomFileSystemModel::setFilter(QDir::Filters) } -QString filterMetaIcons(const QString fileName) +QString filterMetaIcons(const QString &fileName) { QFileInfo info(fileName); diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryitem.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryitem.cpp index 827c07e8f4..d67631531c 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryitem.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryitem.cpp @@ -33,9 +33,7 @@ ItemLibraryItem::ItemLibraryItem(QObject *parent) { } -ItemLibraryItem::~ItemLibraryItem() -{ -} +ItemLibraryItem::~ItemLibraryItem() = default; QString ItemLibraryItem::itemName() const { diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp index 15dec3a6e9..ed36dd4a04 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp @@ -88,11 +88,11 @@ QVariant ItemLibraryModel::data(const QModelIndex &index, int role) const if (m_roleNames.contains(role)) { QVariant value = m_sections.at(index.row())->property(m_roleNames.value(role)); - ItemLibrarySectionModel* model = qobject_cast<ItemLibrarySectionModel *>(value.value<QObject*>()); + auto model = qobject_cast<ItemLibrarySectionModel *>(value.value<QObject*>()); if (model) return QVariant::fromValue(model); - ItemLibraryModel* model2 = qobject_cast<ItemLibraryModel *>(value.value<QObject*>()); + auto model2 = qobject_cast<ItemLibraryModel *>(value.value<QObject*>()); if (model2) return QVariant::fromValue(model2); @@ -192,13 +192,13 @@ void ItemLibraryModel::update(ItemLibraryInfo *itemLibraryInfo, Model *model) qCInfo(itemlibraryPopulate) << "Adding:" << entry.typeName() << "to:" << entry.category(); ItemLibrarySection *sectionModel = sectionByName(itemSectionName); - if (sectionModel == 0) { + if (sectionModel == nullptr) { sectionModel = new ItemLibrarySection(itemSectionName, this); m_sections.append(sectionModel); sectionModel->setSectionExpanded(sectionExapanded(itemSectionName)); } - ItemLibraryItem *item = new ItemLibraryItem(sectionModel); + auto item = new ItemLibraryItem(sectionModel); item->setItemLibraryEntry(entry); sectionModel->addSectionEntry(item); } @@ -212,7 +212,7 @@ void ItemLibraryModel::update(ItemLibraryInfo *itemLibraryInfo, Model *model) QMimeData *ItemLibraryModel::getMimeData(const ItemLibraryEntry &itemLibraryEntry) { - QMimeData *mimeData = new QMimeData(); + auto mimeData = new QMimeData(); QByteArray data; QDataStream stream(&data, QIODevice::WriteOnly); @@ -248,7 +248,7 @@ ItemLibrarySection *ItemLibraryModel::sectionByName(const QString §ionName) return itemLibrarySection; } - return 0; + return nullptr; } void ItemLibraryModel::updateVisibility(bool *changed) diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryresourceview.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryresourceview.cpp index 2296d30851..abc70621c9 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryresourceview.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryresourceview.cpp @@ -46,7 +46,7 @@ namespace QmlDesigner { void ItemLibraryResourceView::addSizeAction(QActionGroup *group, const QString &text, int gridSize, int iconSize) { - QAction *action = new QAction(text, group); + auto action = new QAction(text, group); group->addAction(action); action->setCheckable(true); QAction::connect(action, &QAction::triggered, this, [this, gridSize, iconSize]() { @@ -80,7 +80,7 @@ ItemLibraryResourceView::ItemLibraryResourceView(QWidget *parent) : setContextMenuPolicy(Qt::ActionsContextMenu); - QActionGroup *actionGroup = new QActionGroup(this); + auto actionGroup = new QActionGroup(this); actionGroup->setExclusive(true); addSizeAction(actionGroup, tr("Large Icons"), 256, 192); @@ -113,14 +113,14 @@ void ItemLibraryResourceView::startDrag(Qt::DropActions /* supportedActions */) if (!mimeData) return; - CustomFileSystemModel *fileSystemModel = qobject_cast<CustomFileSystemModel*>(model()); + auto fileSystemModel = qobject_cast<CustomFileSystemModel*>(model()); Q_ASSERT(fileSystemModel); QFileInfo fileInfo = fileSystemModel->fileInfo(selectedIndexes().front()); QPixmap pixmap(fileInfo.absoluteFilePath()); if (!pixmap.isNull()) { - QDrag *drag = new QDrag(this); + auto drag = new QDrag(this); drag->setPixmap(QIcon(pixmap).pixmap(128, 128)); - QMimeData *mimeData = new QMimeData; + auto mimeData = new QMimeData; mimeData->setData(QLatin1String("application/vnd.bauhaus.libraryresource"), fileInfo.absoluteFilePath().toUtf8()); drag->setMimeData(mimeData); drag->exec(); diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.cpp index 1ed8d16e1e..c18a486fda 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarysectionmodel.cpp @@ -57,7 +57,7 @@ QVariant ItemLibrarySectionModel::data(const QModelIndex &index, int role) const if (m_roleNames.contains(role)) { QVariant value = m_itemList.at(index.row())->property(m_roleNames.value(role)); - if (ItemLibrarySectionModel* model = qobject_cast<ItemLibrarySectionModel *>(value.value<QObject*>())) + if (auto model = qobject_cast<ItemLibrarySectionModel *>(value.value<QObject*>())) return QVariant::fromValue(model); return m_itemList.at(index.row())->property(m_roleNames.value(role)); diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp index 02b76df176..34955acd87 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp @@ -39,10 +39,7 @@ ItemLibraryView::ItemLibraryView(QObject* parent) } -ItemLibraryView::~ItemLibraryView() -{ - -} +ItemLibraryView::~ItemLibraryView() = default; bool ItemLibraryView::hasWidget() const { @@ -79,7 +76,7 @@ void ItemLibraryView::modelAboutToBeDetached(Model *model) AbstractView::modelAboutToBeDetached(model); - m_widget->setModel(0); + m_widget->setModel(nullptr); } void ItemLibraryView::importsChanged(const QList<Import> &/*addedImports*/, const QList<Import> &/*removedImports*/) diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp index 5414554186..889aaa6a36 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp @@ -111,7 +111,7 @@ ItemLibraryWidget::ItemLibraryWidget(QWidget *parent) : Theme::setupTheme(m_itemViewQuickWidget->engine()); /* other widgets */ - QTabBar *tabBar = new QTabBar(this); + auto tabBar = new QTabBar(this); tabBar->addTab(tr("QML Types", "Title of library QML types view")); tabBar->addTab(tr("Resources", "Title of library resources view")); tabBar->addTab(tr("Imports", "Title of library imports view")); @@ -128,7 +128,7 @@ ItemLibraryWidget::ItemLibraryWidget(QWidget *parent) : m_filterLineEdit->setFiltering(true); QWidget *lineEditFrame = new QWidget(this); lineEditFrame->setObjectName(QStringLiteral("itemLibrarySearchInputFrame")); - QGridLayout *lineEditLayout = new QGridLayout(lineEditFrame); + auto lineEditLayout = new QGridLayout(lineEditFrame); lineEditLayout->setMargin(2); lineEditLayout->setSpacing(0); lineEditLayout->addItem(new QSpacerItem(5, 3, QSizePolicy::Fixed, QSizePolicy::Fixed), 0, 0, 1, 3); @@ -145,7 +145,7 @@ ItemLibraryWidget::ItemLibraryWidget(QWidget *parent) : spacer->setObjectName(QStringLiteral("itemLibrarySearchInputSpacer")); spacer->setFixedHeight(4); - QGridLayout *layout = new QGridLayout(this); + auto layout = new QGridLayout(this); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); layout->addWidget(tabBar, 0, 0, 1, 1); @@ -166,7 +166,7 @@ ItemLibraryWidget::ItemLibraryWidget(QWidget *parent) : connect(&m_compressionTimer, &QTimer::timeout, this, &ItemLibraryWidget::updateModel); - auto *flowLayout = new Utils::FlowLayout(m_importTagsWidget.data()); + auto flowLayout = new Utils::FlowLayout(m_importTagsWidget.data()); flowLayout->setMargin(4); m_addResourcesWidget->setVisible(false); @@ -291,7 +291,7 @@ void ItemLibraryWidget::setupImportTagWidget() qDeleteAll(m_importTagsWidget->findChildren<QWidget*>("", Qt::FindDirectChildrenOnly)); - auto *flowLayout = m_importTagsWidget->layout(); + auto flowLayout = m_importTagsWidget->layout(); auto createButton = [this](const QString &import) { auto button = new QToolButton(m_importTagsWidget.data()); @@ -342,7 +342,7 @@ void ItemLibraryWidget::startDragAndDrop(QQuickItem *mouseArea, QVariant itemLib m_currentitemLibraryEntry = itemLibraryId.value<ItemLibraryEntry>(); QMimeData *mimeData = m_itemLibraryModel->getMimeData(m_currentitemLibraryEntry); - QDrag *drag = new QDrag(this); + auto drag = new QDrag(this); drag->setPixmap(Utils::StyleHelper::dpiSpecificImageFile( m_currentitemLibraryEntry.libraryEntryIconPath())); diff --git a/src/plugins/qmldesigner/components/navigator/iconcheckboxitemdelegate.cpp b/src/plugins/qmldesigner/components/navigator/iconcheckboxitemdelegate.cpp index a6e5314343..0371d0f1bb 100644 --- a/src/plugins/qmldesigner/components/navigator/iconcheckboxitemdelegate.cpp +++ b/src/plugins/qmldesigner/components/navigator/iconcheckboxitemdelegate.cpp @@ -55,7 +55,7 @@ IconCheckboxItemDelegate::IconCheckboxItemDelegate(QObject *parent, QSize IconCheckboxItemDelegate::sizeHint(const QStyleOptionViewItem & /*option*/, const QModelIndex & /*modelIndex*/) const { - return QSize(15, 20); + return {15, 20}; } static bool isChecked(const QModelIndex &modelIndex) diff --git a/src/plugins/qmldesigner/components/navigator/nameitemdelegate.cpp b/src/plugins/qmldesigner/components/navigator/nameitemdelegate.cpp index 14a0109d85..089a540b8f 100644 --- a/src/plugins/qmldesigner/components/navigator/nameitemdelegate.cpp +++ b/src/plugins/qmldesigner/components/navigator/nameitemdelegate.cpp @@ -205,7 +205,7 @@ static void openContextMenu(const QModelIndex &index, const QPoint &pos) bool NameItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *, const QStyleOptionViewItem &, const QModelIndex &index) { if (event->type() == QEvent::MouseButtonRelease) { - QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event); + auto mouseEvent = static_cast<QMouseEvent *>(event); if (mouseEvent->button() == Qt::RightButton) { openContextMenu(index, mouseEvent->globalPos()); mouseEvent->accept(); @@ -220,7 +220,7 @@ QWidget *NameItemDelegate::createEditor(QWidget *parent, const QModelIndex &index) const { if (!getModelNode(index).isValid()) - return 0; + return nullptr; return new QLineEdit(parent); } @@ -230,7 +230,7 @@ void NameItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const ModelNode node = getModelNode(index); const QString value = node.id(); - QLineEdit *lineEdit = static_cast<QLineEdit*>(editor); + auto lineEdit = static_cast<QLineEdit*>(editor); lineEdit->setText(value); } @@ -259,7 +259,7 @@ static void setId(const QModelIndex &index, const QString &newId) void NameItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { Q_UNUSED(model); - QLineEdit *lineEdit = static_cast<QLineEdit*>(editor); + auto lineEdit = static_cast<QLineEdit*>(editor); setId(index,lineEdit->text()); lineEdit->clearFocus(); } @@ -268,7 +268,7 @@ void NameItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex & /*index*/) const { - QLineEdit *lineEdit = static_cast<QLineEdit*>(editor); + auto lineEdit = static_cast<QLineEdit*>(editor); lineEdit->setGeometry(option.rect); } diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index 14776d40d6..38be04f5dc 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -176,9 +176,7 @@ NavigatorTreeModel::NavigatorTreeModel(QObject *parent) : QAbstractItemModel(par { } -NavigatorTreeModel::~NavigatorTreeModel() -{ -} +NavigatorTreeModel::~NavigatorTreeModel() = default; QVariant NavigatorTreeModel::data(const QModelIndex &index, int role) const { @@ -262,7 +260,7 @@ QModelIndex NavigatorTreeModel::index(int row, int column, const QModelIndex &parent) const { if (!m_view->model()) - return QModelIndex(); + return {}; if (!hasIndex(row, column, parent)) return QModelIndex(); @@ -290,7 +288,7 @@ QVariant NavigatorTreeModel::headerData(int, Qt::Orientation, int) const QModelIndex NavigatorTreeModel::parent(const QModelIndex &index) const { if (!index.isValid()) - return QModelIndex(); + return {}; const ModelNode modelNode = modelNodeForIndex(index); @@ -373,7 +371,7 @@ QStringList NavigatorTreeModel::mimeTypes() const QMimeData *NavigatorTreeModel::mimeData(const QModelIndexList &modelIndexList) const { - QMimeData *mimeData = new QMimeData(); + auto mimeData = new QMimeData(); QByteArray encodedModelNodeData; QDataStream encodedModelNodeDataStream(&encodedModelNodeData, QIODevice::WriteOnly); diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp index 0e36908964..6b617eaaf5 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp @@ -60,7 +60,7 @@ public: baseStyle()->setParent(parent); } - void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = 0) const + void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = nullptr) const override { static QRect mouseOverStateSavedFrameRectangle; if (element == QStyle::PE_PanelItemViewRow) { @@ -98,7 +98,7 @@ public: } } - int styleHint(StyleHint hint, const QStyleOption *option = 0, const QWidget *widget = 0, QStyleHintReturn *returnData = 0) const { + int styleHint(StyleHint hint, const QStyleOption *option = nullptr, const QWidget *widget = nullptr, QStyleHintReturn *returnData = nullptr) const override { if (hint == SH_ItemView_ShowDecorationSelected) return 0; else diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp index e94135d0e8..c8fc4e5b54 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp @@ -75,7 +75,7 @@ NavigatorView::NavigatorView(QObject* parent) : m_treeModel(new NavigatorTreeModel(this)) { #ifndef QMLDESIGNER_TEST - Internal::NavigatorContext *navigatorContext = new Internal::NavigatorContext(m_widget.data()); + auto navigatorContext = new Internal::NavigatorContext(m_widget.data()); Core::ICore::addContextObject(navigatorContext); #endif @@ -92,7 +92,7 @@ NavigatorView::NavigatorView(QObject* parent) : connect(m_widget.data(), &NavigatorWidget::filterToggled, this, &NavigatorView::filterToggled); #ifndef QMLDESIGNER_TEST - NameItemDelegate *idDelegate = new NameItemDelegate(this); + auto idDelegate = new NameItemDelegate(this); IconCheckboxItemDelegate *showDelegate = new IconCheckboxItemDelegate(this, Utils::Icons::EYE_OPEN_TOOLBAR.icon(), @@ -479,7 +479,7 @@ QTreeView *NavigatorView::treeWidget() const { if (m_widget) return m_widget->treeView(); - return 0; + return nullptr; } NavigatorTreeModel *NavigatorView::treeModel() diff --git a/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp b/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp index 43f13c2bf3..17f8650950 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp @@ -45,10 +45,9 @@ namespace QmlDesigner { -NavigatorWidget::NavigatorWidget(NavigatorView *view) : - QFrame(), - m_treeView(new NavigatorTreeView), - m_navigatorView(view) +NavigatorWidget::NavigatorWidget(NavigatorView *view) + : m_treeView(new NavigatorTreeView), + m_navigatorView(view) { m_treeView->setDragEnabled(true); m_treeView->setAcceptDrops(true); diff --git a/src/plugins/qmldesigner/components/propertyeditor/fileresourcesmodel.cpp b/src/plugins/qmldesigner/components/propertyeditor/fileresourcesmodel.cpp index 6201fec182..5d7b1aeaaf 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/fileresourcesmodel.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/fileresourcesmodel.cpp @@ -43,9 +43,9 @@ FileResourcesModel::FileResourcesModel(QObject *parent) : void FileResourcesModel::setModelNodeBackend(const QVariant &modelNodeBackend) { - QObject* modelNodeBackendObject = modelNodeBackend.value<QObject*>(); + auto modelNodeBackendObject = modelNodeBackend.value<QObject*>(); - const QmlDesigner::QmlModelNodeProxy *backendObjectCasted = + const auto backendObjectCasted = qobject_cast<const QmlDesigner::QmlModelNodeProxy *>(modelNodeBackendObject); if (backendObjectCasted) diff --git a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp index c1aff9dabd..aa7cfe1bb0 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp @@ -213,7 +213,7 @@ QColor GradientModel::getColor(int index) const return stop.modelValue("color").value<QColor>(); } qWarning() << Q_FUNC_INFO << "invalid color index"; - return QColor(); + return {}; } qreal GradientModel::getPosition(int index) const @@ -291,9 +291,9 @@ void GradientModel::setupModel() void GradientModel::setAnchorBackend(const QVariant &anchorBackend) { - QObject* anchorBackendObject = anchorBackend.value<QObject*>(); + auto anchorBackendObject = anchorBackend.value<QObject*>(); - const QmlDesigner::Internal::QmlAnchorBindingProxy *backendCasted = + const auto backendCasted = qobject_cast<const QmlDesigner::Internal::QmlAnchorBindingProxy *>(anchorBackendObject); if (backendCasted) @@ -330,7 +330,7 @@ bool GradientModel::locked() const if (m_locked) return true; - QmlDesigner::PropertyEditorView *view = qobject_cast<QmlDesigner::PropertyEditorView*>(m_itemNode.view()); + auto view = qobject_cast<QmlDesigner::PropertyEditorView*>(m_itemNode.view()); if (view && view->locked()) return true; diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp index 67183e1555..dc8243e1c8 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp @@ -71,7 +71,7 @@ QColor convertColorFromString(const QString &s) uchar r = fromHex(s, 3); uchar g = fromHex(s, 5); uchar b = fromHex(s, 7); - return QColor(r, g, b, a); + return {r, g, b, a}; } else { QColor rv(s); return rv; @@ -84,9 +84,9 @@ PropertyEditorContextObject::PropertyEditorContextObject(QObject *parent) : QObject(parent), m_isBaseState(false), m_selectionChanged(false), - m_backendValues(0), - m_qmlComponent(0), - m_qmlContext(0) + m_backendValues(nullptr), + m_qmlComponent(nullptr), + m_qmlContext(nullptr) { } @@ -342,7 +342,7 @@ void PropertyEditorContextObject::setSpecificQmlData(const QString &newSpecificQ m_specificQmlData = newSpecificQmlData; delete m_qmlComponent; - m_qmlComponent = 0; + m_qmlComponent = nullptr; emit specificQmlComponentChanged(); emit specificQmlDataChanged(); diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp index 16c2e5f1b2..86b3ac9165 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp @@ -86,7 +86,7 @@ static QObject *variantToQObject(const QVariant &value) if (value.userType() == QMetaType::QObjectStar || value.userType() > QMetaType::User) return *(QObject **)value.constData(); - return 0; + return nullptr; } namespace QmlDesigner { @@ -109,15 +109,13 @@ PropertyEditorQmlBackend::PropertyEditorQmlBackend(PropertyEditorView *propertyE propertyEditor, &PropertyEditorView::changeValue); } -PropertyEditorQmlBackend::~PropertyEditorQmlBackend() -{ -} +PropertyEditorQmlBackend::~PropertyEditorQmlBackend() = default; void PropertyEditorQmlBackend::setupPropertyEditorValue(const PropertyName &name, PropertyEditorView *propertyEditor, const QString &type) { QmlDesigner::PropertyName propertyName(name); propertyName.replace('.', '_'); - PropertyEditorValue *valueObject = qobject_cast<PropertyEditorValue*>(variantToQObject(backendValuesPropertyMap().value(QString::fromUtf8(propertyName)))); + auto valueObject = qobject_cast<PropertyEditorValue*>(variantToQObject(backendValuesPropertyMap().value(QString::fromUtf8(propertyName)))); if (!valueObject) { valueObject = new PropertyEditorValue(&backendValuesPropertyMap()); QObject::connect(valueObject, &PropertyEditorValue::valueChanged, &backendValuesPropertyMap(), &DesignerPropertyMap::valueChanged); @@ -186,7 +184,7 @@ void PropertyEditorQmlBackend::createPropertyEditorValue(const QmlObjectNode &qm { PropertyName propertyName(name); propertyName.replace('.', '_'); - PropertyEditorValue *valueObject = qobject_cast<PropertyEditorValue*>(variantToQObject(backendValuesPropertyMap().value(QString::fromUtf8(propertyName)))); + auto valueObject = qobject_cast<PropertyEditorValue*>(variantToQObject(backendValuesPropertyMap().value(QString::fromUtf8(propertyName)))); if (!valueObject) { valueObject = new PropertyEditorValue(&backendValuesPropertyMap()); QObject::connect(valueObject, &PropertyEditorValue::valueChanged, &backendValuesPropertyMap(), &DesignerPropertyMap::valueChanged); @@ -220,7 +218,7 @@ void PropertyEditorQmlBackend::setValue(const QmlObjectNode & qmlObjectNode, con { PropertyName propertyName = name; propertyName.replace('.', '_'); - PropertyEditorValue *propertyValue = qobject_cast<PropertyEditorValue*>(variantToQObject(m_backendValuesPropertyMap.value(QString::fromUtf8(propertyName)))); + auto propertyValue = qobject_cast<PropertyEditorValue*>(variantToQObject(m_backendValuesPropertyMap.value(QString::fromUtf8(propertyName)))); if (propertyValue) { propertyValue->setValue(value); @@ -285,7 +283,7 @@ void PropertyEditorQmlBackend::setup(const QmlObjectNode &qmlObjectNode, const Q setupLayoutAttachedProperties(qmlObjectNode, propertyEditor); // className - PropertyEditorValue *valueObject = qobject_cast<PropertyEditorValue*>(variantToQObject(m_backendValuesPropertyMap.value(QLatin1String("className")))); + auto valueObject = qobject_cast<PropertyEditorValue*>(variantToQObject(m_backendValuesPropertyMap.value(QLatin1String("className")))); if (!valueObject) valueObject = new PropertyEditorValue(&m_backendValuesPropertyMap); valueObject->setName("className"); @@ -366,7 +364,7 @@ void PropertyEditorQmlBackend::initialSetup(const TypeName &typeName, const QUrl foreach (const PropertyName &propertyName, metaInfo.propertyNames()) setupPropertyEditorValue(propertyName, propertyEditor, QString::fromUtf8(metaInfo.propertyTypeName(propertyName))); - PropertyEditorValue *valueObject = qobject_cast<PropertyEditorValue*>(variantToQObject(m_backendValuesPropertyMap.value(QLatin1String("className")))); + auto valueObject = qobject_cast<PropertyEditorValue*>(variantToQObject(m_backendValuesPropertyMap.value(QLatin1String("className")))); if (!valueObject) valueObject = new PropertyEditorValue(&m_backendValuesPropertyMap); valueObject->setName("className"); @@ -403,8 +401,8 @@ QString PropertyEditorQmlBackend::propertyEditorResourcesPath() { return Core::ICore::resourcePath() + QStringLiteral("/qmldesigner/propertyEditorQmlSources"); } -QString PropertyEditorQmlBackend::templateGeneration(NodeMetaInfo type, - NodeMetaInfo superType, +QString PropertyEditorQmlBackend::templateGeneration(const NodeMetaInfo &type, + const NodeMetaInfo &superType, const QmlObjectNode &objectNode) { if (!templateConfiguration() || !templateConfiguration()->isValid()) diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.h b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.h index a272b35aef..a0012a1cc1 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.h +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.h @@ -68,7 +68,7 @@ public: PropertyEditorValue *propertyValueForName(const QString &propertyName); static QString propertyEditorResourcesPath(); - static QString templateGeneration(NodeMetaInfo type, NodeMetaInfo superType, + static QString templateGeneration(const NodeMetaInfo &type, const NodeMetaInfo &superType, const QmlObjectNode &objectNode); static QUrl getQmlFileUrl(const TypeName &relativeTypeName, const NodeMetaInfo &info = NodeMetaInfo()); diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp index f4cc31f56e..df58f309ec 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp @@ -358,7 +358,7 @@ PropertyEditorNodeWrapper::PropertyEditorNodeWrapper(PropertyEditorValue* parent connect(m_editorValue, &PropertyEditorValue::modelNodeChanged, this, &PropertyEditorNodeWrapper::update); } -PropertyEditorNodeWrapper::PropertyEditorNodeWrapper(QObject *parent) : QObject(parent), m_editorValue(NULL) +PropertyEditorNodeWrapper::PropertyEditorNodeWrapper(QObject *parent) : QObject(parent), m_editorValue(nullptr) { } @@ -441,7 +441,7 @@ void PropertyEditorNodeWrapper::changeValue(const QString &propertyName) if (m_modelNode.isValid()) { QmlDesigner::QmlObjectNode qmlObjectNode(m_modelNode); - PropertyEditorValue *valueObject = qvariant_cast<PropertyEditorValue *>(m_valuesPropertyMap.value(QString::fromLatin1(name))); + auto valueObject = qvariant_cast<PropertyEditorValue *>(m_valuesPropertyMap.value(QString::fromLatin1(name))); if (valueObject->value().isValid()) qmlObjectNode.setVariantProperty(name, valueObject->value()); @@ -463,7 +463,7 @@ void PropertyEditorNodeWrapper::setup() foreach (const QmlDesigner::PropertyName &propertyName, m_modelNode.metaInfo().propertyNames()) { if (qmlObjectNode.isValid()) { - PropertyEditorValue *valueObject = new PropertyEditorValue(&m_valuesPropertyMap); + auto valueObject = new PropertyEditorValue(&m_valuesPropertyMap); valueObject->setName(propertyName); valueObject->setValue(qmlObjectNode.instanceValue(propertyName)); connect(valueObject, &PropertyEditorValue::valueChanged, &m_valuesPropertyMap, &QQmlPropertyMap::valueChanged); diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp index dc88f342b7..e046eceb64 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp @@ -70,10 +70,10 @@ static bool propertyIsAttachedLayoutProperty(const PropertyName &propertyName) PropertyEditorView::PropertyEditorView(QWidget *parent) : AbstractView(parent), m_parent(parent), - m_updateShortcut(0), + m_updateShortcut(nullptr), m_timerId(0), m_stackedWidget(new PropertyEditorWidget(parent)), - m_qmlBackEndForCurrentType(0), + m_qmlBackEndForCurrentType(nullptr), m_locked(false), m_setupCompleted(false), m_singleShotTimer(new QTimer(this)) @@ -152,13 +152,13 @@ void PropertyEditorView::changeValue(const QString &name) if (newId == m_selectedNode.id()) return; - if (m_selectedNode.isValidId(newId) && !hasId(newId)) { + if (QmlDesigner::ModelNode::isValidId(newId) && !hasId(newId)) { m_selectedNode.setIdWithRefactoring(newId); } else { m_locked = true; value->setValue(m_selectedNode.id()); m_locked = false; - if (!m_selectedNode.isValidId(newId)) + if (!QmlDesigner::ModelNode::isValidId(newId)) Core::AsynchronousMessageBox::warning(tr("Invalid Id"), tr("%1 is an invalid id.").arg(newId)); else Core::AsynchronousMessageBox::warning(tr("Invalid Id"), tr("%1 already exists.").arg(newId)); @@ -170,7 +170,7 @@ void PropertyEditorView::changeValue(const QString &name) underscoreName.replace('.', '_'); PropertyEditorValue *value = m_qmlBackEndForCurrentType->propertyValueForName(QString::fromLatin1(underscoreName)); - if (value ==0) + if (value ==nullptr) return; QmlObjectNode qmlObjectNode(m_selectedNode); @@ -381,7 +381,7 @@ void PropertyEditorView::updateSize() { if (!m_qmlBackEndForCurrentType) return; - QWidget* frame = m_qmlBackEndForCurrentType->widget()->findChild<QWidget*>("propertyEditorFrame"); + auto frame = m_qmlBackEndForCurrentType->widget()->findChild<QWidget*>("propertyEditorFrame"); if (frame) frame->resize(m_stackedWidget->size()); } @@ -412,7 +412,7 @@ void PropertyEditorView::timerEvent(QTimerEvent *timerEvent) void PropertyEditorView::resetView() { - if (model() == 0) + if (model() == nullptr) return; m_locked = true; @@ -688,7 +688,7 @@ bool PropertyEditorView::hasWidget() const WidgetInfo PropertyEditorView::widgetInfo() { - return createWidgetInfo(m_stackedWidget, 0, QStringLiteral("Properties"), WidgetInfo::RightPane, 0); + return createWidgetInfo(m_stackedWidget, nullptr, QStringLiteral("Properties"), WidgetInfo::RightPane, 0); } void PropertyEditorView::currentStateChanged(const ModelNode &node) @@ -706,7 +706,7 @@ void PropertyEditorView::instancePropertyChanged(const QList<QPair<ModelNode, Pr return; m_locked = true; - typedef QPair<ModelNode, PropertyName> ModelNodePropertyPair; + using ModelNodePropertyPair = QPair<ModelNode, PropertyName>; foreach (const ModelNodePropertyPair &propertyPair, propertyList) { const ModelNode modelNode = propertyPair.first; const QmlObjectNode qmlObjectNode(modelNode); @@ -762,7 +762,7 @@ void PropertyEditorView::reloadQml() m_stackedWidget->removeWidget(widget); delete widget; } - m_qmlBackEndForCurrentType = 0; + m_qmlBackEndForCurrentType = nullptr; delayedResetView(); } diff --git a/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp b/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp index 31b16e2e2d..afc7c49715 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp @@ -39,7 +39,7 @@ class NodeState; const PropertyName auxDataString("anchors_"); -static inline void backupPropertyAndRemove(ModelNode node, const PropertyName &propertyName) +static inline void backupPropertyAndRemove(const ModelNode &node, const PropertyName &propertyName) { if (node.hasVariantProperty(propertyName)) { node.setAuxiliaryData(auxDataString + propertyName, node.variantProperty(propertyName).value()); @@ -70,9 +70,7 @@ QmlAnchorBindingProxy::QmlAnchorBindingProxy(QObject *parent) : { } -QmlAnchorBindingProxy::~QmlAnchorBindingProxy() -{ -} +QmlAnchorBindingProxy::~QmlAnchorBindingProxy() = default; void QmlAnchorBindingProxy::setup(const QmlItemNode &fxItemNode) { diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.cpp index 45999b0fe0..07e758b35a 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.cpp @@ -60,7 +60,7 @@ int StatesEditorModel::count() const QModelIndex StatesEditorModel::index(int row, int column, const QModelIndex &parent) const { if (m_statesEditorView.isNull()) - return QModelIndex(); + return {}; int internalNodeId = 0; diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp index 995372bcbe..3e2bc91e7d 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp @@ -30,7 +30,7 @@ #include <QDebug> #include <QRegExp> -#include <math.h> +#include <cmath> #include <nodemetainfo.h> @@ -67,7 +67,7 @@ WidgetInfo StatesEditorView::widgetInfo() if (!m_statesEditorWidget) m_statesEditorWidget = new StatesEditorWidget(this, m_statesEditorModel.data()); - return createWidgetInfo(m_statesEditorWidget.data(), 0, QLatin1String("StatesEditor"), WidgetInfo::BottomPane, 0, tr("States")); + return createWidgetInfo(m_statesEditorWidget.data(), nullptr, QLatin1String("StatesEditor"), WidgetInfo::BottomPane, 0, tr("States")); } void StatesEditorView::rootNodeTypeChanged(const QString &/*type*/, int /*majorVersion*/, int /*minorVersion*/) diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp index 83d22c307d..956b0d32a6 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.cpp @@ -85,10 +85,9 @@ void StatesEditorWidget::showAddNewStatesButton(bool showAddNewStatesButton) } StatesEditorWidget::StatesEditorWidget(StatesEditorView *statesEditorView, StatesEditorModel *statesEditorModel) - : QQuickWidget(), - m_statesEditorView(statesEditorView), - m_imageProvider(0), - m_qmlSourceUpdateShortcut(0) + : m_statesEditorView(statesEditorView), + m_imageProvider(nullptr), + m_qmlSourceUpdateShortcut(nullptr) { m_imageProvider = new Internal::StatesEditorImageProvider; m_imageProvider->setNodeInstanceView(statesEditorView->nodeInstanceView()); @@ -115,9 +114,7 @@ StatesEditorWidget::StatesEditorWidget(StatesEditorView *statesEditorView, State reloadQmlSource(); } -StatesEditorWidget::~StatesEditorWidget() -{ -} +StatesEditorWidget::~StatesEditorWidget() = default; QString StatesEditorWidget::qmlSourcesPath() { return Core::ICore::resourcePath() + QStringLiteral("/qmldesigner/statesEditorQmlSources"); diff --git a/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp b/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp index 85e42b7d80..462a51dbe7 100644 --- a/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp +++ b/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp @@ -99,7 +99,7 @@ void TextEditorView::modelAttached(Model *model) AbstractView::modelAttached(model); - TextEditor::BaseTextEditor* textEditor = qobject_cast<TextEditor::BaseTextEditor*>( + auto textEditor = qobject_cast<TextEditor::BaseTextEditor*>( QmlDesignerPlugin::instance()->currentDesignDocument()->textEditor()->duplicate()); Core::Context context = textEditor->context(); @@ -118,7 +118,7 @@ void TextEditorView::modelAboutToBeDetached(Model *model) { AbstractView::modelAboutToBeDetached(model); - m_widget->setTextEditor(0); + m_widget->setTextEditor(nullptr); // in case the user closed it explicit we do not want to do anything with the editor if (TextEditor::BaseTextEditor *textEditor = @@ -149,7 +149,7 @@ void TextEditorView::nodeReparented(const ModelNode &/*node*/, const NodeAbstrac WidgetInfo TextEditorView::widgetInfo() { - return createWidgetInfo(m_widget, 0, "TextEditor", WidgetInfo::CentralPane, 0, tr("Text Editor"), DesignerWidgetFlags::IgnoreErrors); + return createWidgetInfo(m_widget, nullptr, "TextEditor", WidgetInfo::CentralPane, 0, tr("Text Editor"), DesignerWidgetFlags::IgnoreErrors); } void TextEditorView::contextHelpId(const Core::IContext::HelpIdCallback &callback) const diff --git a/src/plugins/qmldesigner/components/texteditor/texteditorwidget.cpp b/src/plugins/qmldesigner/components/texteditor/texteditorwidget.cpp index 4cf464d4e7..8bf98d79c9 100644 --- a/src/plugins/qmldesigner/components/texteditor/texteditorwidget.cpp +++ b/src/plugins/qmldesigner/components/texteditor/texteditorwidget.cpp @@ -186,7 +186,7 @@ bool TextEditorWidget::eventFilter( QObject *, QEvent *event) QKeySequence(Qt::Key_Down + Qt::CTRL) }; if (event->type() == QEvent::ShortcutOverride) { - QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); + auto keyEvent = static_cast<QKeyEvent *>(event); if (std::find(overrideKeys.begin(), overrideKeys.end(), keyEvent->key()) != overrideKeys.end()) { keyEvent->accept(); @@ -199,7 +199,7 @@ bool TextEditorWidget::eventFilter( QObject *, QEvent *event) | Qt::MetaModifier; QKeySequence keySqeuence(keyEvent->key() | (keyEvent->modifiers() & relevantModifiers)); - for (QKeySequence overrideSequence : overrideSequences) + for (const QKeySequence &overrideSequence : overrideSequences) if (keySqeuence.matches(overrideSequence)) { keyEvent->accept(); return true; diff --git a/src/plugins/qmldesigner/componentsplugin/addtabdesigneraction.h b/src/plugins/qmldesigner/componentsplugin/addtabdesigneraction.h index 93eae8153f..fa57709b99 100644 --- a/src/plugins/qmldesigner/componentsplugin/addtabdesigneraction.h +++ b/src/plugins/qmldesigner/componentsplugin/addtabdesigneraction.h @@ -35,14 +35,14 @@ class AddTabDesignerAction : public QObject, public AbstractAction public: AddTabDesignerAction(); - QByteArray category() const; - QByteArray menuId() const; - int priority() const; - Type type() const; + QByteArray category() const override; + QByteArray menuId() const override; + int priority() const override; + Type type() const override; protected: - bool isVisible(const SelectionContext &selectionContext) const; - bool isEnabled(const SelectionContext &selectionContext) const; + bool isVisible(const SelectionContext &selectionContext) const override; + bool isEnabled(const SelectionContext &selectionContext) const override; private: void addNewTab(); diff --git a/src/plugins/qmldesigner/componentsplugin/addtabtotabviewdialog.h b/src/plugins/qmldesigner/componentsplugin/addtabtotabviewdialog.h index 8128985d64..c30e8fccf9 100644 --- a/src/plugins/qmldesigner/componentsplugin/addtabtotabviewdialog.h +++ b/src/plugins/qmldesigner/componentsplugin/addtabtotabviewdialog.h @@ -35,8 +35,8 @@ class AddTabToTabViewDialog : public QDialog Q_OBJECT public: - explicit AddTabToTabViewDialog(QWidget *parent = 0); - ~AddTabToTabViewDialog(); + explicit AddTabToTabViewDialog(QWidget *parent = nullptr); + ~AddTabToTabViewDialog() override; static QString create(const QString &tabName, QWidget *parent); diff --git a/src/plugins/qmldesigner/componentsplugin/componentsplugin.h b/src/plugins/qmldesigner/componentsplugin/componentsplugin.h index 30e0cc5aa1..14892065ae 100644 --- a/src/plugins/qmldesigner/componentsplugin/componentsplugin.h +++ b/src/plugins/qmldesigner/componentsplugin/componentsplugin.h @@ -40,10 +40,10 @@ class ComponentsPlugin : public QObject, QmlDesigner::IWidgetPlugin Q_INTERFACES(QmlDesigner::IWidgetPlugin) public: ComponentsPlugin(); - ~ComponentsPlugin() {} + ~ComponentsPlugin() override = default; - QString metaInfo() const; - QString pluginName() const; + QString metaInfo() const override; + QString pluginName() const override; }; diff --git a/src/plugins/qmldesigner/componentsplugin/entertabdesigneraction.cpp b/src/plugins/qmldesigner/componentsplugin/entertabdesigneraction.cpp index 956f26c453..7973bf565c 100644 --- a/src/plugins/qmldesigner/componentsplugin/entertabdesigneraction.cpp +++ b/src/plugins/qmldesigner/componentsplugin/entertabdesigneraction.cpp @@ -124,7 +124,7 @@ void EnterTabDesignerAction::createActionForTab(const ModelNode &modelNode) if (itemNode.isValid()) { QString what = tr("Step into: %1"). arg(itemNode.instanceValue("title").toString()); - EnterTabAction *selectionAction = new EnterTabAction(what); + auto selectionAction = new EnterTabAction(what); SelectionContext nodeSelectionContext = selectionContext(); nodeSelectionContext.setTargetNode(modelNode); diff --git a/src/plugins/qmldesigner/componentsplugin/tabviewindexmodel.cpp b/src/plugins/qmldesigner/componentsplugin/tabviewindexmodel.cpp index 751ec18235..ab5c831bae 100644 --- a/src/plugins/qmldesigner/componentsplugin/tabviewindexmodel.cpp +++ b/src/plugins/qmldesigner/componentsplugin/tabviewindexmodel.cpp @@ -36,7 +36,7 @@ TabViewIndexModel::TabViewIndexModel(QObject *parent) : void TabViewIndexModel::setModelNodeBackend(const QVariant &modelNodeBackend) { - QObject* modelNodeBackendObject = modelNodeBackend.value<QObject*>(); + auto modelNodeBackendObject = modelNodeBackend.value<QObject*>(); if (modelNodeBackendObject) setModelNode(modelNodeBackendObject->property("modelNode").value<QmlDesigner::ModelNode>()); diff --git a/src/plugins/qmldesigner/componentsplugin/tabviewindexmodel.h b/src/plugins/qmldesigner/componentsplugin/tabviewindexmodel.h index e10f46a085..9443f09d55 100644 --- a/src/plugins/qmldesigner/componentsplugin/tabviewindexmodel.h +++ b/src/plugins/qmldesigner/componentsplugin/tabviewindexmodel.h @@ -37,7 +37,7 @@ class TabViewIndexModel : public QObject Q_PROPERTY(QStringList tabViewIndexModel READ tabViewIndexModel NOTIFY modelNodeBackendChanged) public: - explicit TabViewIndexModel(QObject *parent = 0); + explicit TabViewIndexModel(QObject *parent = nullptr); void setModelNodeBackend(const QVariant &modelNodeBackend); void setModelNode(const QmlDesigner::ModelNode &modelNode); diff --git a/src/plugins/qmldesigner/designercore/exceptions/exception.cpp b/src/plugins/qmldesigner/designercore/exceptions/exception.cpp index e106c2fe93..b0482ddc97 100644 --- a/src/plugins/qmldesigner/designercore/exceptions/exception.cpp +++ b/src/plugins/qmldesigner/designercore/exceptions/exception.cpp @@ -126,9 +126,7 @@ if (s_shouldAssert) Q_ASSERT_X(false, _function, QString(QStringLiteral("%1:%2 - %3")).arg(m_file).arg(m_line).arg(m_function).toUtf8()); } -Exception::~Exception() -{ -} +Exception::~Exception() = default; /*! Returns the unmangled backtrace of this exception as a string. diff --git a/src/plugins/qmldesigner/designercore/filemanager/addarraymembervisitor.cpp b/src/plugins/qmldesigner/designercore/filemanager/addarraymembervisitor.cpp index 898ce22bcb..94e1cbaa0f 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/addarraymembervisitor.cpp +++ b/src/plugins/qmldesigner/designercore/filemanager/addarraymembervisitor.cpp @@ -45,10 +45,10 @@ AddArrayMemberVisitor::AddArrayMemberVisitor(TextModifier &modifier, void AddArrayMemberVisitor::findArrayBindingAndInsert(const QString &propertyName, QmlJS::AST::UiObjectMemberList *ast) { for (QmlJS::AST::UiObjectMemberList *iter = ast; iter; iter = iter->next) { - if (QmlJS::AST::UiArrayBinding *arrayBinding = QmlJS::AST::cast<QmlJS::AST::UiArrayBinding*>(iter->member)) { + if (auto arrayBinding = QmlJS::AST::cast<QmlJS::AST::UiArrayBinding*>(iter->member)) { if (toString(arrayBinding->qualifiedId) == propertyName) insertInto(arrayBinding); - } else if (QmlJS::AST::UiObjectBinding *objectBinding = QmlJS::AST::cast<QmlJS::AST::UiObjectBinding*>(iter->member)) { + } else if (auto objectBinding = QmlJS::AST::cast<QmlJS::AST::UiObjectBinding*>(iter->member)) { if (toString(objectBinding->qualifiedId) == propertyName && willConvertObjectBindingIntoArrayBinding()) convertAndAdd(objectBinding); } @@ -80,7 +80,7 @@ bool AddArrayMemberVisitor::visit(QmlJS::AST::UiObjectDefinition *ast) // FIXME: duplicate code in the QmlJS::Rewriter class, remove this void AddArrayMemberVisitor::insertInto(QmlJS::AST::UiArrayBinding *arrayBinding) { - QmlJS::AST::UiObjectMember *lastMember = 0; + QmlJS::AST::UiObjectMember *lastMember = nullptr; for (QmlJS::AST::UiArrayMemberList *iter = arrayBinding->members; iter; iter = iter->next) if (iter->member) lastMember = iter->member; diff --git a/src/plugins/qmldesigner/designercore/filemanager/addarraymembervisitor.h b/src/plugins/qmldesigner/designercore/filemanager/addarraymembervisitor.h index d414e24664..3498068fbc 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/addarraymembervisitor.h +++ b/src/plugins/qmldesigner/designercore/filemanager/addarraymembervisitor.h @@ -45,8 +45,8 @@ public: { m_convertObjectBindingIntoArrayBinding = convertObjectBindingIntoArrayBinding; } protected: - virtual bool visit(QmlJS::AST::UiObjectBinding *ast); - virtual bool visit(QmlJS::AST::UiObjectDefinition *ast); + bool visit(QmlJS::AST::UiObjectBinding *ast) override; + bool visit(QmlJS::AST::UiObjectDefinition *ast) override; private: void findArrayBindingAndInsert(const QString &propertyName, QmlJS::AST::UiObjectMemberList *ast); diff --git a/src/plugins/qmldesigner/designercore/filemanager/addobjectvisitor.h b/src/plugins/qmldesigner/designercore/filemanager/addobjectvisitor.h index 2b869cbc50..dc1dd66e36 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/addobjectvisitor.h +++ b/src/plugins/qmldesigner/designercore/filemanager/addobjectvisitor.h @@ -39,8 +39,8 @@ public: const PropertyNameList &propertyOrder); protected: - virtual bool visit(QmlJS::AST::UiObjectBinding *ast); - virtual bool visit(QmlJS::AST::UiObjectDefinition *ast); + bool visit(QmlJS::AST::UiObjectBinding *ast) override; + bool visit(QmlJS::AST::UiObjectDefinition *ast) override; private: void insertInto(QmlJS::AST::UiObjectInitializer *ast); diff --git a/src/plugins/qmldesigner/designercore/filemanager/addpropertyvisitor.cpp b/src/plugins/qmldesigner/designercore/filemanager/addpropertyvisitor.cpp index 7628c6b828..70e2f8463e 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/addpropertyvisitor.cpp +++ b/src/plugins/qmldesigner/designercore/filemanager/addpropertyvisitor.cpp @@ -83,7 +83,7 @@ void AddPropertyVisitor::addInMembers(QmlJS::AST::UiObjectInitializer *initializ QmlJS::AST::SourceLocation startOfNextMember; unsigned depth; - if (insertAfter == 0 || insertAfter->member == 0) { + if (insertAfter == nullptr || insertAfter->member == nullptr) { // insert as first member endOfPreviousMember = initializer->lbraceToken; @@ -108,7 +108,7 @@ void AddPropertyVisitor::addInMembers(QmlJS::AST::UiObjectInitializer *initializ bool needsTrailingSemicolon = false; if (isOneLiner) { - if (insertAfter == 0) { // we're inserting after an lbrace + if (insertAfter == nullptr) { // we're inserting after an lbrace if (initializer->members) { // we're inserting before a member (and not the rbrace) needsTrailingSemicolon = m_propertyType == QmlRefactoring::ScriptBinding; } diff --git a/src/plugins/qmldesigner/designercore/filemanager/addpropertyvisitor.h b/src/plugins/qmldesigner/designercore/filemanager/addpropertyvisitor.h index 9da136d82c..f6f92de125 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/addpropertyvisitor.h +++ b/src/plugins/qmldesigner/designercore/filemanager/addpropertyvisitor.h @@ -44,8 +44,8 @@ public: const TypeName &dynamicTypeName); protected: - virtual bool visit(QmlJS::AST::UiObjectDefinition *ast); - virtual bool visit(QmlJS::AST::UiObjectBinding *ast); + bool visit(QmlJS::AST::UiObjectDefinition *ast) override; + bool visit(QmlJS::AST::UiObjectBinding *ast) override; private: void addInMembers(QmlJS::AST::UiObjectInitializer *initializer); diff --git a/src/plugins/qmldesigner/designercore/filemanager/changeimportsvisitor.cpp b/src/plugins/qmldesigner/designercore/filemanager/changeimportsvisitor.cpp index f5b5a42e30..a35ff98ef4 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/changeimportsvisitor.cpp +++ b/src/plugins/qmldesigner/designercore/filemanager/changeimportsvisitor.cpp @@ -70,7 +70,7 @@ bool ChangeImportsVisitor::remove(QmlJS::AST::UiProgram *ast, const Import &impo return false; for (QmlJS::AST::UiHeaderItemList *iter = ast->headers; iter; iter = iter->next) { - QmlJS::AST::UiImport *iterImport = QmlJS::AST::cast<QmlJS::AST::UiImport *>(iter->headerItem); + auto iterImport = QmlJS::AST::cast<QmlJS::AST::UiImport *>(iter->headerItem); if (equals(iterImport, import)) { int start = iterImport->firstSourceLocation().begin(); int end = iterImport->lastSourceLocation().end(); diff --git a/src/plugins/qmldesigner/designercore/filemanager/changeobjecttypevisitor.h b/src/plugins/qmldesigner/designercore/filemanager/changeobjecttypevisitor.h index 474f83b944..9c25c35c5c 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/changeobjecttypevisitor.h +++ b/src/plugins/qmldesigner/designercore/filemanager/changeobjecttypevisitor.h @@ -38,8 +38,8 @@ public: const QString &newType); protected: - virtual bool visit(QmlJS::AST::UiObjectDefinition *ast); - virtual bool visit(QmlJS::AST::UiObjectBinding *ast); + bool visit(QmlJS::AST::UiObjectDefinition *ast) override; + bool visit(QmlJS::AST::UiObjectBinding *ast) override; private: void replaceType(QmlJS::AST::UiQualifiedId *typeId); diff --git a/src/plugins/qmldesigner/designercore/filemanager/changepropertyvisitor.cpp b/src/plugins/qmldesigner/designercore/filemanager/changepropertyvisitor.cpp index eadd48dc7f..b6ed184f9d 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/changepropertyvisitor.cpp +++ b/src/plugins/qmldesigner/designercore/filemanager/changepropertyvisitor.cpp @@ -113,7 +113,7 @@ void ChangePropertyVisitor::replaceInMembers(UiObjectInitializer *initializer, break; // for grouped properties: } else if (!prefix.isEmpty()) { - if (UiObjectDefinition *def = cast<UiObjectDefinition *>(member)) { + if (auto def = cast<UiObjectDefinition *>(member)) { if (toString(def->qualifiedTypeNameId) == prefix) replaceInMembers(def->initializer, suffix); } @@ -127,16 +127,16 @@ void ChangePropertyVisitor::replaceMemberValue(UiObjectMember *propertyMember, b QString replacement = m_value; int startOffset = -1; int endOffset = -1; - if (UiObjectBinding *objectBinding = AST::cast<UiObjectBinding *>(propertyMember)) { + if (auto objectBinding = AST::cast<UiObjectBinding *>(propertyMember)) { startOffset = objectBinding->qualifiedTypeNameId->identifierToken.offset; endOffset = objectBinding->initializer->rbraceToken.end(); - } else if (UiScriptBinding *scriptBinding = AST::cast<UiScriptBinding *>(propertyMember)) { + } else if (auto scriptBinding = AST::cast<UiScriptBinding *>(propertyMember)) { startOffset = scriptBinding->statement->firstSourceLocation().offset; endOffset = scriptBinding->statement->lastSourceLocation().end(); - } else if (UiArrayBinding *arrayBinding = AST::cast<UiArrayBinding *>(propertyMember)) { + } else if (auto arrayBinding = AST::cast<UiArrayBinding *>(propertyMember)) { startOffset = arrayBinding->lbracketToken.offset; endOffset = arrayBinding->rbracketToken.end(); - } else if (UiPublicMember *publicMember = AST::cast<UiPublicMember*>(propertyMember)) { + } else if (auto publicMember = AST::cast<UiPublicMember*>(propertyMember)) { if (publicMember->statement) { startOffset = publicMember->statement->firstSourceLocation().offset; if (publicMember->semicolonToken.isValid()) @@ -165,13 +165,13 @@ void ChangePropertyVisitor::replaceMemberValue(UiObjectMember *propertyMember, b bool ChangePropertyVisitor::isMatchingPropertyMember(const QString &propName, UiObjectMember *member) { - if (UiObjectBinding *objectBinding = AST::cast<UiObjectBinding *>(member)) + if (auto objectBinding = AST::cast<UiObjectBinding *>(member)) return propName == toString(objectBinding->qualifiedId); - else if (UiScriptBinding *scriptBinding = AST::cast<UiScriptBinding *>(member)) + else if (auto scriptBinding = AST::cast<UiScriptBinding *>(member)) return propName == toString(scriptBinding->qualifiedId); - else if (UiArrayBinding *arrayBinding = AST::cast<UiArrayBinding *>(member)) + else if (auto arrayBinding = AST::cast<UiArrayBinding *>(member)) return propName == toString(arrayBinding->qualifiedId); - else if (UiPublicMember *publicMember = AST::cast<UiPublicMember *>(member)) + else if (auto publicMember = AST::cast<UiPublicMember *>(member)) return propName == publicMember->name; else return false; @@ -192,7 +192,7 @@ void ChangePropertyVisitor::insertIntoArray(QmlJS::AST::UiArrayBinding *ast) if (!ast) return; - UiObjectMember *lastMember = 0; + UiObjectMember *lastMember = nullptr; for (UiArrayMemberList *iter = ast->members; iter; iter = iter->next) { lastMember = iter->member; } diff --git a/src/plugins/qmldesigner/designercore/filemanager/changepropertyvisitor.h b/src/plugins/qmldesigner/designercore/filemanager/changepropertyvisitor.h index f97eea0a37..d4a9c50a9a 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/changepropertyvisitor.h +++ b/src/plugins/qmldesigner/designercore/filemanager/changepropertyvisitor.h @@ -41,8 +41,8 @@ public: QmlRefactoring::PropertyType propertyType); protected: - virtual bool visit(QmlJS::AST::UiObjectDefinition *ast); - virtual bool visit(QmlJS::AST::UiObjectBinding *ast); + bool visit(QmlJS::AST::UiObjectDefinition *ast) override; + bool visit(QmlJS::AST::UiObjectBinding *ast) override; private: void replaceInMembers(QmlJS::AST::UiObjectInitializer *initializer, diff --git a/src/plugins/qmldesigner/designercore/filemanager/firstdefinitionfinder.cpp b/src/plugins/qmldesigner/designercore/filemanager/firstdefinitionfinder.cpp index dec17c5e1b..76ecb59f30 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/firstdefinitionfinder.cpp +++ b/src/plugins/qmldesigner/designercore/filemanager/firstdefinitionfinder.cpp @@ -54,7 +54,7 @@ FirstDefinitionFinder::FirstDefinitionFinder(const QString &text): qint32 FirstDefinitionFinder::operator()(quint32 offset) { m_offset = offset; - m_firstObjectDefinition = 0; + m_firstObjectDefinition = nullptr; QmlJS::AST::Node::accept(m_doc->qmlProgram(), this); @@ -70,7 +70,7 @@ void FirstDefinitionFinder::extractFirstObjectDefinition(QmlJS::AST::UiObjectIni return; for (QmlJS::AST::UiObjectMemberList *iter = ast->members; iter; iter = iter->next) { - if (QmlJS::AST::UiObjectDefinition *def = QmlJS::AST::cast<QmlJS::AST::UiObjectDefinition*>(iter->member)) + if (auto def = QmlJS::AST::cast<QmlJS::AST::UiObjectDefinition*>(iter->member)) m_firstObjectDefinition = def; } } diff --git a/src/plugins/qmldesigner/designercore/filemanager/moveobjectbeforeobjectvisitor.cpp b/src/plugins/qmldesigner/designercore/filemanager/moveobjectbeforeobjectvisitor.cpp index 0ec53a7452..3be5de5bc9 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/moveobjectbeforeobjectvisitor.cpp +++ b/src/plugins/qmldesigner/designercore/filemanager/moveobjectbeforeobjectvisitor.cpp @@ -53,8 +53,8 @@ MoveObjectBeforeObjectVisitor::MoveObjectBeforeObjectVisitor(TextModifier &modif bool MoveObjectBeforeObjectVisitor::operator ()(QmlJS::AST::UiProgram *ast) { - movingObject = 0; - beforeObject = 0; + movingObject = nullptr; + beforeObject = nullptr; movingObjectParents.clear(); QMLRewriter::operator ()(ast); @@ -102,14 +102,14 @@ void MoveObjectBeforeObjectVisitor::doMove() TextModifier::MoveInfo moveInfo; QmlJS::AST::Node *parent = movingObjectParent(); - QmlJS::AST::UiArrayMemberList *arrayMember = 0, *otherArrayMember = 0; + QmlJS::AST::UiArrayMemberList *arrayMember = nullptr, *otherArrayMember = nullptr; QString separator; if (!inDefaultProperty) { - QmlJS::AST::UiArrayBinding *initializer = QmlJS::AST::cast<QmlJS::AST::UiArrayBinding*>(parent); + auto initializer = QmlJS::AST::cast<QmlJS::AST::UiArrayBinding*>(parent); Q_ASSERT(initializer); - otherArrayMember = 0; + otherArrayMember = nullptr; for (QmlJS::AST::UiArrayMemberList *cur = initializer->members; cur; cur = cur->next) { if (cur->member == movingObject) { arrayMember = cur; @@ -166,7 +166,7 @@ QmlJS::AST::Node *MoveObjectBeforeObjectVisitor::movingObjectParent() const if (movingObjectParents.size() > 1) return movingObjectParents.at(movingObjectParents.size() - 2); else - return 0; + return nullptr; } QmlJS::AST::SourceLocation MoveObjectBeforeObjectVisitor::lastParentLocation() const @@ -174,9 +174,9 @@ QmlJS::AST::SourceLocation MoveObjectBeforeObjectVisitor::lastParentLocation() c dump(movingObjectParents); QmlJS::AST::Node *parent = movingObjectParent(); - if (QmlJS::AST::UiObjectInitializer *initializer = QmlJS::AST::cast<QmlJS::AST::UiObjectInitializer*>(parent)) + if (auto initializer = QmlJS::AST::cast<QmlJS::AST::UiObjectInitializer*>(parent)) return initializer->rbraceToken; - else if (QmlJS::AST::UiArrayBinding *initializer = QmlJS::AST::cast<QmlJS::AST::UiArrayBinding*>(parent)) + else if (auto initializer = QmlJS::AST::cast<QmlJS::AST::UiArrayBinding*>(parent)) return initializer->rbracketToken; else return QmlJS::AST::SourceLocation(); diff --git a/src/plugins/qmldesigner/designercore/filemanager/moveobjectbeforeobjectvisitor.h b/src/plugins/qmldesigner/designercore/filemanager/moveobjectbeforeobjectvisitor.h index 7b5f39d175..922d9fe40a 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/moveobjectbeforeobjectvisitor.h +++ b/src/plugins/qmldesigner/designercore/filemanager/moveobjectbeforeobjectvisitor.h @@ -43,17 +43,17 @@ public: quint32 beforeObjectLocation, bool inDefaultProperty); - bool operator ()(QmlJS::AST::UiProgram *ast); + bool operator ()(QmlJS::AST::UiProgram *ast) override; protected: - virtual bool preVisit(QmlJS::AST::Node *ast); - virtual void postVisit(QmlJS::AST::Node *ast); + bool preVisit(QmlJS::AST::Node *ast) override; + void postVisit(QmlJS::AST::Node *ast) override; - virtual bool visit(QmlJS::AST::UiObjectDefinition *ast); + bool visit(QmlJS::AST::UiObjectDefinition *ast) override; private: bool foundEverything() const - { return movingObject != 0 && !movingObjectParents.isEmpty() && (toEnd || beforeObject != 0); } + { return movingObject != nullptr && !movingObjectParents.isEmpty() && (toEnd || beforeObject != nullptr); } void doMove(); diff --git a/src/plugins/qmldesigner/designercore/filemanager/moveobjectvisitor.cpp b/src/plugins/qmldesigner/designercore/filemanager/moveobjectvisitor.cpp index b0fe35fc90..e0e820ac8f 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/moveobjectvisitor.cpp +++ b/src/plugins/qmldesigner/designercore/filemanager/moveobjectvisitor.cpp @@ -53,7 +53,7 @@ public: {} protected: - virtual bool visit(UiObjectBinding *ast) + bool visit(UiObjectBinding *ast) override { if (didRewriting()) return false; @@ -64,7 +64,7 @@ protected: return !didRewriting(); } - virtual bool visit(UiObjectDefinition *ast) + bool visit(UiObjectDefinition *ast) override { if (didRewriting()) return false; @@ -100,7 +100,7 @@ private: for (UiObjectMemberList *iter = ast->members; iter; iter = iter->next) { UiObjectMember *member = iter->member; - if (UiArrayBinding *arrayBinding = cast<UiArrayBinding*>(member)) { + if (auto arrayBinding = cast<UiArrayBinding*>(member)) { if (toString(arrayBinding->qualifiedId) == QString::fromUtf8(targetPropertyName)) { appendToArray(arrayBinding); @@ -128,7 +128,7 @@ private: void appendToArray(UiArrayBinding *ast) { - UiObjectMember *lastMember = 0; + UiObjectMember *lastMember = nullptr; for (UiArrayMemberList *iter = ast->members; iter; iter = iter->next) { if (iter->member) @@ -179,7 +179,7 @@ bool MoveObjectVisitor::visit(UiArrayBinding *ast) if (didRewriting()) return false; - UiArrayMemberList *currentMember = 0; + UiArrayMemberList *currentMember = nullptr; for (UiArrayMemberList *it = ast->members; it; it = it->next) { if (it->member->firstSourceLocation().offset == objectLocation) { diff --git a/src/plugins/qmldesigner/designercore/filemanager/moveobjectvisitor.h b/src/plugins/qmldesigner/designercore/filemanager/moveobjectvisitor.h index cc6d44825d..b3b8b1ab1c 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/moveobjectvisitor.h +++ b/src/plugins/qmldesigner/designercore/filemanager/moveobjectvisitor.h @@ -40,12 +40,12 @@ public: quint32 targetParentObjectLocation, const PropertyNameList &propertyOrder); - bool operator ()(QmlJS::AST::UiProgram *ast); + bool operator ()(QmlJS::AST::UiProgram *ast) override; protected: - virtual bool visit(QmlJS::AST::UiArrayBinding *ast); - virtual bool visit(QmlJS::AST::UiObjectBinding *ast); - virtual bool visit(QmlJS::AST::UiObjectDefinition *ast); + bool visit(QmlJS::AST::UiArrayBinding *ast) override; + bool visit(QmlJS::AST::UiObjectBinding *ast) override; + bool visit(QmlJS::AST::UiObjectDefinition *ast) override; private: void doMove(const TextModifier::MoveInfo &moveInfo); diff --git a/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.cpp b/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.cpp index 6247f98697..b5388afc59 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.cpp +++ b/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.cpp @@ -153,7 +153,7 @@ QString QMLRewriter::removeIndentation(const QString &text, unsigned depth) QmlJS::AST::SourceLocation QMLRewriter::calculateLocation(QmlJS::AST::UiQualifiedId *id) { - Q_ASSERT(id != 0); + Q_ASSERT(id != nullptr); const QmlJS::AST::SourceLocation startLocation = id->identifierToken; @@ -169,7 +169,7 @@ QmlJS::AST::SourceLocation QMLRewriter::calculateLocation(QmlJS::AST::UiQualifie bool QMLRewriter::isMissingSemicolon(QmlJS::AST::UiObjectMember *member) { - QmlJS::AST::UiScriptBinding *binding = QmlJS::AST::cast<QmlJS::AST::UiScriptBinding *>(member); + auto binding = QmlJS::AST::cast<QmlJS::AST::UiScriptBinding *>(member); if (binding) return isMissingSemicolon(binding->statement); else @@ -178,14 +178,14 @@ bool QMLRewriter::isMissingSemicolon(QmlJS::AST::UiObjectMember *member) bool QMLRewriter::isMissingSemicolon(QmlJS::AST::Statement *stmt) { - if (QmlJS::AST::ExpressionStatement *eStmt = QmlJS::AST::cast<QmlJS::AST::ExpressionStatement *>(stmt)) { + if (auto eStmt = QmlJS::AST::cast<QmlJS::AST::ExpressionStatement *>(stmt)) { return !eStmt->semicolonToken.isValid(); - } else if (QmlJS::AST::IfStatement *iStmt = QmlJS::AST::cast<QmlJS::AST::IfStatement *>(stmt)) { + } else if (auto iStmt = QmlJS::AST::cast<QmlJS::AST::IfStatement *>(stmt)) { if (iStmt->elseToken.isValid()) return isMissingSemicolon(iStmt->ko); else return isMissingSemicolon(iStmt->ok); - } else if (QmlJS::AST::DebuggerStatement *dStmt = QmlJS::AST::cast<QmlJS::AST::DebuggerStatement *>(stmt)) { + } else if (auto dStmt = QmlJS::AST::cast<QmlJS::AST::DebuggerStatement *>(stmt)) { return !dStmt->semicolonToken.isValid(); } else { return false; @@ -263,8 +263,8 @@ QmlJS::AST::UiObjectMemberList *QMLRewriter::searchMemberToInsertAfter(QmlJS::AS { const int objectDefinitionInsertionPoint = propertyOrder.indexOf(PropertyName()); // XXX ???? - QmlJS::AST::UiObjectMemberList *lastObjectDef = 0; - QmlJS::AST::UiObjectMemberList *lastNonObjectDef = 0; + QmlJS::AST::UiObjectMemberList *lastObjectDef = nullptr; + QmlJS::AST::UiObjectMemberList *lastNonObjectDef = nullptr; for (QmlJS::AST::UiObjectMemberList *iter = members; iter; iter = iter->next) { QmlJS::AST::UiObjectMember *member = iter->member; @@ -272,11 +272,11 @@ QmlJS::AST::UiObjectMemberList *QMLRewriter::searchMemberToInsertAfter(QmlJS::AS if (QmlJS::AST::cast<QmlJS::AST::UiObjectDefinition*>(member)) lastObjectDef = iter; - else if (QmlJS::AST::UiArrayBinding *arrayBinding = QmlJS::AST::cast<QmlJS::AST::UiArrayBinding*>(member)) + else if (auto arrayBinding = QmlJS::AST::cast<QmlJS::AST::UiArrayBinding*>(member)) idx = propertyOrder.indexOf(toString(arrayBinding->qualifiedId).toUtf8()); - else if (QmlJS::AST::UiObjectBinding *objectBinding = QmlJS::AST::cast<QmlJS::AST::UiObjectBinding*>(member)) + else if (auto objectBinding = QmlJS::AST::cast<QmlJS::AST::UiObjectBinding*>(member)) idx = propertyOrder.indexOf(toString(objectBinding->qualifiedId).toUtf8()); - else if (QmlJS::AST::UiScriptBinding *scriptBinding = QmlJS::AST::cast<QmlJS::AST::UiScriptBinding*>(member)) + else if (auto scriptBinding = QmlJS::AST::cast<QmlJS::AST::UiScriptBinding*>(member)) idx = propertyOrder.indexOf(toString(scriptBinding->qualifiedId).toUtf8()); else if (QmlJS::AST::cast<QmlJS::AST::UiPublicMember*>(member)) idx = propertyOrder.indexOf("property"); @@ -297,20 +297,20 @@ QmlJS::AST::UiObjectMemberList *QMLRewriter::searchMemberToInsertAfter(QmlJS::AS const QmlDesigner::PropertyNameList &propertyOrder) { if (!members) - return 0; // empty members + return nullptr; // empty members QHash<QString, QmlJS::AST::UiObjectMemberList *> orderedMembers; for (QmlJS::AST::UiObjectMemberList *iter = members; iter; iter = iter->next) { QmlJS::AST::UiObjectMember *member = iter->member; - if (QmlJS::AST::UiArrayBinding *arrayBinding = QmlJS::AST::cast<QmlJS::AST::UiArrayBinding*>(member)) + if (auto arrayBinding = QmlJS::AST::cast<QmlJS::AST::UiArrayBinding*>(member)) orderedMembers[toString(arrayBinding->qualifiedId)] = iter; - else if (QmlJS::AST::UiObjectBinding *objectBinding = QmlJS::AST::cast<QmlJS::AST::UiObjectBinding*>(member)) + else if (auto objectBinding = QmlJS::AST::cast<QmlJS::AST::UiObjectBinding*>(member)) orderedMembers[toString(objectBinding->qualifiedId)] = iter; else if (QmlJS::AST::cast<QmlJS::AST::UiObjectDefinition*>(member)) orderedMembers[QString::null] = iter; - else if (QmlJS::AST::UiScriptBinding *scriptBinding = QmlJS::AST::cast<QmlJS::AST::UiScriptBinding*>(member)) + else if (auto scriptBinding = QmlJS::AST::cast<QmlJS::AST::UiScriptBinding*>(member)) orderedMembers[toString(scriptBinding->qualifiedId)] = iter; else if (QmlJS::AST::cast<QmlJS::AST::UiPublicMember*>(member)) orderedMembers[QStringLiteral("property")] = iter; @@ -325,11 +325,11 @@ QmlJS::AST::UiObjectMemberList *QMLRewriter::searchMemberToInsertAfter(QmlJS::AS for (; idx > 0; --idx) { const QString prop = QString::fromLatin1(propertyOrder.at(idx - 1)); QmlJS::AST::UiObjectMemberList *candidate = orderedMembers.value(prop, 0); - if (candidate != 0) + if (candidate != nullptr) return candidate; } - return 0; + return nullptr; } void QMLRewriter::dump(const ASTPath &path) diff --git a/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.h b/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.h index af54ba8c13..062710ef4c 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.h +++ b/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.h @@ -39,7 +39,7 @@ namespace Internal { class QMLRewriter: protected QmlJS::AST::Visitor { public: - typedef QStack<QmlJS::AST::Node *> ASTPath; + using ASTPath = QStack<QmlJS::AST::Node *>; public: QMLRewriter(QmlDesigner::TextModifier &textModifier); diff --git a/src/plugins/qmldesigner/designercore/filemanager/removepropertyvisitor.cpp b/src/plugins/qmldesigner/designercore/filemanager/removepropertyvisitor.cpp index 20b0e4342b..a61acd0254 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/removepropertyvisitor.cpp +++ b/src/plugins/qmldesigner/designercore/filemanager/removepropertyvisitor.cpp @@ -81,7 +81,7 @@ void RemovePropertyVisitor::removeFrom(QmlJS::AST::UiObjectInitializer *ast) removeMember(member); // check for grouped properties: } else if (!prefix.isEmpty()) { - if (QmlJS::AST::UiObjectDefinition *def = QmlJS::AST::cast<QmlJS::AST::UiObjectDefinition *>(member)) { + if (auto def = QmlJS::AST::cast<QmlJS::AST::UiObjectDefinition *>(member)) { if (toString(def->qualifiedTypeNameId) == prefix) removeGroupedProperty(def); } @@ -98,7 +98,7 @@ void RemovePropertyVisitor::removeGroupedProperty(QmlJS::AST::UiObjectDefinition const QString propName = propertyName.mid(dotIdx + 1); - QmlJS::AST::UiObjectMember *wanted = 0; + QmlJS::AST::UiObjectMember *wanted = nullptr; unsigned memberCount = 0; for (QmlJS::AST::UiObjectMemberList *it = ast->initializer->members; it; it = it->next) { ++memberCount; @@ -131,13 +131,13 @@ void RemovePropertyVisitor::removeMember(QmlJS::AST::UiObjectMember *member) // FIXME: duplicate code in the QmlJS::Rewriter class, remove this bool RemovePropertyVisitor::memberNameMatchesPropertyName(const QString &propertyName, QmlJS::AST::UiObjectMember *ast) { - if (QmlJS::AST::UiPublicMember *publicMember = QmlJS::AST::cast<QmlJS::AST::UiPublicMember*>(ast)) + if (auto publicMember = QmlJS::AST::cast<QmlJS::AST::UiPublicMember*>(ast)) return publicMember->name == propertyName; - else if (QmlJS::AST::UiObjectBinding *objectBinding = QmlJS::AST::cast<QmlJS::AST::UiObjectBinding*>(ast)) + else if (auto objectBinding = QmlJS::AST::cast<QmlJS::AST::UiObjectBinding*>(ast)) return toString(objectBinding->qualifiedId) == propertyName; - else if (QmlJS::AST::UiScriptBinding *scriptBinding = QmlJS::AST::cast<QmlJS::AST::UiScriptBinding*>(ast)) + else if (auto scriptBinding = QmlJS::AST::cast<QmlJS::AST::UiScriptBinding*>(ast)) return toString(scriptBinding->qualifiedId) == propertyName; - else if (QmlJS::AST::UiArrayBinding *arrayBinding = QmlJS::AST::cast<QmlJS::AST::UiArrayBinding*>(ast)) + else if (auto arrayBinding = QmlJS::AST::cast<QmlJS::AST::UiArrayBinding*>(ast)) return toString(arrayBinding->qualifiedId) == propertyName; else return false; diff --git a/src/plugins/qmldesigner/designercore/filemanager/removepropertyvisitor.h b/src/plugins/qmldesigner/designercore/filemanager/removepropertyvisitor.h index 7eb8b53fd9..61d5f86241 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/removepropertyvisitor.h +++ b/src/plugins/qmldesigner/designercore/filemanager/removepropertyvisitor.h @@ -40,8 +40,8 @@ public: const QString &name); protected: - virtual bool visit(QmlJS::AST::UiObjectBinding *ast); - virtual bool visit(QmlJS::AST::UiObjectDefinition *ast); + bool visit(QmlJS::AST::UiObjectBinding *ast) override; + bool visit(QmlJS::AST::UiObjectDefinition *ast) override; private: void removeFrom(QmlJS::AST::UiObjectInitializer *ast); diff --git a/src/plugins/qmldesigner/designercore/filemanager/removeuiobjectmembervisitor.cpp b/src/plugins/qmldesigner/designercore/filemanager/removeuiobjectmembervisitor.cpp index 06fb1b3087..a7036b25c7 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/removeuiobjectmembervisitor.cpp +++ b/src/plugins/qmldesigner/designercore/filemanager/removeuiobjectmembervisitor.cpp @@ -95,7 +95,7 @@ QmlJS::AST::UiArrayBinding *RemoveUIObjectMemberVisitor::containingArray() const return QmlJS::AST::cast<QmlJS::AST::UiArrayBinding*>(parents[parents.size() - 3]); } - return 0; + return nullptr; } // FIXME: duplicate code in the QmlJS::Rewriter class, remove this @@ -104,7 +104,7 @@ void RemoveUIObjectMemberVisitor::extendToLeadingOrTrailingComma(QmlJS::AST::UiA int &start, int &end) const { - QmlJS::AST::UiArrayMemberList *currentMember = 0; + QmlJS::AST::UiArrayMemberList *currentMember = nullptr; for (QmlJS::AST::UiArrayMemberList *it = parentArray->members; it; it = it->next) { if (it->member == ast) { currentMember = it; diff --git a/src/plugins/qmldesigner/designercore/filemanager/removeuiobjectmembervisitor.h b/src/plugins/qmldesigner/designercore/filemanager/removeuiobjectmembervisitor.h index 6fc4d1d0b3..6f92e927ce 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/removeuiobjectmembervisitor.h +++ b/src/plugins/qmldesigner/designercore/filemanager/removeuiobjectmembervisitor.h @@ -39,15 +39,15 @@ public: quint32 objectLocation); protected: - virtual bool preVisit(QmlJS::AST::Node *ast); - virtual void postVisit(QmlJS::AST::Node *); + bool preVisit(QmlJS::AST::Node *ast) override; + void postVisit(QmlJS::AST::Node *) override; - virtual bool visit(QmlJS::AST::UiPublicMember *ast); - virtual bool visit(QmlJS::AST::UiObjectDefinition *ast); - virtual bool visit(QmlJS::AST::UiSourceElement *ast); - virtual bool visit(QmlJS::AST::UiObjectBinding *ast); - virtual bool visit(QmlJS::AST::UiScriptBinding *ast); - virtual bool visit(QmlJS::AST::UiArrayBinding *ast); + bool visit(QmlJS::AST::UiPublicMember *ast) override; + bool visit(QmlJS::AST::UiObjectDefinition *ast) override; + bool visit(QmlJS::AST::UiSourceElement *ast) override; + bool visit(QmlJS::AST::UiObjectBinding *ast) override; + bool visit(QmlJS::AST::UiScriptBinding *ast) override; + bool visit(QmlJS::AST::UiArrayBinding *ast) override; private: bool visitObjectMember(QmlJS::AST::UiObjectMember *ast); diff --git a/src/plugins/qmldesigner/designercore/include/abstractproperty.h b/src/plugins/qmldesigner/designercore/include/abstractproperty.h index 65f3f666be..75cb024ccd 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractproperty.h +++ b/src/plugins/qmldesigner/designercore/include/abstractproperty.h @@ -38,9 +38,9 @@ namespace QmlDesigner { class InternalNode; class InternalProperty; - typedef QSharedPointer<InternalNode> InternalNodePointer; - typedef QSharedPointer<InternalProperty> InternalPropertyPointer; - typedef QWeakPointer<InternalNode> InternalNodeWeakPointer; + using InternalNodePointer = QSharedPointer<InternalNode>; + using InternalPropertyPointer = QSharedPointer<InternalProperty>; + using InternalNodeWeakPointer = QWeakPointer<InternalNode>; } class Model; diff --git a/src/plugins/qmldesigner/designercore/include/abstractview.h b/src/plugins/qmldesigner/designercore/include/abstractview.h index 610d137acc..4eb4f05666 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractview.h +++ b/src/plugins/qmldesigner/designercore/include/abstractview.h @@ -47,8 +47,8 @@ QT_END_NAMESPACE namespace QmlDesigner { namespace Internal { class InternalNode; - typedef QSharedPointer<InternalNode> InternalNodePointer; - typedef QWeakPointer<InternalNode> InternalNodeWeakPointer; + using InternalNodePointer = QSharedPointer<InternalNode>; + using InternalNodeWeakPointer = QWeakPointer<InternalNode>; } } @@ -69,13 +69,11 @@ class WidgetInfo { public: class ToolBarWidgetFactoryInterface { public: - ToolBarWidgetFactoryInterface() - {} + ToolBarWidgetFactoryInterface() = default; virtual QList<QToolButton*> createToolBarWidgets() = 0; - virtual ~ToolBarWidgetFactoryInterface() - {} + virtual ~ToolBarWidgetFactoryInterface() = default; }; template <class T> diff --git a/src/plugins/qmldesigner/designercore/include/forwardview.h b/src/plugins/qmldesigner/designercore/include/forwardview.h index d317bec793..8d4406b6d2 100644 --- a/src/plugins/qmldesigner/designercore/include/forwardview.h +++ b/src/plugins/qmldesigner/designercore/include/forwardview.h @@ -40,37 +40,37 @@ template <class ViewType> class ForwardView : public AbstractView { public: - typedef QPointer<ForwardView> Pointer; - typedef typename ViewType::Pointer ViewTypePointer; + using Pointer = QPointer<ForwardView<ViewType> >; + using ViewTypePointer = typename ViewType::Pointer; ForwardView(QObject *parent); - void modelAttached(Model *model); - void modelAboutToBeDetached(Model *model); - - void nodeCreated(const ModelNode &createdNode); - void nodeAboutToBeRemoved(const ModelNode &removedNode); - void nodeRemoved(const ModelNode &removedNode, const NodeAbstractProperty &parentProperty, PropertyChangeFlags propertyChange); - void nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent, const NodeAbstractProperty &oldPropertyParent, AbstractView::PropertyChangeFlags propertyChange); - void nodeIdChanged(const ModelNode& node, const QString& newId, const QString& oldId); - void propertiesAboutToBeRemoved(const QList<AbstractProperty>& propertyList); - void propertiesRemoved(const QList<AbstractProperty>& propertyList); - void variantPropertiesChanged(const QList<VariantProperty>& propertyList, PropertyChangeFlags propertyChange); - void bindingPropertiesChanged(const QList<BindingProperty>& propertyList, PropertyChangeFlags propertyChange); - void signalHandlerPropertiesChanged(const QVector<SignalHandlerProperty>& propertyList,PropertyChangeFlags propertyChange); - void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion); + void modelAttached(Model *model) override; + void modelAboutToBeDetached(Model *model) override; + + void nodeCreated(const ModelNode &createdNode) override; + void nodeAboutToBeRemoved(const ModelNode &removedNode) override; + void nodeRemoved(const ModelNode &removedNode, const NodeAbstractProperty &parentProperty, PropertyChangeFlags propertyChange) override; + void nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent, const NodeAbstractProperty &oldPropertyParent, AbstractView::PropertyChangeFlags propertyChange) override; + void nodeIdChanged(const ModelNode& node, const QString& newId, const QString& oldId) override; + void propertiesAboutToBeRemoved(const QList<AbstractProperty>& propertyList) override; + void propertiesRemoved(const QList<AbstractProperty>& propertyList) override; + void variantPropertiesChanged(const QList<VariantProperty>& propertyList, PropertyChangeFlags propertyChange) override; + void bindingPropertiesChanged(const QList<BindingProperty>& propertyList, PropertyChangeFlags propertyChange) override; + void signalHandlerPropertiesChanged(const QVector<SignalHandlerProperty>& propertyList,PropertyChangeFlags propertyChange) override; + void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) override; void selectedNodesChanged(const QList<ModelNode> &selectedNodeList, - const QList<ModelNode> &lastSelectedNodeList); + const QList<ModelNode> &lastSelectedNodeList) override; - void fileUrlChanged(const QUrl &oldUrl, const QUrl &newUrl); + void fileUrlChanged(const QUrl &oldUrl, const QUrl &newUrl) override; - void nodeOrderChanged(const NodeListProperty &listProperty, const ModelNode &movedNode, int oldIndex); - void importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports); + void nodeOrderChanged(const NodeListProperty &listProperty, const ModelNode &movedNode, int oldIndex) override; + void importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports) override; - void auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &data); + void auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &data) override; - void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList); + void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList) override; protected: void appendView(ViewType *view); diff --git a/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h b/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h index 9cca2ceb7e..aed724e50f 100644 --- a/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h +++ b/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h @@ -71,7 +71,7 @@ public: ItemLibraryEntry(const ItemLibraryEntry &other); ItemLibraryEntry& operator=(const ItemLibraryEntry &other); - typedef QmlDesigner::PropertyContainer Property; + using Property = QmlDesigner::PropertyContainer; QList<Property> properties() const; QHash<QString, QString> hints() const; diff --git a/src/plugins/qmldesigner/designercore/include/iwidgetplugin.h b/src/plugins/qmldesigner/designercore/include/iwidgetplugin.h index f85ad1e144..4b27e104af 100644 --- a/src/plugins/qmldesigner/designercore/include/iwidgetplugin.h +++ b/src/plugins/qmldesigner/designercore/include/iwidgetplugin.h @@ -34,7 +34,7 @@ namespace QmlDesigner { class IWidgetPlugin { public: - virtual ~IWidgetPlugin() {} + virtual ~IWidgetPlugin() = default; virtual QString metaInfo() const = 0; virtual QString pluginName() const = 0; diff --git a/src/plugins/qmldesigner/designercore/include/metainfo.h b/src/plugins/qmldesigner/designercore/include/metainfo.h index 90d94c324a..cc4e8c1ed0 100644 --- a/src/plugins/qmldesigner/designercore/include/metainfo.h +++ b/src/plugins/qmldesigner/designercore/include/metainfo.h @@ -43,7 +43,7 @@ namespace Internal { class MetaInfoPrivate; class ModelPrivate; class SubComponentManagerPrivate; - typedef QSharedPointer<MetaInfoPrivate> MetaInfoPrivatePointer; + using MetaInfoPrivatePointer = QSharedPointer<MetaInfoPrivate>; } QMLDESIGNERCORE_EXPORT bool operator==(const MetaInfo &first, const MetaInfo &second); diff --git a/src/plugins/qmldesigner/designercore/include/model.h b/src/plugins/qmldesigner/designercore/include/model.h index 2f07c2a3d3..efa6731d85 100644 --- a/src/plugins/qmldesigner/designercore/include/model.h +++ b/src/plugins/qmldesigner/designercore/include/model.h @@ -59,7 +59,7 @@ class RewriterView; class NodeInstanceView; class TextModifier; -typedef QList<QPair<PropertyName, QVariant> > PropertyListType; +using PropertyListType = QList<QPair<PropertyName, QVariant> >; class QMLDESIGNERCORE_EXPORT Model : public QObject { diff --git a/src/plugins/qmldesigner/designercore/include/modelnode.h b/src/plugins/qmldesigner/designercore/include/modelnode.h index 0f07221fab..c48f079204 100644 --- a/src/plugins/qmldesigner/designercore/include/modelnode.h +++ b/src/plugins/qmldesigner/designercore/include/modelnode.h @@ -42,9 +42,9 @@ namespace Internal { class InternalNode; class InternalProperty; - typedef QSharedPointer<InternalNode> InternalNodePointer; - typedef QSharedPointer<InternalProperty> InternalPropertyPointer; - typedef QWeakPointer<InternalNode> InternalNodeWeakPointer; + using InternalNodePointer = QSharedPointer<InternalNode>; + using InternalPropertyPointer = QSharedPointer<InternalProperty>; + using InternalNodeWeakPointer = QWeakPointer<InternalNode>; } class NodeMetaInfo; class AbstractProperty; @@ -60,7 +60,7 @@ class ModelNode; QMLDESIGNERCORE_EXPORT QList<Internal::InternalNodePointer> toInternalNodeList(const QList<ModelNode> &nodeList); -typedef QList<QPair<PropertyName, QVariant> > PropertyListType; +using PropertyListType = QList<QPair<PropertyName, QVariant> >; class QMLDESIGNERCORE_EXPORT ModelNode { diff --git a/src/plugins/qmldesigner/designercore/include/nodeabstractproperty.h b/src/plugins/qmldesigner/designercore/include/nodeabstractproperty.h index fa0460f771..1386b4265e 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeabstractproperty.h +++ b/src/plugins/qmldesigner/designercore/include/nodeabstractproperty.h @@ -31,7 +31,7 @@ namespace QmlDesigner { namespace Internal { class InternalNodeAbstractProperty; - typedef QSharedPointer<InternalNodeAbstractProperty> InternalNodeAbstractPropertyPointer; + using InternalNodeAbstractPropertyPointer = QSharedPointer<InternalNodeAbstractProperty>; } class QMLDESIGNERCORE_EXPORT NodeAbstractProperty : public AbstractProperty diff --git a/src/plugins/qmldesigner/designercore/include/nodeanchors.h b/src/plugins/qmldesigner/designercore/include/nodeanchors.h index efa20cc1a3..cb791f76c3 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeanchors.h +++ b/src/plugins/qmldesigner/designercore/include/nodeanchors.h @@ -38,11 +38,11 @@ namespace QmlDesigner { namespace Internal { class InternalNode; - typedef QSharedPointer<InternalNode> InternalNodePointer; - typedef QWeakPointer<InternalNode> InternalNodeWeakPointer; + using InternalNodePointer = QSharedPointer<InternalNode>; + using InternalNodeWeakPointer = QWeakPointer<InternalNode>; class InternalNodeState; - typedef QSharedPointer<InternalNodeState> InternalNodeStatePointer; + using InternalNodeStatePointer = QSharedPointer<InternalNodeState>; class TextToModelMerger; } diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h index 12f5430cd6..c0e0b41537 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h @@ -75,7 +75,7 @@ class QMLDESIGNERCORE_EXPORT NodeInstanceView : public AbstractView, public Node friend class NodeInstance; public: - typedef QWeakPointer<NodeInstanceView> Pointer; + using Pointer = QWeakPointer<NodeInstanceView>; explicit NodeInstanceView(QObject *parent = nullptr, NodeInstanceServerInterface::RunModus runModus = NodeInstanceServerInterface::NormalModus); ~NodeInstanceView() override; diff --git a/src/plugins/qmldesigner/designercore/include/nodelistproperty.h b/src/plugins/qmldesigner/designercore/include/nodelistproperty.h index 94af238bef..dc1967efec 100644 --- a/src/plugins/qmldesigner/designercore/include/nodelistproperty.h +++ b/src/plugins/qmldesigner/designercore/include/nodelistproperty.h @@ -36,7 +36,7 @@ namespace QmlDesigner { namespace Internal { class ModelPrivate; class InternalNodeListProperty; - typedef QSharedPointer<InternalNodeListProperty> InternalNodeListPropertyPointer; + using InternalNodeListPropertyPointer = QSharedPointer<InternalNodeListProperty>; } diff --git a/src/plugins/qmldesigner/designercore/include/nodemetainfo.h b/src/plugins/qmldesigner/designercore/include/nodemetainfo.h index 89b62939a3..5d2d171ae7 100644 --- a/src/plugins/qmldesigner/designercore/include/nodemetainfo.h +++ b/src/plugins/qmldesigner/designercore/include/nodemetainfo.h @@ -54,7 +54,7 @@ class QMLDESIGNERCORE_EXPORT NodeMetaInfo { public: NodeMetaInfo(); - NodeMetaInfo(Model *model, TypeName type, int maj, int min); + NodeMetaInfo(Model *model, const TypeName &type, int maj, int min); ~NodeMetaInfo(); diff --git a/src/plugins/qmldesigner/designercore/include/qmldesignercorelib_global.h b/src/plugins/qmldesigner/designercore/include/qmldesignercorelib_global.h index 8362c39d44..0872c547c8 100644 --- a/src/plugins/qmldesigner/designercore/include/qmldesignercorelib_global.h +++ b/src/plugins/qmldesigner/designercore/include/qmldesignercorelib_global.h @@ -36,11 +36,11 @@ # define QMLDESIGNERCORE_EXPORT Q_DECL_IMPORT #endif namespace QmlDesigner { -typedef QByteArray PropertyName; -typedef QList<PropertyName> PropertyNameList; -typedef QByteArray TypeName; -typedef QList<PropertyName> PropertyTypeList; -typedef QByteArray IdName; +using PropertyName = QByteArray; +using PropertyNameList = QList<PropertyName>; +using TypeName = QByteArray; +using PropertyTypeList = QList<PropertyName>; +using IdName = QByteArray; enum AnchorLineType { AnchorLineInvalid = 0x0, diff --git a/src/plugins/qmldesigner/designercore/include/textmodifier.h b/src/plugins/qmldesigner/designercore/include/textmodifier.h index 150545e7e8..617d0b9b7b 100644 --- a/src/plugins/qmldesigner/designercore/include/textmodifier.h +++ b/src/plugins/qmldesigner/designercore/include/textmodifier.h @@ -58,7 +58,7 @@ public: }; public: - TextModifier() {} + TextModifier() = default; ~TextModifier() override = 0; virtual void replace(int offset, int length, const QString& replacement) = 0; diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp index 6589ceb875..15d09e4516 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp @@ -43,18 +43,9 @@ class ProxyNodeInstanceData { public: ProxyNodeInstanceData() - : parentInstanceId(-1), - penWidth(1), - isAnchoredBySibling(false), - isAnchoredByChildren(false), - hasContent(false), - isMovable(false), - isResizable(false), - isInLayoutable(false), - directUpdates(false) {} - qint32 parentInstanceId; + qint32 parentInstanceId{-1}; ModelNode modelNode; QRectF boundingRect; QRectF contentItemBoundingRect; @@ -64,14 +55,14 @@ public: QTransform contentTransform; QTransform contentItemTransform; QTransform sceneTransform; - int penWidth; - bool isAnchoredBySibling; - bool isAnchoredByChildren; - bool hasContent; - bool isMovable; - bool isResizable; - bool isInLayoutable; - bool directUpdates; + int penWidth{1}; + bool isAnchoredBySibling{false}; + bool isAnchoredByChildren{false}; + bool hasContent{false}; + bool isMovable{false}; + bool isResizable{false}; + bool isInLayoutable{false}; + bool directUpdates{false}; QHash<PropertyName, QVariant> propertyValues; @@ -87,9 +78,7 @@ public: QHash<PropertyName, QPair<PropertyName, qint32> > anchors; }; -NodeInstance::NodeInstance() -{ -} +NodeInstance::NodeInstance() = default; NodeInstance::NodeInstance(ProxyNodeInstanceData *dPointer) : d(dPointer) @@ -98,27 +87,18 @@ NodeInstance::NodeInstance(ProxyNodeInstanceData *dPointer) NodeInstance NodeInstance::create(const ModelNode &node) { - ProxyNodeInstanceData *d = new ProxyNodeInstanceData; + auto d = new ProxyNodeInstanceData; d->modelNode = node; return NodeInstance(d); } -NodeInstance::~NodeInstance() -{ -} +NodeInstance::~NodeInstance() = default; -NodeInstance::NodeInstance(const NodeInstance &other) - : d(other.d) -{ -} +NodeInstance::NodeInstance(const NodeInstance &other) = default; -NodeInstance &NodeInstance::operator=(const NodeInstance &other) -{ - d = other.d; - return *this; -} +NodeInstance &NodeInstance::operator=(const NodeInstance &other) = default; ModelNode NodeInstance::modelNode() const { diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp index cadd15c47c..c75c8a6401 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp @@ -337,7 +337,7 @@ QString NodeInstanceServerProxy::qrcMappingString() const if (rewriterView) { QString mappingString; - typedef QPair<QString, QString> StringPair; + using StringPair = QPair<QString, QString>; foreach (const StringPair &pair, rewriterView->qrcMapping()) { if (!mappingString.isEmpty()) @@ -406,7 +406,7 @@ void NodeInstanceServerProxy::writeCommand(const QVariant &command) void NodeInstanceServerProxy::processFinished(int exitCode, QProcess::ExitStatus exitStatus) { - QProcess* finishedProcess = qobject_cast<QProcess*>(sender()); + auto finishedProcess = qobject_cast<QProcess*>(sender()); if (finishedProcess) qWarning() << "Process" << (exitStatus == QProcess::CrashExit ? "crashed:" : "finished:") << finishedProcess->arguments() << "exitCode:" << exitCode; else diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index 6c3becde43..9a8527e659 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -121,7 +121,7 @@ NodeInstanceView::~NodeInstanceView() { removeAllInstanceNodeRelationships(); delete nodeInstanceServer(); - m_currentKit = 0; + m_currentKit = nullptr; } //\{ @@ -778,7 +778,7 @@ QRectF NodeInstanceView::sceneRect() const if (rootNodeInstance().isValid()) return rootNodeInstance().boundingRect(); - return QRectF(); + return {}; } QList<ModelNode> filterNodesForSkipItems(const QList<ModelNode> &nodeList) @@ -945,7 +945,7 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand() ClearSceneCommand NodeInstanceView::createClearSceneCommand() const { - return ClearSceneCommand(); + return {}; } CompleteComponentCommand NodeInstanceView::createComponentCompleteCommand(const QList<NodeInstance> &instanceList) const diff --git a/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp b/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp index 91533db5c8..8962310ffb 100644 --- a/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp +++ b/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp @@ -144,7 +144,7 @@ bool PuppetCreator::useOnlyFallbackPuppet() const if (!m_kit || !m_kit->isValid()) qWarning() << "Invalid kit for QML puppet"; return m_designerSettings.value(DesignerSettingsKey::USE_ONLY_FALLBACK_PUPPET - ).toBool() || m_kit == 0 || !m_kit->isValid(); + ).toBool() || m_kit == nullptr || !m_kit->isValid(); #else return true; #endif diff --git a/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp index 4183af4b1f..7c5ee2f7aa 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/itemlibraryinfo.cpp @@ -37,13 +37,13 @@ namespace Internal { class ItemLibraryEntryData : public QSharedData { public: - ItemLibraryEntryData() : majorVersion(-1), minorVersion(-1) - { } + ItemLibraryEntryData() + {} QString name; TypeName typeName; QString category; - int majorVersion; - int minorVersion; + int majorVersion{-1}; + int minorVersion{-1}; QString libraryEntryIconPath; QIcon typeIcon; QList<PropertyContainer> properties; @@ -59,10 +59,7 @@ public: // ItemLibraryEntry // -ItemLibraryEntry::ItemLibraryEntry(const ItemLibraryEntry &other) - : m_data(other.m_data) -{ -} +ItemLibraryEntry::ItemLibraryEntry(const ItemLibraryEntry &other) = default; ItemLibraryEntry& ItemLibraryEntry::operator=(const ItemLibraryEntry &other) { @@ -97,9 +94,7 @@ ItemLibraryEntry::ItemLibraryEntry() : m_data(new Internal::ItemLibraryEntryData m_data->name.clear(); } -ItemLibraryEntry::~ItemLibraryEntry() -{ -} +ItemLibraryEntry::~ItemLibraryEntry() = default; QString ItemLibraryEntry::name() const { diff --git a/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp index aca9535055..14f1982b72 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp @@ -120,10 +120,7 @@ properties. /*! Constructs a copy of \a metaInfo. */ -MetaInfo::MetaInfo(const MetaInfo &metaInfo) : - m_p(metaInfo.m_p) -{ -} +MetaInfo::MetaInfo(const MetaInfo &metaInfo) = default; /*! Creates a meta information object with just the QML types registered statically. @@ -138,19 +135,13 @@ MetaInfo::MetaInfo() : { } -MetaInfo::~MetaInfo() -{ -} +MetaInfo::~MetaInfo() = default; /*! Assigns \a other to this meta information and returns a reference to this meta information. */ -MetaInfo& MetaInfo::operator=(const MetaInfo &other) -{ - m_p = other.m_p; - return *this; -} +MetaInfo& MetaInfo::operator=(const MetaInfo &other) = default; ItemLibraryInfo *MetaInfo::itemLibraryInfo() const { diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp index 94c192b34f..f92358efc9 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp @@ -50,8 +50,8 @@ namespace Internal { struct TypeDescription { QString className; - int minorVersion; - int majorVersion; + int minorVersion{}; + int majorVersion{}; }; } //Internal @@ -77,7 +77,7 @@ namespace Internal { using namespace QmlJS; -typedef QPair<PropertyName, TypeName> PropertyInfo; +using PropertyInfo = QPair<PropertyName, TypeName>; QVector<PropertyInfo> getObjectTypes(const ObjectValue *ov, const ContextPtr &context, bool local = false, int rec = 0); @@ -350,7 +350,7 @@ static inline bool isValueType(const QString &type) const CppComponentValue *findQmlPrototype(const ObjectValue *ov, const ContextPtr &context) { if (!ov) - return 0; + return nullptr; const CppComponentValue * qmlValue = value_cast<CppComponentValue>(ov); if (qmlValue) @@ -517,9 +517,9 @@ QVector<PropertyInfo> getObjectTypes(const ObjectValue *objectValue, const Conte class NodeMetaInfoPrivate { public: - typedef QSharedPointer<NodeMetaInfoPrivate> Pointer; - NodeMetaInfoPrivate(); - ~NodeMetaInfoPrivate() {} + using Pointer = QSharedPointer<NodeMetaInfoPrivate>; + NodeMetaInfoPrivate() = default; + ~NodeMetaInfoPrivate() = default; bool isValid() const; bool isFileComponent() const; @@ -669,11 +669,6 @@ NodeMetaInfoPrivate::Pointer NodeMetaInfoPrivate::create(Model *model, const Typ return newData; } -NodeMetaInfoPrivate::NodeMetaInfoPrivate() : m_isValid(false) -{ - -} - NodeMetaInfoPrivate::NodeMetaInfoPrivate(Model *model, TypeName type, int maj, int min) : m_qualfiedTypeName(type) , m_majorVersion(maj) @@ -728,7 +723,7 @@ const CppComponentValue *NodeMetaInfoPrivate::getCppComponentValue() const { const QList<TypeName> nameComponents = m_qualfiedTypeName.split('.'); if (nameComponents.size() < 2) - return 0; + return nullptr; const TypeName &type = nameComponents.constLast(); TypeName module; @@ -741,7 +736,7 @@ const CppComponentValue *NodeMetaInfoPrivate::getCppComponentValue() const // get the qml object value that's available in the document const QmlJS::Imports *importsPtr = context()->imports(document()); if (importsPtr) { - const QList<QmlJS::Import> imports = importsPtr->all(); + const QList<QmlJS::Import> &imports = importsPtr->all(); foreach (const QmlJS::Import &import, imports) { if (import.info.path() != QString::fromUtf8(module)) continue; @@ -789,14 +784,14 @@ ContextPtr NodeMetaInfoPrivate::context() const { if (m_model && m_model->rewriterView() && m_model->rewriterView()->scopeChain()) return m_model->rewriterView()->scopeChain()->context(); - return ContextPtr(0); + return ContextPtr(nullptr); } const Document *NodeMetaInfoPrivate::document() const { if (m_model && m_model->rewriterView()) return m_model->rewriterView()->document(); - return 0; + return nullptr; } void NodeMetaInfoPrivate::setupLocalPropertyInfo(const QVector<PropertyInfo> &localPropertyInfos) @@ -968,7 +963,7 @@ QString NodeMetaInfoPrivate::propertyEnumScope(const PropertyName &propertyName) const CppComponentValue *qmlObjectValue = getNearestCppComponentValue(); if (!qmlObjectValue) return QString(); - const CppComponentValue *definedIn = 0; + const CppComponentValue *definedIn = nullptr; qmlObjectValue->getEnum(QString::fromUtf8(propertyType(propertyName)), &definedIn); if (definedIn) { QString nonCppPackage; @@ -1322,19 +1317,14 @@ NodeMetaInfo::NodeMetaInfo() : m_privateData(new Internal::NodeMetaInfoPrivate() } -NodeMetaInfo::NodeMetaInfo(Model *model, TypeName type, int maj, int min) : m_privateData(Internal::NodeMetaInfoPrivate::create(model, type, maj, min)) +NodeMetaInfo::NodeMetaInfo(Model *model, const TypeName &type, int maj, int min) : m_privateData(Internal::NodeMetaInfoPrivate::create(model, type, maj, min)) { } -NodeMetaInfo::~NodeMetaInfo() -{ -} +NodeMetaInfo::~NodeMetaInfo() = default; -NodeMetaInfo::NodeMetaInfo(const NodeMetaInfo &other) - : m_privateData(other.m_privateData) -{ -} +NodeMetaInfo::NodeMetaInfo(const NodeMetaInfo &other) = default; NodeMetaInfo &NodeMetaInfo::operator=(const NodeMetaInfo &other) { diff --git a/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp b/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp index 40a9d75776..c6602a3bc7 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp @@ -79,27 +79,11 @@ AbstractProperty::AbstractProperty(const AbstractProperty &property, AbstractVie } -AbstractProperty::~AbstractProperty() -{ -} +AbstractProperty::~AbstractProperty() = default; -AbstractProperty::AbstractProperty(const AbstractProperty &other) - : m_propertyName(other.m_propertyName), - m_internalNode(other.m_internalNode), - m_model(other.m_model), - m_view(other.m_view) -{ -} +AbstractProperty::AbstractProperty(const AbstractProperty &other) = default; -AbstractProperty& AbstractProperty::operator=(const AbstractProperty &other) -{ - m_propertyName = other.m_propertyName; - m_internalNode = other.m_internalNode; - m_model = other.m_model; - m_view = other.m_view; - - return *this; -} +AbstractProperty& AbstractProperty::operator=(const AbstractProperty &other) = default; Internal::InternalNodePointer AbstractProperty::internalNode() const { diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp index ab7195a940..9c4b768535 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp @@ -68,7 +68,7 @@ AbstractView::~AbstractView() */ void AbstractView::setModel(Model *model) { - Q_ASSERT(model != 0); + Q_ASSERT(model != nullptr); if (model == m_model.data()) return; @@ -525,7 +525,7 @@ NodeInstanceView *AbstractView::nodeInstanceView() const if (model()) return model()->d->nodeInstanceView(); else - return 0; + return nullptr; } RewriterView *AbstractView::rewriterView() const @@ -533,7 +533,7 @@ RewriterView *AbstractView::rewriterView() const if (model()) return model()->d->rewriterView(); else - return 0; + return nullptr; } void AbstractView::resetView() diff --git a/src/plugins/qmldesigner/designercore/model/basetexteditmodifier.cpp b/src/plugins/qmldesigner/designercore/model/basetexteditmodifier.cpp index 6204d670b5..612f3003e5 100644 --- a/src/plugins/qmldesigner/designercore/model/basetexteditmodifier.cpp +++ b/src/plugins/qmldesigner/designercore/model/basetexteditmodifier.cpp @@ -47,7 +47,7 @@ void BaseTextEditModifier::indentLines(int startLine, int endLine) { if (startLine < 0) return; - TextEditor::TextEditorWidget *baseTextEditorWidget = qobject_cast<TextEditor::TextEditorWidget*>(plainTextEdit()); + auto baseTextEditorWidget = qobject_cast<TextEditor::TextEditorWidget*>(plainTextEdit()); if (!baseTextEditorWidget) return; @@ -82,7 +82,7 @@ void BaseTextEditModifier::indent(int offset, int length) int BaseTextEditModifier::indentDepth() const { - if (TextEditor::TextEditorWidget *bte = qobject_cast<TextEditor::TextEditorWidget*>(plainTextEdit())) + if (auto bte = qobject_cast<TextEditor::TextEditorWidget*>(plainTextEdit())) return bte->textDocument()->tabSettings().m_indentSize; else return 0; @@ -90,9 +90,8 @@ int BaseTextEditModifier::indentDepth() const bool BaseTextEditModifier::renameId(const QString &oldId, const QString &newId) { - if (TextEditor::TextEditorWidget *bte = qobject_cast<TextEditor::TextEditorWidget*>(plainTextEdit())) { - if (QmlJSEditor::QmlJSEditorDocument *document - = qobject_cast<QmlJSEditor::QmlJSEditorDocument *>(bte->textDocument())) { + if (auto bte = qobject_cast<TextEditor::TextEditorWidget*>(plainTextEdit())) { + if (auto document = qobject_cast<QmlJSEditor::QmlJSEditorDocument *>(bte->textDocument())) { Utils::ChangeSet changeSet; foreach (const QmlJS::AST::SourceLocation &loc, document->semanticInfo().idLocations.value(oldId)) { @@ -106,9 +105,9 @@ bool BaseTextEditModifier::renameId(const QString &oldId, const QString &newId) return false; } -static QmlJS::AST::UiObjectDefinition *getObjectDefinition(QList<QmlJS::AST::Node *> path, QmlJS::AST::UiQualifiedId *qualifiedId) +static QmlJS::AST::UiObjectDefinition *getObjectDefinition(const QList<QmlJS::AST::Node *> &path, QmlJS::AST::UiQualifiedId *qualifiedId) { - QmlJS::AST::UiObjectDefinition *object = 0; + QmlJS::AST::UiObjectDefinition *object = nullptr; for (int i = path.size() - 1; i >= 0; --i) { auto node = path.at(i); if (auto objDef = QmlJS::AST::cast<QmlJS::AST::UiObjectDefinition *>(node)) { @@ -121,11 +120,11 @@ static QmlJS::AST::UiObjectDefinition *getObjectDefinition(QList<QmlJS::AST::Nod bool BaseTextEditModifier::moveToComponent(int nodeOffset) { - if (TextEditor::TextEditorWidget *bte = qobject_cast<TextEditor::TextEditorWidget*>(plainTextEdit())) { - if (QmlJSEditor::QmlJSEditorDocument *document + if (auto bte = qobject_cast<TextEditor::TextEditorWidget*>(plainTextEdit())) { + if (auto document = qobject_cast<QmlJSEditor::QmlJSEditorDocument *>(bte->textDocument())) { - auto *qualifiedId = QmlJS::AST::cast<QmlJS::AST::UiQualifiedId *>(document->semanticInfo().astNodeAt(nodeOffset)); + auto qualifiedId = QmlJS::AST::cast<QmlJS::AST::UiQualifiedId *>(document->semanticInfo().astNodeAt(nodeOffset)); QList<QmlJS::AST::Node *> path = document->semanticInfo().rangePath(nodeOffset); QmlJS::AST::UiObjectDefinition *object = getObjectDefinition(path, qualifiedId); @@ -141,8 +140,8 @@ bool BaseTextEditModifier::moveToComponent(int nodeOffset) QStringList BaseTextEditModifier::autoComplete(QTextDocument *textDocument, int position, bool explicitComplete) { - if (TextEditor::TextEditorWidget *bte = qobject_cast<TextEditor::TextEditorWidget*>(plainTextEdit())) - if (QmlJSEditor::QmlJSEditorDocument *document + if (auto bte = qobject_cast<TextEditor::TextEditorWidget*>(plainTextEdit())) + if (auto document = qobject_cast<QmlJSEditor::QmlJSEditorDocument *>(bte->textDocument())) return QmlJSEditor::qmlJSAutoComplete(textDocument, position, diff --git a/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp b/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp index fe8ebe1729..ebd3c7c709 100644 --- a/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp @@ -43,9 +43,7 @@ bool compareBindingProperties(const QmlDesigner::BindingProperty &bindingPropert return true; } -BindingProperty::BindingProperty() -{ -} +BindingProperty::BindingProperty() = default; BindingProperty::BindingProperty(const BindingProperty &property, AbstractView *view) : AbstractProperty(property.name(), property.internalNode(), property.model(), view) diff --git a/src/plugins/qmldesigner/designercore/model/componenttextmodifier.cpp b/src/plugins/qmldesigner/designercore/model/componenttextmodifier.cpp index f104842995..1d500b8496 100644 --- a/src/plugins/qmldesigner/designercore/model/componenttextmodifier.cpp +++ b/src/plugins/qmldesigner/designercore/model/componenttextmodifier.cpp @@ -39,9 +39,7 @@ ComponentTextModifier::ComponentTextModifier(TextModifier *originalModifier, int connect(m_originalModifier, &TextModifier::moved, this, &TextModifier::moved); } -ComponentTextModifier::~ComponentTextModifier() -{ -} +ComponentTextModifier::~ComponentTextModifier() = default; void ComponentTextModifier::replace(int offset, int length, const QString& replacement) { diff --git a/src/plugins/qmldesigner/designercore/model/import.cpp b/src/plugins/qmldesigner/designercore/model/import.cpp index 0ea54ef983..7b9c2c56c4 100644 --- a/src/plugins/qmldesigner/designercore/model/import.cpp +++ b/src/plugins/qmldesigner/designercore/model/import.cpp @@ -29,9 +29,7 @@ namespace QmlDesigner { -Import::Import() -{ -} +Import::Import() = default; Import Import::createLibraryImport(const QString &url, const QString &version, const QString &alias, const QStringList &importPaths) { diff --git a/src/plugins/qmldesigner/designercore/model/internalbindingproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalbindingproperty.cpp index df054b152f..4853c8a626 100644 --- a/src/plugins/qmldesigner/designercore/model/internalbindingproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalbindingproperty.cpp @@ -36,7 +36,7 @@ InternalBindingProperty::InternalBindingProperty(const PropertyName &name, const InternalBindingProperty::Pointer InternalBindingProperty::create(const PropertyName &name, const InternalNodePointer &propertyOwner) { - InternalBindingProperty *newPointer(new InternalBindingProperty(name, propertyOwner)); + auto newPointer(new InternalBindingProperty(name, propertyOwner)); InternalBindingProperty::Pointer smartPointer(newPointer); newPointer->setInternalWeakPointer(smartPointer); diff --git a/src/plugins/qmldesigner/designercore/model/internalbindingproperty.h b/src/plugins/qmldesigner/designercore/model/internalbindingproperty.h index 5cb82205fa..c1d772b9ac 100644 --- a/src/plugins/qmldesigner/designercore/model/internalbindingproperty.h +++ b/src/plugins/qmldesigner/designercore/model/internalbindingproperty.h @@ -33,11 +33,11 @@ namespace Internal { class InternalBindingProperty : public InternalProperty { public: - typedef QSharedPointer<InternalBindingProperty> Pointer; + using Pointer = QSharedPointer<InternalBindingProperty>; static Pointer create(const PropertyName &name, const InternalNodePointer &propertyOwner); - bool isValid() const; + bool isValid() const override; QString expression() const; void setExpression(const QString &expression); @@ -45,7 +45,7 @@ public: void setDynamicExpression(const TypeName &type, const QString &expression); - bool isBindingProperty() const; + bool isBindingProperty() const override; protected: InternalBindingProperty(const PropertyName &name, const InternalNodePointer &propertyOwner); diff --git a/src/plugins/qmldesigner/designercore/model/internalnode.cpp b/src/plugins/qmldesigner/designercore/model/internalnode.cpp index 7e11ab6c3f..1f8b622765 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalnode.cpp @@ -61,7 +61,7 @@ InternalNode::InternalNode(const TypeName &typeName,int majorVersion, int minorV InternalNode::Pointer InternalNode::create(const TypeName &type,int majorVersion, int minorVersion, qint32 internalId) { - InternalNode *newPointer(new InternalNode(type, majorVersion, minorVersion, internalId)); + auto newPointer(new InternalNode(type, majorVersion, minorVersion, internalId)); InternalNode::Pointer smartPointer(newPointer); newPointer->setInternalWeakPointer(smartPointer); diff --git a/src/plugins/qmldesigner/designercore/model/internalnode_p.h b/src/plugins/qmldesigner/designercore/model/internalnode_p.h index 0997c5a4ff..f31039ffc2 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnode_p.h +++ b/src/plugins/qmldesigner/designercore/model/internalnode_p.h @@ -45,16 +45,16 @@ namespace Internal { class InternalProperty; class InternalNode; -typedef QSharedPointer<InternalNode> InternalNodePointer; -typedef QSharedPointer<InternalProperty> InternalPropertyPointer; -typedef QWeakPointer<InternalNode> InternalNodeWeakPointer; +using InternalNodePointer = QSharedPointer<InternalNode>; +using InternalPropertyPointer = QSharedPointer<InternalProperty>; +using InternalNodeWeakPointer = QWeakPointer<InternalNode>; class InternalNode { friend class InternalProperty; public: - typedef QSharedPointer<InternalNode> Pointer; - typedef QWeakPointer<InternalNode> WeakPointer; + using Pointer = QSharedPointer<InternalNode>; + using WeakPointer = QWeakPointer<InternalNode>; explicit InternalNode(); diff --git a/src/plugins/qmldesigner/designercore/model/internalnodeabstractproperty.h b/src/plugins/qmldesigner/designercore/model/internalnodeabstractproperty.h index 0ea7d49eff..ee80cc42da 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnodeabstractproperty.h +++ b/src/plugins/qmldesigner/designercore/model/internalnodeabstractproperty.h @@ -36,10 +36,10 @@ class InternalNodeAbstractProperty : public InternalProperty friend class InternalNode; public: - typedef QSharedPointer<InternalNodeAbstractProperty> Pointer; - typedef QWeakPointer<InternalNodeAbstractProperty> WeakPointer; + using Pointer = QSharedPointer<InternalNodeAbstractProperty>; + using WeakPointer = QWeakPointer<InternalNodeAbstractProperty>; - bool isNodeAbstractProperty() const; + bool isNodeAbstractProperty() const override; virtual QList<InternalNodePointer> allSubNodes() const = 0; virtual QList<InternalNodePointer> directSubNodes() const = 0; @@ -48,7 +48,7 @@ public: virtual int count() const = 0; virtual int indexOf(const InternalNodePointer &node) const = 0; - virtual bool isValid() const; + bool isValid() const override; using InternalProperty::remove; // keep the virtual remove(...) function around diff --git a/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.cpp index 5d4103b5d8..51f6b3421b 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.cpp @@ -37,7 +37,7 @@ InternalNodeListProperty::InternalNodeListProperty(const PropertyName &name, con InternalNodeListProperty::Pointer InternalNodeListProperty::create(const PropertyName &name, const InternalNodePointer &propertyOwner) { - InternalNodeListProperty *newPointer(new InternalNodeListProperty(name, propertyOwner)); + auto newPointer(new InternalNodeListProperty(name, propertyOwner)); InternalProperty::Pointer smartPointer(newPointer); newPointer->setInternalWeakPointer(smartPointer.toWeakRef()); diff --git a/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.h b/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.h index d58e44d08c..b50a144491 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.h +++ b/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.h @@ -36,28 +36,28 @@ namespace Internal { class InternalNodeListProperty : public InternalNodeAbstractProperty { public: - typedef QSharedPointer<InternalNodeListProperty> Pointer; + using Pointer = QSharedPointer<InternalNodeListProperty>; static Pointer create(const PropertyName &name, const InternalNodePointer &propertyOwner); - bool isValid() const; + bool isValid() const override; - bool isEmpty() const; - int count() const; - int indexOf(const InternalNodePointer &node) const; + bool isEmpty() const override; + int count() const override; + int indexOf(const InternalNodePointer &node) const override; InternalNodePointer at(int index) const; - bool isNodeListProperty() const; + bool isNodeListProperty() const override; - QList<InternalNodePointer> allSubNodes() const; - QList<InternalNodePointer> directSubNodes() const; + QList<InternalNodePointer> allSubNodes() const override; + QList<InternalNodePointer> directSubNodes() const override; const QList<InternalNodePointer> &nodeList() const; void slide(int from, int to); protected: InternalNodeListProperty(const PropertyName &name, const InternalNodePointer &propertyOwner); - void add(const InternalNodePointer &node); - void remove(const InternalNodePointer &node); + void add(const InternalNodePointer &node) override; + void remove(const InternalNodePointer &node) override; private: QList<InternalNodePointer> m_nodeList; diff --git a/src/plugins/qmldesigner/designercore/model/internalnodeproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalnodeproperty.cpp index c2daf83680..7965561344 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnodeproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalnodeproperty.cpp @@ -36,7 +36,7 @@ InternalNodeProperty::InternalNodeProperty(const PropertyName &name, const Inter InternalNodeProperty::Pointer InternalNodeProperty::create(const PropertyName &name, const InternalNode::Pointer &propertyOwner) { - InternalNodeProperty *newPointer = new InternalNodeProperty(name, propertyOwner); + auto newPointer = new InternalNodeProperty(name, propertyOwner); InternalNodeProperty::Pointer smartPointer(newPointer); newPointer->setInternalWeakPointer(smartPointer); diff --git a/src/plugins/qmldesigner/designercore/model/internalnodeproperty.h b/src/plugins/qmldesigner/designercore/model/internalnodeproperty.h index 7da520b011..a7bfe58300 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnodeproperty.h +++ b/src/plugins/qmldesigner/designercore/model/internalnodeproperty.h @@ -33,26 +33,26 @@ namespace Internal { class InternalNodeProperty : public InternalNodeAbstractProperty { public: - typedef QSharedPointer<InternalNodeProperty> Pointer; + using Pointer = QSharedPointer<InternalNodeProperty>; static Pointer create(const PropertyName &name, const InternalNodePointer &propertyOwner); - bool isValid() const; - bool isEmpty() const; - int count() const; - int indexOf(const InternalNodePointer &node) const; - bool isNodeProperty() const; + bool isValid() const override; + bool isEmpty() const override; + int count() const override; + int indexOf(const InternalNodePointer &node) const override; + bool isNodeProperty() const override; - QList<InternalNodePointer> allSubNodes() const; - QList<InternalNodePointer> directSubNodes() const; + QList<InternalNodePointer> allSubNodes() const override; + QList<InternalNodePointer> directSubNodes() const override; InternalNodePointer node() const; protected: InternalNodeProperty(const PropertyName &name, const InternalNodePointer &node); - void add(const InternalNodePointer &node); - void remove(const InternalNodePointer &node); + void add(const InternalNodePointer &node) override; + void remove(const InternalNodePointer &node) override; private: InternalNodePointer m_node; diff --git a/src/plugins/qmldesigner/designercore/model/internalproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalproperty.cpp index e439435fde..df2e2a2275 100644 --- a/src/plugins/qmldesigner/designercore/model/internalproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalproperty.cpp @@ -36,13 +36,9 @@ namespace QmlDesigner { namespace Internal { // Creates invalid InternalProperty -InternalProperty::InternalProperty() -{ -} +InternalProperty::InternalProperty() = default; -InternalProperty::~InternalProperty() -{ -} +InternalProperty::~InternalProperty() = default; InternalProperty::InternalProperty(const PropertyName &name, const InternalNode::Pointer &propertyOwner) : m_name(name), diff --git a/src/plugins/qmldesigner/designercore/model/internalproperty.h b/src/plugins/qmldesigner/designercore/model/internalproperty.h index df6896bf9a..a8eb5b940c 100644 --- a/src/plugins/qmldesigner/designercore/model/internalproperty.h +++ b/src/plugins/qmldesigner/designercore/model/internalproperty.h @@ -42,15 +42,14 @@ class InternalNodeProperty; class InternalNodeAbstractProperty; class InternalNode; -typedef QSharedPointer<InternalNode> InternalNodePointer; -typedef QWeakPointer<InternalNode> InternalNodeWeakPointer; +using InternalNodePointer = QSharedPointer<InternalNode>; +using InternalNodeWeakPointer = QWeakPointer<InternalNode>; class QMLDESIGNERCORE_EXPORT InternalProperty { public: - typedef QSharedPointer<InternalProperty> Pointer; - typedef QWeakPointer<InternalProperty> WeakPointer; - + using Pointer = QSharedPointer<InternalProperty>; + using WeakPointer = QWeakPointer<InternalProperty>; InternalProperty(); virtual ~InternalProperty(); diff --git a/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.cpp index c4c7e91131..08ce26a4c8 100644 --- a/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.cpp @@ -36,7 +36,7 @@ InternalSignalHandlerProperty::InternalSignalHandlerProperty(const PropertyName InternalSignalHandlerProperty::Pointer InternalSignalHandlerProperty::create(const PropertyName &name, const InternalNodePointer &propertyOwner) { - InternalSignalHandlerProperty *newPointer(new InternalSignalHandlerProperty(name, propertyOwner)); + auto newPointer(new InternalSignalHandlerProperty(name, propertyOwner)); InternalSignalHandlerProperty::Pointer smartPointer(newPointer); newPointer->setInternalWeakPointer(smartPointer); diff --git a/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.h b/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.h index c0875f7e5b..9ecf424a54 100644 --- a/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.h +++ b/src/plugins/qmldesigner/designercore/model/internalsignalhandlerproperty.h @@ -33,16 +33,16 @@ namespace Internal { class InternalSignalHandlerProperty : public InternalProperty { public: - typedef QSharedPointer<InternalSignalHandlerProperty> Pointer; + using Pointer = QSharedPointer<InternalSignalHandlerProperty>; static Pointer create(const PropertyName &name, const InternalNodePointer &propertyOwner); - bool isValid() const; + bool isValid() const override; QString source() const; void setSource(const QString &source); - bool isSignalHandlerProperty() const; + bool isSignalHandlerProperty() const override; protected: InternalSignalHandlerProperty(const PropertyName &name, const InternalNodePointer &propertyOwner); diff --git a/src/plugins/qmldesigner/designercore/model/internalvariantproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalvariantproperty.cpp index ac02030b50..3354a6312d 100644 --- a/src/plugins/qmldesigner/designercore/model/internalvariantproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalvariantproperty.cpp @@ -35,7 +35,7 @@ InternalVariantProperty::InternalVariantProperty(const PropertyName &name, const InternalVariantProperty::Pointer InternalVariantProperty::create(const PropertyName &name, const InternalNodePointer &propertyOwner) { - InternalVariantProperty *newPointer(new InternalVariantProperty(name, propertyOwner)); + auto newPointer(new InternalVariantProperty(name, propertyOwner)); InternalVariantProperty::Pointer smartPointer(newPointer); newPointer->setInternalWeakPointer(smartPointer); diff --git a/src/plugins/qmldesigner/designercore/model/internalvariantproperty.h b/src/plugins/qmldesigner/designercore/model/internalvariantproperty.h index 6edfe7a492..481770d15e 100644 --- a/src/plugins/qmldesigner/designercore/model/internalvariantproperty.h +++ b/src/plugins/qmldesigner/designercore/model/internalvariantproperty.h @@ -33,18 +33,18 @@ namespace Internal { class InternalVariantProperty : public InternalProperty { public: - typedef QSharedPointer<InternalVariantProperty> Pointer; + using Pointer = QSharedPointer<InternalVariantProperty>; static Pointer create(const PropertyName &name, const InternalNodePointer &propertyOwner); - bool isValid() const; + bool isValid() const override; QVariant value() const; void setValue(const QVariant &value); void setDynamicValue(const TypeName &type, const QVariant &value); - bool isVariantProperty() const; + bool isVariantProperty() const override; protected: InternalVariantProperty(const PropertyName &name, const InternalNodePointer &propertyOwner); diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index 5f5798b01e..f8cb347ba6 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -113,7 +113,7 @@ void ModelPrivate::detachAllViews() Model *ModelPrivate::create(const TypeName &type, int major, int minor, Model *metaInfoPropxyModel) { - Model *model = new Model; + auto model = new Model; model->d->m_metaInfoProxyModel = metaInfoPropxyModel; model->d->rootNode()->setType(type); @@ -229,7 +229,7 @@ InternalNode::Pointer ModelPrivate::createNode(const TypeName &typeName, InternalNode::Pointer newInternalNodePointer = InternalNode::create(typeName, majorVersion, minorVersion, internalId); newInternalNodePointer->setNodeSourceType(nodeSourceType); - typedef QPair<PropertyName, QVariant> PropertyPair; + using PropertyPair = QPair<PropertyName, QVariant>; foreach (const PropertyPair &propertyPair, propertyList) { newInternalNodePointer->addVariantProperty(propertyPair.first); @@ -368,7 +368,7 @@ void ModelPrivate::notifyAuxiliaryDataChanged(const InternalNodePointer &interna } foreach (const QPointer<AbstractView> &view, m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); ModelNode node(internalNode, model(), view.data()); view->auxiliaryDataChanged(node, name, data); @@ -399,7 +399,7 @@ void ModelPrivate::notifyNodeSourceChanged(const InternalNodePointer &internalNo } foreach (const QPointer<AbstractView> &view, m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); ModelNode node(internalNode, model(), view.data()); view->nodeSourceChanged(node, newNodeSource); @@ -431,7 +431,7 @@ void ModelPrivate::notifyRootNodeTypeChanged(const QString &type, int majorVersi nodeInstanceView()->rootNodeTypeChanged(type, majorVersion, minorVersion); foreach (const QPointer<AbstractView> &view, m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); view->rootNodeTypeChanged(type, majorVersion, minorVersion); } @@ -444,9 +444,9 @@ void ModelPrivate::notifyInstancePropertyChange(const QList<QPair<ModelNode, Pro { // no need to notify the rewriter or the instance view - typedef QPair<ModelNode, PropertyName> ModelNodePropertyPair; + using ModelNodePropertyPair = QPair<ModelNode, PropertyName>; foreach (const QPointer<AbstractView> &view, m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); QList<QPair<ModelNode, PropertyName> > adaptedPropertyList; foreach (const ModelNodePropertyPair &propertyPair, propertyPairList) { @@ -464,7 +464,7 @@ void ModelPrivate::notifyInstanceErrorChange(const QVector<qint32> &instanceIds) QVector<ModelNode> errorNodeList; foreach (const QPointer<AbstractView> &view, m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); foreach (qint32 instanceId, instanceIds) errorNodeList.append(ModelNode(model()->d->nodeForInternalId(instanceId), model(), view)); view->instanceErrorChanged(errorNodeList); @@ -487,7 +487,7 @@ void ModelPrivate::notifyInstancesCompleted(const QVector<ModelNode> &nodeVector } foreach (const QPointer<AbstractView> &view, m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); view->instancesCompleted(toModelNodeVector(internalVector, view.data())); } @@ -525,7 +525,7 @@ void ModelPrivate::notifyInstancesInformationsChange(const QMultiHash<ModelNode, } foreach (const QPointer<AbstractView> &view, m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); view->instanceInformationsChanged(convertModelNodeInformationHash(informationChangeHash, view.data())); } @@ -552,7 +552,7 @@ void ModelPrivate::notifyInstancesRenderImageChanged(const QVector<ModelNode> &n } foreach (const QPointer<AbstractView> &view, m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); view->instancesRenderImageChanged(toModelNodeVector(internalVector, view.data())); } @@ -579,7 +579,7 @@ void ModelPrivate::notifyInstancesPreviewImageChanged(const QVector<ModelNode> & } foreach (const QPointer<AbstractView> &view, m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); view->instancesPreviewImageChanged(toModelNodeVector(internalVector, view.data())); } @@ -606,7 +606,7 @@ void ModelPrivate::notifyInstancesChildrenChanged(const QVector<ModelNode> &node } foreach (const QPointer<AbstractView> &view, m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); view->instancesChildrenChanged(toModelNodeVector(internalVector, view.data())); } @@ -633,7 +633,7 @@ void ModelPrivate::notifyCurrentStateChanged(const ModelNode &node) } foreach (const QPointer<AbstractView> &view, m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); view->currentStateChanged(ModelNode(node.internalNode(), model(), view.data())); } @@ -660,7 +660,7 @@ void ModelPrivate::notifyCurrentTimelineChanged(const ModelNode &node) } for (const QPointer<AbstractView> &view : m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); view->currentTimelineChanged(ModelNode(node.internalNode(), model(), view.data())); } @@ -685,7 +685,7 @@ void ModelPrivate::notifyRewriterBeginTransaction() } foreach (const QPointer<AbstractView> &view, m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); view->rewriterBeginTransaction(); } @@ -710,7 +710,7 @@ void ModelPrivate::notifyRewriterEndTransaction() } foreach (const QPointer<AbstractView> &view, m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); view->rewriterEndTransaction(); } @@ -738,7 +738,7 @@ void ModelPrivate::notifyInstanceToken(const QString &token, int number, const Q } foreach (const QPointer<AbstractView> &view, m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); view->instancesToken(token, number, toModelNodeVector(internalVector, view.data())); } @@ -765,7 +765,7 @@ void ModelPrivate::notifyCustomNotification(const AbstractView *senderView, cons } foreach (const QPointer<AbstractView> &view, m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); view->customNotification(senderView, identifier, toModelNodeList(internalList, view.data()), data); } @@ -809,7 +809,7 @@ void ModelPrivate::notifyPropertiesRemoved(const QList<PropertyPair> &propertyPa foreach (const QPointer<AbstractView> &view, m_viewList) { QList<AbstractProperty> propertyList; - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); foreach (const PropertyPair &propertyPair, propertyPairList) { AbstractProperty newProperty(propertyPair.second, propertyPair.first, model(), view.data()); propertyList.append(newProperty); @@ -844,7 +844,7 @@ void ModelPrivate::notifyPropertiesAboutToBeRemoved(const QList<InternalProperty foreach (const QPointer<AbstractView> &view, m_viewList) { QList<AbstractProperty> propertyList; - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); foreach (const InternalProperty::Pointer &property, internalPropertyList) { AbstractProperty newProperty(property->name(), property->propertyOwner(), model(), view.data()); propertyList.append(newProperty); @@ -932,7 +932,7 @@ void ModelPrivate::notifyNodeCreated(const InternalNode::Pointer &newInternalNod } foreach (const QPointer<AbstractView> &view, m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); ModelNode createdNode(newInternalNodePointer, model(), view.data()); view->nodeCreated(createdNode); } @@ -957,7 +957,7 @@ void ModelPrivate::notifyNodeAboutToBeRemoved(const InternalNode::Pointer &inter } foreach (const QPointer<AbstractView> &view, m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); ModelNode modelNode(internalNodePointer, model(), view.data()); view->nodeAboutToBeRemoved(modelNode); } @@ -997,7 +997,7 @@ void ModelPrivate::notifyNodeRemoved(const InternalNodePointer &internalNodePoin } foreach (const QPointer<AbstractView> &view, m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); ModelNode modelNode(internalNodePointer, model(), view.data()); NodeAbstractProperty parentProperty(parentPropertyName, parentNodePointer, model(), view.data()); view->nodeRemoved(modelNode, parentProperty, propertyChange); @@ -1024,7 +1024,7 @@ void ModelPrivate::notifyNodeTypeChanged(const InternalNodePointer &internalNode } foreach (const QPointer<AbstractView> &view, m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); ModelNode modelNode(internalNodePointer, model(), view.data()); view->nodeTypeChanged(modelNode, type, majorVersion, minorVersion); } @@ -1055,7 +1055,7 @@ void ModelPrivate::notifyNodeIdChanged(const InternalNode::Pointer& internalNode } foreach (const QPointer<AbstractView> &view, m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); ModelNode modelNode(internalNodePointer, model(), view.data()); view->nodeIdChanged(modelNode, newId, oldId); } @@ -1089,7 +1089,7 @@ void ModelPrivate::notifyBindingPropertiesChanged(const QList<InternalBindingPro } foreach (const QPointer<AbstractView> &view, m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); QList<BindingProperty> propertyList; foreach (const InternalBindingPropertyPointer &bindingProperty, internalPropertyList) { propertyList.append(BindingProperty(bindingProperty->name(), bindingProperty->propertyOwner(), model(), view.data())); @@ -1130,7 +1130,7 @@ void ModelPrivate::notifySignalHandlerPropertiesChanged(const QVector<InternalSi } foreach (const QPointer<AbstractView> &view, m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); QVector<SignalHandlerProperty> propertyList; foreach (const InternalSignalHandlerPropertyPointer &signalHandlerProperty, internalPropertyList) { propertyList.append(SignalHandlerProperty(signalHandlerProperty->name(), signalHandlerProperty->propertyOwner(), model(), view.data())); @@ -1172,7 +1172,7 @@ void ModelPrivate::notifyScriptFunctionsChanged(const InternalNodePointer &inter } foreach (const QPointer<AbstractView> &view, m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); ModelNode node(internalNodePointer, model(), view.data()); view->scriptFunctionsChanged(node, scriptFunctionList); @@ -1210,7 +1210,7 @@ void ModelPrivate::notifyVariantPropertiesChanged(const InternalNodePointer &int foreach (const QPointer<AbstractView> &view, m_viewList) { QList<VariantProperty> propertyList; - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); foreach (const PropertyName &propertyName, propertyNameList) { VariantProperty property(propertyName, internalNodePointer, model(), view.data()); propertyList.append(property); @@ -1470,7 +1470,7 @@ void ModelPrivate::changeSelectedNodes(const QList<InternalNode::Pointer> &newSe const QList<InternalNode::Pointer> &oldSelectedNodeList) { foreach (const QPointer<AbstractView> &view, m_viewList) { - Q_ASSERT(view != 0); + Q_ASSERT(view != nullptr); view->selectedNodesChanged(toModelNodeList(newSelectedNodeList, view.data()), toModelNodeList(oldSelectedNodeList, view.data())); } } @@ -2094,7 +2094,7 @@ The view is informed that it has been registered within the model by a call to A void Model::attachView(AbstractView *view) { // Internal::WriteLocker locker(d); - RewriterView *castedRewriterView = qobject_cast<RewriterView*>(view); + auto castedRewriterView = qobject_cast<RewriterView*>(view); if (castedRewriterView) { if (rewriterView() == castedRewriterView) return; @@ -2103,7 +2103,7 @@ void Model::attachView(AbstractView *view) return; } - NodeInstanceView *nodeInstanceView = qobject_cast<NodeInstanceView*>(view); + auto nodeInstanceView = qobject_cast<NodeInstanceView*>(view); if (nodeInstanceView) return; @@ -2123,11 +2123,11 @@ void Model::detachView(AbstractView *view, ViewNotification emitDetachNotify) // Internal::WriteLocker locker(d); bool emitNotify = (emitDetachNotify == NotifyView); - RewriterView *rewriterView = qobject_cast<RewriterView*>(view); + auto rewriterView = qobject_cast<RewriterView*>(view); if (rewriterView) return; - NodeInstanceView *nodeInstanceView = qobject_cast<NodeInstanceView*>(view); + auto nodeInstanceView = qobject_cast<NodeInstanceView*>(view); if (nodeInstanceView) return; diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h index 08c6507630..dd29d25e51 100644 --- a/src/plugins/qmldesigner/designercore/model/model_p.h +++ b/src/plugins/qmldesigner/designercore/model/model_p.h @@ -56,15 +56,14 @@ class InternalVariantProperty; class InternalNodeAbstractProperty; class InternalNodeListProperty; -typedef QSharedPointer<InternalNode> InternalNodePointer; -typedef QSharedPointer<InternalProperty> InternalPropertyPointer; -typedef QSharedPointer<InternalBindingProperty> InternalBindingPropertyPointer; -typedef QSharedPointer<InternalSignalHandlerProperty> InternalSignalHandlerPropertyPointer; -typedef QSharedPointer<InternalVariantProperty> InternalVariantPropertyPointer; -typedef QSharedPointer<InternalNodeAbstractProperty> InternalNodeAbstractPropertyPointer; -typedef QSharedPointer<InternalNodeListProperty> InternalNodeListPropertyPointer; -typedef QPair<InternalNodePointer, PropertyName> PropertyPair; - +using InternalNodePointer = QSharedPointer<InternalNode>; +using InternalPropertyPointer = QSharedPointer<InternalProperty>; +using InternalBindingPropertyPointer = QSharedPointer<InternalBindingProperty>; +using InternalSignalHandlerPropertyPointer = QSharedPointer<InternalSignalHandlerProperty>; +using InternalVariantPropertyPointer = QSharedPointer<InternalVariantProperty>; +using InternalNodeAbstractPropertyPointer = QSharedPointer<InternalNodeAbstractProperty>; +using InternalNodeListPropertyPointer = QSharedPointer<InternalNodeListProperty>; +using PropertyPair = QPair<InternalNodePointer, PropertyName>; class ModelPrivate; @@ -88,7 +87,7 @@ class ModelPrivate : public QObject { public: ModelPrivate(Model *model); - ~ModelPrivate(); + ~ModelPrivate() override; static Model *create(const TypeName &type, int major, int minor, Model *metaInfoPropxyModel); diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index 7a80390d85..e6610102b7 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -103,27 +103,13 @@ ModelNode::ModelNode(): } -ModelNode::ModelNode(const ModelNode &other): - m_internalNode(other.m_internalNode), - m_model(other.m_model), - m_view(other.m_view) -{ -} +ModelNode::ModelNode(const ModelNode &other) = default; -ModelNode& ModelNode::operator=(const ModelNode &other) -{ - this->m_model = other.m_model; - this->m_internalNode = other.m_internalNode; - this->m_view = other.m_view; - - return *this; -} +ModelNode& ModelNode::operator=(const ModelNode &other) = default; /*! \brief does nothing */ -ModelNode::~ModelNode() -{ -} +ModelNode::~ModelNode() = default; /*! \brief returns the name of node which is a short cut to a property like objectName \return name of the node diff --git a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp index 39d99accdf..323e40c9f0 100644 --- a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp @@ -248,8 +248,7 @@ void ModelToTextMerger::applyChanges() textModifier->deactivateChangeSignals(); textModifier->startGroup(); - for (int i = 0; i < m_rewriteActions.size(); ++i) { - RewriteAction* action = m_rewriteActions.at(i); + for (auto action : m_rewriteActions) { if (DebugRewriteActions) qDebug() << "Next rewrite action:" << qPrintable(action->info()); diff --git a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.h b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.h index 582a78542f..98dd7c7a90 100644 --- a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.h +++ b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.h @@ -36,7 +36,7 @@ namespace Internal { class ModelToTextMerger { - typedef AbstractView::PropertyChangeFlags PropertyChangeFlags; + using PropertyChangeFlags = AbstractView::PropertyChangeFlags; public: ModelToTextMerger(RewriterView *reWriterView); diff --git a/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp b/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp index 27b5a5c746..b9c1fb7075 100644 --- a/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp @@ -35,9 +35,7 @@ namespace QmlDesigner { -NodeAbstractProperty::NodeAbstractProperty() -{ -} +NodeAbstractProperty::NodeAbstractProperty() = default; NodeAbstractProperty::NodeAbstractProperty(const NodeAbstractProperty &property, AbstractView *view) : AbstractProperty(property.name(), property.internalNode(), property.model(), view) diff --git a/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp b/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp index d4735160c5..84864e5e51 100644 --- a/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp @@ -36,8 +36,7 @@ namespace QmlDesigner { -NodeListProperty::NodeListProperty() -{} +NodeListProperty::NodeListProperty() = default; NodeListProperty::NodeListProperty(const NodeListProperty &property, AbstractView *view) : NodeAbstractProperty(property.name(), property.internalNode(), property.model(), view) diff --git a/src/plugins/qmldesigner/designercore/model/nodeproperty.cpp b/src/plugins/qmldesigner/designercore/model/nodeproperty.cpp index 2d262c2ab6..d33af251d1 100644 --- a/src/plugins/qmldesigner/designercore/model/nodeproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/nodeproperty.cpp @@ -33,9 +33,7 @@ namespace QmlDesigner { -NodeProperty::NodeProperty() -{ -} +NodeProperty::NodeProperty() = default; NodeProperty::NodeProperty(const PropertyName &propertyName, const Internal::InternalNodePointer &internalNode, Model* model, AbstractView *view) : NodeAbstractProperty(propertyName, internalNode, model, view) diff --git a/src/plugins/qmldesigner/designercore/model/plaintexteditmodifier.cpp b/src/plugins/qmldesigner/designercore/model/plaintexteditmodifier.cpp index f6aa4caf1c..f87dc73a2c 100644 --- a/src/plugins/qmldesigner/designercore/model/plaintexteditmodifier.cpp +++ b/src/plugins/qmldesigner/designercore/model/plaintexteditmodifier.cpp @@ -36,7 +36,7 @@ using namespace Utils; using namespace QmlDesigner; PlainTextEditModifier::PlainTextEditModifier(QPlainTextEdit *textEdit): - m_changeSet(0), + m_changeSet(nullptr), m_textEdit(textEdit), m_changeSignalsEnabled(true), m_pendingChangeSignal(false), @@ -48,9 +48,7 @@ PlainTextEditModifier::PlainTextEditModifier(QPlainTextEdit *textEdit): this, &PlainTextEditModifier::textEditChanged); } -PlainTextEditModifier::~PlainTextEditModifier() -{ -} +PlainTextEditModifier::~PlainTextEditModifier() = default; void PlainTextEditModifier::replace(int offset, int length, const QString &replacement) { @@ -135,7 +133,7 @@ void PlainTextEditModifier::commitGroup() if (m_changeSet) { runRewriting(m_changeSet); delete m_changeSet; - m_changeSet = 0; + m_changeSet = nullptr; } textCursor().endEditBlock(); diff --git a/src/plugins/qmldesigner/designercore/model/propertycontainer.cpp b/src/plugins/qmldesigner/designercore/model/propertycontainer.cpp index e2b80bae0f..ae62b4d0e6 100644 --- a/src/plugins/qmldesigner/designercore/model/propertycontainer.cpp +++ b/src/plugins/qmldesigner/designercore/model/propertycontainer.cpp @@ -35,9 +35,7 @@ using namespace QmlDesigner::Internal; // Creates invalid PropertyContainer -PropertyContainer::PropertyContainer() -{ -} +PropertyContainer::PropertyContainer() = default; PropertyContainer::PropertyContainer(const PropertyName &name, const QString &type, const QVariant &value) : m_name(name), m_type(type), m_value(value) diff --git a/src/plugins/qmldesigner/designercore/model/propertynode.cpp b/src/plugins/qmldesigner/designercore/model/propertynode.cpp index 5d1f502c24..d616c0ac70 100644 --- a/src/plugins/qmldesigner/designercore/model/propertynode.cpp +++ b/src/plugins/qmldesigner/designercore/model/propertynode.cpp @@ -27,8 +27,6 @@ namespace QmlDesigner { -PropertyNode::PropertyNode() -{ -} +PropertyNode::PropertyNode() = default; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/propertyparser.cpp b/src/plugins/qmldesigner/designercore/model/propertyparser.cpp index 943294d345..a39f2b221b 100644 --- a/src/plugins/qmldesigner/designercore/model/propertyparser.cpp +++ b/src/plugins/qmldesigner/designercore/model/propertyparser.cpp @@ -34,7 +34,7 @@ namespace { -static uchar fromHex(const uchar c, const uchar c2) +uchar fromHex(const uchar c, const uchar c2) { uchar rv = 0; if (c >= '0' && c <= '9') @@ -54,7 +54,7 @@ static uchar fromHex(const uchar c, const uchar c2) return rv; } -static uchar fromHex(const QString &s, int idx) +uchar fromHex(const QString &s, int idx) { uchar c = s.at(idx).toLatin1(); uchar c2 = s.at(idx + 1).toLatin1(); @@ -69,7 +69,7 @@ QColor colorFromString(const QString &s, bool *ok) uchar g = fromHex(s, 5); uchar b = fromHex(s, 7); if (ok) *ok = true; - return QColor(r, g, b, a); + return {r, g, b, a}; } else { QColor rv(s); if (ok) *ok = rv.isValid(); @@ -82,13 +82,13 @@ QPointF pointFFromString(const QString &s, bool *ok) if (s.count(QLatin1Char(',')) != 1) { if (ok) *ok = false; - return QPointF(); + return {}; } bool xGood, yGood; int index = s.indexOf(QLatin1Char(',')); - qreal xCoord = s.left(index).toDouble(&xGood); - qreal yCoord = s.mid(index+1).toDouble(&yGood); + qreal xCoord = s.leftRef(index).toDouble(&xGood); + qreal yCoord = s.midRef(index+1).toDouble(&yGood); if (!xGood || !yGood) { if (ok) *ok = false; @@ -105,17 +105,17 @@ QRectF rectFFromString(const QString &s, bool *ok) if (s.count(QLatin1Char(',')) != 2 || s.count(QLatin1Char('x')) != 1) { if (ok) *ok = false; - return QRectF(); + return {}; } bool xGood, yGood, wGood, hGood; int index = s.indexOf(QLatin1Char(',')); - qreal x = s.left(index).toDouble(&xGood); + qreal x = s.leftRef(index).toDouble(&xGood); int index2 = s.indexOf(QLatin1Char(','), index+1); - qreal y = s.mid(index+1, index2-index-1).toDouble(&yGood); + qreal y = s.midRef(index+1, index2-index-1).toDouble(&yGood); index = s.indexOf(QLatin1Char('x'), index2+1); - qreal width = s.mid(index2+1, index-index2-1).toDouble(&wGood); - qreal height = s.mid(index+1).toDouble(&hGood); + qreal width = s.midRef(index2+1, index-index2-1).toDouble(&wGood); + qreal height = s.midRef(index+1).toDouble(&hGood); if (!xGood || !yGood || !wGood || !hGood) { if (ok) *ok = false; @@ -132,13 +132,13 @@ QSizeF sizeFFromString(const QString &s, bool *ok) if (s.count(QLatin1Char('x')) != 1) { if (ok) *ok = false; - return QSizeF(); + return {}; } bool wGood, hGood; int index = s.indexOf(QLatin1Char('x')); - qreal width = s.left(index).toDouble(&wGood); - qreal height = s.mid(index+1).toDouble(&hGood); + qreal width = s.leftRef(index).toDouble(&wGood); + qreal height = s.midRef(index+1).toDouble(&hGood); if (!wGood || !hGood) { if (ok) *ok = false; @@ -155,15 +155,15 @@ QVector3D vector3DFromString(const QString &s, bool *ok) if (s.count(QLatin1Char(',')) != 2) { if (ok) *ok = false; - return QVector3D(); + return {}; } bool xGood, yGood, zGood; int index = s.indexOf(QLatin1Char(',')); int index2 = s.indexOf(QLatin1Char(','), index+1); - qreal xCoord = s.left(index).toDouble(&xGood); - qreal yCoord = s.mid(index+1, index2-index-1).toDouble(&yGood); - qreal zCoord = s.mid(index2+1).toDouble(&zGood); + qreal xCoord = s.leftRef(index).toDouble(&xGood); + qreal yCoord = s.midRef(index+1, index2-index-1).toDouble(&yGood); + qreal zCoord = s.midRef(index2+1).toDouble(&zGood); if (!xGood || !yGood || !zGood) { if (ok) *ok = false; diff --git a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp index f05826945c..fb695723a8 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp @@ -69,7 +69,7 @@ static QmlItemNode createQmlItemNodeFromSource(AbstractView *view, const QString textEdit.setPlainText(source); NotIndentingTextEditModifier modifier(&textEdit); - QScopedPointer<RewriterView> rewriterView(new RewriterView(RewriterView::Amend, 0)); + QScopedPointer<RewriterView> rewriterView(new RewriterView(RewriterView::Amend, nullptr)); rewriterView->setCheckSemanticErrors(false); rewriterView->setTextModifier(&modifier); inputModel->setRewriterView(rewriterView.data()); @@ -113,7 +113,7 @@ QmlItemNode QmlItemNode::createQmlItemNode(AbstractView *view, const ItemLibrary int minorVersion = metaInfo.minorVersion(); int majorVersion = metaInfo.majorVersion(); - typedef QPair<PropertyName, QString> PropertyBindingEntry; + using PropertyBindingEntry = QPair<PropertyName, QString>; QList<PropertyBindingEntry> propertyBindingList; if (itemLibraryEntry.qmlSource().isEmpty()) { QList<QPair<PropertyName, QVariant> > propertyPairList; @@ -455,7 +455,7 @@ QPointF QmlItemNode::instanceScenePosition() const else if (modelNode().hasParentProperty() && QmlItemNode::isValidQmlItemNode(modelNode().parentProperty().parentModelNode())) return QmlItemNode(modelNode().parentProperty().parentModelNode()).instanceSceneTransform().map(nodeInstance().position()); - return QPointF(); + return {}; } QPointF QmlItemNode::instancePosition() const diff --git a/src/plugins/qmldesigner/designercore/model/qmlmodelnodefacade.cpp b/src/plugins/qmldesigner/designercore/model/qmlmodelnodefacade.cpp index c63e56a22d..5c02c94676 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlmodelnodefacade.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlmodelnodefacade.cpp @@ -36,7 +36,7 @@ AbstractView *QmlModelNodeFacade::view() const if (modelNode().isValid()) return modelNode().view(); else - return 0; + return nullptr; } NodeInstanceView *QmlModelNodeFacade::nodeInstanceView(const ModelNode &modelNode) @@ -53,8 +53,7 @@ NodeInstanceView *QmlModelNodeFacade::nodeInstanceView() const QmlModelNodeFacade::QmlModelNodeFacade(const ModelNode &modelNode) : m_modelNode(modelNode) {} -QmlModelNodeFacade::~QmlModelNodeFacade() -{} +QmlModelNodeFacade::~QmlModelNodeFacade() = default; QmlModelNodeFacade::operator ModelNode() const { diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp index 6d598350f7..650d1e7305 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp @@ -568,7 +568,6 @@ QmlItemNode QmlObjectNode::itemForInstance(const NodeInstance &instance) const } QmlObjectNode::QmlObjectNode() - : QmlModelNodeFacade() { } diff --git a/src/plugins/qmldesigner/designercore/model/qmlstate.cpp b/src/plugins/qmldesigner/designercore/model/qmlstate.cpp index c937d446d6..adb56076eb 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlstate.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlstate.cpp @@ -38,7 +38,6 @@ namespace QmlDesigner { QmlModelState::QmlModelState() - : QmlModelNodeFacade() { } diff --git a/src/plugins/qmldesigner/designercore/model/qmltimeline.cpp b/src/plugins/qmldesigner/designercore/model/qmltimeline.cpp index 462604e82d..14f18327fe 100644 --- a/src/plugins/qmldesigner/designercore/model/qmltimeline.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmltimeline.cpp @@ -40,10 +40,7 @@ namespace QmlDesigner { -QmlTimeline::QmlTimeline() -{ - -} +QmlTimeline::QmlTimeline() = default; QmlTimeline::QmlTimeline(const ModelNode &modelNode) : QmlModelNodeFacade(modelNode) { diff --git a/src/plugins/qmldesigner/designercore/model/qmltimelinekeyframegroup.cpp b/src/plugins/qmldesigner/designercore/model/qmltimelinekeyframegroup.cpp index 86f3815014..e457e5cdaa 100644 --- a/src/plugins/qmldesigner/designercore/model/qmltimelinekeyframegroup.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmltimelinekeyframegroup.cpp @@ -38,10 +38,7 @@ namespace QmlDesigner { -QmlTimelineKeyframeGroup::QmlTimelineKeyframeGroup() -{ - -} +QmlTimelineKeyframeGroup::QmlTimelineKeyframeGroup() = default; QmlTimelineKeyframeGroup::QmlTimelineKeyframeGroup(const ModelNode &modelNode) : QmlModelNodeFacade(modelNode) { @@ -93,7 +90,7 @@ int QmlTimelineKeyframeGroup::getSupposedTargetIndex(qreal newFrame) const { const NodeListProperty nodeListProperty = modelNode().defaultNodeListProperty(); int i = 0; - for (auto node : nodeListProperty.toModelNodeList()) { + for (const auto &node : nodeListProperty.toModelNodeList()) { if (node.hasVariantProperty("frame")) { const qreal currentFrame = node.variantProperty("frame").value().toReal(); if (!qFuzzyCompare(currentFrame, newFrame)) { //Ignore the frame itself diff --git a/src/plugins/qmldesigner/designercore/model/rewriteaction.cpp b/src/plugins/qmldesigner/designercore/model/rewriteaction.cpp index 154a80f760..106341043d 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriteaction.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriteaction.cpp @@ -36,7 +36,7 @@ using namespace QmlDesigner; namespace { // anonymous -static inline QString toInfo(const Import &import) +QString toInfo(const Import &import) { QString txt; @@ -65,7 +65,7 @@ static inline QString toInfo(const Import &import) return txt; } -static inline QString toString(QmlRefactoring::PropertyType type) +QString toString(QmlRefactoring::PropertyType type) { switch (type) { case QmlRefactoring::ArrayBinding: return QStringLiteral("array binding"); diff --git a/src/plugins/qmldesigner/designercore/model/rewriteaction.h b/src/plugins/qmldesigner/designercore/model/rewriteaction.h index 4c461e8aea..a4a6a82adc 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriteaction.h +++ b/src/plugins/qmldesigner/designercore/model/rewriteaction.h @@ -50,25 +50,24 @@ public: virtual bool execute(QmlDesigner::QmlRefactoring &refactoring, ModelNodePositionStorage &positionStore) = 0; virtual QString info() const = 0; - virtual AddImportRewriteAction *asAddImportRewriteAction() { return 0; } - virtual AddPropertyRewriteAction *asAddPropertyRewriteAction() { return 0; } - virtual ChangeIdRewriteAction *asChangeIdRewriteAction() { return 0; } - virtual ChangePropertyRewriteAction *asChangePropertyRewriteAction() { return 0; } - virtual ChangeTypeRewriteAction *asChangeTypeRewriteAction() { return 0; } - virtual RemoveImportRewriteAction * asRemoveImportRewriteAction() { return 0; } - virtual RemoveNodeRewriteAction *asRemoveNodeRewriteAction() { return 0; } - virtual RemovePropertyRewriteAction *asRemovePropertyRewriteAction() { return 0; } - virtual ReparentNodeRewriteAction *asReparentNodeRewriteAction() { return 0; } - virtual MoveNodeRewriteAction *asMoveNodeRewriteAction() { return 0; } - virtual ~RewriteAction() {} + virtual AddImportRewriteAction *asAddImportRewriteAction() { return nullptr; } + virtual AddPropertyRewriteAction *asAddPropertyRewriteAction() { return nullptr; } + virtual ChangeIdRewriteAction *asChangeIdRewriteAction() { return nullptr; } + virtual ChangePropertyRewriteAction *asChangePropertyRewriteAction() { return nullptr; } + virtual ChangeTypeRewriteAction *asChangeTypeRewriteAction() { return nullptr; } + virtual RemoveImportRewriteAction *asRemoveImportRewriteAction() { return nullptr; } + virtual RemoveNodeRewriteAction *asRemoveNodeRewriteAction() { return nullptr; } + virtual RemovePropertyRewriteAction *asRemovePropertyRewriteAction() { return nullptr; } + virtual ReparentNodeRewriteAction *asReparentNodeRewriteAction() { return nullptr; } + virtual MoveNodeRewriteAction *asMoveNodeRewriteAction() { return nullptr; } + virtual ~RewriteAction() = default; protected: - RewriteAction() - {} + RewriteAction() = default; -private: - RewriteAction(const RewriteAction &); - RewriteAction &operator=(const RewriteAction&); +public: + RewriteAction(const RewriteAction&) = delete; + RewriteAction &operator=(const RewriteAction&) = delete; }; class AddPropertyRewriteAction: public RewriteAction @@ -79,10 +78,10 @@ public: m_sheduledInHierarchy(property.isValid() && property.parentModelNode().isInHierarchy()) {} - virtual bool execute(QmlDesigner::QmlRefactoring &refactoring, ModelNodePositionStorage &positionStore); - virtual QString info() const; + bool execute(QmlDesigner::QmlRefactoring &refactoring, ModelNodePositionStorage &positionStore) override; + QString info() const override; - virtual AddPropertyRewriteAction *asAddPropertyRewriteAction() { return this; } + AddPropertyRewriteAction *asAddPropertyRewriteAction() override { return this; } AbstractProperty property() const { return m_property; } @@ -111,10 +110,10 @@ public: m_node(node), m_oldId(oldId), m_newId(newId) {} - virtual bool execute(QmlDesigner::QmlRefactoring &refactoring, ModelNodePositionStorage &positionStore); - virtual QString info() const; + bool execute(QmlDesigner::QmlRefactoring &refactoring, ModelNodePositionStorage &positionStore) override; + QString info() const override; - virtual ChangeIdRewriteAction *asChangeIdRewriteAction() { return this; } + ChangeIdRewriteAction *asChangeIdRewriteAction() override { return this; } ModelNode node() const { return m_node; } @@ -133,10 +132,10 @@ public: m_sheduledInHierarchy(property.isValid() && property.parentModelNode().isInHierarchy()) {} - virtual bool execute(QmlDesigner::QmlRefactoring &refactoring, ModelNodePositionStorage &positionStore); - virtual QString info() const; + bool execute(QmlDesigner::QmlRefactoring &refactoring, ModelNodePositionStorage &positionStore) override; + QString info() const override; - virtual ChangePropertyRewriteAction *asChangePropertyRewriteAction() { return this; } + ChangePropertyRewriteAction *asChangePropertyRewriteAction() override { return this; } AbstractProperty property() const { return m_property; } @@ -165,10 +164,10 @@ public: m_node(node) {} - virtual bool execute(QmlDesigner::QmlRefactoring &refactoring, ModelNodePositionStorage &positionStore); - virtual QString info() const; + bool execute(QmlDesigner::QmlRefactoring &refactoring, ModelNodePositionStorage &positionStore) override; + QString info() const override; - virtual ChangeTypeRewriteAction *asChangeTypeRewriteAction() { return this; } + ChangeTypeRewriteAction *asChangeTypeRewriteAction() override { return this; } ModelNode node() const { return m_node; } @@ -184,10 +183,10 @@ public: m_node(node) {} - virtual bool execute(QmlDesigner::QmlRefactoring &refactoring, ModelNodePositionStorage &positionStore); - virtual QString info() const; + bool execute(QmlDesigner::QmlRefactoring &refactoring, ModelNodePositionStorage &positionStore) override; + QString info() const override; - virtual RemoveNodeRewriteAction *asRemoveNodeRewriteAction() { return this; } + RemoveNodeRewriteAction *asRemoveNodeRewriteAction() override { return this; } ModelNode node() const { return m_node; } @@ -203,10 +202,10 @@ public: m_property(property) {} - virtual bool execute(QmlDesigner::QmlRefactoring &refactoring, ModelNodePositionStorage &positionStore); - virtual QString info() const; + bool execute(QmlDesigner::QmlRefactoring &refactoring, ModelNodePositionStorage &positionStore) override; + QString info() const override; - virtual RemovePropertyRewriteAction *asRemovePropertyRewriteAction() { return this; } + RemovePropertyRewriteAction *asRemovePropertyRewriteAction() override { return this; } AbstractProperty property() const { return m_property; } @@ -222,10 +221,10 @@ public: m_node(node), m_oldParentProperty(oldParentProperty), m_targetProperty(targetProperty), m_propertyType(propertyType) {} - virtual bool execute(QmlDesigner::QmlRefactoring &refactoring, ModelNodePositionStorage &positionStore); - virtual QString info() const; + bool execute(QmlDesigner::QmlRefactoring &refactoring, ModelNodePositionStorage &positionStore) override; + QString info() const override; - virtual ReparentNodeRewriteAction *asReparentNodeRewriteAction() { return this; } + ReparentNodeRewriteAction *asReparentNodeRewriteAction() override { return this; } ModelNode reparentedNode() const { return m_node; } @@ -256,10 +255,10 @@ public: m_movingNode(movingNode), m_newTrailingNode(newTrailingNode) {} - virtual bool execute(QmlDesigner::QmlRefactoring &refactoring, ModelNodePositionStorage &positionStore); - virtual QString info() const; + bool execute(QmlDesigner::QmlRefactoring &refactoring, ModelNodePositionStorage &positionStore) override; + QString info() const override; - virtual MoveNodeRewriteAction *asMoveNodeRewriteAction() { return this; } + MoveNodeRewriteAction *asMoveNodeRewriteAction() override { return this; } private: ModelNode m_movingNode; @@ -273,10 +272,10 @@ public: m_import(import) {} - virtual bool execute(QmlDesigner::QmlRefactoring &refactoring, ModelNodePositionStorage &positionStore); - virtual QString info() const; + bool execute(QmlDesigner::QmlRefactoring &refactoring, ModelNodePositionStorage &positionStore) override; + QString info() const override; - virtual AddImportRewriteAction *asAddImportRewriteAction() { return this; } + AddImportRewriteAction *asAddImportRewriteAction() override { return this; } Import import() const { return m_import; } @@ -291,10 +290,10 @@ public: m_import(import) {} - virtual bool execute(QmlDesigner::QmlRefactoring &refactoring, ModelNodePositionStorage &positionStore); - virtual QString info() const; + bool execute(QmlDesigner::QmlRefactoring &refactoring, ModelNodePositionStorage &positionStore) override; + QString info() const override; - virtual RemoveImportRewriteAction *asRemoveImportRewriteAction() { return this; } + RemoveImportRewriteAction *asRemoveImportRewriteAction() override { return this; } Import import() const { return m_import; } diff --git a/src/plugins/qmldesigner/designercore/model/rewriteactioncompressor.cpp b/src/plugins/qmldesigner/designercore/model/rewriteactioncompressor.cpp index fef81225f4..6dac375ff7 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriteactioncompressor.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriteactioncompressor.cpp @@ -317,7 +317,7 @@ void RewriteActionCompressor::compressAddEditActions(QList<RewriteAction *> &act QmlTextGenerator gen(m_propertyOrder); foreach (RewriteAction *action, dirtyActions) { - RewriteAction *newAction = 0; + RewriteAction *newAction = nullptr; if (AddPropertyRewriteAction *addAction = action->asAddPropertyRewriteAction()) { newAction = new AddPropertyRewriteAction(addAction->property(), gen(addAction->containedModelNode()), @@ -364,7 +364,7 @@ void RewriteActionCompressor::compressAddReparentActions(QList<RewriteAction *> RewriteAction *previousAction = addedNodes[reparentAction->reparentedNode()]; actionsToRemove.append(previousAction); - RewriteAction *replacementAction = 0; + RewriteAction *replacementAction = nullptr; if (AddPropertyRewriteAction *addAction = previousAction->asAddPropertyRewriteAction()) { replacementAction = new AddPropertyRewriteAction(reparentAction->targetProperty(), addAction->valueText(), diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index ab4dba68df..f42a125555 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -70,9 +70,7 @@ RewriterView::RewriterView(DifferenceHandling differenceHandling, QObject *paren connect(&m_amendTimer, &QTimer::timeout, this, &RewriterView::amendQmlText); } -RewriterView::~RewriterView() -{ -} +RewriterView::~RewriterView() = default; Internal::ModelToTextMerger *RewriterView::modelToTextMerger() const { @@ -470,7 +468,7 @@ QString RewriterView::auxiliaryDataAsQML() const QString str = "Designer {\n "; int columnCount = 0; - for (const auto node : allModelNodes()) { + for (const auto &node : allModelNodes()) { QHash<PropertyName, QVariant> data = node.auxiliaryData(); if (!data.isEmpty()) { hasAuxData = true; @@ -920,13 +918,11 @@ QString RewriterView::getRawAuxiliaryData() const const QString oldText = m_textModifier->text(); - QString newText = oldText; - - int startIndex = newText.indexOf(annotationsStart()); - int endIndex = newText.indexOf(annotationsEnd()); + int startIndex = oldText.indexOf(annotationsStart()); + int endIndex = oldText.indexOf(annotationsEnd()); if (startIndex > 0 && endIndex > 0) - return newText.mid(startIndex, endIndex - startIndex + annotationsEnd().length()); + return oldText.mid(startIndex, endIndex - startIndex + annotationsEnd().length()); return {}; } @@ -959,14 +955,14 @@ void RewriterView::writeAuxiliaryData() changeSet.apply(&tc); } -static void checkNode(QmlJS::SimpleReaderNode::Ptr node, RewriterView *view); +static void checkNode(const QmlJS::SimpleReaderNode::Ptr &node, RewriterView *view); -static void checkChildNodes(QmlJS::SimpleReaderNode::Ptr node, RewriterView *view) +static void checkChildNodes(const QmlJS::SimpleReaderNode::Ptr &node, RewriterView *view) { if (!node) return; - for (auto child : node->children()) + for (const auto &child : node->children()) checkNode(child, view); } @@ -977,7 +973,7 @@ static QString fixUpIllegalChars(const QString &str) return ret; } -static void checkNode(QmlJS::SimpleReaderNode::Ptr node, RewriterView *view) +static void checkNode(const QmlJS::SimpleReaderNode::Ptr &node, RewriterView *view) { if (!node) return; diff --git a/src/plugins/qmldesigner/designercore/model/signalhandlerproperty.cpp b/src/plugins/qmldesigner/designercore/model/signalhandlerproperty.cpp index 3ad9280e7a..e1701a0b71 100644 --- a/src/plugins/qmldesigner/designercore/model/signalhandlerproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/signalhandlerproperty.cpp @@ -33,9 +33,7 @@ #include "model_p.h" namespace QmlDesigner { -SignalHandlerProperty::SignalHandlerProperty() -{ -} +SignalHandlerProperty::SignalHandlerProperty() = default; SignalHandlerProperty::SignalHandlerProperty(const SignalHandlerProperty &property, AbstractView *view) : AbstractProperty(property.name(), property.internalNode(), property.model(), view) diff --git a/src/plugins/qmldesigner/designercore/model/textmodifier.cpp b/src/plugins/qmldesigner/designercore/model/textmodifier.cpp index 9016619f6d..8653f5efd9 100644 --- a/src/plugins/qmldesigner/designercore/model/textmodifier.cpp +++ b/src/plugins/qmldesigner/designercore/model/textmodifier.cpp @@ -31,9 +31,7 @@ using namespace QmlDesigner; -TextModifier::~TextModifier() -{ -} +TextModifier::~TextModifier() = default; int TextModifier::getLineInDocument(QTextDocument *document, int offset) { diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 9066a65d7e..df9fbb0b94 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -68,12 +68,12 @@ static Q_LOGGING_CATEGORY(rewriterBenchmark, "qtc.rewriter.load") namespace { -static inline bool isSupportedAttachedProperties(const QString &propertyName) +bool isSupportedAttachedProperties(const QString &propertyName) { return propertyName.startsWith(QLatin1String("Layout.")); } -static inline QStringList supportedVersionsList() +QStringList supportedVersionsList() { static const QStringList list = { "2.0", "2.1", "2.2", "2.3", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11" @@ -81,7 +81,7 @@ static inline QStringList supportedVersionsList() return list; } -static inline QStringList globalQtEnums() +QStringList globalQtEnums() { static const QStringList list = { "Horizontal", "Vertical", "AlignVCenter", "AlignLeft", "LeftToRight", "RightToLeft", @@ -93,7 +93,7 @@ static inline QStringList globalQtEnums() return list; } -static inline QStringList knownEnumScopes() +QStringList knownEnumScopes() { static const QStringList list = { "TextInput", "TextEdit", "Material", "Universal", "Font", "Shape", "ShapePath", "AbstractButton" @@ -101,12 +101,12 @@ static inline QStringList knownEnumScopes() return list; } -static inline bool supportedQtQuickVersion(const QString &version) +bool supportedQtQuickVersion(const QString &version) { return supportedVersionsList().contains(version); } -static inline QString stripQuotes(const QString &str) +QString stripQuotes(const QString &str) { if ((str.startsWith(QLatin1Char('"')) && str.endsWith(QLatin1Char('"'))) || (str.startsWith(QLatin1Char('\'')) && str.endsWith(QLatin1Char('\'')))) @@ -115,7 +115,7 @@ static inline QString stripQuotes(const QString &str) return str; } -static inline QString deEscape(const QString &value) +inline QString deEscape(const QString &value) { QString result = value; @@ -128,7 +128,7 @@ static inline QString deEscape(const QString &value) return result; } -static inline unsigned char convertHex(ushort c) +unsigned char convertHex(ushort c) { if (c >= '0' && c <= '9') return (c - '0'); @@ -145,7 +145,7 @@ QChar convertUnicode(ushort c1, ushort c2, (convertHex(c1) << 4) + convertHex(c2)); } -static inline bool isHexDigit(ushort c) +bool isHexDigit(ushort c) { return ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') @@ -153,7 +153,7 @@ static inline bool isHexDigit(ushort c) } -static inline QString fixEscapedUnicodeChar(const QString &value) //convert "\u2939" +QString fixEscapedUnicodeChar(const QString &value) //convert "\u2939" { if (value.count() == 6 && value.at(0) == QLatin1Char('\\') && value.at(1) == QLatin1Char('u') && isHexDigit(value.at(2).unicode()) && isHexDigit(value.at(3).unicode()) && @@ -163,7 +163,7 @@ static inline QString fixEscapedUnicodeChar(const QString &value) //convert "\u2 return value; } -static inline bool isSignalPropertyName(const QString &signalName) +bool isSignalPropertyName(const QString &signalName) { if (signalName.isEmpty()) return false; @@ -175,7 +175,7 @@ static inline bool isSignalPropertyName(const QString &signalName) pureSignalName.at(2).isLetter(); } -static inline QVariant cleverConvert(const QString &value) +QVariant cleverConvert(const QString &value) { if (value == QLatin1String("true")) return QVariant(true); @@ -191,15 +191,15 @@ static inline QVariant cleverConvert(const QString &value) return QVariant(value); } -static bool isLiteralValue(AST::ExpressionNode *expr) +bool isLiteralValue(AST::ExpressionNode *expr) { if (AST::cast<AST::NumericLiteral*>(expr)) return true; - else if (AST::cast<AST::StringLiteral*>(expr)) + if (AST::cast<AST::StringLiteral*>(expr)) return true; - else if (AST::UnaryPlusExpression *plusExpr = AST::cast<AST::UnaryPlusExpression*>(expr)) + else if (auto plusExpr = AST::cast<AST::UnaryPlusExpression*>(expr)) return isLiteralValue(plusExpr->expression); - else if (AST::UnaryMinusExpression *minusExpr = AST::cast<AST::UnaryMinusExpression*>(expr)) + else if (auto minusExpr = AST::cast<AST::UnaryMinusExpression*>(expr)) return isLiteralValue(minusExpr->expression); else if (AST::cast<AST::TrueLiteral*>(expr)) return true; @@ -209,16 +209,16 @@ static bool isLiteralValue(AST::ExpressionNode *expr) return false; } -static bool isLiteralValue(AST::Statement *stmt) +bool isLiteralValue(AST::Statement *stmt) { - AST::ExpressionStatement *exprStmt = AST::cast<AST::ExpressionStatement *>(stmt); + auto exprStmt = AST::cast<AST::ExpressionStatement *>(stmt); if (exprStmt) return isLiteralValue(exprStmt->expression); else return false; } -static inline bool isLiteralValue(AST::UiScriptBinding *script) +bool isLiteralValue(AST::UiScriptBinding *script) { if (!script || !script->statement) return false; @@ -226,7 +226,7 @@ static inline bool isLiteralValue(AST::UiScriptBinding *script) return isLiteralValue(script->statement); } -static inline int propertyType(const QString &typeName) +int propertyType(const QString &typeName) { if (typeName == QStringLiteral("bool")) return QMetaType::type("bool"); @@ -250,7 +250,7 @@ static inline int propertyType(const QString &typeName) return -1; } -static inline QVariant convertDynamicPropertyValueToVariant(const QString &astValue, +QVariant convertDynamicPropertyValueToVariant(const QString &astValue, const QString &astType) { const QString cleanedValue = fixEscapedUnicodeChar(deEscape(stripQuotes(astValue.trimmed()))); @@ -271,12 +271,12 @@ static inline QVariant convertDynamicPropertyValueToVariant(const QString &astVa } } -static bool isListElementType(const QmlDesigner::TypeName &type) +bool isListElementType(const QmlDesigner::TypeName &type) { return type == "ListElement" || type == "QtQuick.ListElement" || type == "Qt.ListElement"; } -static bool isComponentType(const QmlDesigner::TypeName &type) +bool isComponentType(const QmlDesigner::TypeName &type) { return type == "Component" || type == "Qt.Component" @@ -285,7 +285,7 @@ static bool isComponentType(const QmlDesigner::TypeName &type) || type == "QQmlComponent"; } -static bool isCustomParserType(const QmlDesigner::TypeName &type) +bool isCustomParserType(const QmlDesigner::TypeName &type) { return type == "QtQuick.VisualItemModel" || type == "Qt.VisualItemModel" || type == "QtQuick.VisualDataModel" || type == "Qt.VisualDataModel" || @@ -294,17 +294,17 @@ static bool isCustomParserType(const QmlDesigner::TypeName &type) } -static bool isPropertyChangesType(const QmlDesigner::TypeName &type) +bool isPropertyChangesType(const QmlDesigner::TypeName &type) { return type == "PropertyChanges" || type == "QtQuick.PropertyChanges" || type == "Qt.PropertyChanges"; } -static bool isConnectionsType(const QmlDesigner::TypeName &type) +bool isConnectionsType(const QmlDesigner::TypeName &type) { return type == "Connections" || type == "QtQuick.Connections" || type == "Qt.Connections"; } -static bool propertyIsComponentType(const QmlDesigner::NodeAbstractProperty &property, const QmlDesigner::TypeName &type, QmlDesigner::Model *model) +bool propertyIsComponentType(const QmlDesigner::NodeAbstractProperty &property, const QmlDesigner::TypeName &type, QmlDesigner::Model *model) { if (model->metaInfo(type).isSubclassOf("QtQuick.Component") && !isComponentType(type)) return false; //If the type is already a subclass of Component keep it @@ -313,7 +313,7 @@ static bool propertyIsComponentType(const QmlDesigner::NodeAbstractProperty &pro isComponentType(property.parentModelNode().metaInfo().propertyTypeName(property.name())); } -static inline QString extractComponentFromQml(const QString &source) +QString extractComponentFromQml(const QString &source) { if (source.isEmpty()) return QString(); @@ -336,7 +336,7 @@ static inline QString extractComponentFromQml(const QString &source) return result; } -static QString normalizeJavaScriptExpression(const QString &expression) +QString normalizeJavaScriptExpression(const QString &expression) { static const QRegularExpression regExp("\\n(\\s)+"); @@ -344,11 +344,44 @@ static QString normalizeJavaScriptExpression(const QString &expression) return result.replace(regExp, "\n"); } -static bool compareJavaScriptExpression(const QString &expression1, const QString &expression2) +bool compareJavaScriptExpression(const QString &expression1, const QString &expression2) { return normalizeJavaScriptExpression(expression1) == normalizeJavaScriptExpression(expression2); } +bool smartVeryFuzzyCompare(const QVariant &value1, const QVariant &value2) +{ //we ignore slight changes on doubles and only check three digits + if ((value1.type() == QVariant::Double) || (value2.type() == QVariant::Double)) { + bool ok1, ok2; + qreal a = value1.toDouble(&ok1); + qreal b = value2.toDouble(&ok2); + + if (!ok1 || !ok2) + return false; + + if (qFuzzyCompare(a, b)) + return true; + + int ai = qRound(a * 1000); + int bi = qRound(b * 1000); + + if (qFuzzyCompare((qreal(ai) / 1000), (qreal(bi) / 1000))) + return true; + } + return false; +} + +bool equals(const QVariant &a, const QVariant &b) +{ + if (a.canConvert<QmlDesigner::Enumeration>() && b.canConvert<QmlDesigner::Enumeration>()) + return a.value<QmlDesigner::Enumeration>().toString() == b.value<QmlDesigner::Enumeration>().toString(); + if (a == b) + return true; + if (smartVeryFuzzyCompare(a, b)) + return true; + return false; +} + } // anonymous namespace namespace QmlDesigner { @@ -368,8 +401,7 @@ public: { } - ~ReadingContext() - {} + ~ReadingContext() = default; Document::Ptr doc() const { return m_doc; } @@ -436,7 +468,8 @@ public: /// When something is changed here, also change Check::checkScopeObjectMember in /// qmljscheck.cpp /// ### Maybe put this into the context as a helper function. - bool lookupProperty(const QString &prefix, const AST::UiQualifiedId *id, const Value **property = 0, const ObjectValue **parentObject = 0, QString *name = 0) + bool lookupProperty(const QString &prefix, const AST::UiQualifiedId *id, const Value **property = nullptr, + const ObjectValue **parentObject = nullptr, QString *name = nullptr) { QList<const ObjectValue *> scopeObjects = m_scopeChain.qmlScopeObjects(); if (scopeObjects.isEmpty()) @@ -472,8 +505,8 @@ public: return false; // global lookup for first part of id - const ObjectValue *objectValue = 0; - const Value *value = 0; + const ObjectValue *objectValue = nullptr; + const Value *value = nullptr; for (int i = scopeObjects.size() - 1; i >= 0; --i) { objectValue = scopeObjects[i]; value = objectValue->lookupMember(propertyName, m_context); @@ -560,8 +593,8 @@ public: { const bool hasQuotes = astValue.trimmed().left(1) == QStringLiteral("\"") && astValue.trimmed().right(1) == QStringLiteral("\""); const QString cleanedValue = fixEscapedUnicodeChar(deEscape(stripQuotes(astValue.trimmed()))); - const Value *property = 0; - const ObjectValue *containingObject = 0; + const Value *property = nullptr; + const ObjectValue *containingObject = nullptr; QString name; if (!lookupProperty(propertyPrefix, propertyId, &property, &containingObject, &name)) { qWarning() << Q_FUNC_INFO << "Unknown property" << propertyPrefix + QLatin1Char('.') + toString(propertyId) @@ -623,13 +656,13 @@ public: return QVariant::fromValue(Enumeration(astValue)); } - AST::ExpressionStatement *eStmt = AST::cast<AST::ExpressionStatement *>(rhs); + auto eStmt = AST::cast<AST::ExpressionStatement *>(rhs); if (!eStmt || !eStmt->expression) return QVariant(); - const ObjectValue *containingObject = 0; + const ObjectValue *containingObject = nullptr; QString name; - if (!lookupProperty(propertyPrefix, propertyId, 0, &containingObject, &name)) + if (!lookupProperty(propertyPrefix, propertyId, nullptr, &containingObject, &name)) return QVariant(); if (containingObject) @@ -639,14 +672,14 @@ public: return QVariant(); const QString lhsPropertyTypeName = lhsCppComponent->propertyType(name); - const ObjectValue *rhsValueObject = 0; + const ObjectValue *rhsValueObject = nullptr; QString rhsValueName; - if (AST::IdentifierExpression *idExp = AST::cast<AST::IdentifierExpression *>(eStmt->expression)) { + if (auto idExp = AST::cast<AST::IdentifierExpression *>(eStmt->expression)) { if (!m_scopeChain.qmlScopeObjects().isEmpty()) rhsValueObject = m_scopeChain.qmlScopeObjects().constLast(); if (!idExp->name.isEmpty()) rhsValueName = idExp->name.toString(); - } else if (AST::FieldMemberExpression *memberExp = AST::cast<AST::FieldMemberExpression *>(eStmt->expression)) { + } else if (auto memberExp = AST::cast<AST::FieldMemberExpression *>(eStmt->expression)) { Evaluate evaluate(&m_scopeChain); const Value *result = evaluate(memberExp->base); rhsValueObject = result->asObjectValue(); @@ -689,40 +722,6 @@ private: using namespace QmlDesigner; using namespace QmlDesigner::Internal; - -static inline bool smartVeryFuzzyCompare(QVariant value1, QVariant value2) -{ //we ignore slight changes on doubles and only check three digits - if ((value1.type() == QVariant::Double) || (value2.type() == QVariant::Double)) { - bool ok1, ok2; - qreal a = value1.toDouble(&ok1); - qreal b = value2.toDouble(&ok2); - - if (!ok1 || !ok2) - return false; - - if (qFuzzyCompare(a, b)) - return true; - - int ai = qRound(a * 1000); - int bi = qRound(b * 1000); - - if (qFuzzyCompare((qreal(ai) / 1000), (qreal(bi) / 1000))) - return true; - } - return false; -} - -static inline bool equals(const QVariant &a, const QVariant &b) -{ - if (a.canConvert<Enumeration>() && b.canConvert<Enumeration>()) - return a.value<Enumeration>().toString() == b.value<Enumeration>().toString(); - if (a == b) - return true; - if (smartVeryFuzzyCompare(a, b)) - return true; - return false; -} - TextToModelMerger::TextToModelMerger(RewriterView *reWriterView) : m_rewriterView(reWriterView), m_isActive(false) @@ -748,7 +747,7 @@ void TextToModelMerger::setupImports(const Document::Ptr &doc, QList<Import> existingImports = m_rewriterView->model()->imports(); for (AST::UiHeaderItemList *iter = doc->qmlProgram()->headers; iter; iter = iter->next) { - AST::UiImport *import = AST::cast<AST::UiImport *>(iter->headerItem); + auto import = AST::cast<AST::UiImport *>(iter->headerItem); if (!import) continue; @@ -1022,7 +1021,7 @@ bool TextToModelMerger::load(const QString &data, DifferenceHandler &differenceH } setupUsedImports(); - AST::UiObjectMember *astRootNode = 0; + AST::UiObjectMember *astRootNode = nullptr; if (AST::UiProgram *program = m_document->qmlProgram()) if (program->members) astRootNode = program->members->member; @@ -1081,7 +1080,7 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, if (modelNode.isRootNode() && isComponentType(typeName)) { for (AST::UiObjectMemberList *iter = astInitializer->members; iter; iter = iter->next) { - if (AST::UiObjectDefinition *def = AST::cast<AST::UiObjectDefinition *>(iter->member)) { + if (auto def = AST::cast<AST::UiObjectDefinition *>(iter->member)) { syncNode(modelNode, def, context, differenceHandler); return; } @@ -1120,7 +1119,7 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, if (!member) continue; - if (AST::UiArrayBinding *array = AST::cast<AST::UiArrayBinding *>(member)) { + if (auto array = AST::cast<AST::UiArrayBinding *>(member)) { const QString astPropertyName = toString(array->qualifiedId); if (isPropertyChangesType(typeName) || isConnectionsType(typeName) || context->lookupProperty(QString(), array->qualifiedId)) { AbstractProperty modelProperty = modelNode.property(astPropertyName.toUtf8()); @@ -1135,7 +1134,7 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, qWarning() << "Skipping invalid array property" << astPropertyName << "for node type" << modelNode.type(); } - } else if (AST::UiObjectDefinition *def = AST::cast<AST::UiObjectDefinition *>(member)) { + } else if (auto def = AST::cast<AST::UiObjectDefinition *>(member)) { const QString &name = def->qualifiedTypeNameId->name.toString(); if (name.isEmpty() || !name.at(0).isUpper()) { QStringList props = syncGroupedProperties(modelNode, @@ -1148,13 +1147,13 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, } else { defaultPropertyItems.append(member); } - } else if (AST::UiObjectBinding *binding = AST::cast<AST::UiObjectBinding *>(member)) { + } else if (auto binding = AST::cast<AST::UiObjectBinding *>(member)) { const QString astPropertyName = toString(binding->qualifiedId); if (binding->hasOnToken) { // skip value sources } else { - const Value *propertyType = 0; - const ObjectValue *containingObject = 0; + const Value *propertyType = nullptr; + const ObjectValue *containingObject = nullptr; QString name; if (context->lookupProperty(QString(), binding->qualifiedId, &propertyType, &containingObject, &name) || isPropertyChangesType(typeName) @@ -1173,9 +1172,9 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, modelPropertyNames.remove(astPropertyName.toUtf8()); } } - } else if (AST::UiScriptBinding *script = AST::cast<AST::UiScriptBinding *>(member)) { + } else if (auto script = AST::cast<AST::UiScriptBinding *>(member)) { modelPropertyNames.remove(syncScriptBinding(modelNode, QString(), script, context, differenceHandler)); - } else if (AST::UiPublicMember *property = AST::cast<AST::UiPublicMember *>(member)) { + } else if (auto property = AST::cast<AST::UiPublicMember *>(member)) { if (property->type == AST::UiPublicMember::Signal) continue; // QML designer doesn't support this yet. @@ -1198,7 +1197,7 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, AbstractProperty modelProperty = modelNode.property(astName.toUtf8()); if (property->binding) { - if (AST::UiObjectBinding *binding = AST::cast<AST::UiObjectBinding *>(property->binding)) + if (auto binding = AST::cast<AST::UiObjectBinding *>(property->binding)) syncNodeProperty(modelProperty, binding, context, astType, differenceHandler); else qWarning() << "Arrays are not yet supported"; @@ -1251,7 +1250,7 @@ static QVariant parsePropertyExpression(AST::ExpressionNode *expressionNode) { Q_ASSERT(expressionNode); - AST::ArrayLiteral *arrayLiteral = AST::cast<AST::ArrayLiteral *>(expressionNode); + auto arrayLiteral = AST::cast<AST::ArrayLiteral *>(expressionNode); if (arrayLiteral) { QList<QVariant> variantList; @@ -1260,19 +1259,19 @@ static QVariant parsePropertyExpression(AST::ExpressionNode *expressionNode) return variantList; } - AST::StringLiteral *stringLiteral = AST::cast<AST::StringLiteral *>(expressionNode); + auto stringLiteral = AST::cast<AST::StringLiteral *>(expressionNode); if (stringLiteral) return stringLiteral->value.toString(); - AST::TrueLiteral *trueLiteral = AST::cast<AST::TrueLiteral *>(expressionNode); + auto trueLiteral = AST::cast<AST::TrueLiteral *>(expressionNode); if (trueLiteral) return true; - AST::FalseLiteral *falseLiteral = AST::cast<AST::FalseLiteral *>(expressionNode); + auto falseLiteral = AST::cast<AST::FalseLiteral *>(expressionNode); if (falseLiteral) return false; - AST::NumericLiteral *numericLiteral = AST::cast<AST::NumericLiteral *>(expressionNode); + auto numericLiteral = AST::cast<AST::NumericLiteral *>(expressionNode); if (numericLiteral) return numericLiteral->value; @@ -1284,7 +1283,7 @@ QVariant parsePropertyScriptBinding(AST::UiScriptBinding *uiScriptBinding) { Q_ASSERT(uiScriptBinding); - AST::ExpressionStatement *expStmt = AST::cast<AST::ExpressionStatement *>(uiScriptBinding->statement); + auto expStmt = AST::cast<AST::ExpressionStatement *>(uiScriptBinding->statement); if (!expStmt) return QVariant(); @@ -1596,7 +1595,7 @@ QStringList TextToModelMerger::syncGroupedProperties(ModelNode &modelNode, for (AST::UiObjectMemberList *iter = members; iter; iter = iter->next) { AST::UiObjectMember *member = iter->member; - if (AST::UiScriptBinding *script = AST::cast<AST::UiScriptBinding *>(member)) { + if (auto script = AST::cast<AST::UiScriptBinding *>(member)) { const QString prop = QString::fromLatin1(syncScriptBinding(modelNode, name, script, context, differenceHandler)); if (!prop.isEmpty()) props.append(prop); @@ -1881,12 +1880,12 @@ ModelNode ModelAmender::listPropertyMissingModelNode(NodeListProperty &modelProp ReadingContext *context, AST::UiObjectMember *arrayMember) { - AST::UiQualifiedId *astObjectType = 0; - AST::UiObjectInitializer *astInitializer = 0; - if (AST::UiObjectDefinition *def = AST::cast<AST::UiObjectDefinition *>(arrayMember)) { + AST::UiQualifiedId *astObjectType = nullptr; + AST::UiObjectInitializer *astInitializer = nullptr; + if (auto def = AST::cast<AST::UiObjectDefinition *>(arrayMember)) { astObjectType = def->qualifiedTypeNameId; astInitializer = def->initializer; - } else if (AST::UiObjectBinding *bin = AST::cast<AST::UiObjectBinding *>(arrayMember)) { + } else if (auto bin = AST::cast<AST::UiObjectBinding *>(arrayMember)) { astObjectType = bin->qualifiedTypeNameId; astInitializer = bin->initializer; } diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h index 4eebae3b85..82def3927f 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h @@ -167,8 +167,7 @@ public: DifferenceHandler(TextToModelMerger *textToModelMerger): m_merger(textToModelMerger) {} - virtual ~DifferenceHandler() - {} + virtual ~DifferenceHandler() = default; virtual void modelMissesImport(const QmlDesigner::Import &import) = 0; virtual void importAbsentInQMl(const QmlDesigner::Import &import) = 0; @@ -219,48 +218,47 @@ public: ModelValidator(TextToModelMerger *textToModelMerger): DifferenceHandler(textToModelMerger) {} - ~ModelValidator() - {} - - virtual void modelMissesImport(const QmlDesigner::Import &import); - virtual void importAbsentInQMl(const QmlDesigner::Import &import); - virtual void bindingExpressionsDiffer(BindingProperty &modelProperty, - const QString &javascript, - const TypeName &astType); - virtual void shouldBeBindingProperty(AbstractProperty &modelProperty, - const QString &javascript, - const TypeName &astType); - virtual void signalHandlerSourceDiffer(SignalHandlerProperty &modelProperty, - const QString &javascript); - virtual void shouldBeSignalHandlerProperty(AbstractProperty &modelProperty, - const QString &javascript); - virtual void shouldBeNodeListProperty(AbstractProperty &modelProperty, - const QList<QmlJS::AST::UiObjectMember *> arrayMembers, - ReadingContext *context); - virtual void variantValuesDiffer(VariantProperty &modelProperty, const QVariant &qmlVariantValue, const TypeName &dynamicTypeName); - virtual void shouldBeVariantProperty(AbstractProperty &modelProperty, const QVariant &qmlVariantValue, const TypeName &dynamicTypeName); - virtual void shouldBeNodeProperty(AbstractProperty &modelProperty, - const TypeName &typeName, - int majorVersion, - int minorVersion, - QmlJS::AST::UiObjectMember *astNode, - const TypeName &dynamicPropertyType, - ReadingContext *context); - - virtual void modelNodeAbsentFromQml(ModelNode &modelNode); - virtual ModelNode listPropertyMissingModelNode(NodeListProperty &modelProperty, - ReadingContext *context, - QmlJS::AST::UiObjectMember *arrayMember); - virtual void typeDiffers(bool isRootNode, - ModelNode &modelNode, - const TypeName &typeName, - int majorVersion, - int minorVersion, - QmlJS::AST::UiObjectMember *astNode, - ReadingContext *context); - virtual void propertyAbsentFromQml(AbstractProperty &modelProperty); - virtual void idsDiffer(ModelNode &modelNode, const QString &qmlId); - virtual bool isValidator() const {return false; } + ~ModelValidator() override = default; + + void modelMissesImport(const QmlDesigner::Import &import) override; + void importAbsentInQMl(const QmlDesigner::Import &import) override; + void bindingExpressionsDiffer(BindingProperty &modelProperty, + const QString &javascript, + const TypeName &astType) override; + void shouldBeBindingProperty(AbstractProperty &modelProperty, + const QString &javascript, + const TypeName &astType) override; + void signalHandlerSourceDiffer(SignalHandlerProperty &modelProperty, + const QString &javascript) override; + void shouldBeSignalHandlerProperty(AbstractProperty &modelProperty, + const QString &javascript) override; + void shouldBeNodeListProperty(AbstractProperty &modelProperty, + const QList<QmlJS::AST::UiObjectMember *> arrayMembers, + ReadingContext *context) override; + void variantValuesDiffer(VariantProperty &modelProperty, const QVariant &qmlVariantValue, const TypeName &dynamicTypeName) override; + void shouldBeVariantProperty(AbstractProperty &modelProperty, const QVariant &qmlVariantValue, const TypeName &dynamicTypeName) override; + void shouldBeNodeProperty(AbstractProperty &modelProperty, + const TypeName &typeName, + int majorVersion, + int minorVersion, + QmlJS::AST::UiObjectMember *astNode, + const TypeName &dynamicPropertyType, + ReadingContext *context) override; + + void modelNodeAbsentFromQml(ModelNode &modelNode) override; + ModelNode listPropertyMissingModelNode(NodeListProperty &modelProperty, + ReadingContext *context, + QmlJS::AST::UiObjectMember *arrayMember) override; + void typeDiffers(bool isRootNode, + ModelNode &modelNode, + const TypeName &typeName, + int majorVersion, + int minorVersion, + QmlJS::AST::UiObjectMember *astNode, + ReadingContext *context) override; + void propertyAbsentFromQml(AbstractProperty &modelProperty) override; + void idsDiffer(ModelNode &modelNode, const QString &qmlId) override; + bool isValidator() const override {return false; } }; class ModelAmender: public DifferenceHandler @@ -269,48 +267,47 @@ public: ModelAmender(TextToModelMerger *textToModelMerger): DifferenceHandler(textToModelMerger) {} - ~ModelAmender() - {} - - virtual void modelMissesImport(const QmlDesigner::Import &import); - virtual void importAbsentInQMl(const QmlDesigner::Import &import); - virtual void bindingExpressionsDiffer(BindingProperty &modelProperty, - const QString &javascript, - const TypeName &astType); - virtual void shouldBeBindingProperty(AbstractProperty &modelProperty, - const QString &javascript, - const TypeName &astType); - virtual void signalHandlerSourceDiffer(SignalHandlerProperty &modelProperty, - const QString &javascript); - virtual void shouldBeSignalHandlerProperty(AbstractProperty &modelProperty, - const QString &javascript); - virtual void shouldBeNodeListProperty(AbstractProperty &modelProperty, - const QList<QmlJS::AST::UiObjectMember *> arrayMembers, - ReadingContext *context); - virtual void variantValuesDiffer(VariantProperty &modelProperty, const QVariant &qmlVariantValue, const TypeName &dynamicType); - virtual void shouldBeVariantProperty(AbstractProperty &modelProperty, const QVariant &qmlVariantValue, const TypeName &dynamicTypeName); - virtual void shouldBeNodeProperty(AbstractProperty &modelProperty, - const TypeName &typeName, - int majorVersion, - int minorVersion, - QmlJS::AST::UiObjectMember *astNode, - const TypeName &dynamicPropertyType, - ReadingContext *context); - - virtual void modelNodeAbsentFromQml(ModelNode &modelNode); - virtual ModelNode listPropertyMissingModelNode(NodeListProperty &modelProperty, - ReadingContext *context, - QmlJS::AST::UiObjectMember *arrayMember); - virtual void typeDiffers(bool isRootNode, - ModelNode &modelNode, - const TypeName &typeName, - int majorVersion, - int minorVersion, - QmlJS::AST::UiObjectMember *astNode, - ReadingContext *context); - virtual void propertyAbsentFromQml(AbstractProperty &modelProperty); - virtual void idsDiffer(ModelNode &modelNode, const QString &qmlId); - virtual bool isValidator() const {return true; } + ~ModelAmender() override = default; + + void modelMissesImport(const QmlDesigner::Import &import) override; + void importAbsentInQMl(const QmlDesigner::Import &import) override; + void bindingExpressionsDiffer(BindingProperty &modelProperty, + const QString &javascript, + const TypeName &astType) override; + void shouldBeBindingProperty(AbstractProperty &modelProperty, + const QString &javascript, + const TypeName &astType) override; + void signalHandlerSourceDiffer(SignalHandlerProperty &modelProperty, + const QString &javascript) override; + void shouldBeSignalHandlerProperty(AbstractProperty &modelProperty, + const QString &javascript) override; + void shouldBeNodeListProperty(AbstractProperty &modelProperty, + const QList<QmlJS::AST::UiObjectMember *> arrayMembers, + ReadingContext *context) override; + void variantValuesDiffer(VariantProperty &modelProperty, const QVariant &qmlVariantValue, const TypeName &dynamicType) override; + void shouldBeVariantProperty(AbstractProperty &modelProperty, const QVariant &qmlVariantValue, const TypeName &dynamicTypeName) override; + void shouldBeNodeProperty(AbstractProperty &modelProperty, + const TypeName &typeName, + int majorVersion, + int minorVersion, + QmlJS::AST::UiObjectMember *astNode, + const TypeName &dynamicPropertyType, + ReadingContext *context) override; + + void modelNodeAbsentFromQml(ModelNode &modelNode) override; + ModelNode listPropertyMissingModelNode(NodeListProperty &modelProperty, + ReadingContext *context, + QmlJS::AST::UiObjectMember *arrayMember) override; + void typeDiffers(bool isRootNode, + ModelNode &modelNode, + const TypeName &typeName, + int majorVersion, + int minorVersion, + QmlJS::AST::UiObjectMember *astNode, + ReadingContext *context) override; + void propertyAbsentFromQml(AbstractProperty &modelProperty) override; + void idsDiffer(ModelNode &modelNode, const QString &qmlId) override; + bool isValidator() const override {return true; } }; } //Internal diff --git a/src/plugins/qmldesigner/designercore/model/variantproperty.cpp b/src/plugins/qmldesigner/designercore/model/variantproperty.cpp index dbdf1bb74e..03c4f5acbf 100644 --- a/src/plugins/qmldesigner/designercore/model/variantproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/variantproperty.cpp @@ -35,8 +35,7 @@ namespace QmlDesigner { -VariantProperty::VariantProperty() -{} +VariantProperty::VariantProperty() = default; VariantProperty::VariantProperty(const VariantProperty &property, AbstractView *view) : AbstractProperty(property.name(), property.internalNode(), property.model(), view) diff --git a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp index 9fca067862..3c35c36f84 100644 --- a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp +++ b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp @@ -143,7 +143,7 @@ void ViewManager::detachRewriterView() { if (RewriterView *view = currentDesignDocument()->rewriterView()) { view->deactivateTextMofifierChangeSignals(); - currentModel()->setRewriterView(0); + currentModel()->setRewriterView(nullptr); } } @@ -205,7 +205,7 @@ void ViewManager::detachViewsExceptRewriterAndComponetView() if (d->debugView.isAttached()) currentModel()->detachView(&d->debugView); - currentModel()->setNodeInstanceView(0); + currentModel()->setNodeInstanceView(nullptr); } void ViewManager::attachItemLibraryView() @@ -374,13 +374,13 @@ QWidget *ViewManager::widget(const QString &uniqueId) const void ViewManager::disableWidgets() { - for (auto view : views()) + for (const auto &view : views()) view->disableWidget(); } void ViewManager::enableWidgets() { - for (auto view : views()) + for (const auto &view : views()) view->enableWidget(); } diff --git a/src/plugins/qmldesigner/designercore/pluginmanager/widgetpluginmanager.cpp b/src/plugins/qmldesigner/designercore/pluginmanager/widgetpluginmanager.cpp index cae792a456..2b3b5c81c5 100644 --- a/src/plugins/qmldesigner/designercore/pluginmanager/widgetpluginmanager.cpp +++ b/src/plugins/qmldesigner/designercore/pluginmanager/widgetpluginmanager.cpp @@ -37,9 +37,7 @@ namespace QmlDesigner { namespace Internal { -WidgetPluginManager::WidgetPluginManager() -{ -} +WidgetPluginManager::WidgetPluginManager() = default; WidgetPluginManager::IWidgetPluginList WidgetPluginManager::instances() { @@ -63,7 +61,7 @@ bool WidgetPluginManager::addPath(const QString &path) QAbstractItemModel *WidgetPluginManager::createModel(QObject *parent) { - QStandardItemModel *model = new QStandardItemModel(parent); + auto model = new QStandardItemModel(parent); const auto end = m_paths.end(); for (auto it = m_paths.begin(); it != end; ++it) model->appendRow(it->createModelItem()); diff --git a/src/plugins/qmldesigner/designercore/pluginmanager/widgetpluginmanager.h b/src/plugins/qmldesigner/designercore/pluginmanager/widgetpluginmanager.h index 2955ef9bfd..854da511c3 100644 --- a/src/plugins/qmldesigner/designercore/pluginmanager/widgetpluginmanager.h +++ b/src/plugins/qmldesigner/designercore/pluginmanager/widgetpluginmanager.h @@ -49,9 +49,9 @@ namespace Internal { class WidgetPluginManager { Q_DISABLE_COPY(WidgetPluginManager) - typedef QList<WidgetPluginPath> PluginPathList; + using PluginPathList = QList<WidgetPluginPath>; public: - typedef QList<IWidgetPlugin *> IWidgetPluginList; + using IWidgetPluginList = QList<IWidgetPlugin *>; WidgetPluginManager(); diff --git a/src/plugins/qmldesigner/designercore/pluginmanager/widgetpluginpath.cpp b/src/plugins/qmldesigner/designercore/pluginmanager/widgetpluginpath.cpp index 6904417759..968a2e8bc3 100644 --- a/src/plugins/qmldesigner/designercore/pluginmanager/widgetpluginpath.cpp +++ b/src/plugins/qmldesigner/designercore/pluginmanager/widgetpluginpath.cpp @@ -52,11 +52,11 @@ static IWidgetPlugin *instance(WidgetPluginData &p) // Go stale once something fails if (p.failed) - return 0; + return nullptr; // Pull up the plugin, retrieve IPlugin instance. if (!p.instanceGuard) { - p.instance = 0; + p.instance = nullptr; QPluginLoader loader(p.path); if (debug) @@ -68,7 +68,7 @@ static IWidgetPlugin *instance(WidgetPluginData &p) "Failed to create instance of file " "\"%1\": %2").arg(p.path).arg(p.errorMessage); qWarning() << p.errorMessage; - return 0; + return nullptr; } QObject *object = loader.instance(); if (!object) { @@ -77,7 +77,7 @@ static IWidgetPlugin *instance(WidgetPluginData &p) "Failed to create instance of file \"%1\"." ).arg(p.path); qWarning() << p.errorMessage; - return 0; + return nullptr; } IWidgetPlugin *iplugin = qobject_cast<IWidgetPlugin *>(object); if (!iplugin) { @@ -87,7 +87,7 @@ static IWidgetPlugin *instance(WidgetPluginData &p) ).arg(p.path); qWarning() << p.errorMessage; delete object; - return 0; + return nullptr; } p.instanceGuard = object; p.instance = iplugin; @@ -110,7 +110,7 @@ static IWidgetPlugin *instance(WidgetPluginData &p) WidgetPluginData::WidgetPluginData(const QString &p) : path(p), failed(false), - instance(0) + instance(nullptr) { } @@ -187,7 +187,7 @@ QStandardItem *WidgetPluginPath::createModelItem() // If there are failed ones, create a separate "Failed" // category at the end QStandardItem *pathItem = new QStandardItem(m_path.absolutePath()); - QStandardItem *failedCategory = 0; + QStandardItem *failedCategory = nullptr; const auto end = m_plugins.end(); for (auto it = m_plugins.begin(); it != end; ++it) { QStandardItem *pluginItem = new QStandardItem(Utils::FileName::fromString(it->path).fileName()); diff --git a/src/plugins/qmldesigner/designercore/pluginmanager/widgetpluginpath.h b/src/plugins/qmldesigner/designercore/pluginmanager/widgetpluginpath.h index 391fe86fe9..13ad38fcd3 100644 --- a/src/plugins/qmldesigner/designercore/pluginmanager/widgetpluginpath.h +++ b/src/plugins/qmldesigner/designercore/pluginmanager/widgetpluginpath.h @@ -66,7 +66,7 @@ struct WidgetPluginData { // IPlugins. class WidgetPluginPath { - typedef QList<IWidgetPlugin *> IWidgetPluginList; + using IWidgetPluginList = QList<IWidgetPlugin *>; public: explicit WidgetPluginPath(const QDir &path); @@ -80,7 +80,7 @@ public: QStandardItem *createModelItem(); private: - typedef QList<WidgetPluginData> PluginDataList; + using PluginDataList = QList<WidgetPluginData>; static QStringList libraryFilePaths(const QDir &dir); void clear(); diff --git a/src/plugins/qmldesigner/designersettings.cpp b/src/plugins/qmldesigner/designersettings.cpp index 7520296c26..d1e8a3a569 100644 --- a/src/plugins/qmldesigner/designersettings.cpp +++ b/src/plugins/qmldesigner/designersettings.cpp @@ -36,9 +36,7 @@ namespace DesignerSettingsGroupKey { const char QML_DESIGNER_SETTINGS_GROUP[] = "Designer"; } -DesignerSettings::DesignerSettings() -{ -} +DesignerSettings::DesignerSettings() = default; void DesignerSettings::restoreValue(QSettings *settings, const QByteArray &key, const QVariant &defaultValue) { diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp index 52020a55ee..49f484583b 100644 --- a/src/plugins/qmldesigner/designmodewidget.cpp +++ b/src/plugins/qmldesigner/designmodewidget.cpp @@ -84,17 +84,14 @@ class ItemLibrarySideBarItem : public Core::SideBarItem { public: explicit ItemLibrarySideBarItem(QWidget *widget, const QString &id); - virtual ~ItemLibrarySideBarItem(); + ~ItemLibrarySideBarItem() override; - virtual QList<QToolButton *> createToolBarWidgets(); + QList<QToolButton *> createToolBarWidgets() override; }; ItemLibrarySideBarItem::ItemLibrarySideBarItem(QWidget *widget, const QString &id) : Core::SideBarItem(widget, id) {} -ItemLibrarySideBarItem::~ItemLibrarySideBarItem() -{ - -} +ItemLibrarySideBarItem::~ItemLibrarySideBarItem() = default; QList<QToolButton *> ItemLibrarySideBarItem::createToolBarWidgets() { @@ -105,9 +102,9 @@ class DesignerSideBarItem : public Core::SideBarItem { public: explicit DesignerSideBarItem(QWidget *widget, WidgetInfo::ToolBarWidgetFactoryInterface *createToolBarWidgets, const QString &id); - virtual ~DesignerSideBarItem(); + ~DesignerSideBarItem() override; - virtual QList<QToolButton *> createToolBarWidgets(); + QList<QToolButton *> createToolBarWidgets() override; private: WidgetInfo::ToolBarWidgetFactoryInterface *m_toolBarWidgetFactory; @@ -267,7 +264,7 @@ void DesignModeWidget::setup() foreach (Core::INavigationWidgetFactory *factory, factories) { Core::NavigationView navigationView; - navigationView.widget = 0; + navigationView.widget = nullptr; if (factory->id() == "Projects") { navigationView = factory->createWidget(); projectsExplorer = navigationView.widget; @@ -293,7 +290,7 @@ void DesignModeWidget::setup() } } - QToolBar *toolBar = new QToolBar; + auto toolBar = new QToolBar; toolBar->addAction(viewManager().componentViewAction()); toolBar->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); DesignerActionToolBar *designerToolBar = QmlDesignerPlugin::instance()->viewManager().designerActionManager().createToolBar(m_toolBar); @@ -450,7 +447,7 @@ void DesignModeWidget::addNavigatorHistoryEntry(const Utils::FileName &fileName) static QTabWidget *createWidgetsInTabWidget(const QList<WidgetInfo> &widgetInfos) { - QTabWidget *tabWidget = new QTabWidget; + auto tabWidget = new QTabWidget; foreach (const WidgetInfo &widgetInfo, widgetInfos) tabWidget->addTab(widgetInfo.widget, widgetInfo.tabName); @@ -488,10 +485,10 @@ static QWidget *createbottomSideBarWidget(const QList<WidgetInfo> &widgetInfos) static Core::MiniSplitter *createCentralSplitter(const QList<WidgetInfo> &widgetInfos) { // editor and output panes - Core::MiniSplitter *outputPlaceholderSplitter = new Core::MiniSplitter; + auto outputPlaceholderSplitter = new Core::MiniSplitter; outputPlaceholderSplitter->setOrientation(Qt::Vertical); - SwitchSplitTabWidget *switchSplitTabWidget = new SwitchSplitTabWidget(); + auto switchSplitTabWidget = new SwitchSplitTabWidget(); foreach (const WidgetInfo &widgetInfo, widgetInfos) { if (widgetInfo.placementHint == widgetInfo.CentralPane) @@ -516,7 +513,7 @@ QWidget *DesignModeWidget::createCenterWidget() { QWidget *centerWidget = new QWidget; - QVBoxLayout *horizontalLayout = new QVBoxLayout(centerWidget); + auto horizontalLayout = new QVBoxLayout(centerWidget); horizontalLayout->setMargin(0); horizontalLayout->setSpacing(0); @@ -537,9 +534,9 @@ QWidget *DesignModeWidget::createCenterWidget() QWidget *DesignModeWidget::createCrumbleBarFrame() { - auto *frame = new Utils::StyledBar(this); + auto frame = new Utils::StyledBar(this); frame->setSingleRow(false); - QHBoxLayout *layout = new QHBoxLayout(frame); + auto layout = new QHBoxLayout(frame); layout->setMargin(0); layout->setSpacing(0); layout->addWidget(m_crumbleBar->crumblePath()); diff --git a/src/plugins/qmldesigner/documentmanager.cpp b/src/plugins/qmldesigner/documentmanager.cpp index 97b475a0f9..423281b6fd 100644 --- a/src/plugins/qmldesigner/documentmanager.cpp +++ b/src/plugins/qmldesigner/documentmanager.cpp @@ -358,7 +358,7 @@ QStringList DocumentManager::isoIconsQmakeVariableValue(const QString &proPath) return QStringList(); } - QmakeProjectManager::QmakeProFileNode *proNode = dynamic_cast<QmakeProjectManager::QmakeProFileNode*>(parentNode); + auto proNode = dynamic_cast<QmakeProjectManager::QmakeProFileNode*>(parentNode); if (!proNode) { qCWarning(documentManagerLog) << "Parent node for node at" << proPath << "could not be converted to a QmakeProFileNode"; return QStringList(); @@ -381,7 +381,7 @@ bool DocumentManager::setIsoIconsQmakeVariableValue(const QString &proPath, cons return false; } - QmakeProjectManager::QmakeProFileNode *proNode = dynamic_cast<QmakeProjectManager::QmakeProFileNode*>(parentNode); + auto proNode = dynamic_cast<QmakeProjectManager::QmakeProFileNode*>(parentNode); if (!proNode) { qCWarning(documentManagerLog) << "Node for" << proPath << "could not be converted to a QmakeProFileNode"; return false; @@ -407,7 +407,7 @@ void DocumentManager::findPathToIsoProFile(bool *iconResourceFileAlreadyExists, << "(" << node << static_cast<int>(node->nodeType()) << ")"; if (node->nodeType() == ProjectExplorer::NodeType::VirtualFolder && node->displayName() == "Resources") { - ProjectExplorer::VirtualFolderNode *virtualFolderNode = dynamic_cast<ProjectExplorer::VirtualFolderNode*>(node); + auto virtualFolderNode = dynamic_cast<ProjectExplorer::VirtualFolderNode*>(node); for (int subFolderIndex = 0; subFolderIndex < virtualFolderNode->folderNodes().size() && !iconQrcFileNode; ++subFolderIndex) { ProjectExplorer::FolderNode *subFolderNode = virtualFolderNode->folderNodes().at(subFolderIndex); @@ -446,7 +446,7 @@ void DocumentManager::findPathToIsoProFile(bool *iconResourceFileAlreadyExists, *resourceFilePath = projectDirectory + "/" + isoIconsQrcFile; } - *iconResourceFileAlreadyExists = iconQrcFileNode != 0; + *iconResourceFileAlreadyExists = iconQrcFileNode != nullptr; } bool DocumentManager::isoProFileSupportsAddingExistingFiles(const QString &resourceFileProPath) @@ -494,7 +494,7 @@ bool DocumentManager::belongsToQmakeProject() return false; ProjectExplorer::Node *rootNode = project->rootProjectNode(); - QmakeProjectManager::QmakeProFileNode *proNode = dynamic_cast<QmakeProjectManager::QmakeProFileNode*>(rootNode); + auto proNode = dynamic_cast<QmakeProjectManager::QmakeProFileNode*>(rootNode); return proNode; } diff --git a/src/plugins/qmldesigner/documentwarningwidget.cpp b/src/plugins/qmldesigner/documentwarningwidget.cpp index 6afe9b2714..a159e12f86 100644 --- a/src/plugins/qmldesigner/documentwarningwidget.cpp +++ b/src/plugins/qmldesigner/documentwarningwidget.cpp @@ -87,16 +87,16 @@ DocumentWarningWidget::DocumentWarningWidget(QWidget *parent) connect(m_ignoreWarningsCheckBox, &QCheckBox::toggled, this, &DocumentWarningWidget::ignoreCheckBoxToggled); - QVBoxLayout *layout = new QVBoxLayout(this); + auto layout = new QVBoxLayout(this); layout->addWidget(m_headerLabel); - QVBoxLayout *messageLayout = new QVBoxLayout; + auto messageLayout = new QVBoxLayout; messageLayout->setMargin(20); messageLayout->setSpacing(5); messageLayout->addWidget(m_navigateLabel); messageLayout->addWidget(m_messageLabel); layout->addLayout(messageLayout); layout->addWidget(m_ignoreWarningsCheckBox); - QHBoxLayout *buttonLayout = new QHBoxLayout(); + auto buttonLayout = new QHBoxLayout(); buttonLayout->addStretch(); buttonLayout->addWidget(m_continueButton); layout->addLayout(buttonLayout); diff --git a/src/plugins/qmldesigner/qmldesignerextension/colortool/colortool.cpp b/src/plugins/qmldesigner/qmldesignerextension/colortool/colortool.cpp index 7f03543c2c..32a5742f9f 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/colortool/colortool.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/colortool/colortool.cpp @@ -53,28 +53,28 @@ class ColorToolAction : public AbstractAction public: ColorToolAction() : AbstractAction(QCoreApplication::translate("ColorToolAction","Edit Color")) {} - QByteArray category() const + QByteArray category() const override { return QByteArray(); } - QByteArray menuId() const + QByteArray menuId() const override { return "ColorTool"; } - int priority() const + int priority() const override { return CustomActionsPriority; } - Type type() const + Type type() const override { return FormEditorAction; } protected: - bool isVisible(const SelectionContext &selectionContext) const + bool isVisible(const SelectionContext &selectionContext) const override { if (selectionContext.singleNodeIsSelected()) return selectionContext.currentSingleSelectedNode().metaInfo().hasProperty("color"); @@ -82,25 +82,22 @@ protected: return false; } - bool isEnabled(const SelectionContext &selectionContext) const + bool isEnabled(const SelectionContext &selectionContext) const override { return isVisible(selectionContext); } }; ColorTool::ColorTool() - : QObject(), AbstractCustomTool() { - ColorToolAction *colorToolAction = new ColorToolAction; + auto colorToolAction = new ColorToolAction; QmlDesignerPlugin::instance()->designerActionManager().addDesignerAction(colorToolAction); connect(colorToolAction->action(), &QAction::triggered, [=]() { view()->changeCurrentToolTo(this); }); } -ColorTool::~ColorTool() -{ -} +ColorTool::~ColorTool() = default; void ColorTool::clear() { diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/backendmodel.cpp b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/backendmodel.cpp index 0d86c4696a..f356788a55 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/backendmodel.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/backendmodel.cpp @@ -79,12 +79,12 @@ void BackendModel::resetModel() if (cppTypeData.isSingleton) { NodeMetaInfo metaInfo = m_connectionView->model()->metaInfo(cppTypeData.typeName.toUtf8()); if (metaInfo.isValid() && !metaInfo.isSubclassOf("QtQuick.Item")) { - QStandardItem *type = new QStandardItem(cppTypeData.typeName); + auto type = new QStandardItem(cppTypeData.typeName); type->setData(cppTypeData.typeName, Qt::UserRole + 1); type->setData(true, Qt::UserRole + 2); type->setEditable(false); - QStandardItem *name = new QStandardItem(cppTypeData.typeName); + auto name = new QStandardItem(cppTypeData.typeName); name->setEditable(false); QStandardItem *singletonItem = new QStandardItem(""); diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/bindingmodel.cpp b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/bindingmodel.cpp index 9b08e5179c..cd8c92b82c 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/bindingmodel.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/bindingmodel.cpp @@ -444,7 +444,7 @@ void BindingModel::handleDataChanged(const QModelIndex &topLeft, const QModelInd void BindingModel::handleException() { - QMessageBox::warning(0, tr("Error"), m_exceptionError); + QMessageBox::warning(nullptr, tr("Error"), m_exceptionError); resetModel(); } diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionmodel.cpp b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionmodel.cpp index 7c79334ea2..8cd297890e 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionmodel.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionmodel.cpp @@ -195,7 +195,7 @@ void ConnectionModel::updateSignalName(int rowNumber) connectionNode.removeProperty(signalHandlerProperty.name()); transaction.commit(); //committing in the try block } catch (Exception &e) { //better save then sorry - QMessageBox::warning(0, tr("Error"), e.description()); + QMessageBox::warning(nullptr, tr("Error"), e.description()); } QStandardItem* idItem = item(rowNumber, 0); @@ -220,7 +220,7 @@ void ConnectionModel::updateTargetNode(int rowNumber) connectionNode.bindingProperty("target").setExpression(newTarget); transaction.commit(); //committing in the try block } catch (Exception &e) { //better save then sorry - QMessageBox::warning(0, tr("Error"), e.description()); + QMessageBox::warning(nullptr, tr("Error"), e.description()); } QStandardItem* idItem = item(rowNumber, 0); @@ -278,7 +278,7 @@ void ConnectionModel::addConnection() } transaction.commit(); } catch (Exception &e) { //better save then sorry - QMessageBox::warning(0, tr("Error"), e.description()); + QMessageBox::warning(nullptr, tr("Error"), e.description()); } } } @@ -303,7 +303,7 @@ void ConnectionModel::deleteConnectionByRow(int currentRow) void ConnectionModel::handleException() { - QMessageBox::warning(0, tr("Error"), m_exceptionError); + QMessageBox::warning(nullptr, tr("Error"), m_exceptionError); resetModel(); } diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionview.cpp b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionview.cpp index 2e7c9d4f54..2c3d5fb534 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionview.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionview.cpp @@ -52,9 +52,7 @@ ConnectionView::ConnectionView(QObject *parent) : AbstractView(parent), connectionViewWidget()->setBackendModel(m_backendModel); } -ConnectionView::~ConnectionView() -{ -} +ConnectionView::~ConnectionView() = default; void ConnectionView::modelAttached(Model *model) { diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionviewwidget.cpp b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionviewwidget.cpp index 9a92bb0852..1c62cec81b 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionviewwidget.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionviewwidget.cpp @@ -196,13 +196,13 @@ void ConnectionViewWidget::invalidateButtonStatus() setEnabledAddButton(true); } else if (currentTab() == BindingTab) { emit setEnabledRemoveButton(ui->bindingView->selectionModel()->hasSelection()); - BindingModel *bindingModel = qobject_cast<BindingModel*>(ui->bindingView->model()); + auto bindingModel = qobject_cast<BindingModel*>(ui->bindingView->model()); setEnabledAddButton(bindingModel->connectionView()->model() && bindingModel->connectionView()->selectedModelNodes().count() == 1); } else if (currentTab() == DynamicPropertiesTab) { emit setEnabledRemoveButton(ui->dynamicPropertiesView->selectionModel()->hasSelection()); - DynamicPropertiesModel *dynamicPropertiesModel = qobject_cast<DynamicPropertiesModel*>(ui->dynamicPropertiesView->model()); + auto dynamicPropertiesModel = qobject_cast<DynamicPropertiesModel*>(ui->dynamicPropertiesView->model()); setEnabledAddButton(dynamicPropertiesModel->connectionView()->model() && dynamicPropertiesModel->connectionView()->selectedModelNodes().count() == 1); } else if (currentTab() == BackendTab) { @@ -242,7 +242,7 @@ void ConnectionViewWidget::removeButtonClicked() if (ui->connectionView->selectionModel()->selectedRows().isEmpty()) return; int currentRow = ui->connectionView->selectionModel()->selectedRows().constFirst().row(); - ConnectionModel *connectionModel = qobject_cast<ConnectionModel*>(ui->connectionView->model()); + auto connectionModel = qobject_cast<ConnectionModel*>(ui->connectionView->model()); if (connectionModel) { connectionModel->deleteConnectionByRow(currentRow); } @@ -250,7 +250,7 @@ void ConnectionViewWidget::removeButtonClicked() if (ui->bindingView->selectionModel()->selectedRows().isEmpty()) return; int currentRow = ui->bindingView->selectionModel()->selectedRows().constFirst().row(); - BindingModel *bindingModel = qobject_cast<BindingModel*>(ui->bindingView->model()); + auto bindingModel = qobject_cast<BindingModel*>(ui->bindingView->model()); if (bindingModel) { bindingModel->deleteBindindByRow(currentRow); } @@ -258,12 +258,12 @@ void ConnectionViewWidget::removeButtonClicked() if (ui->dynamicPropertiesView->selectionModel()->selectedRows().isEmpty()) return; int currentRow = ui->dynamicPropertiesView->selectionModel()->selectedRows().constFirst().row(); - DynamicPropertiesModel *dynamicPropertiesModel = qobject_cast<DynamicPropertiesModel*>(ui->dynamicPropertiesView->model()); + auto dynamicPropertiesModel = qobject_cast<DynamicPropertiesModel*>(ui->dynamicPropertiesView->model()); if (dynamicPropertiesModel) dynamicPropertiesModel->deleteDynamicPropertyByRow(currentRow); } else if (currentTab() == BackendTab) { int currentRow = ui->backendView->selectionModel()->selectedRows().constFirst().row(); - BackendModel *backendModel = qobject_cast<BackendModel*>(ui->backendView->model()); + auto backendModel = qobject_cast<BackendModel*>(ui->backendView->model()); if (backendModel) backendModel->deletePropertyByRow(currentRow); } @@ -275,22 +275,22 @@ void ConnectionViewWidget::addButtonClicked() { if (currentTab() == ConnectionTab) { - ConnectionModel *connectionModel = qobject_cast<ConnectionModel*>(ui->connectionView->model()); + auto connectionModel = qobject_cast<ConnectionModel*>(ui->connectionView->model()); if (connectionModel) { connectionModel->addConnection(); } } else if (currentTab() == BindingTab) { - BindingModel *bindingModel = qobject_cast<BindingModel*>(ui->bindingView->model()); + auto bindingModel = qobject_cast<BindingModel*>(ui->bindingView->model()); if (bindingModel) { bindingModel->addBindingForCurrentNode(); } } else if (currentTab() == DynamicPropertiesTab) { - DynamicPropertiesModel *dynamicPropertiesModel = qobject_cast<DynamicPropertiesModel*>(ui->dynamicPropertiesView->model()); + auto dynamicPropertiesModel = qobject_cast<DynamicPropertiesModel*>(ui->dynamicPropertiesView->model()); if (dynamicPropertiesModel) dynamicPropertiesModel->addDynamicPropertyForCurrentNode(); } else if (currentTab() == BackendTab) { - BackendModel *backendModel = qobject_cast<BackendModel*>(ui->backendView->model()); + auto backendModel = qobject_cast<BackendModel*>(ui->backendView->model()); if (backendModel) backendModel->addNewBackend(); } diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/delegates.cpp b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/delegates.cpp index cf9c5b6f7e..1a9958f916 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/delegates.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/delegates.cpp @@ -76,7 +76,7 @@ void PropertiesComboBox::setText(const QString &text) void PropertiesComboBox::disableValidator() { - setValidator(0); + setValidator(nullptr); } ConnectionComboBox::ConnectionComboBox(QWidget *parent) : PropertiesComboBox(parent) @@ -110,8 +110,8 @@ void ConnectionEditorDelegate::paint(QPainter *painter, BindingDelegate::BindingDelegate(QWidget *parent) : ConnectionEditorDelegate(parent) { - static QItemEditorFactory *factory = 0; - if (factory == 0) { + static QItemEditorFactory *factory = nullptr; + if (factory == nullptr) { factory = new QItemEditorFactory; QItemEditorCreatorBase *creator = new QItemEditorCreator<PropertiesComboBox>("text"); @@ -125,7 +125,7 @@ QWidget *BindingDelegate::createEditor(QWidget *parent, const QStyleOptionViewIt { QWidget *widget = QStyledItemDelegate::createEditor(parent, option, index); - const BindingModel *model = qobject_cast<const BindingModel*>(index.model()); + const auto model = qobject_cast<const BindingModel*>(index.model()); if (!model) { qWarning() << "BindingDelegate::createEditor no model"; return widget; @@ -137,7 +137,7 @@ QWidget *BindingDelegate::createEditor(QWidget *parent, const QStyleOptionViewIt model->connectionView()->allModelNodes(); - PropertiesComboBox *bindingComboBox = qobject_cast<PropertiesComboBox*>(widget); + auto bindingComboBox = qobject_cast<PropertiesComboBox*>(widget); if (!bindingComboBox) { qWarning() << "BindingDelegate::createEditor no bindingComboBox"; return widget; @@ -192,7 +192,7 @@ QWidget *DynamicPropertiesDelegate::createEditor(QWidget *parent, const QStyleOp { QWidget *widget = QStyledItemDelegate::createEditor(parent, option, index); - const DynamicPropertiesModel *model = qobject_cast<const DynamicPropertiesModel*>(index.model()); + const auto model = qobject_cast<const DynamicPropertiesModel*>(index.model()); if (!model) { qWarning() << "BindingDelegate::createEditor no model"; return widget; @@ -206,14 +206,14 @@ QWidget *DynamicPropertiesDelegate::createEditor(QWidget *parent, const QStyleOp switch (index.column()) { case DynamicPropertiesModel::TargetModelNodeRow: { - return 0; //no editor + return nullptr; //no editor }; case DynamicPropertiesModel::PropertyNameRow: { return QStyledItemDelegate::createEditor(parent, option, index); }; case DynamicPropertiesModel::PropertyTypeRow: { - PropertiesComboBox *dynamicPropertiesComboBox = new PropertiesComboBox(parent); + auto dynamicPropertiesComboBox = new PropertiesComboBox(parent); connect(dynamicPropertiesComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), this, [=]() { auto delegate = const_cast<DynamicPropertiesDelegate*>(this); emit delegate->commitData(dynamicPropertiesComboBox); @@ -236,13 +236,13 @@ QWidget *DynamicPropertiesDelegate::createEditor(QWidget *parent, const QStyleOp default: qWarning() << "BindingDelegate::createEditor column" << index.column(); } - return 0; + return nullptr; } ConnectionDelegate::ConnectionDelegate(QWidget *parent) : ConnectionEditorDelegate(parent) { - static QItemEditorFactory *factory = 0; - if (factory == 0) { + static QItemEditorFactory *factory = nullptr; + if (factory == nullptr) { factory = new QItemEditorFactory; QItemEditorCreatorBase *creator = new QItemEditorCreator<ConnectionComboBox>("text"); @@ -257,9 +257,9 @@ QWidget *ConnectionDelegate::createEditor(QWidget *parent, const QStyleOptionVie QWidget *widget = QStyledItemDelegate::createEditor(parent, option, index); - const ConnectionModel *connectionModel = qobject_cast<const ConnectionModel*>(index.model()); + const auto connectionModel = qobject_cast<const ConnectionModel*>(index.model()); - ConnectionComboBox *connectionComboBox = qobject_cast<ConnectionComboBox*>(widget); + auto connectionComboBox = qobject_cast<ConnectionComboBox*>(widget); if (!connectionModel) { qWarning() << "ConnectionDelegate::createEditor no model"; @@ -322,7 +322,7 @@ BackendDelegate::BackendDelegate(QWidget *parent) : ConnectionEditorDelegate(par QWidget *BackendDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { - const BackendModel *model = qobject_cast<const BackendModel*>(index.model()); + const auto model = qobject_cast<const BackendModel*>(index.model()); model->connectionView()->allModelNodes(); @@ -333,7 +333,7 @@ QWidget *BackendDelegate::createEditor(QWidget *parent, const QStyleOptionViewIt switch (index.column()) { case BackendModel::TypeNameColumn: { - PropertiesComboBox *backendComboBox = new PropertiesComboBox(parent); + auto backendComboBox = new PropertiesComboBox(parent); backendComboBox->addItems(model->possibleCppTypes()); connect(backendComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), this, [=]() { auto delegate = const_cast<BackendDelegate*>(this); @@ -345,10 +345,10 @@ QWidget *BackendDelegate::createEditor(QWidget *parent, const QStyleOptionViewIt return widget; }; case BackendModel::IsSingletonColumn: { - return 0; //no editor + return nullptr; //no editor }; case BackendModel::IsLocalColumn: { - return 0; //no editor + return nullptr; //no editor }; default: qWarning() << "BackendDelegate::createEditor column" << index.column(); } diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/dynamicpropertiesmodel.cpp b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/dynamicpropertiesmodel.cpp index 620cd9bf0f..8d4186a5b5 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/dynamicpropertiesmodel.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/dynamicpropertiesmodel.cpp @@ -475,7 +475,7 @@ void DynamicPropertiesModel::updatePropertyName(int rowNumber) targetNode.removeProperty(bindingProperty.name()); transaction.commit(); //committing in the try block } catch (Exception &e) { //better save then sorry - QMessageBox::warning(0, tr("Error"), e.description()); + QMessageBox::warning(nullptr, tr("Error"), e.description()); } updateCustomData(rowNumber, targetNode.bindingProperty(newName)); @@ -495,7 +495,7 @@ void DynamicPropertiesModel::updatePropertyName(int rowNumber) targetNode.removeProperty(variantProperty.name()); transaction.commit(); //committing in the try block } catch (Exception &e) { //better save then sorry - QMessageBox::warning(0, tr("Error"), e.description()); + QMessageBox::warning(nullptr, tr("Error"), e.description()); } updateCustomData(rowNumber, targetNode.variantProperty(newName)); @@ -525,7 +525,7 @@ void DynamicPropertiesModel::updatePropertyType(int rowNumber) targetNode.bindingProperty(propertyName).setDynamicTypeNameAndExpression(newType, expression); transaction.commit(); //committing in the try block } catch (Exception &e) { //better save then sorry - QMessageBox::warning(0, tr("Error"), e.description()); + QMessageBox::warning(nullptr, tr("Error"), e.description()); } updateCustomData(rowNumber, targetNode.bindingProperty(propertyName)); @@ -549,7 +549,7 @@ void DynamicPropertiesModel::updatePropertyType(int rowNumber) } transaction.commit(); //committing in the try block } catch (Exception &e) { //better save then sorry - QMessageBox::warning(0, tr("Error"), e.description()); + QMessageBox::warning(nullptr, tr("Error"), e.description()); } updateCustomData(rowNumber, targetNode.variantProperty(propertyName)); @@ -683,7 +683,7 @@ void DynamicPropertiesModel::handleDataChanged(const QModelIndex &topLeft, const void DynamicPropertiesModel::handleException() { - QMessageBox::warning(0, tr("Error"), m_exceptionError); + QMessageBox::warning(nullptr, tr("Error"), m_exceptionError); resetModel(); } diff --git a/src/plugins/qmldesigner/qmldesignerextension/pathtool/controlpoint.cpp b/src/plugins/qmldesigner/qmldesignerextension/pathtool/controlpoint.cpp index 0032b237f9..d2a8bf75c3 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/pathtool/controlpoint.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/pathtool/controlpoint.cpp @@ -33,14 +33,9 @@ namespace QmlDesigner { -ControlPoint::ControlPoint() -{ -} +ControlPoint::ControlPoint() = default; -ControlPoint::ControlPoint(const ControlPoint &other) - : d(other.d) -{ -} +ControlPoint::ControlPoint(const ControlPoint &other) = default; ControlPoint::ControlPoint(const QPointF &coordinate) : d(new ControlPointData) @@ -54,9 +49,7 @@ ControlPoint::ControlPoint(double x, double y) d->coordinate = QPointF(x, y); } -ControlPoint::~ControlPoint() -{ -} +ControlPoint::~ControlPoint() = default; ControlPoint &ControlPoint::operator =(const ControlPoint &other) { diff --git a/src/plugins/qmldesigner/qmldesignerextension/pathtool/cubicsegment.cpp b/src/plugins/qmldesigner/qmldesignerextension/pathtool/cubicsegment.cpp index be72a33ee1..0005514339 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/pathtool/cubicsegment.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/pathtool/cubicsegment.cpp @@ -31,9 +31,7 @@ namespace QmlDesigner { -CubicSegment::CubicSegment() -{ -} +CubicSegment::CubicSegment() = default; CubicSegment CubicSegment::create() { diff --git a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathitem.cpp b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathitem.cpp index e6fb45b4b1..0d5b380747 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathitem.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathitem.cpp @@ -42,11 +42,10 @@ namespace QmlDesigner { PathItem::PathItem(FormEditorScene* scene) - : QGraphicsObject(), - m_selectionManipulator(this), - m_lastPercent(-1.), - m_formEditorItem(0), - m_dontUpdatePath(false) + : m_selectionManipulator(this), + m_lastPercent(-1.), + m_formEditorItem(nullptr), + m_dontUpdatePath(false) { scene->addItem(this); setFlag(QGraphicsItem::ItemIsMovable, false); @@ -54,7 +53,7 @@ PathItem::PathItem(FormEditorScene* scene) PathItem::~PathItem() { - m_formEditorItem = 0; + m_formEditorItem = nullptr; } static ModelNode pathModelNode(FormEditorItem *formEditorItem) @@ -64,9 +63,9 @@ static ModelNode pathModelNode(FormEditorItem *formEditorItem) return modelNode.nodeProperty("path").modelNode(); } -typedef QPair<PropertyName, QVariant> PropertyPair; +using PropertyPair = QPair<PropertyName, QVariant>; -void PathItem::writeLinePath(ModelNode pathNode, const CubicSegment &cubicSegment) +void PathItem::writeLinePath(const ModelNode &pathNode, const CubicSegment &cubicSegment) { QList<PropertyPair> propertyList; propertyList.append(PropertyPair("x", cubicSegment.fourthControlX())); @@ -76,7 +75,7 @@ void PathItem::writeLinePath(ModelNode pathNode, const CubicSegment &cubicSegmen pathNode.nodeListProperty("pathElements").reparentHere(lineNode); } -void PathItem::writeQuadPath(ModelNode pathNode, const CubicSegment &cubicSegment) +void PathItem::writeQuadPath(const ModelNode &pathNode, const CubicSegment &cubicSegment) { QList<QPair<PropertyName, QVariant> > propertyList; propertyList.append(PropertyPair("controlX", cubicSegment.quadraticControlX())); @@ -88,7 +87,7 @@ void PathItem::writeQuadPath(ModelNode pathNode, const CubicSegment &cubicSegmen pathNode.nodeListProperty("pathElements").reparentHere(lineNode); } -void PathItem::writeCubicPath(ModelNode pathNode, const CubicSegment &cubicSegment) +void PathItem::writeCubicPath(const ModelNode &pathNode, const CubicSegment &cubicSegment) { QList<QPair<PropertyName, QVariant> > propertyList; propertyList.append(PropertyPair("control1X", cubicSegment.secondControlX())); @@ -102,7 +101,7 @@ void PathItem::writeCubicPath(ModelNode pathNode, const CubicSegment &cubicSegme pathNode.nodeListProperty("pathElements").reparentHere(lineNode); } -void PathItem::writePathAttributes(ModelNode pathNode, const QMap<QString, QVariant> &attributes) +void PathItem::writePathAttributes(const ModelNode &pathNode, const QMap<QString, QVariant> &attributes) { QMapIterator<QString, QVariant> attributesIterator(attributes); while (attributesIterator.hasNext()) { @@ -116,7 +115,7 @@ void PathItem::writePathAttributes(ModelNode pathNode, const QMap<QString, QVari } } -void PathItem::writePathPercent(ModelNode pathNode, double percent) +void PathItem::writePathPercent(const ModelNode& pathNode, double percent) { if (percent >= 0.0) { QList<QPair<PropertyName, QVariant> > propertyList; @@ -498,7 +497,7 @@ QRectF PathItem::instanceBoundingRect() const if (formEditorItem()) return formEditorItem()->qmlItemNode().instanceBoundingRect(); - return QRectF(); + return {}; } void PathItem::readControlPoints() @@ -557,7 +556,7 @@ void PathItem::readControlPoints() } } -static CubicSegment getMinimumDistanceSegment(const QPointF &pickPoint, const QList<CubicSegment> &cubicSegments, double maximumDistance, double *t = 0) +static CubicSegment getMinimumDistanceSegment(const QPointF &pickPoint, const QList<CubicSegment> &cubicSegments, double maximumDistance, double *t = nullptr) { CubicSegment minimumDistanceSegment; double actualMinimumDistance = maximumDistance; @@ -610,7 +609,7 @@ void PathItem::openPath() QAction *PathItem::createClosedPathAction(QMenu *contextMenu) const { - QAction *closedPathAction = new QAction(contextMenu); + auto closedPathAction = new QAction(contextMenu); closedPathAction->setCheckable(true); closedPathAction->setChecked(isClosedPath()); closedPathAction->setText(tr("Closed Path")); @@ -638,11 +637,11 @@ void PathItem::createCubicSegmentContextMenu(CubicSegment &cubicSegment, const Q { QMenu contextMenu; - QAction *splitSegmentAction = new QAction(&contextMenu); + auto splitSegmentAction = new QAction(&contextMenu); splitSegmentAction->setText(tr("Split Segment")); contextMenu.addAction(splitSegmentAction); - QAction *straightLinePointAction = new QAction(&contextMenu); + auto straightLinePointAction = new QAction(&contextMenu); straightLinePointAction->setText(tr("Make Curve Segment Straight")); contextMenu.addAction(straightLinePointAction); @@ -672,7 +671,7 @@ void PathItem::createCubicSegmentContextMenu(CubicSegment &cubicSegment, const Q void PathItem::createEditPointContextMenu(const ControlPoint &controlPoint, const QPoint &menuPosition) { QMenu contextMenu; - QAction *removeEditPointAction = new QAction(&contextMenu); + auto removeEditPointAction = new QAction(&contextMenu); removeEditPointAction->setText(tr("Remove Edit Point")); contextMenu.addAction(removeEditPointAction); @@ -943,8 +942,8 @@ void PathItem::removeEditPoint(const ControlPoint &controlPoint) m_cubicSegments.removeOne(cubicSegments.constFirst()); } else if (cubicSegments.count() == 2){ CubicSegment mergedCubicSegment = CubicSegment::create(); - CubicSegment firstCubicSegment = cubicSegments.at(0); - CubicSegment secondCubicSegment = cubicSegments.at(1); + const CubicSegment &firstCubicSegment = cubicSegments.at(0); + const CubicSegment &secondCubicSegment = cubicSegments.at(1); mergedCubicSegment.setFirstControlPoint(firstCubicSegment.firstControlPoint()); mergedCubicSegment.setSecondControlPoint(firstCubicSegment.secondControlPoint()); mergedCubicSegment.setThirdControlPoint(secondCubicSegment.thirdControlPoint()); diff --git a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathitem.h b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathitem.h index d431262b39..17981283a6 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathitem.h +++ b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathitem.h @@ -72,7 +72,7 @@ public: Type = 0xEAAC }; PathItem(FormEditorScene* scene); - ~PathItem(); + ~PathItem() override; int type() const override; void setFormEditorItem(FormEditorItem *formEditorItem); @@ -99,11 +99,11 @@ public: protected: void updateBoundingRect(); QRectF instanceBoundingRect() const; - void writeLinePath(ModelNode pathNode, const CubicSegment &cubicSegment); - void writeQuadPath(ModelNode pathNode, const CubicSegment &cubicSegment); - void writeCubicPath(ModelNode pathNode, const CubicSegment &cubicSegment); - void writePathAttributes(ModelNode pathNode, const QMap<QString, QVariant> &attributes); - void writePathPercent(ModelNode pathNode, double percent); + void writeLinePath(const ModelNode &pathNode, const CubicSegment &cubicSegment); + void writeQuadPath(const ModelNode &pathNode, const CubicSegment &cubicSegment); + void writeCubicPath(const ModelNode &pathNode, const CubicSegment &cubicSegment); + void writePathAttributes(const ModelNode &pathNode, const QMap<QString, QVariant> &attributes); + void writePathPercent(const ModelNode &pathNode, double percent); void readControlPoints(); void splitCubicSegment(CubicSegment &cubicSegment, double t); void closePath(); diff --git a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathselectionmanipulator.cpp b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathselectionmanipulator.cpp index 510181258e..6df6976233 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathselectionmanipulator.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathselectionmanipulator.cpp @@ -166,9 +166,7 @@ void PathSelectionManipulator::endMultiSelection() m_isMultiSelecting = false; } -SelectionPoint::SelectionPoint() -{ -} +SelectionPoint::SelectionPoint() = default; SelectionPoint::SelectionPoint(const ControlPoint &controlPoint) : controlPoint(controlPoint) diff --git a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathtool.cpp b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathtool.cpp index 66582f017d..a01ae050ac 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathtool.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathtool.cpp @@ -101,28 +101,28 @@ class PathToolAction : public AbstractAction public: PathToolAction() : AbstractAction(QCoreApplication::translate("PathToolAction","Edit Path")) {} - QByteArray category() const + QByteArray category() const override { return QByteArray(); } - QByteArray menuId() const + QByteArray menuId() const override { return "PathTool"; } - int priority() const + int priority() const override { return CustomActionsPriority; } - Type type() const + Type type() const override { return ContextMenuAction; } protected: - bool isVisible(const SelectionContext &selectionContext) const + bool isVisible(const SelectionContext &selectionContext) const override { if (selectionContext.scenePosition().isNull()) return false; @@ -133,18 +133,16 @@ protected: return false; } - bool isEnabled(const SelectionContext &selectionContext) const + bool isEnabled(const SelectionContext &selectionContext) const override { return isVisible(selectionContext); } }; PathTool::PathTool() - : QObject(), - AbstractCustomTool(), - m_pathToolView(this) + : m_pathToolView(this) { - PathToolAction *textToolAction = new PathToolAction; + auto textToolAction = new PathToolAction; QmlDesignerPlugin::instance()->designerActionManager().addDesignerAction(textToolAction); connect(textToolAction->action(), &QAction::triggered, [=]() { if (m_pathToolView.model()) @@ -155,9 +153,7 @@ PathTool::PathTool() } -PathTool::~PathTool() -{ -} +PathTool::~PathTool() = default; void PathTool::clear() { @@ -239,7 +235,7 @@ void PathTool::mouseDoubleClickEvent(const QList<QGraphicsItem*> & /*itemList*/, void PathTool::itemsAboutToRemoved(const QList<FormEditorItem*> &removedItemList) { - if (m_pathItem == 0) + if (m_pathItem == nullptr) return; if (removedItemList.contains(m_pathItem->formEditorItem())) @@ -280,7 +276,7 @@ void PathTool::instancesParentChanged(const QList<FormEditorItem *> & /*itemLis void PathTool::instancePropertyChange(const QList<QPair<ModelNode, PropertyName> > &propertyList) { - typedef QPair<ModelNode, PropertyName> ModelNodePropertyNamePair; + using ModelNodePropertyNamePair = QPair<ModelNode, PropertyName>; foreach (const ModelNodePropertyNamePair &propertyPair, propertyList) { if (propertyPair.first == m_pathItem->formEditorItem()->qmlItemNode().modelNode() && propertyPair.second == "path") diff --git a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathtoolview.cpp b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathtoolview.cpp index a15abf569e..ea1e28832a 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathtoolview.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathtoolview.cpp @@ -37,8 +37,7 @@ namespace QmlDesigner { PathToolView::PathToolView(PathTool *pathTool) - : AbstractView(), - m_pathTool(pathTool) + : m_pathTool(pathTool) { } diff --git a/src/plugins/qmldesigner/qmldesignerextension/sourcetool/sourcetool.cpp b/src/plugins/qmldesigner/qmldesignerextension/sourcetool/sourcetool.cpp index 9c7f32c1bb..d121e60c73 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/sourcetool/sourcetool.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/sourcetool/sourcetool.cpp @@ -79,35 +79,35 @@ public: action()->setIcon(prevIcon.icon()); } - QByteArray category() const + QByteArray category() const override { return QByteArray(); } - QByteArray menuId() const + QByteArray menuId() const override { return "SourceTool"; } - int priority() const + int priority() const override { return CustomActionsPriority; } - Type type() const + Type type() const override { return FormEditorAction; } protected: - bool isVisible(const SelectionContext &selectionContext) const + bool isVisible(const SelectionContext &selectionContext) const override { if (selectionContext.singleNodeIsSelected()) return modelNodeHasUrlSource(selectionContext.currentSingleSelectedNode()); return false; } - bool isEnabled(const SelectionContext &selectionContext) const + bool isEnabled(const SelectionContext &selectionContext) const override { return isVisible(selectionContext); } @@ -115,18 +115,15 @@ protected: SourceTool::SourceTool() - : QObject(), AbstractCustomTool() { - SourceToolAction *sourceToolAction = new SourceToolAction; + auto sourceToolAction = new SourceToolAction; QmlDesignerPlugin::instance()->designerActionManager().addDesignerAction(sourceToolAction); connect(sourceToolAction->action(), &QAction::triggered, [=]() { view()->changeCurrentToolTo(this); }); } -SourceTool::~SourceTool() -{ -} +SourceTool::~SourceTool() = default; void SourceTool::clear() { @@ -171,7 +168,6 @@ void SourceTool::mouseReleaseEvent(const QList<QGraphicsItem*> &itemList, AbstractFormEditorTool::mouseReleaseEvent(itemList, event); } - void SourceTool::mouseDoubleClickEvent(const QList<QGraphicsItem*> &itemList, QGraphicsSceneMouseEvent *event) { AbstractFormEditorTool::mouseDoubleClickEvent(itemList, event); @@ -199,7 +195,7 @@ void SourceTool::selectedItemsChanged(const QList<FormEditorItem*> &itemList) if (openDirectory.isEmpty()) openDirectory = baseDirectory(view()->model()->fileUrl()); - QString fileName = QFileDialog::getOpenFileName(0, + QString fileName = QFileDialog::getOpenFileName(nullptr, tr("Open File"), openDirectory); fileSelected(fileName); diff --git a/src/plugins/qmldesigner/qmldesignerextension/texttool/textedititem.cpp b/src/plugins/qmldesigner/qmldesignerextension/texttool/textedititem.cpp index 0728c8128b..1ce3244cbc 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/texttool/textedititem.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/texttool/textedititem.cpp @@ -36,14 +36,14 @@ namespace QmlDesigner { TextEditItem::TextEditItem(FormEditorScene* scene) : TextEditItemWidget(scene) - , m_formEditorItem(0) + , m_formEditorItem(nullptr) { connect(lineEdit(), &QLineEdit::returnPressed, this, &TextEditItem::returnPressed); } TextEditItem::~TextEditItem() { - m_formEditorItem = 0; + m_formEditorItem = nullptr; } void TextEditItem::writeTextToProperty() diff --git a/src/plugins/qmldesigner/qmldesignerextension/texttool/textedititem.h b/src/plugins/qmldesigner/qmldesignerextension/texttool/textedititem.h index 4213de9822..5497dadbe1 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/texttool/textedititem.h +++ b/src/plugins/qmldesigner/qmldesignerextension/texttool/textedititem.h @@ -36,8 +36,8 @@ class TextEditItem : public TextEditItemWidget Q_OBJECT public: TextEditItem(FormEditorScene* scene); - ~TextEditItem(); - int type() const; + ~TextEditItem() override; + int type() const override; void setFormEditorItem(FormEditorItem *formEditorItem); FormEditorItem *formEditorItem() const; diff --git a/src/plugins/qmldesigner/qmldesignerextension/texttool/textedititemwidget.cpp b/src/plugins/qmldesigner/qmldesignerextension/texttool/textedititemwidget.cpp index e9380a6c71..40efb67e77 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/texttool/textedititemwidget.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/texttool/textedititemwidget.cpp @@ -34,7 +34,6 @@ namespace QmlDesigner { TextEditItemWidget::TextEditItemWidget(QGraphicsScene* scene) - : QGraphicsProxyWidget() { scene->addItem(this); setFlag(QGraphicsItem::ItemIsMovable, false); @@ -43,7 +42,7 @@ TextEditItemWidget::TextEditItemWidget(QGraphicsScene* scene) TextEditItemWidget::~TextEditItemWidget() { - setWidget(0); + setWidget(nullptr); } void TextEditItemWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/) diff --git a/src/plugins/qmldesigner/qmldesignerextension/texttool/textedititemwidget.h b/src/plugins/qmldesigner/qmldesignerextension/texttool/textedititemwidget.h index d0caf3a265..7ff2909919 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/texttool/textedititemwidget.h +++ b/src/plugins/qmldesigner/qmldesignerextension/texttool/textedititemwidget.h @@ -40,7 +40,7 @@ class TextEditItemWidget : public QGraphicsProxyWidget Q_OBJECT public: TextEditItemWidget(QGraphicsScene *scene); - ~TextEditItemWidget(); + ~TextEditItemWidget() override; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; diff --git a/src/plugins/qmldesigner/qmldesignerextension/texttool/texttool.cpp b/src/plugins/qmldesigner/qmldesignerextension/texttool/texttool.cpp index fcaaba72ce..76dc414c03 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/texttool/texttool.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/texttool/texttool.cpp @@ -54,28 +54,28 @@ class TextToolAction : public AbstractAction public: TextToolAction() : AbstractAction(QCoreApplication::translate("TextToolAction","Edit Text")) {} - QByteArray category() const + QByteArray category() const override { return QByteArray(); } - QByteArray menuId() const + QByteArray menuId() const override { return "TextTool"; } - int priority() const + int priority() const override { return CustomActionsPriority; } - Type type() const + Type type() const override { return ContextMenuAction; } protected: - bool isVisible(const SelectionContext &selectionContext) const + bool isVisible(const SelectionContext &selectionContext) const override { if (selectionContext.scenePosition().isNull()) return false; @@ -86,25 +86,22 @@ protected: return false; } - bool isEnabled(const SelectionContext &selectionContext) const + bool isEnabled(const SelectionContext &selectionContext) const override { return isVisible(selectionContext); } }; TextTool::TextTool() - : QObject() , AbstractCustomTool() { - TextToolAction *textToolAction = new TextToolAction; + auto textToolAction = new TextToolAction; QmlDesignerPlugin::instance()->designerActionManager().addDesignerAction(textToolAction); connect(textToolAction->action(), &QAction::triggered, [=]() { view()->changeCurrentToolTo(this); }); } -TextTool::~TextTool() -{ -} +TextTool::~TextTool() = default; void TextTool::clear() { @@ -195,7 +192,7 @@ void TextTool::mouseDoubleClickEvent(const QList<QGraphicsItem*> & /*itemList*/, void TextTool::itemsAboutToRemoved(const QList<FormEditorItem*> &removedItemList) { - if (textItem() == 0) + if (textItem() == nullptr) return; if (removedItemList.contains(textItem()->formEditorItem())) @@ -232,7 +229,7 @@ void TextTool::instancesParentChanged(const QList<FormEditorItem *> & /*itemLis void TextTool::instancePropertyChange(const QList<QPair<ModelNode, PropertyName> > &propertyList) { - typedef QPair<ModelNode, PropertyName> ModelNodePropertyNamePair; + using ModelNodePropertyNamePair = QPair<ModelNode, PropertyName>; foreach (const ModelNodePropertyNamePair &propertyPair, propertyList) { if (propertyPair.first == textItem()->formEditorItem()->qmlItemNode().modelNode() && propertyPair.second == "text") diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index 140c2ef937..2c745b2ce8 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -93,7 +93,7 @@ QmlDesignerPlugin *QmlDesignerPlugin::m_instance = nullptr; static bool isInDesignerMode() { - return Core::ModeManager::currentMode() == Core::Constants::MODE_DESIGN; + return Core::ModeManager::currentModeId() == Core::Constants::MODE_DESIGN; } static bool checkIfEditorIsQtQuick(Core::IEditor *editor) @@ -106,7 +106,7 @@ static bool checkIfEditorIsQtQuick(Core::IEditor *editor) || document->language() == QmlJS::Dialect::QmlQtQuick2Ui || document->language() == QmlJS::Dialect::Qml; - if (Core::ModeManager::currentMode() == Core::Constants::MODE_DESIGN) { + if (Core::ModeManager::currentModeId() == Core::Constants::MODE_DESIGN) { Core::AsynchronousMessageBox::warning(QmlDesignerPlugin::tr("Cannot Open Design Mode"), QmlDesignerPlugin::tr("The QML file is not currently opened in a QML Editor.")); Core::ModeManager::activateMode(Core::Constants::MODE_EDIT); diff --git a/src/plugins/qmldesigner/qtquickplugin/qtquickplugin.cpp b/src/plugins/qmldesigner/qtquickplugin/qtquickplugin.cpp index 2536b0091c..3c3692d8ad 100644 --- a/src/plugins/qmldesigner/qtquickplugin/qtquickplugin.cpp +++ b/src/plugins/qmldesigner/qtquickplugin/qtquickplugin.cpp @@ -28,11 +28,7 @@ namespace QmlDesigner { - -QtQuickPlugin::QtQuickPlugin() -{ - -} +QtQuickPlugin::QtQuickPlugin() = default; QString QtQuickPlugin::pluginName() const { diff --git a/src/plugins/qmldesigner/qtquickplugin/qtquickplugin.h b/src/plugins/qmldesigner/qtquickplugin/qtquickplugin.h index 831c8f65e7..eff352a14d 100644 --- a/src/plugins/qmldesigner/qtquickplugin/qtquickplugin.h +++ b/src/plugins/qmldesigner/qtquickplugin/qtquickplugin.h @@ -40,10 +40,10 @@ class QtQuickPlugin : public QObject, QmlDesigner::IWidgetPlugin Q_INTERFACES(QmlDesigner::IWidgetPlugin) public: QtQuickPlugin(); - ~QtQuickPlugin() {} + ~QtQuickPlugin() override = default; - QString metaInfo() const; - QString pluginName() const; + QString metaInfo() const override; + QString pluginName() const override; }; diff --git a/src/plugins/qmldesigner/settingspage.cpp b/src/plugins/qmldesigner/settingspage.cpp index 882e48eb1e..6fb88e5f21 100644 --- a/src/plugins/qmldesigner/settingspage.cpp +++ b/src/plugins/qmldesigner/settingspage.cpp @@ -228,7 +228,7 @@ void SettingsPageWidget::setSettings(const DesignerSettings &settings) } SettingsPage::SettingsPage() : - m_widget(0) + m_widget(nullptr) { setId("B.QmlDesigner"); setDisplayName(tr("Qt Quick Designer")); diff --git a/src/plugins/qmldesigner/shortcutmanager.cpp b/src/plugins/qmldesigner/shortcutmanager.cpp index 9bb8574b28..0000adfd68 100644 --- a/src/plugins/qmldesigner/shortcutmanager.cpp +++ b/src/plugins/qmldesigner/shortcutmanager.cpp @@ -133,9 +133,9 @@ void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContex //Save Core::ActionManager::registerAction(&m_saveAction, Core::Constants::SAVE, qmlDesignerMainContext); - connect(&m_saveAction, &QAction::triggered, em, [em] { + connect(&m_saveAction, &QAction::triggered, em, [] { QmlDesignerPlugin::instance()->viewManager().reformatFileUsingTextEditorView(); - em->saveDocument(); + Core::EditorManager::saveDocument(); }); Core::Command *command = nullptr; @@ -365,7 +365,7 @@ DesignDocument *ShortCutManager::currentDesignDocument() const void ShortCutManager::undoAvailable(bool isAvailable) { - DesignDocument *documentController = qobject_cast<DesignDocument*>(sender()); + auto documentController = qobject_cast<DesignDocument*>(sender()); if (currentDesignDocument() && currentDesignDocument() == documentController) { m_undoAction.setEnabled(isAvailable); @@ -374,7 +374,7 @@ void ShortCutManager::undoAvailable(bool isAvailable) void ShortCutManager::redoAvailable(bool isAvailable) { - DesignDocument *documentController = qobject_cast<DesignDocument*>(sender()); + auto documentController = qobject_cast<DesignDocument*>(sender()); if (currentDesignDocument() && currentDesignDocument() == documentController) { m_redoAction.setEnabled(isAvailable); diff --git a/src/plugins/qmldesigner/switchsplittabwidget.cpp b/src/plugins/qmldesigner/switchsplittabwidget.cpp index 7a1c14187c..9d81f3564d 100644 --- a/src/plugins/qmldesigner/switchsplittabwidget.cpp +++ b/src/plugins/qmldesigner/switchsplittabwidget.cpp @@ -77,7 +77,7 @@ SwitchSplitTabWidget::SwitchSplitTabWidget(QWidget *parent) m_tabBarBackground->layout()->addItem(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding)); m_tabBarBackground->layout()->addWidget(m_tabBar); - QToolButton *horizontalButton = new QToolButton; + auto horizontalButton = new QToolButton; horizontalButton->setObjectName("centralTabBar"); horizontalButton->setIcon(Utils::Icon({{QLatin1String(":/qmldesigner/images/spliteditorvertically.png"), Utils::Theme::IconsBaseColor}}).icon()); @@ -87,7 +87,7 @@ SwitchSplitTabWidget::SwitchSplitTabWidget(QWidget *parent) updateSplitterSizes(); selectFakeTab(); }); - QToolButton *verticalButton = new QToolButton; + auto verticalButton = new QToolButton; verticalButton->setObjectName("centralTabBar"); verticalButton->setIcon(Utils::Icon({{QLatin1String(":/qmldesigner/images/spliteditorhorizontally.png"), Utils::Theme::IconsBaseColor}}).icon()); diff --git a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp index 456853633f..2da26d1bf7 100644 --- a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp +++ b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp @@ -99,8 +99,8 @@ public: init(); } - virtual void performChanges(QmlJSRefactoringFilePtr currentFile, - const QmlJSRefactoringChanges &refactoring) + void performChanges(QmlJSRefactoringFilePtr currentFile, + const QmlJSRefactoringChanges &refactoring) override { QString componentName = m_componentName; diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index a9e063245e..bb9c70f768 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -70,7 +70,7 @@ #include <texteditor/texteditoractionhandler.h> #include <texteditor/textmark.h> -#include <utils/annotateditemdelegate.h> +#include <utils/delegates.h> #include <utils/changeset.h> #include <utils/qtcassert.h> #include <utils/uncommentselection.h> @@ -1031,7 +1031,7 @@ bool QmlJSEditor::isDesignModePreferred() const alwaysPreferDesignMode = true; // stay in design mode if we are there - Id mode = ModeManager::currentMode(); + Id mode = ModeManager::currentModeId(); return alwaysPreferDesignMode || mode == Core::Constants::MODE_DESIGN; } diff --git a/src/plugins/qmljseditor/qmljseditor.pro b/src/plugins/qmljseditor/qmljseditor.pro index a4f7916611..549b174c49 100644 --- a/src/plugins/qmljseditor/qmljseditor.pro +++ b/src/plugins/qmljseditor/qmljseditor.pro @@ -11,7 +11,6 @@ HEADERS += \ qmlexpressionundercursor.h \ qmljshighlighter.h \ qmljshoverhandler.h \ - qmljspreviewrunner.h \ qmljscomponentfromobjectdef.h \ qmljsoutline.h \ qmloutlinemodel.h \ @@ -39,7 +38,6 @@ SOURCES += \ qmlexpressionundercursor.cpp \ qmljshighlighter.cpp \ qmljshoverhandler.cpp \ - qmljspreviewrunner.cpp \ qmljscomponentfromobjectdef.cpp \ qmljsoutline.cpp \ qmloutlinemodel.cpp \ diff --git a/src/plugins/qmljseditor/qmljseditor.qbs b/src/plugins/qmljseditor/qmljseditor.qbs index 9459876c9f..a9d16c778c 100644 --- a/src/plugins/qmljseditor/qmljseditor.qbs +++ b/src/plugins/qmljseditor/qmljseditor.qbs @@ -48,8 +48,6 @@ QtcPlugin { "qmljsoutline.h", "qmljsoutlinetreeview.cpp", "qmljsoutlinetreeview.h", - "qmljspreviewrunner.cpp", - "qmljspreviewrunner.h", "qmljsquickfix.cpp", "qmljsquickfix.h", "qmljsquickfixassist.cpp", diff --git a/src/plugins/qmljseditor/qmljseditordocument.cpp b/src/plugins/qmljseditor/qmljseditordocument.cpp index 9345042c11..f8662774c0 100644 --- a/src/plugins/qmljseditor/qmljseditordocument.cpp +++ b/src/plugins/qmljseditor/qmljseditordocument.cpp @@ -108,7 +108,7 @@ protected: using Visitor::visit; using Visitor::endVisit; - virtual bool visit(AST::UiScriptBinding *node) + bool visit(AST::UiScriptBinding *node) override { if (asString(node->qualifiedId) == QLatin1String("id")) { if (AST::ExpressionStatement *stmt = AST::cast<AST::ExpressionStatement*>(node->statement)) { @@ -130,7 +130,7 @@ protected: return false; } - virtual bool visit(AST::IdentifierExpression *node) + bool visit(AST::IdentifierExpression *node) override { if (!node->name.isEmpty()) { const QString &name = node->name.toString(); @@ -205,7 +205,7 @@ protected: decl->endColumn = last.startColumn + last.length; } - virtual bool visit(AST::UiObjectDefinition *node) + bool visit(AST::UiObjectDefinition *node) override { ++_depth; @@ -223,12 +223,12 @@ protected: return true; // search for more bindings } - virtual void endVisit(AST::UiObjectDefinition *) + void endVisit(AST::UiObjectDefinition *) override { --_depth; } - virtual bool visit(AST::UiObjectBinding *node) + bool visit(AST::UiObjectBinding *node) override { ++_depth; @@ -250,12 +250,12 @@ protected: return true; // search for more bindings } - virtual void endVisit(AST::UiObjectBinding *) + void endVisit(AST::UiObjectBinding *) override { --_depth; } - virtual bool visit(AST::UiScriptBinding *) + bool visit(AST::UiScriptBinding *) override { ++_depth; @@ -272,17 +272,17 @@ protected: return false; // more more bindings in this subtree. } - virtual void endVisit(AST::UiScriptBinding *) + void endVisit(AST::UiScriptBinding *) override { --_depth; } - virtual bool visit(AST::FunctionExpression *) + bool visit(AST::FunctionExpression *) override { return false; } - virtual bool visit(AST::FunctionDeclaration *ast) + bool visit(AST::FunctionDeclaration *ast) override { if (ast->name.isEmpty()) return false; @@ -309,7 +309,7 @@ protected: return false; } - virtual bool visit(AST::VariableDeclaration *ast) + bool visit(AST::VariableDeclaration *ast) override { if (ast->name.isEmpty()) return false; @@ -376,27 +376,27 @@ public: protected: using AST::Visitor::visit; - virtual bool visit(AST::UiObjectBinding *ast) + bool visit(AST::UiObjectBinding *ast) override { if (ast->initializer && ast->initializer->lbraceToken.length) _ranges.append(createRange(ast, ast->initializer)); return true; } - virtual bool visit(AST::UiObjectDefinition *ast) + bool visit(AST::UiObjectDefinition *ast) override { if (ast->initializer && ast->initializer->lbraceToken.length) _ranges.append(createRange(ast, ast->initializer)); return true; } - virtual bool visit(AST::FunctionExpression *ast) + bool visit(AST::FunctionExpression *ast) override { _ranges.append(createRange(ast)); return true; } - virtual bool visit(AST::FunctionDeclaration *ast) + bool visit(AST::FunctionDeclaration *ast) override { _ranges.append(createRange(ast)); return true; @@ -412,7 +412,7 @@ protected: return true; } - virtual bool visit(AST::UiScriptBinding *ast) + bool visit(AST::UiScriptBinding *ast) override { if (AST::Block *block = AST::cast<AST::Block *>(ast->statement)) _ranges.append(createRange(ast, block)); diff --git a/src/plugins/qmljseditor/qmljseditorplugin.cpp b/src/plugins/qmljseditor/qmljseditorplugin.cpp index 129b21f1c7..474e2642ff 100644 --- a/src/plugins/qmljseditor/qmljseditorplugin.cpp +++ b/src/plugins/qmljseditor/qmljseditorplugin.cpp @@ -30,7 +30,6 @@ #include "qmljseditorplugin.h" #include "qmljshighlighter.h" #include "qmljsoutline.h" -#include "qmljspreviewrunner.h" #include "qmljsquickfixassist.h" #include "qmltaskmanager.h" #include "quicktoolbar.h" diff --git a/src/plugins/qmljseditor/qmljsfindreferences.cpp b/src/plugins/qmljseditor/qmljsfindreferences.cpp index af2750de0c..6c8d2f4f98 100644 --- a/src/plugins/qmljseditor/qmljsfindreferences.cpp +++ b/src/plugins/qmljseditor/qmljsfindreferences.cpp @@ -95,7 +95,7 @@ protected: using Visitor::visit; - virtual bool visit(AST::UiPublicMember *node) + bool visit(AST::UiPublicMember *node) override { if (node->name == _name && _scopeChain.qmlScopeObjects().contains(_scope)) { @@ -110,7 +110,7 @@ protected: return true; } - virtual bool visit(AST::UiObjectDefinition *node) + bool visit(AST::UiObjectDefinition *node) override { _builder.push(node); Node::accept(node->initializer, this); @@ -118,7 +118,7 @@ protected: return false; } - virtual bool visit(AST::UiObjectBinding *node) + bool visit(AST::UiObjectBinding *node) override { if (node->qualifiedId && !node->qualifiedId->next @@ -133,7 +133,7 @@ protected: return false; } - virtual bool visit(AST::UiScriptBinding *node) + bool visit(AST::UiScriptBinding *node) override { if (node->qualifiedId && !node->qualifiedId->next @@ -151,7 +151,7 @@ protected: return true; } - virtual bool visit(AST::UiArrayBinding *node) + bool visit(AST::UiArrayBinding *node) override { if (node->qualifiedId && !node->qualifiedId->next @@ -162,7 +162,7 @@ protected: return true; } - virtual bool visit(AST::IdentifierExpression *node) + bool visit(AST::IdentifierExpression *node) override { if (node->name.isEmpty() || node->name != _name) return false; @@ -193,7 +193,7 @@ protected: return false; } - virtual bool visit(AST::FieldMemberExpression *node) + bool visit(AST::FieldMemberExpression *node) override { if (node->name != _name) return true; @@ -209,12 +209,12 @@ protected: return true; } - virtual bool visit(AST::FunctionDeclaration *node) + bool visit(AST::FunctionDeclaration *node) override { return visit(static_cast<FunctionExpression *>(node)); } - virtual bool visit(AST::FunctionExpression *node) + bool visit(AST::FunctionExpression *node) override { if (node->name == _name) { if (checkLookup()) @@ -227,7 +227,7 @@ protected: return false; } - virtual bool visit(AST::VariableDeclaration *node) + bool visit(AST::VariableDeclaration *node) override { if (node->name == _name) { if (checkLookup()) @@ -320,7 +320,7 @@ protected: using Visitor::visit; - virtual bool visit(AST::UiPublicMember *node) + bool visit(AST::UiPublicMember *node) override { if (node->memberTypeName() == _name){ const ObjectValue * tVal = _context->lookupType(_doc.data(), QStringList(_name)); @@ -336,7 +336,7 @@ protected: return true; } - virtual bool visit(AST::UiObjectDefinition *node) + bool visit(AST::UiObjectDefinition *node) override { checkTypeName(node->qualifiedTypeNameId); _builder.push(node); @@ -345,7 +345,7 @@ protected: return false; } - virtual bool visit(AST::UiObjectBinding *node) + bool visit(AST::UiObjectBinding *node) override { checkTypeName(node->qualifiedTypeNameId); _builder.push(node); @@ -354,7 +354,7 @@ protected: return false; } - virtual bool visit(AST::UiScriptBinding *node) + bool visit(AST::UiScriptBinding *node) override { if (AST::cast<Block *>(node->statement)) { Node::accept(node->qualifiedId, this); @@ -366,7 +366,7 @@ protected: return true; } - virtual bool visit(AST::IdentifierExpression *node) + bool visit(AST::IdentifierExpression *node) override { if (node->name != _name) return false; @@ -378,7 +378,7 @@ protected: return false; } - virtual bool visit(AST::FieldMemberExpression *node) + bool visit(AST::FieldMemberExpression *node) override { if (node->name != _name) return true; @@ -392,12 +392,12 @@ protected: return true; } - virtual bool visit(AST::FunctionDeclaration *node) + bool visit(AST::FunctionDeclaration *node) override { return visit(static_cast<FunctionExpression *>(node)); } - virtual bool visit(AST::FunctionExpression *node) + bool visit(AST::FunctionExpression *node) override { Node::accept(node->formals, this); _builder.push(node); @@ -406,13 +406,13 @@ protected: return false; } - virtual bool visit(AST::VariableDeclaration *node) + bool visit(AST::VariableDeclaration *node) override { Node::accept(node->expression, this); return false; } - virtual bool visit(UiImport *ast) + bool visit(UiImport *ast) override { if (ast && ast->importId == _name) { const Imports *imp = _context->imports(_doc.data()); @@ -499,7 +499,7 @@ protected: using Visitor::visit; - virtual bool preVisit(Node *node) + bool preVisit(Node *node) override { if (Statement *stmt = node->statementCast()) return containsOffset(stmt->firstSourceLocation(), stmt->lastSourceLocation()); @@ -510,7 +510,7 @@ protected: return true; } - virtual bool visit(IdentifierExpression *node) + bool visit(IdentifierExpression *node) override { if (containsOffset(node->identifierToken)) { _name = node->name.toString(); @@ -524,7 +524,7 @@ protected: return true; } - virtual bool visit(FieldMemberExpression *node) + bool visit(FieldMemberExpression *node) override { if (containsOffset(node->identifierToken)) { setScope(node->base); @@ -547,17 +547,17 @@ protected: return true; } - virtual bool visit(UiScriptBinding *node) + bool visit(UiScriptBinding *node) override { return !checkBindingName(node->qualifiedId); } - virtual bool visit(UiArrayBinding *node) + bool visit(UiArrayBinding *node) override { return !checkBindingName(node->qualifiedId); } - virtual bool visit(UiObjectBinding *node) + bool visit(UiObjectBinding *node) override { if ((!checkTypeName(node->qualifiedTypeNameId)) && (!checkBindingName(node->qualifiedId))) { @@ -569,7 +569,7 @@ protected: return false; } - virtual bool visit(UiObjectDefinition *node) + bool visit(UiObjectDefinition *node) override { if (!checkTypeName(node->qualifiedTypeNameId)) { Node *oldObjectNode = _objectNode; @@ -580,7 +580,7 @@ protected: return false; } - virtual bool visit(UiPublicMember *node) + bool visit(UiPublicMember *node) override { if (containsOffset(node->typeToken)){ if (node->isValid()) { @@ -598,12 +598,12 @@ protected: return true; } - virtual bool visit(FunctionDeclaration *node) + bool visit(FunctionDeclaration *node) override { return visit(static_cast<FunctionExpression *>(node)); } - virtual bool visit(FunctionExpression *node) + bool visit(FunctionExpression *node) override { if (containsOffset(node->identifierToken)) { _name = node->name.toString(); @@ -612,7 +612,7 @@ protected: return true; } - virtual bool visit(VariableDeclaration *node) + bool visit(VariableDeclaration *node) override { if (containsOffset(node->identifierToken)) { _name = node->name.toString(); diff --git a/src/plugins/qmljseditor/qmljshighlighter.cpp b/src/plugins/qmljseditor/qmljshighlighter.cpp index 06d65a3971..5777c6c3e2 100644 --- a/src/plugins/qmljseditor/qmljshighlighter.cpp +++ b/src/plugins/qmljseditor/qmljshighlighter.cpp @@ -131,13 +131,28 @@ void QmlJSHighlighter::highlightBlock(const QString &text) break; } } + if (text.midRef(token.offset, token.length) == QLatin1String("enum")) { + setFormat(token.offset, token.length, formatForCategory(C_KEYWORD)); + break; + } } else if (index > 0 && maybeQmlBuiltinType(spell)) { const Token &previousToken = tokens.at(index - 1); - if (previousToken.is(Token::Identifier) && text.at(previousToken.offset) == QLatin1Char('p') - && text.midRef(previousToken.offset, previousToken.length) == QLatin1String("property")) { + if (previousToken.is(Token::Identifier) + && text.at(previousToken.offset) == QLatin1Char('p') + && text.midRef(previousToken.offset, previousToken.length) + == QLatin1String("property")) { setFormat(token.offset, token.length, formatForCategory(C_KEYWORD)); break; } + } else if (index == 1) { + const Token &previousToken = tokens.at(0); + if (previousToken.is(Token::Identifier) + && text.at(previousToken.offset) == QLatin1Char('e') + && text.midRef(previousToken.offset, previousToken.length) + == QLatin1String("enum")) { + setFormat(token.offset, token.length, formatForCategory(C_ENUMERATION)); + break; + } } } break; @@ -206,6 +221,8 @@ bool QmlJSHighlighter::maybeQmlKeyword(const QStringRef &text) const return true; else if (ch == QLatin1Char('o') && text == QLatin1String("on")) return true; + else if (ch == QLatin1Char('e') && text == QLatin1String("enum")) + return true; else return false; } diff --git a/src/plugins/qmljseditor/qmljsoutlinetreeview.cpp b/src/plugins/qmljseditor/qmljsoutlinetreeview.cpp index d89b84a3b5..9e7efe7efd 100644 --- a/src/plugins/qmljseditor/qmljsoutlinetreeview.cpp +++ b/src/plugins/qmljseditor/qmljsoutlinetreeview.cpp @@ -26,7 +26,7 @@ #include "qmljsoutlinetreeview.h" #include "qmloutlinemodel.h" -#include <utils/annotateditemdelegate.h> +#include <utils/delegates.h> #include <QMenu> namespace QmlJSEditor { diff --git a/src/plugins/qmljseditor/qmljspreviewrunner.cpp b/src/plugins/qmljseditor/qmljspreviewrunner.cpp deleted file mode 100644 index 5d829098ec..0000000000 --- a/src/plugins/qmljseditor/qmljspreviewrunner.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "qmljspreviewrunner.h" - -#include <coreplugin/icore.h> - -#include <projectexplorer/runconfiguration.h> - -#include <utils/environment.h> -#include <utils/hostosinfo.h> -#include <utils/qtcprocess.h> -#include <utils/synchronousprocess.h> - -#include <QMessageBox> -#include <QApplication> - -namespace QmlJSEditor { -namespace Internal { - -QmlJSPreviewRunner::QmlJSPreviewRunner(QObject *parent) : - QObject(parent) -{ - // prepend creator/bin dir to search path (only useful for special creator-qml package) - const QString searchPath = QCoreApplication::applicationDirPath() - + Utils::HostOsInfo::pathListSeparator() - + QString::fromLocal8Bit(qgetenv("PATH")); - m_qmlViewerDefaultPath = Utils::SynchronousProcess::locateBinary(searchPath, QLatin1String("qmlviewer")); -} - -bool QmlJSPreviewRunner::isReady() const -{ - return !m_qmlViewerDefaultPath.isEmpty(); -} - -void QmlJSPreviewRunner::run(const QString &filename) -{ - QString errorMessage; - if (!filename.isEmpty()) { - ProjectExplorer::Runnable r; - r.environment = Utils::Environment::systemEnvironment(); - r.runMode = ProjectExplorer::ApplicationLauncher::Gui; - r.executable = m_qmlViewerDefaultPath; - r.commandLineArguments = Utils::QtcProcess::quoteArg(filename); - m_applicationLauncher.start(r); - } else { - errorMessage = tr("No file specified."); - } - - if (!errorMessage.isEmpty()) - QMessageBox::warning(Core::ICore::dialogParent(), tr("Failed to preview Qt Quick file"), - tr("Could not preview Qt Quick (QML) file. Reason:\n%1").arg(errorMessage)); -} - - -} // namespace Internal -} // namespace QmlJSEditor diff --git a/src/plugins/qmljseditor/qmljsquickfixes.cpp b/src/plugins/qmljseditor/qmljsquickfixes.cpp index 49a15a3e68..e1afb05275 100644 --- a/src/plugins/qmljseditor/qmljsquickfixes.cpp +++ b/src/plugins/qmljseditor/qmljsquickfixes.cpp @@ -138,8 +138,8 @@ public: setDescription(tr("Add a Comment to Suppress This Message")); } - virtual void performChanges(QmlJSRefactoringFilePtr currentFile, - const QmlJSRefactoringChanges &) + void performChanges(QmlJSRefactoringFilePtr currentFile, + const QmlJSRefactoringChanges &) override { Utils::ChangeSet changes; const int insertLoc = _message.location.begin() - _message.location.startColumn + 1; diff --git a/src/plugins/qmljseditor/qmljswrapinloader.cpp b/src/plugins/qmljseditor/qmljswrapinloader.cpp index fca146e3d7..509a1daf9d 100644 --- a/src/plugins/qmljseditor/qmljswrapinloader.cpp +++ b/src/plugins/qmljseditor/qmljswrapinloader.cpp @@ -62,7 +62,7 @@ public: } protected: - virtual bool visit(UiObjectInitializer *ast) + bool visit(UiObjectInitializer *ast) override { UiScriptBinding *idBinding; QString id = idOfObject(ast, &idBinding); @@ -107,8 +107,8 @@ public: return tryName; } - virtual void performChanges(QmlJSRefactoringFilePtr currentFile, - const QmlJSRefactoringChanges &) + void performChanges(QmlJSRefactoringFilePtr currentFile, + const QmlJSRefactoringChanges &) override { UiScriptBinding *idBinding; const QString id = idOfObject(m_objDef, &idBinding); diff --git a/src/plugins/qmljstools/qmljslocatordata.cpp b/src/plugins/qmljstools/qmljslocatordata.cpp index d7ee5e6154..36aa5c4010 100644 --- a/src/plugins/qmljstools/qmljslocatordata.cpp +++ b/src/plugins/qmljstools/qmljslocatordata.cpp @@ -25,6 +25,9 @@ #include "qmljslocatordata.h" +#include <projectexplorer/project.h> +#include <projectexplorer/session.h> + #include <qmljs/qmljsmodelmanagerinterface.h> #include <qmljs/qmljsutils.h> //#include <qmljs/qmljsinterpreter.h> @@ -40,10 +43,25 @@ LocatorData::LocatorData() { ModelManagerInterface *manager = ModelManagerInterface::instance(); + // Force the updating of source file when updating a project (they could be cached, in such + // case LocatorData::onDocumentUpdated will not be called. + connect(manager, &ModelManagerInterface::projectInfoUpdated, + [manager](const ModelManagerInterface::ProjectInfo &info) { + QStringList files; + for (const Utils::FileName &f: info.project->files(ProjectExplorer::Project::SourceFiles)) + files << f.toString(); + manager->updateSourceFiles(files, true); + }); + connect(manager, &ModelManagerInterface::documentUpdated, this, &LocatorData::onDocumentUpdated); connect(manager, &ModelManagerInterface::aboutToRemoveFiles, this, &LocatorData::onAboutToRemoveFiles); + + ProjectExplorer::SessionManager *session = ProjectExplorer::SessionManager::instance(); + if (session) + connect(session, &ProjectExplorer::SessionManager::projectRemoved, + [this] (ProjectExplorer::Project*) { m_entries.clear(); }); } LocatorData::~LocatorData() @@ -233,4 +251,3 @@ void LocatorData::onAboutToRemoveFiles(const QStringList &files) m_entries.remove(file); } } - diff --git a/src/plugins/qmljstools/qmljsrefactoringchanges.cpp b/src/plugins/qmljstools/qmljsrefactoringchanges.cpp index 12b5c4d7a2..b27631c2d0 100644 --- a/src/plugins/qmljstools/qmljsrefactoringchanges.cpp +++ b/src/plugins/qmljstools/qmljsrefactoringchanges.cpp @@ -46,9 +46,9 @@ public: , m_snapshot(snapshot) {} - virtual void indentSelection(const QTextCursor &selection, - const QString &fileName, - const TextEditor::TextDocument *textDocument) const + void indentSelection(const QTextCursor &selection, + const QString &fileName, + const TextEditor::TextDocument *textDocument) const override { // ### shares code with QmlJSTextEditor::indent QTextDocument *doc = selection.document(); @@ -70,9 +70,9 @@ public: } while (block.isValid() && block != end); } - virtual void reindentSelection(const QTextCursor &selection, - const QString &fileName, - const TextEditor::TextDocument *textDocument) const + void reindentSelection(const QTextCursor &selection, + const QString &fileName, + const TextEditor::TextDocument *textDocument) const override { const TextEditor::TabSettings &tabSettings = ProjectExplorer::actualTabSettings(fileName, textDocument); @@ -81,7 +81,7 @@ public: indenter.reindent(selection.document(), selection, tabSettings); } - virtual void fileChanged(const QString &fileName) + void fileChanged(const QString &fileName) override { m_modelManager->updateSourceFiles(QStringList(fileName), true); } diff --git a/src/plugins/qmljstools/qmljssemanticinfo.cpp b/src/plugins/qmljstools/qmljssemanticinfo.cpp index c2aa71dc3e..b72aa2f58e 100644 --- a/src/plugins/qmljstools/qmljssemanticinfo.cpp +++ b/src/plugins/qmljstools/qmljssemanticinfo.cpp @@ -86,7 +86,7 @@ protected: return handle(ast, ast->firstSourceLocation(), ast->lastSourceLocation(), addToPath); } - virtual bool preVisit(AST::Node *node) + bool preVisit(AST::Node *node) override { if (Statement *stmt = node->statementCast()) return handleLocationAst(stmt); @@ -97,7 +97,7 @@ protected: return true; } - virtual bool visit(AST::UiQualifiedId *ast) + bool visit(AST::UiQualifiedId *ast) override { AST::SourceLocation first = ast->identifierToken; AST::SourceLocation last; @@ -108,19 +108,19 @@ protected: return false; } - virtual bool visit(AST::UiProgram *ast) + bool visit(AST::UiProgram *ast) override { _path.append(ast); return true; } - virtual bool visit(AST::Program *ast) + bool visit(AST::Program *ast) override { _path.append(ast); return true; } - virtual bool visit(AST::UiImport *ast) + bool visit(AST::UiImport *ast) override { return handleLocationAst(ast); } diff --git a/src/plugins/qmlprofiler/memoryusagemodel.cpp b/src/plugins/qmlprofiler/memoryusagemodel.cpp index fa7c258b00..1fcfc4631f 100644 --- a/src/plugins/qmlprofiler/memoryusagemodel.cpp +++ b/src/plugins/qmlprofiler/memoryusagemodel.cpp @@ -116,16 +116,14 @@ QVariantMap MemoryUsageModel::details(int index) const else result.insert(QLatin1String("displayName"), tr("Memory Freed")); - result.insert(tr("Total"), tr("%1 byte(s)", nullptr, toSameSignedInt(ev->size)).arg(ev->size)); + result.insert(tr("Total"), tr("%n byte(s)", nullptr, toSameSignedInt(ev->size))); if (ev->allocations > 0) { - result.insert(tr("Allocated"), tr("%1 byte(s)", nullptr, toSameSignedInt(ev->allocated)) - .arg(ev->allocated)); + result.insert(tr("Allocated"), tr("%n byte(s)", nullptr, toSameSignedInt(ev->allocated))); result.insert(tr("Allocations"), ev->allocations); } if (ev->deallocations > 0) { result.insert(tr("Deallocated"), - tr("%1 byte(s)", nullptr, toSameSignedInt(-ev->deallocated)) - .arg(-ev->deallocated)); + tr("%n byte(s)", nullptr, toSameSignedInt(-ev->deallocated))); result.insert(tr("Deallocations"), ev->deallocations); } QString memoryTypeName; diff --git a/src/plugins/qmlprofiler/qmlevent.h b/src/plugins/qmlprofiler/qmlevent.h index 23a62cb643..3f999d419e 100644 --- a/src/plugins/qmlprofiler/qmlevent.h +++ b/src/plugins/qmlprofiler/qmlevent.h @@ -39,24 +39,26 @@ namespace QmlProfiler { struct QmlEvent : public Timeline::TraceEvent { - QmlEvent() : m_dataType(Inline8Bit), m_dataLength(0) {} + static const qint32 staticClassId = 0x716d6c65; // 'qmle'; + + QmlEvent() : TraceEvent(staticClassId), m_dataType(Inline8Bit), m_dataLength(0) {} template<typename Number> QmlEvent(qint64 timestamp, int typeIndex, std::initializer_list<Number> list) - : TraceEvent(timestamp, typeIndex) + : TraceEvent(staticClassId, timestamp, typeIndex) { assignNumbers<std::initializer_list<Number>, Number>(list); } QmlEvent(qint64 timestamp, int typeIndex, const QString &data) - : TraceEvent(timestamp, typeIndex) + : TraceEvent(staticClassId, timestamp, typeIndex) { assignNumbers<QByteArray, qint8>(data.toUtf8()); } template<typename Number> QmlEvent(qint64 timestamp, int typeIndex, const QVector<Number> &data) - : TraceEvent(timestamp, typeIndex) + : TraceEvent(staticClassId, timestamp, typeIndex) { assignNumbers<QVector<Number>, Number>(data); } diff --git a/src/plugins/qmlprofiler/qmleventtype.cpp b/src/plugins/qmlprofiler/qmleventtype.cpp index 9cb99c0081..88a3d6dd47 100644 --- a/src/plugins/qmlprofiler/qmleventtype.cpp +++ b/src/plugins/qmlprofiler/qmleventtype.cpp @@ -79,7 +79,7 @@ QDataStream &operator<<(QDataStream &stream, const QmlEventType &type) QmlEventType::QmlEventType(Message message, RangeType rangeType, int detailType, const QmlEventLocation &location, const QString &data, const QString displayName) : - TraceEventType(qmlFeatureFromType(message, rangeType, detailType)), + TraceEventType(staticClassId, qmlFeatureFromType(message, rangeType, detailType)), m_data(data), m_location(location), m_message(message), m_rangeType(rangeType), m_detailType(detailType) { diff --git a/src/plugins/qmlprofiler/qmleventtype.h b/src/plugins/qmlprofiler/qmleventtype.h index 6c3fc53e06..1e038e634e 100644 --- a/src/plugins/qmlprofiler/qmleventtype.h +++ b/src/plugins/qmlprofiler/qmleventtype.h @@ -37,6 +37,8 @@ namespace QmlProfiler { class QmlEventType : public Timeline::TraceEventType { public: + static const qint32 staticClassId = 0x716d6c74; // 'qmlt'; + QmlEventType(Message message = MaximumMessage, RangeType rangeType = MaximumRangeType, int detailType = -1, const QmlEventLocation &location = QmlEventLocation(), const QString &data = QString(), const QString displayName = QString()); diff --git a/src/plugins/qmlprofiler/qmlprofilerbindingloopsrenderpass.cpp b/src/plugins/qmlprofiler/qmlprofilerbindingloopsrenderpass.cpp index c41ecffb83..767696613b 100644 --- a/src/plugins/qmlprofiler/qmlprofilerbindingloopsrenderpass.cpp +++ b/src/plugins/qmlprofiler/qmlprofilerbindingloopsrenderpass.cpp @@ -295,12 +295,12 @@ class BindingLoopMaterialShader : public QSGMaterialShader public: BindingLoopMaterialShader(); - virtual void updateState(const RenderState &state, QSGMaterial *newEffect, - QSGMaterial *oldEffect); - virtual char const *const *attributeNames() const; + void updateState(const RenderState &state, QSGMaterial *newEffect, + QSGMaterial *oldEffect) override; + char const *const *attributeNames() const override; private: - virtual void initialize(); + void initialize() override; int m_matrix_id = 0; int m_z_range_id = 0; diff --git a/src/plugins/qmlprofiler/qmlprofilerdetailsrewriter.cpp b/src/plugins/qmlprofiler/qmlprofilerdetailsrewriter.cpp index b3083ebe54..e96a92623f 100644 --- a/src/plugins/qmlprofiler/qmlprofilerdetailsrewriter.cpp +++ b/src/plugins/qmlprofiler/qmlprofilerdetailsrewriter.cpp @@ -112,14 +112,8 @@ void QmlProfilerDetailsRewriter::requestDetailsForLocation(int typeId, QString QmlProfilerDetailsRewriter::getLocalFile(const QString &remoteFile) { - QString localFile; - if (!m_filesCache.contains(remoteFile)) { - localFile = m_projectFinder.findFile(remoteFile); - m_filesCache[remoteFile] = localFile; - } else { - localFile = m_filesCache[remoteFile]; - } - QFileInfo fileInfo(localFile); + const QString localFile = m_projectFinder.findFile(remoteFile); + const QFileInfo fileInfo(localFile); if (!fileInfo.exists() || !fileInfo.isReadable()) return QString(); if (!QmlJS::ModelManagerInterface::guessLanguageOfFile(localFile).isQmlLikeOrJsLanguage()) @@ -176,7 +170,6 @@ void QmlProfilerDetailsRewriter::disconnectQmlModel() void QmlProfilerDetailsRewriter::clear() { - m_filesCache.clear(); m_pendingEvents.clear(); disconnectQmlModel(); } @@ -203,14 +196,12 @@ void QmlProfilerDetailsRewriter::documentReady(QmlJS::Document::Ptr doc) if (m_pendingEvents.isEmpty()) { disconnectQmlModel(); emit eventDetailsChanged(); - m_filesCache.clear(); } } void QmlProfilerDetailsRewriter::populateFileFinder(const ProjectExplorer::Target *target) { QtSupport::BaseQtVersion::populateQmlFileFinder(&m_projectFinder, target); - m_filesCache.clear(); } } // namespace Internal diff --git a/src/plugins/qmlprofiler/qmlprofilerdetailsrewriter.h b/src/plugins/qmlprofiler/qmlprofilerdetailsrewriter.h index e58c336cfd..c0a69eaaa4 100644 --- a/src/plugins/qmlprofiler/qmlprofilerdetailsrewriter.h +++ b/src/plugins/qmlprofiler/qmlprofilerdetailsrewriter.h @@ -60,7 +60,6 @@ private: QMultiHash<QString, PendingEvent> m_pendingEvents; Utils::FileInProjectFinder m_projectFinder; - QHash<QString, QString> m_filesCache; void rewriteDetailsForLocation(const QString &source, QmlJS::Document::Ptr doc, int typeId, const QmlEventLocation &location); diff --git a/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp b/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp index c54c7f0981..2d02c10afd 100644 --- a/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp +++ b/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp @@ -148,8 +148,9 @@ void QmlProfilerModelManager::registerFeatures(quint64 features, QmlEventLoader { const TraceEventLoader traceEventLoader = eventLoader ? [eventLoader]( const Timeline::TraceEvent &event, const Timeline::TraceEventType &type) { - return eventLoader(static_cast<const QmlEvent &>(event), - static_cast<const QmlEventType &>(type)); + QTC_ASSERT(event.is<QmlEvent>(), return); + QTC_ASSERT(type.is<QmlEventType>(), return); + eventLoader(event.asConstRef<QmlEvent>(), type.asConstRef<QmlEventType>()); } : TraceEventLoader(); Timeline::TimelineTraceManager::registerFeatures(features, traceEventLoader, initializer, @@ -158,7 +159,10 @@ void QmlProfilerModelManager::registerFeatures(quint64 features, QmlEventLoader const QmlEventType &QmlProfilerModelManager::eventType(int typeId) const { - return static_cast<const QmlEventType &>(TimelineTraceManager::eventType(typeId)); + static const QmlEventType invalid; + const Timeline::TraceEventType &type = TimelineTraceManager::eventType(typeId); + QTC_ASSERT(type.is<QmlEventType>(), return invalid); + return type.asConstRef<QmlEventType>(); } void QmlProfilerModelManager::replayEvents(TraceEventLoader loader, Initializer initializer, @@ -190,7 +194,8 @@ void QmlProfilerModelManager::replayQmlEvents(QmlEventLoader loader, if (future.isCanceled()) return false; - loader(static_cast<QmlEvent &&>(event), eventType(event.typeIndex())); + QTC_ASSERT(event.is<QmlEvent>(), return false); + loader(event.asRvalueRef<QmlEvent>(), eventType(event.typeIndex())); return true; }); @@ -462,13 +467,19 @@ void QmlProfilerEventTypeStorage::set(int typeId, Timeline::TraceEventType &&typ const size_t index = static_cast<size_t>(typeId); if (m_types.size() <= index) m_types.resize(index + 1); - m_types[index] = std::move(static_cast<QmlEventType &&>(type)); + QTC_ASSERT(type.is<QmlEventType>(), return); + m_types[index] = std::move(type.asRvalueRef<QmlEventType>()); } int QmlProfilerEventTypeStorage::append(Timeline::TraceEventType &&type) { const size_t index = m_types.size(); - m_types.push_back(std::move(static_cast<QmlEventType &&>(type))); + if (type.is<QmlEventType>()) { + m_types.push_back(std::move(type.asRvalueRef<QmlEventType>())); + } else { + QTC_CHECK(false); + m_types.push_back(QmlEventType()); + } QTC_ASSERT(index <= std::numeric_limits<int>::max(), return std::numeric_limits<int>::max()); return static_cast<int>(index); } @@ -495,7 +506,8 @@ QmlProfilerEventStorage::QmlProfilerEventStorage( int QmlProfilerEventStorage::append(Timeline::TraceEvent &&event) { - m_file.append(std::move(static_cast<QmlEvent &&>(event))); + QTC_ASSERT(event.is<QmlEvent>(), return m_size); + m_file.append(std::move(event.asRvalueRef<QmlEvent>())); return m_size++; } diff --git a/src/plugins/qmlprofiler/qmlprofilerruncontrol.cpp b/src/plugins/qmlprofiler/qmlprofilerruncontrol.cpp index 18688ce367..d2ee9434d1 100644 --- a/src/plugins/qmlprofiler/qmlprofilerruncontrol.cpp +++ b/src/plugins/qmlprofiler/qmlprofilerruncontrol.cpp @@ -260,7 +260,6 @@ LocalQmlProfilerSupport::LocalQmlProfilerSupport(QmlProfilerTool *profilerTool, arguments += ' ' + debuggee.commandLineArguments; debuggee.commandLineArguments = arguments; - debuggee.runMode = ApplicationLauncher::Gui; setRunnable(debuggee); } diff --git a/src/plugins/qmlprofiler/qmlprofilertool.cpp b/src/plugins/qmlprofiler/qmlprofilertool.cpp index e78858f2bd..8003788d90 100644 --- a/src/plugins/qmlprofiler/qmlprofilertool.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertool.cpp @@ -41,6 +41,7 @@ #include <app/app_version.h> #include <debugger/debuggericons.h> +#include <debugger/debuggermainwindow.h> #include <debugger/analyzer/analyzermanager.h> #include <utils/fancymainwindow.h> @@ -228,15 +229,14 @@ QmlProfilerTool::QmlProfilerTool() QObject::connect(d->m_startAction, &QAction::triggered, this, &QmlProfilerTool::profileStartupProject); - Utils::ToolbarDescription toolbar; - toolbar.addAction(d->m_startAction); - toolbar.addAction(d->m_stopAction); - toolbar.addWidget(d->m_recordButton); - toolbar.addWidget(d->m_clearButton); - toolbar.addWidget(d->m_searchButton); - toolbar.addWidget(d->m_displayFeaturesButton); - toolbar.addWidget(d->m_timeLabel); - Debugger::registerToolbar(Constants::QmlProfilerPerspectiveId, toolbar); + Utils::Perspective *perspective = d->m_viewContainer->perspective(); + perspective->addToolbarAction(d->m_startAction); + perspective->addToolbarAction(d->m_stopAction); + perspective->addToolbarWidget(d->m_recordButton); + perspective->addToolbarWidget(d->m_clearButton); + perspective->addToolbarWidget(d->m_searchButton); + perspective->addToolbarWidget(d->m_displayFeaturesButton); + perspective->addToolbarWidget(d->m_timeLabel); connect(ProjectExplorerPlugin::instance(), &ProjectExplorerPlugin::updateRunActions, this, &QmlProfilerTool::updateRunActions); diff --git a/src/plugins/qmlprofiler/qmlprofilertracefile.cpp b/src/plugins/qmlprofiler/qmlprofilertracefile.cpp index 38ac383f36..075c518e77 100644 --- a/src/plugins/qmlprofiler/qmlprofilertracefile.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertracefile.cpp @@ -789,7 +789,7 @@ void QmlProfilerTraceFile::saveQtd(QIODevice *device) if (stream.hasError()) fail(tr("Error writing trace file.")); }, [this](const QString &message) { - fail(tr("Could not re-read events from temporary trace file: %s\nSaving failed.") + fail(tr("Could not re-read events from temporary trace file: %1\nSaving failed.") .arg(message)); }, future()); } @@ -857,7 +857,7 @@ void QmlProfilerTraceFile::saveQzt(QIODevice *device) addEventsProgress(traceEnd() - lastProgressTimestamp); } }, [this](const QString &message) { - fail(tr("Could not re-read events from temporary trace file: %s\nSaving failed.") + fail(tr("Could not re-read events from temporary trace file: %1\nSaving failed.") .arg(message)); }, future()); } diff --git a/src/plugins/qmlprofiler/qmlprofilerviewmanager.cpp b/src/plugins/qmlprofiler/qmlprofilerviewmanager.cpp index a18ffa8a8e..2dabf61858 100644 --- a/src/plugins/qmlprofiler/qmlprofilerviewmanager.cpp +++ b/src/plugins/qmlprofiler/qmlprofilerviewmanager.cpp @@ -61,8 +61,7 @@ QmlProfilerViewManager::QmlProfilerViewManager(QObject *parent, new QmlProfilerStateWidget(m_profilerState, m_profilerModelManager, m_traceView); - auto perspective = new Utils::Perspective; - perspective->setName(tr("QML Profiler")); + m_perspective = new Utils::Perspective(Constants::QmlProfilerPerspectiveId, tr("QML Profiler")); auto prepareEventsView = [this](QmlProfilerEventsView *view) { connect(view, &QmlProfilerEventsView::typeSelected, @@ -83,22 +82,26 @@ QmlProfilerViewManager::QmlProfilerViewManager(QObject *parent, m_flameGraphView = new FlameGraphView(m_profilerModelManager); prepareEventsView(m_flameGraphView); - QByteArray anchorDockId; + QWidget *anchor = nullptr; if (m_traceView->isUsable()) { - anchorDockId = m_traceView->objectName().toLatin1(); - perspective->addOperation({anchorDockId, m_traceView, {}, Perspective::SplitVertical}); - perspective->addOperation({m_flameGraphView->objectName().toLatin1(), m_flameGraphView, - anchorDockId, Perspective::AddToTab}); + anchor = m_traceView; + m_perspective->addWindow(m_traceView, Perspective::SplitVertical, nullptr); + m_perspective->addWindow(m_flameGraphView, Perspective::AddToTab, anchor); } else { - anchorDockId = m_flameGraphView->objectName().toLatin1(); - perspective->addOperation({anchorDockId, m_flameGraphView, {}, - Perspective::SplitVertical}); + anchor = m_flameGraphView; + m_perspective->addWindow(m_flameGraphView, Perspective::SplitVertical, nullptr); } - perspective->addOperation({m_statisticsView->objectName().toLatin1(), m_statisticsView, - anchorDockId, Perspective::AddToTab}); - perspective->addOperation({anchorDockId, nullptr, {}, Perspective::Raise}); + m_perspective->addWindow(m_statisticsView, Perspective::AddToTab, anchor); + m_perspective->addWindow(anchor, Perspective::Raise, nullptr); - Debugger::registerPerspective(Constants::QmlProfilerPerspectiveId, perspective); + Debugger::registerPerspective(m_perspective); +} + +QmlProfilerViewManager::~QmlProfilerViewManager() +{ + delete m_traceView; + delete m_flameGraphView; + delete m_statisticsView; } void QmlProfilerViewManager::clear() diff --git a/src/plugins/qmlprofiler/qmlprofilerviewmanager.h b/src/plugins/qmlprofiler/qmlprofilerviewmanager.h index 655c1933eb..e106afb4cc 100644 --- a/src/plugins/qmlprofiler/qmlprofilerviewmanager.h +++ b/src/plugins/qmlprofiler/qmlprofilerviewmanager.h @@ -31,6 +31,8 @@ #include <QObject> +namespace Utils { class Perspective; } + namespace QmlProfiler { namespace Internal { @@ -44,10 +46,12 @@ public: QmlProfilerViewManager(QObject *parent, QmlProfilerModelManager *modelManager, QmlProfilerStateManager *profilerState); + ~QmlProfilerViewManager(); QmlProfilerTraceView *traceView() const { return m_traceView; } QmlProfilerStatisticsView *statisticsView() const { return m_statisticsView; } FlameGraphView *flameGraphView() const { return m_flameGraphView; } + Utils::Perspective *perspective() const { return m_perspective; } void clear(); @@ -61,6 +65,7 @@ private: FlameGraphView *m_flameGraphView = nullptr; QmlProfilerStateManager *m_profilerState = nullptr; QmlProfilerModelManager *m_profilerModelManager = nullptr; + Utils::Perspective *m_perspective = nullptr; }; diff --git a/src/plugins/qmlprofiler/tests/memoryusagemodel_test.cpp b/src/plugins/qmlprofiler/tests/memoryusagemodel_test.cpp index faa0dd1e89..804c6d8fb1 100644 --- a/src/plugins/qmlprofiler/tests/memoryusagemodel_test.cpp +++ b/src/plugins/qmlprofiler/tests/memoryusagemodel_test.cpp @@ -150,9 +150,9 @@ void MemoryUsageModelTest::testDetails() const QVariantMap allocated = model.details(0); QCOMPARE(allocated[QString("displayName")].toString(), model.tr("Memory Allocated")); QCOMPARE(allocated[model.tr("Total")].toString(), - model.tr("%1 byte(s)", nullptr, 4096).arg(4096)); + model.tr("%n byte(s)", nullptr, 4096)); QCOMPARE(allocated[model.tr("Allocated")].toString(), - model.tr("%1 byte(s)", nullptr, 4096).arg(4096)); + model.tr("%n byte(s)", nullptr, 4096)); QCOMPARE(allocated[model.tr("Allocations")].toString(), QString::number(2)); QCOMPARE(allocated[model.tr("Type")].toString(), model.tr("Heap Allocation")); QCOMPARE(allocated[model.tr("Location")].toString(), QmlProfilerModelManager::tr("<bytecode>")); @@ -163,9 +163,9 @@ void MemoryUsageModelTest::testDetails() const QVariantMap large = model.details(2); QCOMPARE(large[QString("displayName")].toString(), model.tr("Memory Allocated")); QCOMPARE(large[model.tr("Total")].toString(), - model.tr("%1 byte(s)", nullptr, 5120).arg(5120)); + model.tr("%n byte(s)", nullptr, 5120)); QCOMPARE(large[model.tr("Allocated")].toString(), - model.tr("%1 byte(s)", nullptr, 1024).arg(1024)); + model.tr("%n byte(s)", nullptr, 1024)); QCOMPARE(large[model.tr("Allocations")].toString(), QString::number(1)); QCOMPARE(large[model.tr("Type")].toString(), model.tr("Large Item Allocation")); QCOMPARE(large[model.tr("Location")].toString(), QmlProfilerModelManager::tr("<bytecode>")); @@ -175,10 +175,8 @@ void MemoryUsageModelTest::testDetails() const QVariantMap freed = model.details(9); QCOMPARE(freed[QString("displayName")].toString(), model.tr("Memory Freed")); - QCOMPARE(freed[model.tr("Total")].toString(), - model.tr("%1 byte(s)", nullptr, 2048).arg(2048)); - QCOMPARE(freed[model.tr("Deallocated")].toString(), - model.tr("%1 byte(s)", nullptr, 1024).arg(1024)); + QCOMPARE(freed[model.tr("Total")].toString(), model.tr("%n byte(s)", nullptr, 2048)); + QCOMPARE(freed[model.tr("Deallocated")].toString(), model.tr("%n byte(s)", nullptr, 1024)); QCOMPARE(freed[model.tr("Deallocations")].toString(), QString::number(1)); QCOMPARE(freed[model.tr("Type")].toString(), model.tr("Heap Usage")); QCOMPARE(freed[model.tr("Location")].toString(), QmlProfilerModelManager::tr("<bytecode>")); diff --git a/src/plugins/qmlprofiler/tests/qmlprofilerattachdialog_test.cpp b/src/plugins/qmlprofiler/tests/qmlprofilerattachdialog_test.cpp index cf2020f2d8..e37a9f0ec0 100644 --- a/src/plugins/qmlprofiler/tests/qmlprofilerattachdialog_test.cpp +++ b/src/plugins/qmlprofiler/tests/qmlprofilerattachdialog_test.cpp @@ -46,15 +46,16 @@ void QmlProfilerAttachDialogTest::testAccessors() dialog.setPort(4444); QCOMPARE(dialog.port(), 4444); - ProjectExplorer::Kit *newKit = new ProjectExplorer::Kit("dings"); + auto newKit = std::make_unique<ProjectExplorer::Kit>("dings"); + ProjectExplorer::Kit *newKitPtr = newKit.get(); ProjectExplorer::KitManager *kitManager = ProjectExplorer::KitManager::instance(); QVERIFY(kitManager); - QVERIFY(kitManager->registerKit(newKit)); + QVERIFY(kitManager->registerKit(std::move(newKit))); dialog.setKitId("dings"); - QCOMPARE(dialog.kit(), newKit); + QCOMPARE(dialog.kit(), newKitPtr); - kitManager->deregisterKit(newKit); + kitManager->deregisterKit(newKitPtr); } } // namespace Internal diff --git a/src/plugins/qmlprofiler/tests/qmlprofilerdetailsrewriter_test.cpp b/src/plugins/qmlprofiler/tests/qmlprofilerdetailsrewriter_test.cpp index 830f1a1e61..0aa74983ae 100644 --- a/src/plugins/qmlprofiler/tests/qmlprofilerdetailsrewriter_test.cpp +++ b/src/plugins/qmlprofiler/tests/qmlprofilerdetailsrewriter_test.cpp @@ -213,8 +213,9 @@ void QmlProfilerDetailsRewriterTest::seedRewriter() QFutureInterface<void> result; QmlJS::PathsAndLanguages lPaths; - for (auto p : QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath)) - lPaths.maybeInsert(Utils::FileName::fromString(p), QmlJS::Dialect::Qml); + lPaths.maybeInsert( + Utils::FileName::fromString(QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath)), + QmlJS::Dialect::Qml); QmlJS::ModelManagerInterface::importScan(result, QmlJS::ModelManagerInterface::workingCopy(), lPaths, m_modelManager, false); @@ -228,17 +229,22 @@ void QmlProfilerDetailsRewriterTest::seedRewriter() doc->parse(); QVERIFY(!doc->source().isEmpty()); - ProjectExplorer::Kit *kit = new ProjectExplorer::Kit; + auto kit = std::make_unique<ProjectExplorer::Kit>(); ProjectExplorer::SysRootKitInformation::setSysRoot( - kit, Utils::FileName::fromLatin1("/nowhere")); + kit.get(), Utils::FileName::fromLatin1("/nowhere")); DummyProject *project = new DummyProject(Utils::FileName::fromString(filename)); ProjectExplorer::SessionManager::addProject(project); - ProjectExplorer::Target *target = project->createTarget(kit); - m_rewriter.populateFileFinder(target); + { + // Make sure the uniqe_ptr gets deleted before the project. + // Otherwise we'll get a double free because the target is also parented to the project + // and unique_ptr doesn't know anything about QObject parent/child relationships. + std::unique_ptr<ProjectExplorer::Target> target = project->createTarget(kit.get()); + m_rewriter.populateFileFinder(target.get()); + } + ProjectExplorer::SessionManager::removeProject(project); - ProjectExplorer::KitManager::deleteKit(kit); } } // namespace Internal diff --git a/src/plugins/qmlprofiler/tests/qmlprofilertool_test.cpp b/src/plugins/qmlprofiler/tests/qmlprofilertool_test.cpp index fdba15f03d..60ffc383e0 100644 --- a/src/plugins/qmlprofiler/tests/qmlprofilertool_test.cpp +++ b/src/plugins/qmlprofiler/tests/qmlprofilertool_test.cpp @@ -44,13 +44,14 @@ namespace Internal { void QmlProfilerToolTest::testAttachToWaitingApplication() { - ProjectExplorer::Kit *newKit = new ProjectExplorer::Kit("fookit"); + auto newKit = std::make_unique<ProjectExplorer::Kit>("fookit"); + ProjectExplorer::Kit * newKitPtr = newKit.get(); ProjectExplorer::KitManager *kitManager = ProjectExplorer::KitManager::instance(); QVERIFY(kitManager); - QVERIFY(kitManager->registerKit(newKit)); + QVERIFY(kitManager->registerKit(std::move(newKit))); QSettings *settings = Core::ICore::settings(); QVERIFY(settings); - settings->setValue(QLatin1String("AnalyzerQmlAttachDialog/kitId"), newKit->id().toSetting()); + settings->setValue(QLatin1String("AnalyzerQmlAttachDialog/kitId"), newKitPtr->id().toSetting()); QmlProfilerTool profilerTool; QTcpServer server; diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp index 09ad0017b5..a9a883d63f 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.cpp +++ b/src/plugins/qmlprojectmanager/qmlproject.cpp @@ -76,10 +76,6 @@ QmlProject::~QmlProject() void QmlProject::addedTarget(Target *target) { - connect(target, &Target::addedRunConfiguration, - this, &QmlProject::addedRunConfiguration); - foreach (RunConfiguration *rc, target->runConfigurations()) - addedRunConfiguration(rc); updateDeploymentData(target); } @@ -101,15 +97,6 @@ void QmlProject::onKitChanged() refresh(Configuration); } -void QmlProject::addedRunConfiguration(RunConfiguration *rc) -{ - // The enabled state of qml runconfigurations can only be decided after - // they have been added to a project - QmlProjectRunConfiguration *qmlrc = qobject_cast<QmlProjectRunConfiguration *>(rc); - if (qmlrc) - qmlrc->updateEnabledState(); -} - Utils::FileName QmlProject::canonicalProjectDir() const { return m_canonicalProjectDir; diff --git a/src/plugins/qmlprojectmanager/qmlproject.h b/src/plugins/qmlprojectmanager/qmlproject.h index c65b4803ac..f3be29287c 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.h +++ b/src/plugins/qmlprojectmanager/qmlproject.h @@ -89,7 +89,6 @@ private: void addedTarget(ProjectExplorer::Target *target); void onActiveTargetChanged(ProjectExplorer::Target *target); void onKitChanged(); - void addedRunConfiguration(ProjectExplorer::RunConfiguration *); // plain format void parseProject(RefreshOptions options); diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp index cc9fdb2168..0fd9f17f95 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp @@ -77,7 +77,6 @@ Runnable QmlProjectRunConfiguration::runnable() const Runnable r; r.executable = executable(); r.commandLineArguments = commandLineArguments(); - r.runMode = ApplicationLauncher::Gui; r.environment = extraAspect<QmlProjectEnvironmentAspect>()->environment(); r.workingDirectory = static_cast<QmlProject *>(project())->targetDirectory(target()).toString(); return r; @@ -299,6 +298,8 @@ QmlProjectRunConfigurationFactory::QmlProjectRunConfigurationFactory() registerRunConfiguration<QmlProjectRunConfiguration> ("QmlProjectManager.QmlRunConfiguration.QmlScene"); addSupportedProjectType(QmlProjectManager::Constants::QML_PROJECT_ID); + + addRunWorkerFactory<SimpleTargetRunner>(ProjectExplorer::Constants::NORMAL_RUN_MODE); } } // namespace Internal diff --git a/src/plugins/qnx/pathchooserdelegate.cpp b/src/plugins/qnx/pathchooserdelegate.cpp deleted file mode 100644 index 2b37c0d9b7..0000000000 --- a/src/plugins/qnx/pathchooserdelegate.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 BlackBerry Limited. All rights reserved. -** Contact: KDAB (info@kdab.com) -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "pathchooserdelegate.h" - -#include <utils/pathchooser.h> -#include <utils/fancylineedit.h> - -namespace Qnx { -namespace Internal { - -PathChooserDelegate::PathChooserDelegate(QObject *parent) - : QStyledItemDelegate(parent) - , m_kind(Utils::PathChooser::ExistingDirectory) -{ -} - -void PathChooserDelegate::setExpectedKind(Utils::PathChooser::Kind kind) -{ - m_kind = kind; -} - -void PathChooserDelegate::setPromptDialogFilter(const QString &filter) -{ - m_filter = filter; -} - -QWidget *PathChooserDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const -{ - Q_UNUSED(option); - Q_UNUSED(index); - - Utils::PathChooser *editor = new Utils::PathChooser(parent); - - editor->setHistoryCompleter(m_historyKey); - editor->setAutoFillBackground(true); // To hide the text beneath the editor widget - editor->lineEdit()->setMinimumWidth(0); - - connect(editor, &Utils::PathChooser::browsingFinished, this, [this, editor]() { - emit const_cast<PathChooserDelegate*>(this)->commitData(editor); - }); - - return editor; -} - -void PathChooserDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const -{ - QString value = index.model()->data(index, Qt::EditRole).toString(); - - Utils::PathChooser *pathChooser = qobject_cast<Utils::PathChooser *>(editor); - if (!pathChooser) - return; - - pathChooser->setExpectedKind(m_kind); - pathChooser->setPromptDialogFilter(m_filter); - pathChooser->setPath(value); -} - -void PathChooserDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const -{ - Utils::PathChooser *pathChooser = qobject_cast<Utils::PathChooser *>(editor); - if (!pathChooser) - return; - - model->setData(index, pathChooser->path(), Qt::EditRole); -} - -void PathChooserDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const -{ - Q_UNUSED(index); - - editor->setGeometry(option.rect); -} - -void PathChooserDelegate::setHistoryCompleter(const QString &key) -{ - m_historyKey = key; -} - -} // namespace Internal -} // namespace Qnx diff --git a/src/plugins/qnx/pathchooserdelegate.h b/src/plugins/qnx/pathchooserdelegate.h deleted file mode 100644 index c8158b423f..0000000000 --- a/src/plugins/qnx/pathchooserdelegate.h +++ /dev/null @@ -1,65 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 BlackBerry Limited. All rights reserved. -** Contact: KDAB (info@kdab.com) -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include <QStyledItemDelegate> - -#include <utils/pathchooser.h> - -namespace Qnx { -namespace Internal { - -// TODO: This whole class should probably go into utils - -class PathChooserDelegate : public QStyledItemDelegate -{ - Q_OBJECT -public: - explicit PathChooserDelegate(QObject *parent = 0); - - void setExpectedKind(Utils::PathChooser::Kind kind); - void setPromptDialogFilter(const QString &filter); - - QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, - const QModelIndex &index) const; - - void setEditorData(QWidget *editor, const QModelIndex &index) const; - void setModelData(QWidget *editor, QAbstractItemModel *model, - const QModelIndex &index) const; - - void updateEditorGeometry(QWidget *editor, - const QStyleOptionViewItem &option, const QModelIndex &index) const; - - void setHistoryCompleter(const QString &key); - -private: - Utils::PathChooser::Kind m_kind; - QString m_filter; - QString m_historyKey; -}; - -} // namespace Internal -} // namespace Qnx diff --git a/src/plugins/qnx/qnx.pro b/src/plugins/qnx/qnx.pro index 49f9d55b77..50a35847d8 100644 --- a/src/plugins/qnx/qnx.pro +++ b/src/plugins/qnx/qnx.pro @@ -14,7 +14,6 @@ SOURCES += qnxplugin.cpp \ qnxqtversion.cpp \ qnxdeployconfiguration.cpp \ qnxdevice.cpp \ - pathchooserdelegate.cpp \ qnxdevicetester.cpp \ qnxdeviceprocesssignaloperation.cpp \ qnxdeviceprocesslist.cpp \ @@ -41,7 +40,6 @@ HEADERS += qnxplugin.h\ qnxqtversion.h \ qnxdeployconfiguration.h \ qnxdevice.h \ - pathchooserdelegate.h \ qnxdevicetester.h \ qnxdeviceprocesssignaloperation.h \ qnxdeviceprocesslist.h \ diff --git a/src/plugins/qnx/qnx.qbs b/src/plugins/qnx/qnx.qbs index 8740daf0ce..6965b5eb16 100644 --- a/src/plugins/qnx/qnx.qbs +++ b/src/plugins/qnx/qnx.qbs @@ -18,8 +18,6 @@ QtcPlugin { "qnxdeployqtlibrariesdialog.cpp", "qnxdeployqtlibrariesdialog.h", "qnxdeployqtlibrariesdialog.ui", - "pathchooserdelegate.cpp", - "pathchooserdelegate.h", "qnxtoolchain.cpp", "qnxtoolchain.h", "qnx.qrc", diff --git a/src/plugins/qnx/qnxconfiguration.cpp b/src/plugins/qnx/qnxconfiguration.cpp index 0f15f9fcfe..6032da6fe4 100644 --- a/src/plugins/qnx/qnxconfiguration.cpp +++ b/src/plugins/qnx/qnxconfiguration.cpp @@ -300,18 +300,19 @@ ProjectExplorer::Kit *QnxConfiguration::createKit( QnxQtVersion *qnxQt = qnxQtVersion(target); // Do not create incomplete kits if no qt qnx version found if (!qnxQt) - return 0; + return nullptr; - Kit *kit = new Kit; + auto kit = std::make_unique<Kit>(); + Kit *kptr = kit.get(); - QtKitInformation::setQtVersion(kit, qnxQt); - ToolChainKitInformation::setToolChain(kit, toolChain); - ToolChainKitInformation::clearToolChain(kit, ProjectExplorer::Constants::C_LANGUAGE_ID); + QtKitInformation::setQtVersion(kptr, qnxQt); + ToolChainKitInformation::setToolChain(kptr, toolChain); + ToolChainKitInformation::clearToolChain(kptr, ProjectExplorer::Constants::C_LANGUAGE_ID); if (debugger.isValid()) - DebuggerKitInformation::setDebugger(kit, debugger); + DebuggerKitInformation::setDebugger(kptr, debugger); - DeviceTypeKitInformation::setDeviceTypeId(kit, Constants::QNX_QNX_OS_TYPE); + DeviceTypeKitInformation::setDeviceTypeId(kptr, Constants::QNX_QNX_OS_TYPE); // TODO: Add sysroot? kit->setUnexpandedDisplayName( @@ -332,8 +333,8 @@ ProjectExplorer::Kit *QnxConfiguration::createKit( kit->setSticky(QmakeProjectManager::Constants::KIT_INFORMATION_ID, true); // add kit with device and qt version not sticky - KitManager::registerKit(kit); - return kit; + KitManager::registerKit(std::move(kit)); + return kptr; } QStringList QnxConfiguration::validationErrors() const diff --git a/src/plugins/qnx/qnxdevicetester.cpp b/src/plugins/qnx/qnxdevicetester.cpp index 41e3de5a0b..e89aa337c0 100644 --- a/src/plugins/qnx/qnxdevicetester.cpp +++ b/src/plugins/qnx/qnxdevicetester.cpp @@ -53,6 +53,7 @@ QnxDeviceTester::QnxDeviceTester(QObject *parent) this, &QnxDeviceTester::handleProcessFinished); m_commandsToTest << QLatin1String("awk") + << QLatin1String("cat") << QLatin1String("grep") << QLatin1String("kill") << QLatin1String("netstat") diff --git a/src/plugins/qnx/qnxutils.cpp b/src/plugins/qnx/qnxutils.cpp index 37351cd92d..8178c33f09 100644 --- a/src/plugins/qnx/qnxutils.cpp +++ b/src/plugins/qnx/qnxutils.cpp @@ -241,15 +241,14 @@ QList<QnxTarget> QnxUtils::findTargets(const Utils::FileName &basePath) Abi QnxUtils::convertAbi(const Abi &abi) { - if (abi.os() == Abi::LinuxOS && abi.osFlavor() == Abi::GenericLinuxFlavor) { + if (abi.os() == Abi::LinuxOS && abi.osFlavor() == Abi::GenericFlavor) { return Abi(abi.architecture(), Abi::QnxOS, - Abi::GenericQnxFlavor, + Abi::GenericFlavor, abi.binaryFormat(), abi.wordWidth()); - } else { - return abi; } + return abi; } QList<Abi> QnxUtils::convertAbis(const QList<Abi> &abis) diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp index af6cdcb44a..d0e892eaed 100644 --- a/src/plugins/qtsupport/baseqtversion.cpp +++ b/src/plugins/qtsupport/baseqtversion.cpp @@ -74,6 +74,8 @@ static const char QTVERSION_OVERRIDE_FEATURES[] = "overrideFeatures"; static const char QTVERSIONQMAKEPATH[] = "QMakePath"; static const char QTVERSIONSOURCEPATH[] = "SourcePath"; +static const char QTVERSION_ABIS[] = "Abis"; + static const char MKSPEC_VALUE_LIBINFIX[] = "QT_LIBINFIX"; static const char MKSPEC_VALUE_NAMESPACE[] = "QT_NAMESPACE"; @@ -102,12 +104,21 @@ static QSet<Id> versionedIds(const QByteArray &prefix, int major, int minor) } /////////////// +// MacroExpanderWrapper +/////////////// +MacroExpander *MacroExpanderWrapper::macroExpander(const BaseQtVersion *qtversion) const +{ + if (!m_expander) + m_expander = BaseQtVersion::createMacroExpander([qtversion]() { return qtversion; }); + return m_expander.get(); +} + +/////////////// // QtVersionNumber /////////////// QtVersionNumber::QtVersionNumber(int ma, int mi, int p) : majorVersion(ma), minorVersion(mi), patchVersion(p) -{ -} +{ } QtVersionNumber::QtVersionNumber(const QString &versionString) { @@ -116,11 +127,6 @@ QtVersionNumber::QtVersionNumber(const QString &versionString) majorVersion = minorVersion = patchVersion = -1; } -QtVersionNumber::QtVersionNumber() -{ - majorVersion = minorVersion = patchVersion = -1; -} - QSet<Id> QtVersionNumber::features() const { return versionedIds(Constants::FEATURE_QT_PREFIX, majorVersion, minorVersion); @@ -182,112 +188,17 @@ bool QtVersionNumber::operator >=(const QtVersionNumber &b) const /////////////// // BaseQtVersion /////////////// -int BaseQtVersion::getUniqueId() -{ - return QtVersionManager::getUniqueId(); -} BaseQtVersion::BaseQtVersion(const FileName &qmakeCommand, bool isAutodetected, const QString &autodetectionSource) - : m_id(getUniqueId()), + : m_id(QtVersionManager::getUniqueId()), m_isAutodetected(isAutodetected), - m_hasQmlDump(false), - m_mkspecUpToDate(false), - m_mkspecReadUpToDate(false), - m_defaultConfigIsDebug(true), - m_defaultConfigIsDebugAndRelease(true), - m_frameworkBuild(false), - m_versionInfoUpToDate(false), - m_installed(true), - m_hasExamples(false), - m_hasDemos(false), - m_hasDocumentation(false), - m_qmakeIsExecutable(true), - m_hasQtAbis(false), - m_autodetectionSource(autodetectionSource) -{ - ctor(qmakeCommand); -} - -BaseQtVersion::BaseQtVersion(const BaseQtVersion &other) : - m_id(other.m_id), - m_isAutodetected(other.m_isAutodetected), - m_hasQmlDump(other.m_hasQmlDump), - m_mkspecUpToDate(other.m_mkspecUpToDate), - m_mkspecReadUpToDate(other.m_mkspecReadUpToDate), - m_defaultConfigIsDebug(other.m_defaultConfigIsDebug), - m_defaultConfigIsDebugAndRelease(other.m_defaultConfigIsDebugAndRelease), - m_frameworkBuild(other.m_frameworkBuild), - m_versionInfoUpToDate(other.m_versionInfoUpToDate), - m_installed(other.m_installed), - m_hasExamples(other.m_hasExamples), - m_hasDemos(other.m_hasDemos), - m_hasDocumentation(other.m_hasDocumentation), - m_qmakeIsExecutable(other.m_qmakeIsExecutable), - m_hasQtAbis(other.m_hasQtAbis), - m_configValues(other.m_configValues), - m_qtConfigValues(other.m_qtConfigValues), - m_unexpandedDisplayName(other.m_unexpandedDisplayName), - m_autodetectionSource(other.m_autodetectionSource), - m_overrideFeatures(other.m_overrideFeatures), - m_sourcePath(other.m_sourcePath), - m_mkspec(other.m_mkspec), - m_mkspecFullPath(other.m_mkspecFullPath), - m_mkspecValues(other.m_mkspecValues), - m_versionInfo(other.m_versionInfo), - m_qmakeCommand(other.m_qmakeCommand), - m_qtVersionString(other.m_qtVersionString), - m_uicCommand(other.m_uicCommand), - m_designerCommand(other.m_designerCommand), - m_linguistCommand(other.m_linguistCommand), - m_qscxmlcCommand(other.m_qscxmlcCommand), - m_qtAbis(other.m_qtAbis) -{ - setupExpander(); -} - -BaseQtVersion::BaseQtVersion() - : m_id(-1), m_isAutodetected(false), - m_hasQmlDump(false), - m_mkspecUpToDate(false), - m_mkspecReadUpToDate(false), - m_defaultConfigIsDebug(true), - m_defaultConfigIsDebugAndRelease(true), - m_frameworkBuild(false), - m_versionInfoUpToDate(false), - m_installed(true), - m_hasExamples(false), - m_hasDemos(false), - m_hasDocumentation(false), - m_qmakeIsExecutable(true), - m_hasQtAbis(false) -{ - ctor(FileName()); -} - -void BaseQtVersion::ctor(const FileName &qmakePath) -{ - m_qmakeCommand = qmakePath; - m_designerCommand.clear(); - m_linguistCommand.clear(); - m_uicCommand.clear(); - m_qscxmlcCommand.clear(); - m_mkspecUpToDate = false; - m_mkspecReadUpToDate = false; - m_versionInfoUpToDate = false; - m_hasQtAbis = false; - m_qtVersionString.clear(); - m_sourcePath.clear(); - setupExpander(); -} + m_autodetectionSource(autodetectionSource), + m_qmakeCommand(qmakeCommand) +{ } +BaseQtVersion::BaseQtVersion(const BaseQtVersion &other) = default; +BaseQtVersion::BaseQtVersion() = default; -void BaseQtVersion::setupExpander() -{ - m_expander = createMacroExpander([this]{ return this; }); -} - -BaseQtVersion::~BaseQtVersion() -{ -} +BaseQtVersion::~BaseQtVersion() = default; QString BaseQtVersion::defaultUnexpandedDisplayName(const FileName &qmakePath, bool fromPath) { @@ -594,6 +505,12 @@ void BaseQtVersion::fromMap(const QVariantMap &map) m_qtSources = Utils::FileName::fromUserInput( map.value(QTVERSIONSOURCEPATH).toString()); + // Handle ABIs provided by the SDKTool: + // Note: Creator does not write these settings itself, so it has to come from the SDKTool! + m_qtAbis = Utils::transform(map.value(QTVERSION_ABIS, QStringList()).toStringList(), &Abi::fromString); + m_qtAbis = Utils::filtered(m_qtAbis, &Abi::isValid); + m_hasQtAbis = !m_qtAbis.isEmpty(); + QFileInfo fi(string); if (BuildableHelperLibrary::isQtChooser(fi)) { // we don't want to treat qtchooser as a normal qmake @@ -602,7 +519,7 @@ void BaseQtVersion::fromMap(const QVariantMap &map) string = BuildableHelperLibrary::qtChooserToQmakePath(fi.symLinkTarget()); } - ctor(FileName::fromString(string)); + m_qmakeCommand = Utils::FileName::fromString(string); } QVariantMap BaseQtVersion::toMap() const @@ -723,7 +640,7 @@ void BaseQtVersion::setAutoDetectionSource(const QString &autodetectionSource) QString BaseQtVersion::displayName() const { - return m_expander->expand(m_unexpandedDisplayName); + return macroExpander()->expand(m_unexpandedDisplayName); } QString BaseQtVersion::unexpandedDisplayName() const @@ -1234,15 +1151,16 @@ QStringList BaseQtVersion::qtConfigValues() const MacroExpander *BaseQtVersion::macroExpander() const { - return m_expander.get(); + return m_expander.macroExpander(this); } -std::unique_ptr<MacroExpander> BaseQtVersion::createMacroExpander(const std::function<BaseQtVersion *()> &qtVersion) +std::unique_ptr<MacroExpander> +BaseQtVersion::createMacroExpander(const std::function<const BaseQtVersion *()> &qtVersion) { const auto versionProperty = - [qtVersion](const std::function<QString(BaseQtVersion *)> &property) { + [qtVersion](const std::function<QString(const BaseQtVersion *)> &property) { return [property, qtVersion]() -> QString { - BaseQtVersion *version = qtVersion(); + const BaseQtVersion *version = qtVersion(); return version ? property(version) : QString(); }; }; @@ -1252,140 +1170,140 @@ std::unique_ptr<MacroExpander> BaseQtVersion::createMacroExpander(const std::fun expander->registerVariable( "Qt:Version", QtKitInformation::tr("The version string of the current Qt version."), - versionProperty([](BaseQtVersion *version) { + versionProperty([](const BaseQtVersion *version) { return version->qtVersionString(); })); expander->registerVariable( "Qt:Type", QtKitInformation::tr("The type of the current Qt version."), - versionProperty([](BaseQtVersion *version) { + versionProperty([](const BaseQtVersion *version) { return version->type(); })); expander->registerVariable( "Qt:Mkspec", QtKitInformation::tr("The mkspec of the current Qt version."), - versionProperty([](BaseQtVersion *version) { + versionProperty([](const BaseQtVersion *version) { return version->mkspec().toUserOutput(); })); expander->registerVariable( "Qt:QT_INSTALL_PREFIX", QtKitInformation::tr("The installation prefix of the current Qt version."), - versionProperty([](BaseQtVersion *version) { + versionProperty([](const BaseQtVersion *version) { return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_PREFIX"); })); expander->registerVariable( "Qt:QT_INSTALL_DATA", QtKitInformation::tr("The installation location of the current Qt version's data."), - versionProperty([](BaseQtVersion *version) { + versionProperty([](const BaseQtVersion *version) { return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_DATA"); })); expander->registerVariable( "Qt:QT_INSTALL_HEADERS", QtKitInformation::tr("The installation location of the current Qt version's header files."), - versionProperty([](BaseQtVersion *version) { + versionProperty([](const BaseQtVersion *version) { return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_HEADERS"); })); expander->registerVariable( "Qt:QT_INSTALL_LIBS", QtKitInformation::tr("The installation location of the current Qt version's library files."), - versionProperty([](BaseQtVersion *version) { + versionProperty([](const BaseQtVersion *version) { return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_LIBS"); })); expander->registerVariable( "Qt:QT_INSTALL_DOCS", QtKitInformation::tr("The installation location of the current Qt version's documentation files."), - versionProperty([](BaseQtVersion *version) { + versionProperty([](const BaseQtVersion *version) { return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_DOCS"); })); expander->registerVariable( "Qt:QT_INSTALL_BINS", QtKitInformation::tr("The installation location of the current Qt version's executable files."), - versionProperty([](BaseQtVersion *version) { + versionProperty([](const BaseQtVersion *version) { return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_BINS"); })); expander->registerVariable( "Qt:QT_INSTALL_PLUGINS", QtKitInformation::tr("The installation location of the current Qt version's plugins."), - versionProperty([](BaseQtVersion *version) { + versionProperty([](const BaseQtVersion *version) { return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_PLUGINS"); })); expander->registerVariable( "Qt:QT_INSTALL_QML", QtKitInformation::tr("The installation location of the current Qt version's QML files."), - versionProperty([](BaseQtVersion *version) { + versionProperty([](const BaseQtVersion *version) { return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_QML"); })); expander->registerVariable( "Qt:QT_INSTALL_IMPORTS", QtKitInformation::tr("The installation location of the current Qt version's imports."), - versionProperty([](BaseQtVersion *version) { + versionProperty([](const BaseQtVersion *version) { return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_IMPORTS"); })); expander->registerVariable( "Qt:QT_INSTALL_TRANSLATIONS", QtKitInformation::tr("The installation location of the current Qt version's translation files."), - versionProperty([](BaseQtVersion *version) { + versionProperty([](const BaseQtVersion *version) { return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_TRANSLATIONS"); })); expander->registerVariable( "Qt:QT_INSTALL_CONFIGURATION", QtKitInformation::tr("The installation location of the current Qt version's translation files."), - versionProperty([](BaseQtVersion *version) { + versionProperty([](const BaseQtVersion *version) { return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_CONFIGURATION"); })); expander->registerVariable( "Qt:QT_INSTALL_EXAMPLES", QtKitInformation::tr("The installation location of the current Qt version's examples."), - versionProperty([](BaseQtVersion *version) { + versionProperty([](const BaseQtVersion *version) { return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_EXAMPLES"); })); expander->registerVariable( "Qt:QT_INSTALL_DEMOS", QtKitInformation::tr("The installation location of the current Qt version's demos."), - versionProperty([](BaseQtVersion *version) { + versionProperty([](const BaseQtVersion *version) { return version->qmakeProperty(version->m_versionInfo, "QT_INSTALL_DEMOS"); })); expander->registerVariable( "Qt:QMAKE_MKSPECS", QtKitInformation::tr("The current Qt version's default mkspecs (Qt 4)."), - versionProperty([](BaseQtVersion *version) { + versionProperty([](const BaseQtVersion *version) { return version->qmakeProperty(version->m_versionInfo, "QMAKE_MKSPECS"); })); expander->registerVariable( "Qt:QMAKE_SPEC", QtKitInformation::tr("The current Qt version's default mkspec (Qt 5; host system)."), - versionProperty([](BaseQtVersion *version) { + versionProperty([](const BaseQtVersion *version) { return version->qmakeProperty(version->m_versionInfo, "QMAKE_SPEC"); })); expander->registerVariable( "Qt:QMAKE_XSPEC", QtKitInformation::tr("The current Qt version's default mkspec (Qt 5; target system)."), - versionProperty([](BaseQtVersion *version) { + versionProperty([](const BaseQtVersion *version) { return version->qmakeProperty(version->m_versionInfo, "QMAKE_XSPEC"); })); expander->registerVariable( "Qt:QMAKE_VERSION", QtKitInformation::tr("The current Qt's qmake version."), - versionProperty([](BaseQtVersion *version) { + versionProperty([](const BaseQtVersion *version) { return version->qmakeProperty(version->m_versionInfo, "QMAKE_VERSION"); })); diff --git a/src/plugins/qtsupport/baseqtversion.h b/src/plugins/qtsupport/baseqtversion.h index ca7deba612..34627bfb62 100644 --- a/src/plugins/qtsupport/baseqtversion.h +++ b/src/plugins/qtsupport/baseqtversion.h @@ -63,12 +63,26 @@ namespace QtSupport { class QtConfigWidget; +class BaseQtVersion; + +// Wrapper to make the std::unique_ptr<Utils::MacroExpander> "copyable": +class MacroExpanderWrapper +{ +public: + MacroExpanderWrapper() = default; + MacroExpanderWrapper(const MacroExpanderWrapper &other) { Q_UNUSED(other); } + MacroExpanderWrapper(MacroExpanderWrapper &&other) = default; + + Utils::MacroExpander *macroExpander(const BaseQtVersion *qtversion) const; +private: + mutable std::unique_ptr<Utils::MacroExpander> m_expander; +}; + class QTSUPPORT_EXPORT QtVersionNumber { public: - QtVersionNumber(int ma, int mi, int p); + QtVersionNumber(int ma = -1, int mi = -1, int p = -1); QtVersionNumber(const QString &versionString); - QtVersionNumber(); QSet<Core::Id> features() const; @@ -232,8 +246,8 @@ public: QStringList qtConfigValues() const; Utils::MacroExpander *macroExpander() const; // owned by the Qt version - static std::unique_ptr<Utils::MacroExpander> createMacroExpander( - const std::function<BaseQtVersion *()> &qtVersion); + static std::unique_ptr<Utils::MacroExpander> + createMacroExpander(const std::function<const BaseQtVersion *()> &qtVersion); static void populateQmlFileFinder(Utils::FileInProjectFinder *finder, const ProjectExplorer::Target *target); @@ -256,9 +270,6 @@ protected: private: void setAutoDetectionSource(const QString &autodetectionSource); - static int getUniqueId(); - void ctor(const Utils::FileName &qmakePath); - void setupExpander(); void updateSourcePath() const; void updateVersionInfo() const; enum HostBinaries { Designer, Linguist, Uic, QScxmlc }; @@ -278,22 +289,22 @@ private: void setId(int id); // used by the qtversionmanager for legacy restore // and by the qtoptionspage to replace Qt versions - int m_id; - - bool m_isAutodetected; - mutable bool m_hasQmlDump; // controlled by m_versionInfoUpToDate - mutable bool m_mkspecUpToDate; - mutable bool m_mkspecReadUpToDate; - mutable bool m_defaultConfigIsDebug; - mutable bool m_defaultConfigIsDebugAndRelease; - mutable bool m_frameworkBuild; - mutable bool m_versionInfoUpToDate; - mutable bool m_installed; - mutable bool m_hasExamples; - mutable bool m_hasDemos; - mutable bool m_hasDocumentation; - mutable bool m_qmakeIsExecutable; - mutable bool m_hasQtAbis; + int m_id = -1; + + bool m_isAutodetected = false; + mutable bool m_hasQmlDump = false; // controlled by m_versionInfoUpToDate + mutable bool m_mkspecUpToDate = false; + mutable bool m_mkspecReadUpToDate = false; + mutable bool m_defaultConfigIsDebug = true; + mutable bool m_defaultConfigIsDebugAndRelease = true; + mutable bool m_frameworkBuild = false; + mutable bool m_versionInfoUpToDate = false; + mutable bool m_installed = true; + mutable bool m_hasExamples = false; + mutable bool m_hasDemos = false; + mutable bool m_hasDocumentation = false; + mutable bool m_qmakeIsExecutable = true; + mutable bool m_hasQtAbis = false; mutable QStringList m_configValues; mutable QStringList m_qtConfigValues; @@ -320,7 +331,7 @@ private: mutable QList<ProjectExplorer::Abi> m_qtAbis; - std::unique_ptr<Utils::MacroExpander> m_expander; + MacroExpanderWrapper m_expander; }; } diff --git a/src/plugins/qtsupport/qtprojectimporter.cpp b/src/plugins/qtsupport/qtprojectimporter.cpp index cee4b38057..af32e4a459 100644 --- a/src/plugins/qtsupport/qtprojectimporter.cpp +++ b/src/plugins/qtsupport/qtprojectimporter.cpp @@ -589,7 +589,7 @@ void QtSupportPlugin::testQtProjectImporter_oneProject() } if (templateKit != defaultKit) - KitManager::deleteKit(templateKit); + delete templateKit; } // -------------------------------------------------------------------- @@ -603,8 +603,7 @@ void QtSupportPlugin::testQtProjectImporter_oneProject() KitManager::deregisterKit(k); // Delete kit templates: - for (int i = 1; i < kitTemplates.count(); ++i) - KitManager::deleteKit(kitTemplates.at(i)); + qDeleteAll(kitTemplates); } } // namespace Internal diff --git a/src/plugins/qtsupport/qtsupportplugin.cpp b/src/plugins/qtsupport/qtsupportplugin.cpp index 30ac0e21e8..2d99d01e38 100644 --- a/src/plugins/qtsupport/qtsupportplugin.cpp +++ b/src/plugins/qtsupport/qtsupportplugin.cpp @@ -84,7 +84,7 @@ bool QtSupportPlugin::initialize(const QStringList &arguments, QString *errorMes d = new QtSupportPluginPrivate; - ProjectExplorer::KitManager::registerKitInformation(new QtKitInformation); + ProjectExplorer::KitManager::registerKitInformation<QtKitInformation>(); (void) new UicGeneratorFactory(this); (void) new QScxmlcGeneratorFactory(this); diff --git a/src/plugins/remotelinux/abstractpackagingstep.cpp b/src/plugins/remotelinux/abstractpackagingstep.cpp index 72df1a7fc7..5ee20c341f 100644 --- a/src/plugins/remotelinux/abstractpackagingstep.cpp +++ b/src/plugins/remotelinux/abstractpackagingstep.cpp @@ -75,7 +75,7 @@ void AbstractPackagingStep::handleBuildConfigurationChanged() { if (d->currentBuildConfiguration) disconnect(d->currentBuildConfiguration, 0, this, 0); - d->currentBuildConfiguration = target()->activeBuildConfiguration(); + d->currentBuildConfiguration = buildConfiguration(); if (d->currentBuildConfiguration) { connect(d->currentBuildConfiguration, &BuildConfiguration::buildDirectoryChanged, this, &AbstractPackagingStep::packageFilePathChanged); diff --git a/src/plugins/resourceeditor/qrceditor/test/mainwindow.cpp b/src/plugins/resourceeditor/qrceditor/test/mainwindow.cpp deleted file mode 100644 index 5de60a50d6..0000000000 --- a/src/plugins/resourceeditor/qrceditor/test/mainwindow.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "mainwindow.h" -#include <resourceeditor/qrceditor/qrceditor.h> - -#include <QAction> -#include <QDebug> -#include <QFileDialog> -#include <QMenuBar> -#include <QStatusBar> -#include <QVBoxLayout> - -MainWindow::MainWindow() : - m_qrcEditor(new SharedTools::QrcEditor()) -{ - m_qrcEditor->setResourceDragEnabled(true); - setWindowTitle(QLatin1String("Test resource editor")); - QMenu* fMenu = menuBar()->addMenu(QLatin1String("File")); - - QAction* oa = fMenu->addAction(QLatin1String("Open...")); - connect(oa, &QAction::triggered, this, &MainWindow::slotOpen); - - QAction* sa = fMenu->addAction(QLatin1String("Save")); - connect(sa, &QAction::triggered, this, &MainWindow::slotSave); - - QAction* xa = fMenu->addAction(QLatin1String("Exit!")); - connect(xa, &QAction::triggered, this, &QWidget::close); - - - QWidget *cw = new QWidget(); - setCentralWidget(cw); - QVBoxLayout *lt = new QVBoxLayout(cw); - lt->addWidget(m_qrcEditor); - setMinimumSize(QSize(500, 500)); -} - -void MainWindow::slotOpen() -{ - const QString fileName = QFileDialog::getOpenFileName(this, QLatin1String("Choose resource file"), - QString(), - QLatin1String("Resource files (*.qrc)")); - if (fileName.isEmpty()) - return; - - if (m_qrcEditor->load(fileName)) - statusBar()->showMessage(QString::fromLatin1("%1 opened").arg(fileName)); - else - statusBar()->showMessage(QString::fromLatin1("Unable to open %1!").arg(fileName)); -} - -void MainWindow::slotSave() -{ - const QString oldFileName = m_qrcEditor->fileName(); - QString fileName = oldFileName; - - if (fileName.isEmpty()) { - fileName = QFileDialog::getSaveFileName(this, QLatin1String("Save resource file"), - QString(), - QLatin1String("Resource files (*.qrc)")); - if (fileName.isEmpty()) - return; - } - - m_qrcEditor->setFileName(fileName); - if (m_qrcEditor->save()) - statusBar()->showMessage(QString::fromLatin1("%1 written").arg(fileName)); - else { - statusBar()->showMessage(QString::fromLatin1("Unable to write %1!").arg(fileName)); - m_qrcEditor->setFileName(oldFileName); - } -} diff --git a/src/plugins/resourceeditor/qrceditor/test/test.pro b/src/plugins/resourceeditor/qrceditor/test/test.pro deleted file mode 100644 index 6931488fce..0000000000 --- a/src/plugins/resourceeditor/qrceditor/test/test.pro +++ /dev/null @@ -1,7 +0,0 @@ -TEMPLATE = app - -QT += gui - -include(../qrceditor.pri) -SOURCES += main.cpp mainwindow.cpp -HEADERS += mainwindow.h diff --git a/src/plugins/texteditor/codeassist/assistproposaliteminterface.h b/src/plugins/texteditor/codeassist/assistproposaliteminterface.h index a4f925f4d9..12b925ebf5 100644 --- a/src/plugins/texteditor/codeassist/assistproposaliteminterface.h +++ b/src/plugins/texteditor/codeassist/assistproposaliteminterface.h @@ -65,6 +65,7 @@ public: virtual bool isSnippet() const = 0; virtual bool isValid() const = 0; virtual quint64 hash() const = 0; // it is only for removing duplicates + virtual bool requiresFixIts() const { return false; } inline int order() const { return m_order; } inline void setOrder(int order) { m_order = order; } diff --git a/src/plugins/texteditor/codeassist/codeassistant.cpp b/src/plugins/texteditor/codeassist/codeassistant.cpp index 3cbd99b517..e94cb5e8d6 100644 --- a/src/plugins/texteditor/codeassist/codeassistant.cpp +++ b/src/plugins/texteditor/codeassist/codeassistant.cpp @@ -84,7 +84,7 @@ public: void clearAbortedPosition(); void updateFromCompletionSettings(const TextEditor::CompletionSettings &settings); - virtual bool eventFilter(QObject *o, QEvent *e); + bool eventFilter(QObject *o, QEvent *e) override; private: void processProposalItem(AssistProposalItemInterface *proposalItem); diff --git a/src/plugins/valgrind/callgrind/callgrindcontroller.cpp b/src/plugins/valgrind/callgrind/callgrindcontroller.cpp index 33b3797e97..d0633caa83 100644 --- a/src/plugins/valgrind/callgrind/callgrindcontroller.cpp +++ b/src/plugins/valgrind/callgrind/callgrindcontroller.cpp @@ -128,7 +128,6 @@ void CallgrindController::run(Option option) Runnable controller = m_valgrindRunnable; controller.executable = CALLGRIND_CONTROL_BINARY; - controller.runMode = ApplicationLauncher::Gui; controller.commandLineArguments = QString("%1 %2").arg(toOptionString(option)).arg(m_pid); if (!m_valgrindRunnable.device diff --git a/src/plugins/valgrind/callgrindengine.cpp b/src/plugins/valgrind/callgrindengine.cpp index 9a0781e72d..4557a8a02c 100644 --- a/src/plugins/valgrind/callgrindengine.cpp +++ b/src/plugins/valgrind/callgrindengine.cpp @@ -42,6 +42,8 @@ using namespace Valgrind::Callgrind; namespace Valgrind { namespace Internal { +void setupCallgrindRunner(CallgrindToolRunner *); + CallgrindToolRunner::CallgrindToolRunner(RunControl *runControl) : ValgrindToolRunner(runControl) { @@ -67,6 +69,8 @@ CallgrindToolRunner::CallgrindToolRunner(RunControl *runControl) }); m_controller.setValgrindRunnable(runnable()); + + setupCallgrindRunner(this); } QStringList CallgrindToolRunner::toolArguments() const diff --git a/src/plugins/valgrind/callgrindtool.cpp b/src/plugins/valgrind/callgrindtool.cpp index 2903b3cae5..faa08371e7 100644 --- a/src/plugins/valgrind/callgrindtool.cpp +++ b/src/plugins/valgrind/callgrindtool.cpp @@ -98,7 +98,6 @@ using namespace Valgrind::Callgrind; using namespace TextEditor; using namespace ProjectExplorer; using namespace Utils; -using namespace std::placeholders; namespace Valgrind { namespace Internal { @@ -106,11 +105,6 @@ namespace Internal { const char CallgrindPerspectiveId[] = "Callgrind.Perspective"; const char CallgrindLocalActionId[] = "Callgrind.Local.Action"; const char CallgrindRemoteActionId[] = "Callgrind.Remote.Action"; -const char CallgrindCallersDockId[] = "Callgrind.Callers.Dock"; -const char CallgrindCalleesDockId[] = "Callgrind.Callees.Dock"; -const char CallgrindFlatDockId[] = "Callgrind.Flat.Dock"; -const char CallgrindVisualizationDockId[] = "Callgrind.Visualization.Dock"; - const char CALLGRIND_RUN_MODE[] = "CallgrindTool.CallgrindRunMode"; class CallgrindTool : public QObject @@ -121,7 +115,7 @@ public: CallgrindTool(); ~CallgrindTool(); - ValgrindToolRunner *createRunTool(RunControl *runControl); + void setupRunner(CallgrindToolRunner *runner); void setParseData(ParseData *data); CostDelegate::CostFormat costFormat() const; @@ -188,10 +182,10 @@ public: QSortFilterProxyModel m_calleesProxy; // Callgrind widgets - CostView *m_flatView = nullptr; - CostView *m_callersView = nullptr; - CostView *m_calleesView = nullptr; - Visualisation *m_visualization = nullptr; + QPointer<CostView> m_flatView; + QPointer<CostView> m_callersView; + QPointer<CostView> m_calleesView; + QPointer<Visualization> m_visualization; // Navigation QAction *m_goBack = nullptr; @@ -272,7 +266,7 @@ CallgrindTool::CallgrindTool() action->setToolTip(toolTip); menu->addAction(ActionManager::registerAction(action, CallgrindRemoteActionId), Debugger::Constants::G_ANALYZER_REMOTE_TOOLS); - QObject::connect(action, &QAction::triggered, this, [this, action] { + QObject::connect(action, &QAction::triggered, this, [action] { auto runConfig = RunConfiguration::startupRunConfiguration(); if (!runConfig) { showCannotStartDialog(action->text()); @@ -283,10 +277,11 @@ CallgrindTool::CallgrindTool() return; Debugger::selectPerspective(CallgrindPerspectiveId); auto runControl = new RunControl(runConfig, CALLGRIND_RUN_MODE); + if (auto creator = RunControl::producer(runConfig, CALLGRIND_RUN_MODE)) + creator(runControl); const auto runnable = dlg.runnable(); runControl->setRunnable(runnable); runControl->setDisplayName(runnable.executable); - createRunTool(runControl); ProjectExplorerPlugin::startRunControl(runControl); }); @@ -312,12 +307,12 @@ CallgrindTool::CallgrindTool() // // DockWidgets // - m_visualization = new Visualisation; + m_visualization = new Visualization; m_visualization->setFrameStyle(QFrame::NoFrame); m_visualization->setObjectName(QLatin1String("Valgrind.CallgrindTool.Visualisation")); m_visualization->setWindowTitle(tr("Visualization")); m_visualization->setModel(&m_dataModel); - connect(m_visualization, &Visualisation::functionActivated, + connect(m_visualization, &Visualization::functionActivated, this, &CallgrindTool::visualisationFunctionSelected); m_callersView = new CostView; @@ -424,18 +419,18 @@ CallgrindTool::CallgrindTool() this, &CallgrindTool::setCostEvent); updateEventCombo(); - ToolbarDescription toolbar; - toolbar.addAction(m_startAction); - toolbar.addAction(m_stopAction); - toolbar.addAction(m_loadExternalLogFile); - toolbar.addAction(m_dumpAction); - toolbar.addAction(m_resetAction); - toolbar.addAction(m_pauseAction); - toolbar.addAction(m_discardAction); - toolbar.addAction(m_goBack); - toolbar.addAction(m_goNext); - toolbar.addWidget(new Utils::StyledSeparator); - toolbar.addWidget(m_eventCombo); + auto perspective = new Perspective(CallgrindPerspectiveId, tr("Callgrind")); + perspective->addToolbarAction(m_startAction); + perspective->addToolbarAction(m_stopAction); + perspective->addToolbarAction(m_loadExternalLogFile); + perspective->addToolbarAction(m_dumpAction); + perspective->addToolbarAction(m_resetAction); + perspective->addToolbarAction(m_pauseAction); + perspective->addToolbarAction(m_discardAction); + perspective->addToolbarAction(m_goBack); + perspective->addToolbarAction(m_goNext); + perspective->addToolbarSeparator(); + perspective->addToolbarWidget(m_eventCombo); // Cost formatting { @@ -468,7 +463,7 @@ CallgrindTool::CallgrindTool() button->setPopupMode(QToolButton::InstantPopup); button->setText(QLatin1String("$")); button->setToolTip(tr("Cost Format")); - toolbar.addWidget(button); + perspective->addToolbarWidget(button); } ValgrindGlobalSettings *settings = ValgrindPlugin::globalSettings(); @@ -505,19 +500,17 @@ CallgrindTool::CallgrindTool() setCostFormat(settings->costFormat()); enableCycleDetection(settings->detectCycles()); - toolbar.addAction(m_cycleDetection); - toolbar.addAction(m_shortenTemplates); - toolbar.addAction(m_filterProjectCosts); - toolbar.addWidget(m_searchFilter); - Debugger::registerToolbar(CallgrindPerspectiveId, toolbar); + perspective->addToolbarAction(m_cycleDetection); + perspective->addToolbarAction(m_shortenTemplates); + perspective->addToolbarAction(m_filterProjectCosts); + perspective->addToolbarWidget(m_searchFilter); - Debugger::registerPerspective(CallgrindPerspectiveId, new Perspective(tr("Callgrind"), { - {CallgrindFlatDockId, m_flatView, {}, Perspective::SplitVertical}, - {CallgrindCalleesDockId, m_calleesView, {}, Perspective::SplitVertical}, - {CallgrindCallersDockId, m_callersView, CallgrindCalleesDockId, Perspective::SplitHorizontal}, - {CallgrindVisualizationDockId, m_visualization, {}, Perspective::SplitVertical, - false, Qt::RightDockWidgetArea} - })); + perspective->addWindow(m_flatView, Perspective::SplitVertical, nullptr); + perspective->addWindow(m_calleesView, Perspective::SplitVertical, nullptr); + perspective->addWindow(m_callersView, Perspective::SplitHorizontal, m_calleesView); + perspective->addWindow(m_visualization, Perspective::SplitVertical, nullptr, + false, Qt::RightDockWidgetArea); + Debugger::registerPerspective(perspective); connect(ProjectExplorerPlugin::instance(), &ProjectExplorerPlugin::updateRunActions, this, &CallgrindTool::updateRunActions); @@ -526,6 +519,10 @@ CallgrindTool::CallgrindTool() CallgrindTool::~CallgrindTool() { qDeleteAll(m_textMarks); + delete m_flatView; + delete m_callersView; + delete m_calleesView; + delete m_visualization; } void CallgrindTool::doClear(bool clearParseData) @@ -747,9 +744,9 @@ void CallgrindTool::updateEventCombo() m_eventCombo->addItem(ParseData::prettyStringForEvent(event)); } -ValgrindToolRunner *CallgrindTool::createRunTool(RunControl *runControl) +void CallgrindTool::setupRunner(CallgrindToolRunner *toolRunner) { - auto toolRunner = new CallgrindToolRunner(runControl); + RunControl *runControl = toolRunner->runControl(); connect(toolRunner, &CallgrindToolRunner::parserDataReady, this, &CallgrindTool::takeParserDataFromRunControl); connect(runControl, &RunControl::stopped, this, &CallgrindTool::engineFinished); @@ -767,7 +764,7 @@ ValgrindToolRunner *CallgrindTool::createRunTool(RunControl *runControl) toolRunner->setToggleCollectFunction(m_toggleCollectFunction); m_toggleCollectFunction.clear(); - QTC_ASSERT(m_visualization, return toolRunner); + QTC_ASSERT(m_visualization, return); // apply project settings if (IRunConfigurationAspect *analyzerAspect = runControl->runConfiguration()->extraAspect(ANALYZER_VALGRIND_SETTINGS)) { @@ -787,8 +784,6 @@ ValgrindToolRunner *CallgrindTool::createRunTool(RunControl *runControl) m_loadExternalLogFile->setEnabled(false); clearTextMarks(); doClear(true); - - return toolRunner; } void CallgrindTool::updateRunActions() @@ -974,12 +969,16 @@ void CallgrindTool::createTextMarks() static CallgrindTool *theCallgrindTool; +void setupCallgrindRunner(CallgrindToolRunner *toolRunner) +{ + theCallgrindTool->setupRunner(toolRunner); +} + void initCallgrindTool() { theCallgrindTool = new CallgrindTool; - auto producer = std::bind(&CallgrindTool::createRunTool, theCallgrindTool, _1); - RunControl::registerWorker(CALLGRIND_RUN_MODE, producer); + RunControl::registerWorker<CallgrindToolRunner>(CALLGRIND_RUN_MODE, {}); } void destroyCallgrindTool() diff --git a/src/plugins/valgrind/callgrindvisualisation.cpp b/src/plugins/valgrind/callgrindvisualisation.cpp index 7dbf781081..a653489e36 100644 --- a/src/plugins/valgrind/callgrindvisualisation.cpp +++ b/src/plugins/valgrind/callgrindvisualisation.cpp @@ -62,9 +62,9 @@ class FunctionGraphicsTextItem : public QAbstractGraphicsShapeItem public: FunctionGraphicsTextItem(const QString &text, QGraphicsItem *parent); - virtual void paint(QPainter *painter, - const QStyleOptionGraphicsItem *option, QWidget *widget); - virtual QRectF boundingRect() const; + void paint(QPainter *painter, + const QStyleOptionGraphicsItem *option, QWidget *widget) override; + QRectF boundingRect() const override; private: QString m_text; @@ -82,8 +82,8 @@ public: FunctionGraphicsItem(const QString &text, qreal x, qreal y, qreal width, qreal height, QGraphicsItem *parent = 0); - virtual void paint(QPainter *painter, - const QStyleOptionGraphicsItem *option, QWidget *widget); + void paint(QPainter *painter, + const QStyleOptionGraphicsItem *option, QWidget *widget) override; FunctionGraphicsTextItem *textItem() const; private: @@ -204,21 +204,21 @@ void FunctionGraphicsItem::paint(QPainter *painter, painter->restore(); } -class Visualisation::Private +class Visualization::Private { public: - Private(Visualisation *qq); + Private(Visualization *qq); void handleMousePressEvent(QMouseEvent *event, bool doubleClicked); qreal sceneHeight() const; qreal sceneWidth() const; - Visualisation *q; + Visualization *q; DataProxyModel *m_model; QGraphicsScene m_scene; }; -Visualisation::Private::Private(Visualisation *qq) +Visualization::Private::Private(Visualization *qq) : q(qq) , m_model(new DataProxyModel(qq)) { @@ -230,10 +230,10 @@ Visualisation::Private::Private(Visualisation *qq) // setup model m_model->setMinimumInclusiveCostRatio(0.1); connect(m_model, &DataProxyModel::filterFunctionChanged, - qq, &Visualisation::populateScene); + qq, &Visualization::populateScene); } -void Visualisation::Private::handleMousePressEvent(QMouseEvent *event, +void Visualization::Private::handleMousePressEvent(QMouseEvent *event, bool doubleClicked) { // find the first item that accepts mouse presses under the cursor position @@ -261,18 +261,18 @@ void Visualisation::Private::handleMousePressEvent(QMouseEvent *event, } -qreal Visualisation::Private::sceneHeight() const +qreal Visualization::Private::sceneHeight() const { return m_scene.height() - FIT_IN_VIEW_MARGIN; } -qreal Visualisation::Private::sceneWidth() const +qreal Visualization::Private::sceneWidth() const { // Magic number to improve margins appearance return m_scene.width() + 1; } -Visualisation::Visualisation(QWidget *parent) +Visualization::Visualization(QWidget *parent) : QGraphicsView(parent) , d(new Private(this)) { @@ -281,17 +281,17 @@ Visualisation::Visualisation(QWidget *parent) setRenderHint(QPainter::Antialiasing); } -Visualisation::~Visualisation() +Visualization::~Visualization() { delete d; } -const Function *Visualisation::functionForItem(QGraphicsItem *item) const +const Function *Visualization::functionForItem(QGraphicsItem *item) const { return item->data(FunctionGraphicsItem::FunctionCallKey).value<const Function *>(); } -QGraphicsItem *Visualisation::itemForFunction(const Function *function) const +QGraphicsItem *Visualization::itemForFunction(const Function *function) const { foreach (QGraphicsItem *item, items()) { if (functionForItem(item) == function) @@ -300,49 +300,49 @@ QGraphicsItem *Visualisation::itemForFunction(const Function *function) const return 0; } -void Visualisation::setFunction(const Function *function) +void Visualization::setFunction(const Function *function) { d->m_model->setFilterFunction(function); } -const Function *Visualisation::function() const +const Function *Visualization::function() const { return d->m_model->filterFunction(); } -void Visualisation::setMinimumInclusiveCostRatio(double ratio) +void Visualization::setMinimumInclusiveCostRatio(double ratio) { d->m_model->setMinimumInclusiveCostRatio(ratio); } -void Visualisation::setModel(QAbstractItemModel *model) +void Visualization::setModel(QAbstractItemModel *model) { QTC_ASSERT(!d->m_model->sourceModel() && model, return); // only set once! d->m_model->setSourceModel(model); connect(model, &QAbstractItemModel::columnsInserted, - this, &Visualisation::populateScene); + this, &Visualization::populateScene); connect(model, &QAbstractItemModel::columnsMoved, - this, &Visualisation::populateScene); + this, &Visualization::populateScene); connect(model, &QAbstractItemModel::columnsRemoved, - this, &Visualisation::populateScene); + this, &Visualization::populateScene); connect(model, &QAbstractItemModel::dataChanged, - this, &Visualisation::populateScene); + this, &Visualization::populateScene); connect(model, &QAbstractItemModel::headerDataChanged, - this, &Visualisation::populateScene); - connect(model, &QAbstractItemModel::layoutChanged, this, &Visualisation::populateScene); - connect(model, &QAbstractItemModel::modelReset, this, &Visualisation::populateScene); + this, &Visualization::populateScene); + connect(model, &QAbstractItemModel::layoutChanged, this, &Visualization::populateScene); + connect(model, &QAbstractItemModel::modelReset, this, &Visualization::populateScene); connect(model, &QAbstractItemModel::rowsInserted, - this, &Visualisation::populateScene); + this, &Visualization::populateScene); connect(model, &QAbstractItemModel::rowsMoved, - this, &Visualisation::populateScene); + this, &Visualization::populateScene); connect(model, &QAbstractItemModel::rowsRemoved, - this, &Visualisation::populateScene); + this, &Visualization::populateScene); populateScene(); } -void Visualisation::setText(const QString &message) +void Visualization::setText(const QString &message) { d->m_scene.clear(); @@ -353,7 +353,7 @@ void Visualisation::setText(const QString &message) textItem->setFlag(QGraphicsItem::ItemIgnoresTransformations); } -void Visualisation::populateScene() +void Visualization::populateScene() { // reset scene first d->m_scene.clear(); @@ -419,21 +419,21 @@ void Visualisation::populateScene() } } -void Visualisation::mousePressEvent(QMouseEvent *event) +void Visualization::mousePressEvent(QMouseEvent *event) { d->handleMousePressEvent(event, false); QGraphicsView::mousePressEvent(event); } -void Visualisation::mouseDoubleClickEvent(QMouseEvent *event) +void Visualization::mouseDoubleClickEvent(QMouseEvent *event) { d->handleMousePressEvent(event, true); QGraphicsView::mouseDoubleClickEvent(event); } -void Visualisation::resizeEvent(QResizeEvent *event) +void Visualization::resizeEvent(QResizeEvent *event) { fitInView(sceneRect()); diff --git a/src/plugins/valgrind/callgrindvisualisation.h b/src/plugins/valgrind/callgrindvisualisation.h index f03b4775b5..c6d0d85958 100644 --- a/src/plugins/valgrind/callgrindvisualisation.h +++ b/src/plugins/valgrind/callgrindvisualisation.h @@ -38,13 +38,13 @@ namespace Callgrind { class Function; } namespace Valgrind { namespace Internal { -class Visualisation : public QGraphicsView +class Visualization : public QGraphicsView { Q_OBJECT public: - explicit Visualisation(QWidget *parent = 0); - virtual ~Visualisation(); + explicit Visualization(QWidget *parent = 0); + virtual ~Visualization(); void setModel(QAbstractItemModel *model); diff --git a/src/plugins/valgrind/memchecktool.cpp b/src/plugins/valgrind/memchecktool.cpp index 6078cd240c..534de63d3d 100644 --- a/src/plugins/valgrind/memchecktool.cpp +++ b/src/plugins/valgrind/memchecktool.cpp @@ -111,8 +111,6 @@ using namespace ProjectExplorer; using namespace Utils; using namespace Valgrind::XmlProtocol; -using namespace std::placeholders; - namespace Valgrind { namespace Internal { @@ -120,7 +118,6 @@ const char MEMCHECK_RUN_MODE[] = "MemcheckTool.MemcheckRunMode"; const char MEMCHECK_WITH_GDB_RUN_MODE[] = "MemcheckTool.MemcheckWithGdbRunMode"; const char MemcheckPerspectiveId[] = "Memcheck.Perspective"; -const char MemcheckErrorDockId[] = "Memcheck.Dock.Error"; class MemcheckToolRunner : public ValgrindToolRunner @@ -128,8 +125,7 @@ class MemcheckToolRunner : public ValgrindToolRunner Q_OBJECT public: - explicit MemcheckToolRunner(ProjectExplorer::RunControl *runControl, - bool withGdb = false); + explicit MemcheckToolRunner(ProjectExplorer::RunControl *runControl); void start() override; void stop() override; @@ -175,33 +171,6 @@ public: QSsh::SshConnection connection; }; -MemcheckToolRunner::MemcheckToolRunner(RunControl *runControl, bool withGdb) - : ValgrindToolRunner(runControl), - m_withGdb(withGdb), - m_localServerAddress(QHostAddress::LocalHost) -{ - setDisplayName("MemcheckToolRunner"); - connect(m_runner.parser(), &XmlProtocol::ThreadedParser::error, - this, &MemcheckToolRunner::parserError); - connect(m_runner.parser(), &XmlProtocol::ThreadedParser::suppressionCount, - this, &MemcheckToolRunner::suppressionCount); - - if (withGdb) { - connect(&m_runner, &ValgrindRunner::valgrindStarted, - this, &MemcheckToolRunner::startDebugger); - connect(&m_runner, &ValgrindRunner::logMessageReceived, - this, &MemcheckToolRunner::appendLog); -// m_runner.disableXml(); - } else { - connect(m_runner.parser(), &XmlProtocol::ThreadedParser::internalError, - this, &MemcheckToolRunner::internalParserError); - } - - // We need a real address to connect to from the outside. - if (device()->type() != ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE) - addStartDependency(new LocalAddressFinder(runControl, &m_localServerAddress)); -} - QString MemcheckToolRunner::progressTitle() const { return tr("Analyzing Memory"); @@ -422,9 +391,9 @@ class MemcheckTool : public QObject public: MemcheckTool(); + ~MemcheckTool(); - RunWorker *createRunWorker(RunControl *runControl); - + void setupRunner(MemcheckToolRunner *runTool); void loadShowXmlLogFile(const QString &filePath, const QString &exitMsg); private: @@ -456,7 +425,7 @@ private: Valgrind::XmlProtocol::ErrorListModel m_errorModel; MemcheckErrorFilterProxyModel m_errorProxyModel; - MemcheckErrorView *m_errorView = 0; + QPointer<MemcheckErrorView> m_errorView; QList<QAction *> m_errorFilterActions; QAction *m_filterProjectAction; @@ -587,9 +556,8 @@ MemcheckTool::MemcheckTool() m_errorView->setObjectName(QLatin1String("Valgrind.MemcheckTool.ErrorView")); m_errorView->setWindowTitle(tr("Memory Issues")); - Debugger::registerPerspective(MemcheckPerspectiveId, new Perspective (tr("Memcheck"), { - {MemcheckErrorDockId, m_errorView, {}, Perspective::SplitVertical} - })); + auto perspective = new Perspective(MemcheckPerspectiveId, tr("Memcheck")); + perspective->addWindow(m_errorView, Perspective::SplitVertical, nullptr); connect(ProjectExplorerPlugin::instance(), &ProjectExplorerPlugin::updateRunActions, this, &MemcheckTool::maybeActiveRunConfigurationChanged); @@ -707,27 +675,32 @@ MemcheckTool::MemcheckTool() TaskHub::clearTasks(Debugger::Constants::ANALYZERTASK_ID); Debugger::selectPerspective(MemcheckPerspectiveId); RunControl *rc = new RunControl(runConfig, MEMCHECK_RUN_MODE); - rc->createWorker(MEMCHECK_RUN_MODE); + if (auto creator = RunControl::producer(runConfig, MEMCHECK_RUN_MODE)) + creator(rc); const auto runnable = dlg.runnable(); rc->setRunnable(runnable); rc->setDisplayName(runnable.executable); ProjectExplorerPlugin::startRunControl(rc); }); - ToolbarDescription toolbar; - toolbar.addAction(m_startAction); + perspective->addToolbarAction(m_startAction); //toolbar.addAction(m_startWithGdbAction); - toolbar.addAction(m_stopAction); - toolbar.addAction(m_loadExternalLogFile); - toolbar.addAction(m_goBack); - toolbar.addAction(m_goNext); - toolbar.addWidget(filterButton); - Debugger::registerToolbar(MemcheckPerspectiveId, toolbar); + perspective->addToolbarAction(m_stopAction); + perspective->addToolbarAction(m_loadExternalLogFile); + perspective->addToolbarAction(m_goBack); + perspective->addToolbarAction(m_goNext); + perspective->addToolbarWidget(filterButton); + Debugger::registerPerspective(perspective); updateFromSettings(); maybeActiveRunConfigurationChanged(); } +MemcheckTool::~MemcheckTool() +{ + delete m_errorView; +} + void MemcheckTool::heobAction() { #ifdef Q_OS_WIN @@ -968,13 +941,12 @@ void MemcheckTool::maybeActiveRunConfigurationChanged() updateFromSettings(); } -RunWorker *MemcheckTool::createRunWorker(RunControl *runControl) +void MemcheckTool::setupRunner(MemcheckToolRunner *runTool) { + RunControl *runControl = runTool->runControl(); m_errorModel.setRelevantFrameFinder(makeFrameFinder(transform(runControl->project()->files(Project::AllFiles), &FileName::toString))); - auto runTool = new MemcheckToolRunner(runControl, runControl->runMode() == MEMCHECK_WITH_GDB_RUN_MODE); - connect(runTool, &MemcheckToolRunner::parserError, this, &MemcheckTool::parserError); connect(runTool, &MemcheckToolRunner::internalParserError, this, &MemcheckTool::internalParserError); connect(runTool, &MemcheckToolRunner::stopped, this, &MemcheckTool::engineFinished); @@ -1002,8 +974,6 @@ RunWorker *MemcheckTool::createRunWorker(RunControl *runControl) }); m_suppressionActions.append(action); } - - return runTool; } void MemcheckTool::loadShowXmlLogFile(const QString &filePath, const QString &exitMsg) @@ -1145,13 +1115,41 @@ void MemcheckTool::setBusyCursor(bool busy) static MemcheckTool *theMemcheckTool; +MemcheckToolRunner::MemcheckToolRunner(RunControl *runControl) + : ValgrindToolRunner(runControl), + m_withGdb(runControl->runMode() == MEMCHECK_WITH_GDB_RUN_MODE), + m_localServerAddress(QHostAddress::LocalHost) +{ + setDisplayName("MemcheckToolRunner"); + connect(m_runner.parser(), &XmlProtocol::ThreadedParser::error, + this, &MemcheckToolRunner::parserError); + connect(m_runner.parser(), &XmlProtocol::ThreadedParser::suppressionCount, + this, &MemcheckToolRunner::suppressionCount); + + if (m_withGdb) { + connect(&m_runner, &ValgrindRunner::valgrindStarted, + this, &MemcheckToolRunner::startDebugger); + connect(&m_runner, &ValgrindRunner::logMessageReceived, + this, &MemcheckToolRunner::appendLog); +// m_runner.disableXml(); + } else { + connect(m_runner.parser(), &XmlProtocol::ThreadedParser::internalError, + this, &MemcheckToolRunner::internalParserError); + } + + // We need a real address to connect to from the outside. + if (device()->type() != ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE) + addStartDependency(new LocalAddressFinder(runControl, &m_localServerAddress)); + + theMemcheckTool->setupRunner(this); +} + void initMemcheckTool() { theMemcheckTool = new MemcheckTool; - auto producer = std::bind(&MemcheckTool::createRunWorker, theMemcheckTool, _1); - RunControl::registerWorker(MEMCHECK_RUN_MODE, producer); - RunControl::registerWorker(MEMCHECK_WITH_GDB_RUN_MODE, producer); + RunControl::registerWorker<MemcheckToolRunner>(MEMCHECK_RUN_MODE, {}); + RunControl::registerWorker<MemcheckToolRunner>(MEMCHECK_WITH_GDB_RUN_MODE, {}); } void destroyMemcheckTool() diff --git a/src/plugins/valgrind/valgrindengine.cpp b/src/plugins/valgrind/valgrindengine.cpp index 82ed9cc0f9..b286fd138d 100644 --- a/src/plugins/valgrind/valgrindengine.cpp +++ b/src/plugins/valgrind/valgrindengine.cpp @@ -38,6 +38,7 @@ #include <projectexplorer/projectexplorericons.h> #include <projectexplorer/runconfiguration.h> +#include <projectexplorer/runconfigurationaspects.h> #include <QApplication> @@ -85,6 +86,9 @@ void ValgrindToolRunner::start() m_runner.setDevice(device()); m_runner.setDebuggee(runnable()); + if (auto aspect = runControl()->runConfiguration()->extraAspect<TerminalAspect>()) + m_runner.setUseTerminal(aspect->useTerminal()); + connect(&m_runner, &ValgrindRunner::processOutputReceived, this, &ValgrindToolRunner::receiveProcessOutput); connect(&m_runner, &ValgrindRunner::valgrindExecuted, diff --git a/src/plugins/valgrind/valgrindrunner.cpp b/src/plugins/valgrind/valgrindrunner.cpp index 86f8c8b4e4..f37d641d39 100644 --- a/src/plugins/valgrind/valgrindrunner.cpp +++ b/src/plugins/valgrind/valgrindrunner.cpp @@ -110,7 +110,6 @@ void ValgrindRunner::Private::run() valgrind.executable = m_valgrindExecutable; valgrind.workingDirectory = m_debuggee.workingDirectory; valgrind.environment = m_debuggee.environment; - valgrind.runMode = m_debuggee.runMode; valgrind.device = m_device; valgrind.commandLineArguments = QtcProcess::joinArgs(fullArgs, m_device->osType()); Utils::QtcProcess::addArgs(&valgrind.commandLineArguments, m_debuggee.commandLineArguments); @@ -258,6 +257,11 @@ void ValgrindRunner::setDevice(const IDevice::ConstPtr &device) d->m_device = device; } +void ValgrindRunner::setUseTerminal(bool on) +{ + d->m_valgrindProcess.setUseTerminal(on); +} + void ValgrindRunner::waitForFinished() const { if (d->m_finished) diff --git a/src/plugins/valgrind/valgrindrunner.h b/src/plugins/valgrind/valgrindrunner.h index aaad50c008..faeafd3a6c 100644 --- a/src/plugins/valgrind/valgrindrunner.h +++ b/src/plugins/valgrind/valgrindrunner.h @@ -50,6 +50,7 @@ public: void setProcessChannelMode(QProcess::ProcessChannelMode mode); void setLocalServerAddress(const QHostAddress &localServerAddress); void setDevice(const ProjectExplorer::IDevice::ConstPtr &device); + void setUseTerminal(bool on); void waitForFinished() const; diff --git a/src/plugins/vcsbase/commonsettingspage.cpp b/src/plugins/vcsbase/commonsettingspage.cpp index 12f374bcbb..ab907437bd 100644 --- a/src/plugins/vcsbase/commonsettingspage.cpp +++ b/src/plugins/vcsbase/commonsettingspage.cpp @@ -37,6 +37,8 @@ #include <QCoreApplication> +using namespace Utils; + namespace VcsBase { namespace Internal { @@ -47,13 +49,13 @@ CommonSettingsWidget::CommonSettingsWidget(QWidget *parent) : m_ui(new Ui::CommonSettingsPage) { m_ui->setupUi(this); - m_ui->submitMessageCheckScriptChooser->setExpectedKind(Utils::PathChooser::ExistingCommand); + m_ui->submitMessageCheckScriptChooser->setExpectedKind(PathChooser::ExistingCommand); m_ui->submitMessageCheckScriptChooser->setHistoryCompleter(QLatin1String("Vcs.MessageCheckScript.History")); - m_ui->nickNameFieldsFileChooser->setExpectedKind(Utils::PathChooser::File); + m_ui->nickNameFieldsFileChooser->setExpectedKind(PathChooser::File); m_ui->nickNameFieldsFileChooser->setHistoryCompleter(QLatin1String("Vcs.NickFields.History")); - m_ui->nickNameMailMapChooser->setExpectedKind(Utils::PathChooser::File); + m_ui->nickNameMailMapChooser->setExpectedKind(PathChooser::File); m_ui->nickNameMailMapChooser->setHistoryCompleter(QLatin1String("Vcs.NickMap.History")); - m_ui->sshPromptChooser->setExpectedKind(Utils::PathChooser::ExistingCommand); + m_ui->sshPromptChooser->setExpectedKind(PathChooser::ExistingCommand); m_ui->sshPromptChooser->setHistoryCompleter(QLatin1String("Vcs.SshPrompt.History")); updatePath(); @@ -93,9 +95,9 @@ void CommonSettingsWidget::setSettings(const CommonVcsSettings &s) void CommonSettingsWidget::updatePath() { - Utils::Environment env = Utils::Environment::systemEnvironment(); + Environment env = Environment::systemEnvironment(); QStringList toAdd = Core::VcsManager::additionalToolsPath(); - env.appendOrSetPath(toAdd.join(Utils::HostOsInfo::pathListSeparator())); + env.appendOrSetPath(toAdd.join(HostOsInfo::pathListSeparator())); m_ui->sshPromptChooser->setEnvironment(env); } diff --git a/src/plugins/vcsbase/nicknamedialog.cpp b/src/plugins/vcsbase/nicknamedialog.cpp index f2e6729046..11737ec08b 100644 --- a/src/plugins/vcsbase/nicknamedialog.cpp +++ b/src/plugins/vcsbase/nicknamedialog.cpp @@ -34,6 +34,8 @@ #include <QStandardItemModel> #include <QSortFilterProxyModel> +using namespace Utils; + enum { NickNameRole = Qt::UserRole + 1 }; /*! @@ -175,7 +177,7 @@ NickNameDialog::NickNameDialog(QStandardItemModel *model, QWidget *parent) : m_filterModel->setSourceModel(model); m_filterModel->setFilterCaseSensitivity(Qt::CaseInsensitive); m_ui->filterTreeView->setModel(m_filterModel); - m_ui->filterTreeView->setActivationMode(Utils::DoubleClickActivation); + m_ui->filterTreeView->setActivationMode(DoubleClickActivation); const int columnCount = m_filterModel->columnCount(); int treeWidth = 0; for (int c = 0; c < columnCount; c++) { @@ -188,7 +190,7 @@ NickNameDialog::NickNameDialog(QStandardItemModel *model, QWidget *parent) : &NickNameDialog::slotActivated); connect(m_ui->filterTreeView->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &NickNameDialog::slotCurrentItemChanged); - connect(m_ui->filterLineEdit, &Utils::FancyLineEdit::filterChanged, + connect(m_ui->filterLineEdit, &FancyLineEdit::filterChanged, m_filterModel, &QSortFilterProxyModel::setFilterFixedString); } @@ -242,7 +244,7 @@ bool NickNameDialog::populateModelFromMailCapFile(const QString &fileName, model->removeRows(0, rowCount); if (fileName.isEmpty()) return true; - Utils::FileReader reader; + FileReader reader; if (!reader.fetch(fileName, QIODevice::Text, errorMessage)) return false; // Split into lines and read diff --git a/src/plugins/vcsbase/submiteditorwidget.cpp b/src/plugins/vcsbase/submiteditorwidget.cpp index f13d1979c2..d9b7125e77 100644 --- a/src/plugins/vcsbase/submiteditorwidget.cpp +++ b/src/plugins/vcsbase/submiteditorwidget.cpp @@ -42,6 +42,8 @@ #include <QSpacerItem> #include <QShortcut> +using namespace Utils; + enum { debug = 0 }; enum { defaultLineWidth = 72 }; @@ -252,16 +254,16 @@ void SubmitEditorWidget::unregisterActions(QAction *editorUndoAction, QAction * QAction *submitAction, QAction *diffAction) { if (editorUndoAction) { - disconnect(d->m_ui.description, &Utils::CompletingTextEdit::undoAvailable, + disconnect(d->m_ui.description, &CompletingTextEdit::undoAvailable, editorUndoAction, &QAction::setEnabled); disconnect(editorUndoAction, &QAction::triggered, - d->m_ui.description, &Utils::CompletingTextEdit::undo); + d->m_ui.description, &CompletingTextEdit::undo); } if (editorRedoAction) { - disconnect(d->m_ui.description, &Utils::CompletingTextEdit::redoAvailable, + disconnect(d->m_ui.description, &CompletingTextEdit::redoAvailable, editorRedoAction, &QAction::setEnabled); disconnect(editorRedoAction, &QAction::triggered, - d->m_ui.description, &Utils::CompletingTextEdit::redo); + d->m_ui.description, &CompletingTextEdit::redo); } if (submitAction) { @@ -446,7 +448,7 @@ QStringList SubmitEditorWidget::checkedFiles() const return rc; } -Utils::CompletingTextEdit *SubmitEditorWidget::descriptionEdit() const +CompletingTextEdit *SubmitEditorWidget::descriptionEdit() const { return d->m_ui.description; } diff --git a/src/plugins/vcsbase/vcsbaseclient.cpp b/src/plugins/vcsbase/vcsbaseclient.cpp index 7060294a97..af80c664f5 100644 --- a/src/plugins/vcsbase/vcsbaseclient.cpp +++ b/src/plugins/vcsbase/vcsbaseclient.cpp @@ -50,6 +50,8 @@ #include <QVariant> #include <QProcessEnvironment> +using namespace Utils; + /*! \class VcsBase::VcsBaseClient @@ -108,7 +110,7 @@ VcsBaseClientSettings &VcsBaseClientImpl::settings() const return *d->m_clientSettings; } -Utils::FileName VcsBaseClientImpl::vcsBinary() const +FileName VcsBaseClientImpl::vcsBinary() const { return settings().binaryPath(); } @@ -134,7 +136,7 @@ VcsCommand *VcsBaseClientImpl::createCommand(const QString &workingDirectory, void VcsBaseClientImpl::enqueueJob(VcsCommand *cmd, const QStringList &args, const QString &workingDirectory, - const Utils::ExitCodeInterpreter &interpreter) const + const ExitCodeInterpreter &interpreter) const { cmd->addJob(vcsBinary(), args, vcsTimeoutS(), workingDirectory, interpreter); cmd->execute(); @@ -149,7 +151,7 @@ QProcessEnvironment VcsBaseClientImpl::processEnvironment() const QString VcsBaseClientImpl::commandOutputFromLocal8Bit(const QByteArray &a) { - return Utils::SynchronousProcess::normalizeNewlines(QString::fromLocal8Bit(a)); + return SynchronousProcess::normalizeNewlines(QString::fromLocal8Bit(a)); } QStringList VcsBaseClientImpl::commandOutputLinesFromLocal8Bit(const QByteArray &a) @@ -175,8 +177,8 @@ QString VcsBaseClientImpl::stripLastNewline(const QString &in) return in; } -Utils::SynchronousProcessResponse -VcsBaseClientImpl::vcsFullySynchronousExec(const QString &workingDir, const Utils::FileName &binary, +SynchronousProcessResponse +VcsBaseClientImpl::vcsFullySynchronousExec(const QString &workingDir, const FileName &binary, const QStringList &args, unsigned flags, int timeoutS, QTextCodec *codec) const { @@ -205,7 +207,7 @@ void VcsBaseClientImpl::annotateRevisionRequested(const QString &workingDirector annotate(workingDirectory, file, changeCopy, line); } -Utils::SynchronousProcessResponse +SynchronousProcessResponse VcsBaseClientImpl::vcsFullySynchronousExec(const QString &workingDir, const QStringList &args, unsigned flags, int timeoutS, QTextCodec *codec) const { @@ -226,10 +228,10 @@ VcsCommand *VcsBaseClientImpl::vcsExec(const QString &workingDirectory, const QS return command; } -Utils::SynchronousProcessResponse VcsBaseClientImpl::vcsSynchronousExec(const QString &workingDir, - const QStringList &args, - unsigned flags, - QTextCodec *outputCodec) const +SynchronousProcessResponse VcsBaseClientImpl::vcsSynchronousExec(const QString &workingDir, + const QStringList &args, + unsigned flags, + QTextCodec *outputCodec) const { return VcsBasePlugin::runVcs(workingDir, vcsBinary(), args, vcsTimeoutS(), flags, outputCodec, processEnvironment()); @@ -316,8 +318,8 @@ bool VcsBaseClient::synchronousCreateRepository(const QString &workingDirectory, { QStringList args(vcsCommandString(CreateRepositoryCommand)); args << extraOptions; - Utils::SynchronousProcessResponse result = vcsFullySynchronousExec(workingDirectory, args); - if (result.result != Utils::SynchronousProcessResponse::Finished) + SynchronousProcessResponse result = vcsFullySynchronousExec(workingDirectory, args); + if (result.result != SynchronousProcessResponse::Finished) return false; VcsOutputWindow::append(result.stdOut()); @@ -335,9 +337,9 @@ bool VcsBaseClient::synchronousClone(const QString &workingDir, args << vcsCommandString(CloneCommand) << extraOptions << srcLocation << dstLocation; - Utils::SynchronousProcessResponse result = vcsFullySynchronousExec(workingDir, args); + SynchronousProcessResponse result = vcsFullySynchronousExec(workingDir, args); resetCachedVcsInfo(workingDir); - return result.result == Utils::SynchronousProcessResponse::Finished; + return result.result == SynchronousProcessResponse::Finished; } bool VcsBaseClient::synchronousAdd(const QString &workingDir, const QString &filename, @@ -345,7 +347,7 @@ bool VcsBaseClient::synchronousAdd(const QString &workingDir, const QString &fil { QStringList args; args << vcsCommandString(AddCommand) << extraOptions << filename; - return vcsFullySynchronousExec(workingDir, args).result == Utils::SynchronousProcessResponse::Finished; + return vcsFullySynchronousExec(workingDir, args).result == SynchronousProcessResponse::Finished; } bool VcsBaseClient::synchronousRemove(const QString &workingDir, const QString &filename, @@ -353,7 +355,7 @@ bool VcsBaseClient::synchronousRemove(const QString &workingDir, const QString & { QStringList args; args << vcsCommandString(RemoveCommand) << extraOptions << filename; - return vcsFullySynchronousExec(workingDir, args).result == Utils::SynchronousProcessResponse::Finished; + return vcsFullySynchronousExec(workingDir, args).result == SynchronousProcessResponse::Finished; } bool VcsBaseClient::synchronousMove(const QString &workingDir, @@ -362,7 +364,7 @@ bool VcsBaseClient::synchronousMove(const QString &workingDir, { QStringList args; args << vcsCommandString(MoveCommand) << extraOptions << from << to; - return vcsFullySynchronousExec(workingDir, args).result == Utils::SynchronousProcessResponse::Finished; + return vcsFullySynchronousExec(workingDir, args).result == SynchronousProcessResponse::Finished; } bool VcsBaseClient::synchronousPull(const QString &workingDir, @@ -376,8 +378,8 @@ bool VcsBaseClient::synchronousPull(const QString &workingDir, VcsCommand::SshPasswordPrompt | VcsCommand::ShowStdOut | VcsCommand::ShowSuccessMessage; - const Utils::SynchronousProcessResponse resp = vcsSynchronousExec(workingDir, args, flags); - const bool ok = resp.result == Utils::SynchronousProcessResponse::Finished; + const SynchronousProcessResponse resp = vcsSynchronousExec(workingDir, args, flags); + const bool ok = resp.result == SynchronousProcessResponse::Finished; if (ok) emit changed(QVariant(workingDir)); return ok; @@ -394,8 +396,8 @@ bool VcsBaseClient::synchronousPush(const QString &workingDir, VcsCommand::SshPasswordPrompt | VcsCommand::ShowStdOut | VcsCommand::ShowSuccessMessage; - const Utils::SynchronousProcessResponse resp = vcsSynchronousExec(workingDir, args, flags); - return resp.result == Utils::SynchronousProcessResponse::Finished; + const SynchronousProcessResponse resp = vcsSynchronousExec(workingDir, args, flags); + return resp.result == SynchronousProcessResponse::Finished; } VcsBaseEditorWidget *VcsBaseClient::annotate( @@ -564,7 +566,7 @@ QString VcsBaseClient::vcsCommandString(VcsCommandTag cmd) const return QString(); } -Utils::ExitCodeInterpreter VcsBaseClient::exitCodeInterpreter(VcsCommandTag cmd) const +ExitCodeInterpreter VcsBaseClient::exitCodeInterpreter(VcsCommandTag cmd) const { Q_UNUSED(cmd) return Utils::defaultExitCodeInterpreter; @@ -640,7 +642,7 @@ QString VcsBaseClient::vcsEditorTitle(const QString &vcsCmd, const QString &sour { return vcsBinary().toFileInfo().baseName() + QLatin1Char(' ') + vcsCmd + QLatin1Char(' ') + - Utils::FileName::fromString(sourceId).fileName(); + FileName::fromString(sourceId).fileName(); } void VcsBaseClient::statusParser(const QString &text) diff --git a/src/plugins/vcsbase/vcsbaseclientsettings.cpp b/src/plugins/vcsbase/vcsbaseclientsettings.cpp index 6ddb4a4b00..5fdd9f9b04 100644 --- a/src/plugins/vcsbase/vcsbaseclientsettings.cpp +++ b/src/plugins/vcsbase/vcsbaseclientsettings.cpp @@ -34,6 +34,8 @@ #include <QSettings> #include <QVariant> +using namespace Utils; + namespace { class SettingValue @@ -176,7 +178,7 @@ public: QHash<QString, SettingValue> m_valueHash; QVariantHash m_defaultValueHash; QString m_settingsGroup; - mutable Utils::FileName m_binaryFullPath; + mutable FileName m_binaryFullPath; }; } // namespace Internal @@ -352,12 +354,12 @@ QVariant::Type VcsBaseClientSettings::valueType(const QString &key) const return QVariant::Invalid; } -Utils::FileName VcsBaseClientSettings::binaryPath() const +FileName VcsBaseClientSettings::binaryPath() const { if (d->m_binaryFullPath.isEmpty()) { - const Utils::FileNameList searchPaths - = Utils::transform(searchPathList(), [](const QString &s) { return Utils::FileName::fromString(s); }); - d->m_binaryFullPath = Utils::Environment::systemEnvironment().searchInPath( + const FileNameList searchPaths + = Utils::transform(searchPathList(), [](const QString &s) { return FileName::fromString(s); }); + d->m_binaryFullPath = Environment::systemEnvironment().searchInPath( stringValue(binaryPathKey), searchPaths); } return d->m_binaryFullPath; @@ -365,7 +367,7 @@ Utils::FileName VcsBaseClientSettings::binaryPath() const QStringList VcsBaseClientSettings::searchPathList() const { - return stringValue(pathKey).split(Utils::HostOsInfo::pathListSeparator(), QString::SkipEmptyParts); + return stringValue(pathKey).split(HostOsInfo::pathListSeparator(), QString::SkipEmptyParts); } QString VcsBaseClientSettings::settingsGroup() const diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp index c79776a8e3..c4382728a7 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.cpp +++ b/src/plugins/vcsbase/vcsbaseeditor.cpp @@ -90,6 +90,7 @@ */ using namespace TextEditor; +using namespace Utils; namespace VcsBase { @@ -563,7 +564,7 @@ public: QList<AbstractTextCursorHandler *> m_textCursorHandlers; QPointer<VcsCommand> m_command; VcsBaseEditorWidget::DescribeFunc m_describeFunc = nullptr; - Utils::ProgressIndicator *m_progressIndicator = nullptr; + ProgressIndicator *m_progressIndicator = nullptr; bool m_fileLogAnnotateEnabled = false; bool m_mouseDragging = false; @@ -867,7 +868,7 @@ void VcsBaseEditorWidget::slotPopulateDiffBrowser() lastFileName = file; // ignore any headers d->m_entrySections.push_back(d->m_entrySections.empty() ? 0 : lineNumber); - entriesComboBox->addItem(Utils::FileName::fromString(file).fileName()); + entriesComboBox->addItem(FileName::fromString(file).fileName()); } } } @@ -1397,7 +1398,7 @@ void VcsBaseEditorWidget::setCommand(VcsCommand *command) } d->m_command = command; if (command) { - d->m_progressIndicator = new Utils::ProgressIndicator(Utils::ProgressIndicatorSize::Large); + d->m_progressIndicator = new ProgressIndicator(ProgressIndicatorSize::Large); d->m_progressIndicator->attachToWidget(this); connect(command, &VcsCommand::finished, this, &VcsBaseEditorWidget::reportCommandFinished); QTimer::singleShot(100, this, &VcsBaseEditorWidget::showProgressIndicator); diff --git a/src/plugins/vcsbase/vcscommand.cpp b/src/plugins/vcsbase/vcscommand.cpp index 26db328083..af1eac8f32 100644 --- a/src/plugins/vcsbase/vcscommand.cpp +++ b/src/plugins/vcsbase/vcscommand.cpp @@ -33,6 +33,8 @@ #include <QProcessEnvironment> +using namespace Utils; + namespace VcsBase { VcsCommand::VcsCommand(const QString &workingDirectory, @@ -40,19 +42,19 @@ VcsCommand::VcsCommand(const QString &workingDirectory, Core::ShellCommand(workingDirectory, environment), m_preventRepositoryChanged(false) { - setOutputProxyFactory([this]() -> Utils::OutputProxy * { - auto proxy = new Utils::OutputProxy; + setOutputProxyFactory([this]() -> OutputProxy * { + auto proxy = new OutputProxy; VcsOutputWindow *outputWindow = VcsOutputWindow::instance(); - connect(proxy, &Utils::OutputProxy::append, + connect(proxy, &OutputProxy::append, outputWindow, [](const QString &txt) { VcsOutputWindow::append(txt); }); - connect(proxy, &Utils::OutputProxy::appendSilently, + connect(proxy, &OutputProxy::appendSilently, outputWindow, &VcsOutputWindow::appendSilently); - connect(proxy, &Utils::OutputProxy::appendError, + connect(proxy, &OutputProxy::appendError, outputWindow, &VcsOutputWindow::appendError); - connect(proxy, &Utils::OutputProxy::appendCommand, + connect(proxy, &OutputProxy::appendCommand, outputWindow, &VcsOutputWindow::appendCommand); - connect(proxy, &Utils::OutputProxy::appendMessage, + connect(proxy, &OutputProxy::appendMessage, outputWindow, &VcsOutputWindow::appendMessage); return proxy; @@ -74,12 +76,12 @@ const QProcessEnvironment VcsCommand::processEnvironment() const return env; } -Utils::SynchronousProcessResponse VcsCommand::runCommand(const Utils::FileName &binary, +SynchronousProcessResponse VcsCommand::runCommand(const FileName &binary, const QStringList &arguments, int timeoutS, const QString &workingDirectory, - const Utils::ExitCodeInterpreter &interpreter) + const ExitCodeInterpreter &interpreter) { - Utils::SynchronousProcessResponse response + SynchronousProcessResponse response = Core::ShellCommand::runCommand(binary, arguments, timeoutS, workingDirectory, interpreter); emitRepositoryChanged(workingDirectory); @@ -99,7 +101,7 @@ unsigned VcsCommand::processFlags() const { unsigned processFlags = 0; if (!VcsBasePlugin::sshPrompt().isEmpty() && (flags() & SshPasswordPrompt)) - processFlags |= Utils::SynchronousProcess::UnixTerminalDisabled; + processFlags |= SynchronousProcess::UnixTerminalDisabled; return processFlags; } diff --git a/src/plugins/vcsbase/vcsoutputwindow.cpp b/src/plugins/vcsbase/vcsoutputwindow.cpp index 5afe3e2051..5e3e4c1b7c 100644 --- a/src/plugins/vcsbase/vcsoutputwindow.cpp +++ b/src/plugins/vcsbase/vcsoutputwindow.cpp @@ -52,6 +52,8 @@ #include <QPoint> #include <QFileInfo> +using namespace Utils; + /*! \class VcsBase::VcsBaseOutputWindow @@ -96,7 +98,7 @@ public: void appendLinesWithStyle(QString const& s, enum VcsOutputWindow::MessageStyle style, const QString &repository = QString()); protected: - virtual void contextMenuEvent(QContextMenuEvent *event); + void contextMenuEvent(QContextMenuEvent *event) override; private: void setFormat(enum VcsOutputWindow::MessageStyle style); @@ -107,7 +109,7 @@ private: QTextCharFormat m_warningFormat; QTextCharFormat m_commandFormat; QTextCharFormat m_messageFormat; - Utils::OutputFormatter *m_formatter; + OutputFormatter *m_formatter; }; OutputWindowPlainTextEdit::OutputWindowPlainTextEdit(QWidget *parent) : @@ -118,7 +120,6 @@ OutputWindowPlainTextEdit::OutputWindowPlainTextEdit(QWidget *parent) : m_commandFormat(m_defaultFormat), m_messageFormat(m_defaultFormat) { - using Utils::Theme; setReadOnly(true); setUndoRedoEnabled(false); setFrameStyle(QFrame::NoFrame); @@ -126,7 +127,7 @@ OutputWindowPlainTextEdit::OutputWindowPlainTextEdit(QWidget *parent) : m_warningFormat.setForeground(Utils::creatorTheme()->color(Theme::OutputPanes_WarningMessageTextColor)); m_commandFormat.setFontWeight(QFont::Bold); m_messageFormat.setForeground(Utils::creatorTheme()->color(Theme::OutputPanes_MessageOutput)); - m_formatter = new Utils::OutputFormatter; + m_formatter = new OutputFormatter; m_formatter->setPlainTextEdit(this); Aggregation::Aggregate *agg = new Aggregation::Aggregate; agg->add(this); @@ -435,12 +436,12 @@ static inline QString formatArguments(const QStringList &args) if (i) str << ' '; if (arg.startsWith(QString::fromLatin1(passwordOptionC) + QLatin1Char('='))) { - str << Utils::QtcProcess::quoteArg("--password=********"); + str << QtcProcess::quoteArg("--password=********"); continue; } - str << Utils::QtcProcess::quoteArg(arg); + str << QtcProcess::quoteArg(arg); if (arg == QLatin1String(passwordOptionC)) { - str << ' ' << Utils::QtcProcess::quoteArg("********"); + str << ' ' << QtcProcess::quoteArg("********"); i++; } } @@ -448,11 +449,11 @@ static inline QString formatArguments(const QStringList &args) } QString VcsOutputWindow::msgExecutionLogEntry(const QString &workingDir, - const Utils::FileName &executable, - const QStringList &arguments) + const FileName &executable, + const QStringList &arguments) { const QString args = formatArguments(arguments); - const QString nativeExecutable = Utils::QtcProcess::quoteArg(executable.toUserOutput()); + const QString nativeExecutable = QtcProcess::quoteArg(executable.toUserOutput()); if (workingDir.isEmpty()) return tr("Running: %1 %2").arg(nativeExecutable, args) + QLatin1Char('\n'); return tr("Running in %1: %2 %3"). @@ -465,7 +466,7 @@ void VcsOutputWindow::appendShellCommandLine(const QString &text) } void VcsOutputWindow::appendCommand(const QString &workingDirectory, - const Utils::FileName &binary, + const FileName &binary, const QStringList &args) { appendShellCommandLine(msgExecutionLogEntry(workingDirectory, binary, args)); diff --git a/src/plugins/vcsbase/vcsprojectcache.cpp b/src/plugins/vcsbase/vcsprojectcache.cpp index a2ca3987a6..f65c676c63 100644 --- a/src/plugins/vcsbase/vcsprojectcache.cpp +++ b/src/plugins/vcsbase/vcsprojectcache.cpp @@ -35,6 +35,8 @@ #include <limits> +using namespace Utils; + namespace { class PathMatcher @@ -44,7 +46,7 @@ public: ProjectExplorer::Project *project() { return m_project; } void match(ProjectExplorer::Project *project, - const Utils::FileName &base, const Utils::FileName &child) { + const FileName &base, const FileName &child) { int count = std::numeric_limits<int>::max(); if (child.isChildOf(base)) { const QString relative = child.toString().mid(base.count() + 1); @@ -98,7 +100,7 @@ ProjectExplorer::Project *VcsProjectCache::projectFor(const QString &repo) return m_instance->m_cache.at(0).project; } - project = projectForToplevel(Utils::FileName::fromString(repo)); + project = projectForToplevel(FileName::fromString(repo)); m_instance->m_cache.prepend(CacheNode(repo, project)); while (m_instance->m_cache.count() > 10) m_instance->m_cache.removeLast(); @@ -121,12 +123,12 @@ void VcsProjectCache::destroy() delete m_instance; } -ProjectExplorer::Project *VcsProjectCache::projectForToplevel(const Utils::FileName &vcsTopLevel) +ProjectExplorer::Project *VcsProjectCache::projectForToplevel(const FileName &vcsTopLevel) { PathMatcher parentMatcher; PathMatcher childMatcher; for (ProjectExplorer::Project *project : ProjectExplorer::SessionManager::projects()) { - const Utils::FileName projectDir = project->projectDirectory(); + const FileName projectDir = project->projectDirectory(); if (projectDir == vcsTopLevel) return project; parentMatcher.match(project, vcsTopLevel, projectDir); diff --git a/src/plugins/vcsbase/wizard/vcscommandpage.cpp b/src/plugins/vcsbase/wizard/vcscommandpage.cpp index 6ab67b24f7..6ad605f586 100644 --- a/src/plugins/vcsbase/wizard/vcscommandpage.cpp +++ b/src/plugins/vcsbase/wizard/vcscommandpage.cpp @@ -40,6 +40,7 @@ using namespace Core; using namespace ProjectExplorer; +using namespace Utils; namespace VcsBase { namespace Internal { @@ -68,8 +69,7 @@ VcsCommandPageFactory::VcsCommandPageFactory() setTypeIdsSuffix(QLatin1String("VcsCommand")); } -Utils::WizardPage *VcsCommandPageFactory::create(JsonWizard *wizard, Id typeId, - const QVariant &data) +WizardPage *VcsCommandPageFactory::create(JsonWizard *wizard, Id typeId, const QVariant &data) { Q_UNUSED(wizard); @@ -286,8 +286,8 @@ void VcsCommandPage::delayedInitialize() extraArgs << tmp; } - ShellCommand *command - = vc->createInitialCheckoutCommand(repo, Utils::FileName::fromString(base), + Core::ShellCommand *command + = vc->createInitialCheckoutCommand(repo, FileName::fromString(base), name, extraArgs); foreach (const JobData &job, m_additionalJobs) { @@ -310,7 +310,7 @@ void VcsCommandPage::delayedInitialize() const QString dir = wiz->expander()->expand(job.workDirectory); const int timeoutS = command->defaultTimeoutS() * job.timeOutFactor; - command->addJob(Utils::FileName::fromUserInput(commandString), args, timeoutS, dir); + command->addJob(FileName::fromUserInput(commandString), args, timeoutS, dir); } start(command); diff --git a/src/plugins/winrt/winrtpackagedeploymentstep.cpp b/src/plugins/winrt/winrtpackagedeploymentstep.cpp index 9d2710192d..050941e042 100644 --- a/src/plugins/winrt/winrtpackagedeploymentstep.cpp +++ b/src/plugins/winrt/winrtpackagedeploymentstep.cpp @@ -95,7 +95,7 @@ bool WinRtPackageDeploymentStep::init(QList<const BuildStep *> &earlierSteps) ProcessParameters *params = processParameters(); params->setCommand(QLatin1String("windeployqt.exe")); params->setArguments(args); - params->setEnvironment(target()->activeBuildConfiguration()->environment()); + params->setEnvironment(buildConfiguration()->environment()); return AbstractProcessStep::init(earlierSteps); } diff --git a/src/shared/clang/clang_installation.pri b/src/shared/clang/clang_installation.pri index 2d1be60748..4baed36668 100644 --- a/src/shared/clang/clang_installation.pri +++ b/src/shared/clang/clang_installation.pri @@ -89,10 +89,20 @@ BIN_EXTENSION = win32: BIN_EXTENSION = .exe isEmpty(LLVM_INSTALL_DIR) { - llvm_config = llvm-config + unix { + llvm_config = $$system(which llvm-config-6.0) + } + + isEmpty(llvm_config) { + llvm_config = llvm-config + } } else { - llvm_config = $$system_quote($$LLVM_INSTALL_DIR/bin/llvm-config) - requires(exists($$llvm_config$$BIN_EXTENSION)) + exists($$LLVM_INSTALL_DIR/bin/llvm-config-6.0$$BIN_EXTENSION) { + llvm_config = $$system_quote($$LLVM_INSTALL_DIR/bin/llvm-config-6.0) + } else { + llvm_config = $$system_quote($$LLVM_INSTALL_DIR/bin/llvm-config) + requires(exists($$llvm_config$$BIN_EXTENSION)) + } } output = $$system($$llvm_config --version, lines) @@ -150,17 +160,12 @@ isEmpty(LLVM_VERSION) { !contains(QMAKE_DEFAULT_LIBDIRS, $$LLVM_LIBDIR): LIBCLANG_LIBS = -L$${LLVM_LIBDIR} LIBCLANG_LIBS += $${CLANG_LIB} - QTC_NO_CLANG_LIBTOOLING=$$(QTC_NO_CLANG_LIBTOOLING) - isEmpty(QTC_NO_CLANG_LIBTOOLING) { - QTC_FORCE_CLANG_LIBTOOLING = $$(QTC_FORCE_CLANG_LIBTOOLING) - versionIsEqual($$LLVM_VERSION, 6, 0)|!isEmpty(QTC_FORCE_CLANG_LIBTOOLING) { - !contains(QMAKE_DEFAULT_LIBDIRS, $$LLVM_LIBDIR): LIBTOOLING_LIBS = -L$${LLVM_LIBDIR} - LIBTOOLING_LIBS += $$CLANGTOOLING_LIBS $$LLVM_STATIC_LIBS - } else { - warning("Clang LibTooling is disabled because only version 6.0 is supported.") - } + QTC_ENABLE_CLANG_LIBTOOLING=$$(QTC_ENABLE_CLANG_LIBTOOLING) + !isEmpty(QTC_ENABLE_CLANG_LIBTOOLING) { + !contains(QMAKE_DEFAULT_LIBDIRS, $$LLVM_LIBDIR): LIBTOOLING_LIBS = -L$${LLVM_LIBDIR} + LIBTOOLING_LIBS += $$CLANGTOOLING_LIBS $$LLVM_STATIC_LIBS } else { - warning("Clang LibTooling is disabled.") + warning("Clang LibTooling is disabled. Set QTC_ENABLE_CLANG_LIBTOOLING to enable it.") } contains(QMAKE_DEFAULT_INCDIRS, $$LLVM_INCLUDEPATH): LLVM_INCLUDEPATH = diff --git a/src/shared/help/topicchooser.cpp b/src/shared/help/topicchooser.cpp index 6b24ab5f38..b7e5db7f3f 100644 --- a/src/shared/help/topicchooser.cpp +++ b/src/shared/help/topicchooser.cpp @@ -64,9 +64,9 @@ TopicChooser::TopicChooser(QWidget *parent, const QString &keyword, if (m_filterModel->rowCount() != 0) ui.listWidget->setCurrentIndex(m_filterModel->index(0, 0)); - connect(ui.buttonDisplay, &QPushButton::clicked, + connect(ui.buttonBox, &QDialogButtonBox::accepted, this, &TopicChooser::acceptDialog); - connect(ui.buttonCancel, &QPushButton::clicked, + connect(ui.buttonBox, &QDialogButtonBox::rejected, this, &TopicChooser::reject); connect(ui.listWidget, &QListView::activated, this, &TopicChooser::activated); diff --git a/src/shared/help/topicchooser.ui b/src/shared/help/topicchooser.ui index 57ab39b394..b288f8334c 100644 --- a/src/shared/help/topicchooser.ui +++ b/src/shared/help/topicchooser.ui @@ -34,53 +34,11 @@ <widget class="QListView" name="listWidget"/> </item> <item> - <layout class="QHBoxLayout" name="unnamed"> - <property name="spacing"> - <number>6</number> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> </property> - <property name="margin"> - <number>0</number> - </property> - <item> - <spacer name="Horizontal Spacing2"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::Expanding</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QPushButton" name="buttonDisplay"> - <property name="text"> - <string>&Display</string> - </property> - <property name="autoDefault"> - <bool>true</bool> - </property> - <property name="default"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="buttonCancel"> - <property name="text"> - <string>&Close</string> - </property> - <property name="autoDefault"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> + </widget> </item> </layout> </widget> diff --git a/src/shared/modeltest/modeltest.cpp b/src/shared/modeltest/modeltest.cpp index 4af993fd57..2dfb296b46 100644 --- a/src/shared/modeltest/modeltest.cpp +++ b/src/shared/modeltest/modeltest.cpp @@ -33,7 +33,7 @@ Connect to all of the models signals. Whenever anything happens recheck everything. */ -ModelTest::ModelTest(QAbstractItemModel *_model, QObject *parent) : QObject(parent), model(_model), fetchingMore(false) +ModelTest::ModelTest(QAbstractItemModel *_model, QObject *parent) : QObject(parent), model(_model) { Q_ASSERT(model); diff --git a/src/shared/modeltest/modeltest.h b/src/shared/modeltest/modeltest.h index e3f3c8aa34..5bdc24f598 100644 --- a/src/shared/modeltest/modeltest.h +++ b/src/shared/modeltest/modeltest.h @@ -34,7 +34,7 @@ class ModelTest : public QObject Q_OBJECT public: - ModelTest(QAbstractItemModel *model, QObject *parent = 0); + ModelTest(QAbstractItemModel *model, QObject *parent = nullptr); private Q_SLOTS: void nonDestructiveBasicTest(); @@ -69,7 +69,7 @@ private: QStack<Changing> insert; QStack<Changing> remove; - bool fetchingMore; + bool fetchingMore = false; QList<QPersistentModelIndex> changing; }; diff --git a/src/shared/registryaccess/registryaccess.cpp b/src/shared/registryaccess/registryaccess.cpp index e37185e507..728aa41d7e 100644 --- a/src/shared/registryaccess/registryaccess.cpp +++ b/src/shared/registryaccess/registryaccess.cpp @@ -39,7 +39,7 @@ static QString winErrorMessage(unsigned long error) const int len = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, error, 0, (LPTSTR)&lpMsgBuf, 0, NULL); + nullptr, error, 0, (LPTSTR)&lpMsgBuf, 0, nullptr); if (len) { rc = QString::fromUtf16(lpMsgBuf, len); LocalFree(lpMsgBuf); @@ -63,14 +63,14 @@ static bool registryReadBinaryKey(HKEY handle, // HKEY_LOCAL_MACHINE, etc. DWORD type; DWORD size; // get size and retrieve - LONG rc = RegQueryValueEx(handle, valueName, 0, &type, 0, &size); + LONG rc = RegQueryValueEx(handle, valueName, nullptr, &type, nullptr, &size); if (rc != ERROR_SUCCESS) { *errorMessage = msgRegistryOperationFailed("read", valueName, msgFunctionFailed("RegQueryValueEx1", rc)); return false; } - BYTE *dataC = new BYTE[size + 1]; + auto dataC = new BYTE[size + 1]; // Will be Utf16 in case of a string - rc = RegQueryValueEx(handle, valueName, 0, &type, dataC, &size); + rc = RegQueryValueEx(handle, valueName, nullptr, &type, dataC, &size); if (rc != ERROR_SUCCESS) { *errorMessage = msgRegistryOperationFailed("read", valueName, msgFunctionFailed("RegQueryValueEx2", rc)); return false; diff --git a/src/shared/registryaccess/registryaccess.h b/src/shared/registryaccess/registryaccess.h index 26c5032767..2880aa6677 100644 --- a/src/shared/registryaccess/registryaccess.h +++ b/src/shared/registryaccess/registryaccess.h @@ -81,6 +81,6 @@ inline bool openRegistryKey(HKEY category, const WCHAR *key, bool readWrite, HKE QString debuggerCall(const QString &additionalOption = QString()); -bool isRegistered(HKEY handle, const QString &call, QString *errorMessage, QString *oldDebugger = 0); +bool isRegistered(HKEY handle, const QString &call, QString *errorMessage, QString *oldDebugger = nullptr); } // namespace RegistryAccess diff --git a/src/tools/buildoutputparser/buildoutputparser.pro b/src/tools/buildoutputparser/buildoutputparser.pro index 53cb6b4434..3a0bce085f 100644 --- a/src/tools/buildoutputparser/buildoutputparser.pro +++ b/src/tools/buildoutputparser/buildoutputparser.pro @@ -6,8 +6,6 @@ include(../../qtcreatortool.pri) TARGET = buildoutputparser -win32|equals(TEST, 1):DEFINES += HAS_MSVC_PARSER - SOURCES = \ main.cpp \ outputprocessor.cpp diff --git a/src/tools/buildoutputparser/buildoutputparser.qbs b/src/tools/buildoutputparser/buildoutputparser.qbs index ad021e2a38..7c92954569 100644 --- a/src/tools/buildoutputparser/buildoutputparser.qbs +++ b/src/tools/buildoutputparser/buildoutputparser.qbs @@ -15,6 +15,4 @@ QtcTool { condition: qbs.targetOS.contains("unix") && !qbs.targetOS.contains("darwin") cpp.rpaths: base.concat(["$ORIGIN/../" + qtc.ide_plugin_path]) } - cpp.defines: base.concat(qbs.targetOS.contains("windows") || qtc.testsEnabled - ? ["HAS_MSVC_PARSER"] : []) } diff --git a/src/tools/buildoutputparser/main.cpp b/src/tools/buildoutputparser/main.cpp index 78556f9f29..6fe0255702 100644 --- a/src/tools/buildoutputparser/main.cpp +++ b/src/tools/buildoutputparser/main.cpp @@ -52,13 +52,7 @@ static void printUsage() { fprintf(stderr, "Usage: %s [--type <compiler type>] <file>\n", qPrintable(QFileInfo(QCoreApplication::applicationFilePath()).fileName())); - fprintf(stderr, "Possible compiler types: gcc, clang%s. Default is gcc.\n", -#ifdef HAS_MSVC_PARSER - ", msvc" -#else - "" -#endif - ); + fprintf(stderr, "Possible compiler types: gcc, clang, msvc. Default is gcc.\n"); } int main(int argc, char *argv[]) @@ -83,10 +77,8 @@ int main(int argc, char *argv[]) compilerType = CompilerTypeGcc; } else if (typeString == QLatin1String("clang")) { compilerType = CompilerTypeClang; -#ifdef HAS_MSVC_PARSER } else if (typeString == QLatin1String("msvc")) { compilerType = CompilerTypeMsvc; -#endif } else { fprintf(stderr, "Invalid compiler type '%s'.\n", qPrintable(typeString)); printUsage(); diff --git a/src/tools/buildoutputparser/outputprocessor.cpp b/src/tools/buildoutputparser/outputprocessor.cpp index 103a2d6b1f..3922d0fc0b 100644 --- a/src/tools/buildoutputparser/outputprocessor.cpp +++ b/src/tools/buildoutputparser/outputprocessor.cpp @@ -28,14 +28,12 @@ #include <projectexplorer/clangparser.h> #include <projectexplorer/gccparser.h> #include <projectexplorer/gnumakeparser.h> +#include <projectexplorer/msvcparser.h> #include <projectexplorer/osparser.h> #include <qmakeprojectmanager/qmakeparser.h> #include <qtsupport/qtparser.h> #include <utils/fileutils.h> -#ifdef HAS_MSVC_PARSER -#include <projectexplorer/msvcparser.h> -#endif #include <QIODevice> #include <QTextStream> @@ -67,11 +65,9 @@ void CompilerOutputProcessor::start() case CompilerTypeClang: parser.appendOutputParser(new ProjectExplorer::ClangParser); break; -#ifdef HAS_MSVC_PARSER case CompilerTypeMsvc: parser.appendOutputParser(new ProjectExplorer::MsvcParser); break; -#endif } connect(&parser, &ProjectExplorer::IOutputParser::addTask, diff --git a/src/tools/buildoutputparser/outputprocessor.h b/src/tools/buildoutputparser/outputprocessor.h index 3dc1c25df9..5595c39004 100644 --- a/src/tools/buildoutputparser/outputprocessor.h +++ b/src/tools/buildoutputparser/outputprocessor.h @@ -34,10 +34,8 @@ namespace ProjectExplorer { class Task; } enum CompilerType { CompilerTypeGcc, - CompilerTypeClang -#ifdef HAS_MSVC_PARSER - , CompilerTypeMsvc -#endif + CompilerTypeClang, + CompilerTypeMsvc }; class CompilerOutputProcessor : public QObject diff --git a/src/tools/clangbackend/source/clangbackend_global.h b/src/tools/clangbackend/source/clangbackend_global.h index ff25ddeb81..658e2e8fb1 100644 --- a/src/tools/clangbackend/source/clangbackend_global.h +++ b/src/tools/clangbackend/source/clangbackend_global.h @@ -56,4 +56,9 @@ enum class PreferredTranslationUnit # define IS_SKIPWARNINGSFROMINCLUDEDFILES_SUPPORTED #endif +// CLANG-UPGRADE-CHECK: Remove IS_COMPLETION_FIXITS_BACKPORTED once we require clang >= 7.0 +#if defined(CINDEX_VERSION_HAS_COMPLETION_FIXITS_BACKPORTED) || CINDEX_VERSION_MINOR >= 49 +# define IS_COMPLETION_FIXITS_BACKPORTED +#endif + } // namespace ClangBackEnd diff --git a/src/tools/clangbackend/source/clangcodecompleteresults.cpp b/src/tools/clangbackend/source/clangcodecompleteresults.cpp index af80d739bf..818aa9360e 100644 --- a/src/tools/clangbackend/source/clangcodecompleteresults.cpp +++ b/src/tools/clangbackend/source/clangcodecompleteresults.cpp @@ -56,24 +56,12 @@ bool ClangCodeCompleteResults::hasResults() const return !isNull() && !isEmpty(); } -bool ClangCodeCompleteResults::hasNoResultsForDotCompletion() const -{ - return !hasResults() && isDotCompletion(); -} - bool ClangCodeCompleteResults::hasUnknownContext() const { const unsigned long long contexts = clang_codeCompleteGetContexts(cxCodeCompleteResults); return contexts == CXCompletionContext_Unknown; } -bool ClangCodeCompleteResults::isDotCompletion() const -{ - const unsigned long long contexts = clang_codeCompleteGetContexts(cxCodeCompleteResults); - - return contexts & CXCompletionContext_DotMemberAccess; -} - CXCodeCompleteResults *ClangCodeCompleteResults::data() const { return cxCodeCompleteResults; diff --git a/src/tools/clangbackend/source/clangcodecompleteresults.h b/src/tools/clangbackend/source/clangcodecompleteresults.h index 0b1ae11df8..000c424b33 100644 --- a/src/tools/clangbackend/source/clangcodecompleteresults.h +++ b/src/tools/clangbackend/source/clangcodecompleteresults.h @@ -49,10 +49,8 @@ public: bool isEmpty() const; bool hasResults() const; - bool hasNoResultsForDotCompletion() const; bool hasUnknownContext() const; - bool isDotCompletion() const; CXCodeCompleteResults *data() const; diff --git a/src/tools/clangbackend/source/clangcompletecodejob.cpp b/src/tools/clangbackend/source/clangcompletecodejob.cpp index 50635a6f0d..ad033a9ea5 100644 --- a/src/tools/clangbackend/source/clangcompletecodejob.cpp +++ b/src/tools/clangbackend/source/clangcompletecodejob.cpp @@ -50,13 +50,9 @@ IAsyncJob::AsyncPrepareResult CompleteCodeJob::prepareAsyncRun() TIME_SCOPE_DURATION("CompleteCodeJobRunner"); UnsavedFiles theUnsavedFiles = unsavedFiles; - const TranslationUnit::CodeCompletionResult results - = translationUnit.complete(theUnsavedFiles, line, column, - funcNameStartLine, funcNameStartColumn); - CompleteCodeJob::AsyncResult asyncResult; - asyncResult.completions = results.completions; - asyncResult.correction = results.correction; + asyncResult = translationUnit.complete(theUnsavedFiles, line, column, + funcNameStartLine, funcNameStartColumn); return asyncResult; }); @@ -69,9 +65,7 @@ void CompleteCodeJob::finalizeAsyncRun() if (context().isDocumentOpen()) { const AsyncResult result = asyncResult(); - const CompletionsMessage message(result.completions, - result.correction, - context().jobRequest.ticketNumber); + const CompletionsMessage message(result, context().jobRequest.ticketNumber); context().client->completions(message); } } diff --git a/src/tools/clangbackend/source/clangcompletecodejob.h b/src/tools/clangbackend/source/clangcompletecodejob.h index 4e9c274faf..0d62ce8b94 100644 --- a/src/tools/clangbackend/source/clangcompletecodejob.h +++ b/src/tools/clangbackend/source/clangcompletecodejob.h @@ -31,16 +31,10 @@ namespace ClangBackEnd { -struct CompleteCodeJobResult -{ - CodeCompletions completions; - CompletionCorrection correction = CompletionCorrection::NoCorrection; -}; - -class CompleteCodeJob : public DocumentJob<CompleteCodeJobResult> +class CompleteCodeJob : public DocumentJob<CodeCompletions> { public: - using AsyncResult = CompleteCodeJobResult; + using AsyncResult = CodeCompletions; AsyncPrepareResult prepareAsyncRun() override; void finalizeAsyncRun() override; diff --git a/src/tools/clangbackend/source/clangjobrequest.cpp b/src/tools/clangbackend/source/clangjobrequest.cpp index 6d73e82996..adaa320123 100644 --- a/src/tools/clangbackend/source/clangjobrequest.cpp +++ b/src/tools/clangbackend/source/clangjobrequest.cpp @@ -268,8 +268,7 @@ void JobRequest::cancelJob(ClangCodeModelClientInterface &client) const client.tooltip(ToolTipMessage(FileContainer(), ToolTipInfo(), ticketNumber)); break; case JobRequest::Type::RequestCompletions: - client.completions( - CompletionsMessage(CodeCompletions(), CompletionCorrection::NoCorrection, ticketNumber)); + client.completions(CompletionsMessage(CodeCompletions(), ticketNumber)); break; case JobRequest::Type::RequestFollowSymbol: client.followSymbol( diff --git a/src/tools/clangbackend/source/clangtooltipinfocollector.cpp b/src/tools/clangbackend/source/clangtooltipinfocollector.cpp index ba0ce0ffd1..201f6fc340 100644 --- a/src/tools/clangbackend/source/clangtooltipinfocollector.cpp +++ b/src/tools/clangbackend/source/clangtooltipinfocollector.cpp @@ -44,33 +44,33 @@ namespace ClangBackEnd { -namespace { - -Utf8StringVector qualificationPrefixAsVector(const Cursor &cursor) +Utf8String qualificationPrefix(const Cursor &cursor) { - Utf8StringVector result; + // TODO: Implement with qualificationPrefixAsVector() + Utf8String qualifiedName; for (Cursor parent = cursor.semanticParent(); - parent.isValid() && (parent.kind() == CXCursor_Namespace || parent.isCompoundType()); + parent.isValid() && (parent.kind() == CXCursor_Namespace); parent = parent.semanticParent()) { - result.prepend(parent.spelling()); + qualifiedName = parent.spelling() + Utf8StringLiteral("::") + qualifiedName; } - return result; + return qualifiedName; } -Utf8String qualificationPrefix(const Cursor &cursor) +namespace { + +Utf8StringVector qualificationPrefixAsVector(const Cursor &cursor) { - // TODO: Implement with qualificationPrefixAsVector() - Utf8String qualifiedName; + Utf8StringVector result; for (Cursor parent = cursor.semanticParent(); - parent.isValid() && (parent.kind() == CXCursor_Namespace); + parent.isValid() && (parent.kind() == CXCursor_Namespace || parent.isCompoundType()); parent = parent.semanticParent()) { - qualifiedName = parent.spelling() + Utf8StringLiteral("::") + qualifiedName; + result.prepend(parent.spelling()); } - return qualifiedName; + return result; } Utf8String displayName(const Cursor &cursor) diff --git a/src/tools/clangbackend/source/clangtooltipinfocollector.h b/src/tools/clangbackend/source/clangtooltipinfocollector.h index 8009aa8bf4..ae1609c276 100644 --- a/src/tools/clangbackend/source/clangtooltipinfocollector.h +++ b/src/tools/clangbackend/source/clangtooltipinfocollector.h @@ -33,6 +33,7 @@ namespace ClangBackEnd { +class Cursor; class UnsavedFiles; ToolTipInfo collectToolTipInfo(UnsavedFiles &unsavedFiles, @@ -42,4 +43,6 @@ ToolTipInfo collectToolTipInfo(UnsavedFiles &unsavedFiles, uint line, uint column); +Utf8String qualificationPrefix(const Cursor &cursor); + } // namespace ClangBackEnd diff --git a/src/tools/clangbackend/source/clangtranslationunit.cpp b/src/tools/clangbackend/source/clangtranslationunit.cpp index 017abdd98f..ad242c7be8 100644 --- a/src/tools/clangbackend/source/clangtranslationunit.cpp +++ b/src/tools/clangbackend/source/clangtranslationunit.cpp @@ -111,21 +111,11 @@ bool TranslationUnit::suspend() const return clang_suspendTranslationUnit(cxTranslationUnit()); } -TranslationUnit::CodeCompletionResult TranslationUnit::complete( - UnsavedFiles &unsavedFiles, - uint line, - uint column, - int funcNameStartLine, - int funcNameStartColumn) const +CodeCompletions TranslationUnit::complete(UnsavedFiles &unsavedFiles, uint line, uint column, + int funcNameStartLine, int funcNameStartColumn) const { - CodeCompleter codeCompleter(*this, unsavedFiles); - - const CodeCompletions completions = codeCompleter.complete(line, column, - funcNameStartLine, - funcNameStartColumn); - const CompletionCorrection correction = codeCompleter.neededCorrection(); - - return CodeCompletionResult{completions, correction}; + return CodeCompleter(*this, unsavedFiles).complete(line, column, funcNameStartLine, + funcNameStartColumn); } void TranslationUnit::extractAnnotations( diff --git a/src/tools/clangbackend/source/clangtranslationunit.h b/src/tools/clangbackend/source/clangtranslationunit.h index ae8741a989..83c8d196a6 100644 --- a/src/tools/clangbackend/source/clangtranslationunit.h +++ b/src/tools/clangbackend/source/clangtranslationunit.h @@ -52,12 +52,6 @@ class CommandLineArguments; class TranslationUnit { public: - struct CodeCompletionResult { - CodeCompletions completions; - CompletionCorrection correction; - }; - -public: TranslationUnit(const Utf8String &id, const Utf8String &filePath, CXIndex &cxIndex, @@ -77,8 +71,8 @@ public: TranslationUnitUpdateResult parse(const TranslationUnitUpdateInput &parseInput) const; TranslationUnitUpdateResult reparse(const TranslationUnitUpdateInput &parseInput) const; - CodeCompletionResult complete(UnsavedFiles &unsavedFiles, uint line, uint column, - int funcNameStartLine, int funcNameStartColumn) const; + CodeCompletions complete(UnsavedFiles &unsavedFiles, uint line, uint column, + int funcNameStartLine, int funcNameStartColumn) const; void extractDiagnostics(DiagnosticContainer &firstHeaderErrorDiagnostic, QVector<DiagnosticContainer> &mainFileDiagnostics) const; diff --git a/src/tools/clangbackend/source/codecompleter.cpp b/src/tools/clangbackend/source/codecompleter.cpp index 8fa5c9cce2..a764d2ae5a 100644 --- a/src/tools/clangbackend/source/codecompleter.cpp +++ b/src/tools/clangbackend/source/codecompleter.cpp @@ -25,19 +25,20 @@ #include "codecompleter.h" -#include "clangfilepath.h" +#include "clangbackend_global.h" #include "clangcodecompleteresults.h" -#include "clangstring.h" -#include "cursor.h" +#include "clangdocument.h" #include "clangexceptions.h" +#include "clangfilepath.h" +#include "clangstring.h" +#include "clangtranslationunitupdater.h" +#include "clangunsavedfilesshallowarguments.h" #include "codecompletionsextractor.h" +#include "cursor.h" #include "sourcelocation.h" +#include "sourcerange.h" #include "unsavedfile.h" #include "unsavedfiles.h" -#include "clangdocument.h" -#include "sourcerange.h" -#include "clangunsavedfilesshallowarguments.h" -#include "clangtranslationunitupdater.h" #include <clang-c/Index.h> @@ -45,12 +46,13 @@ namespace ClangBackEnd { namespace { -CodeCompletions toCodeCompletions(const ClangCodeCompleteResults &results) +CodeCompletions toCodeCompletions(const TranslationUnit &translationUnit, + const ClangCodeCompleteResults &results) { if (results.isNull()) return CodeCompletions(); - CodeCompletionsExtractor extractor(results.data()); + CodeCompletionsExtractor extractor(translationUnit.cxTranslationUnit(), results.data()); CodeCompletions codeCompletions = extractor.extractAll(); return codeCompletions; @@ -85,8 +87,6 @@ CodeCompletions CodeCompleter::complete(uint line, uint column, int funcNameStartLine, int funcNameStartColumn) { - neededCorrection_ = CompletionCorrection::NoCorrection; - // Check if we have a smart pointer completion and get proper constructor signatures in results. // Results are empty when it's not a smart pointer or this completion failed. ClangCodeCompleteResults results = completeSmartPointerCreation(line, @@ -98,14 +98,8 @@ CodeCompletions CodeCompleter::complete(uint line, uint column, results = completeHelper(line, column); filterUnknownContextResults(results, unsavedFile(), line, column); - tryDotArrowCorrectionIfNoResults(results, line, column); - return toCodeCompletions(results); -} - -CompletionCorrection CodeCompleter::neededCorrection() const -{ - return neededCorrection_; + return toCodeCompletions(translationUnit, results); } // For given "make_unique<T>" / "make_shared<T>" / "QSharedPointer<T>::create" return "new T(" @@ -181,7 +175,10 @@ ClangCodeCompleteResults CodeCompleter::completeHelper(uint line, uint column) uint CodeCompleter::defaultOptions() const { uint options = CXCodeComplete_IncludeMacros - | CXCodeComplete_IncludeCodePatterns; + #ifdef IS_COMPLETION_FIXITS_BACKPORTED + | CXCodeComplete_IncludeCompletionsWithFixIts + #endif + | CXCodeComplete_IncludeCodePatterns; if (TranslationUnitUpdater::defaultParseOptions() & CXTranslationUnit_IncludeBriefCommentsInCodeCompletion) { @@ -196,37 +193,5 @@ UnsavedFile &CodeCompleter::unsavedFile() return unsavedFiles.unsavedFile(translationUnit.filePath()); } -void CodeCompleter::tryDotArrowCorrectionIfNoResults(ClangCodeCompleteResults &results, - uint line, - uint column) -{ - if (results.hasNoResultsForDotCompletion()) { - const UnsavedFile &theUnsavedFile = unsavedFile(); - bool positionIsOk = false; - const uint dotPosition = theUnsavedFile.toUtf8Position(line, column - 1, &positionIsOk); - if (positionIsOk && theUnsavedFile.hasCharacterAt(dotPosition, '.')) - results = completeWithArrowInsteadOfDot(line, column, dotPosition); - } -} - -ClangCodeCompleteResults CodeCompleter::completeWithArrowInsteadOfDot(uint line, - uint column, - uint dotPosition) -{ - ClangCodeCompleteResults results; - const bool replaced = unsavedFile().replaceAt(dotPosition, - 1, - Utf8StringLiteral("->")); - - if (replaced) { - results = completeHelper(line, column + 1); - if (results.hasResults()) - neededCorrection_ = CompletionCorrection::DotToArrowCorrection; - filterUnknownContextResults(results, unsavedFile(), line, column+1); - } - - return results; -} - } // namespace ClangBackEnd diff --git a/src/tools/clangbackend/source/codecompleter.h b/src/tools/clangbackend/source/codecompleter.h index 2026e9ba2c..6bfe77c09d 100644 --- a/src/tools/clangbackend/source/codecompleter.h +++ b/src/tools/clangbackend/source/codecompleter.h @@ -47,29 +47,19 @@ public: int funcNameStartLine = -1, int funcNameStartColumn = -1); - CompletionCorrection neededCorrection() const; - private: uint defaultOptions() const; UnsavedFile &unsavedFile(); - void tryDotArrowCorrectionIfNoResults(ClangCodeCompleteResults &results, - uint line, - uint column); - ClangCodeCompleteResults completeHelper(uint line, uint column); ClangCodeCompleteResults completeSmartPointerCreation(uint line, uint column, int funcNameStartLine, int funcNameStartColumn); - ClangCodeCompleteResults completeWithArrowInsteadOfDot(uint line, - uint column, - uint dotPosition); private: TranslationUnit translationUnit; UnsavedFiles unsavedFiles; - CompletionCorrection neededCorrection_ = CompletionCorrection::NoCorrection; }; } // namespace ClangBackEnd diff --git a/src/tools/clangbackend/source/codecompletionsextractor.cpp b/src/tools/clangbackend/source/codecompletionsextractor.cpp index c1e0fdeb71..bd961dc4aa 100644 --- a/src/tools/clangbackend/source/codecompletionsextractor.cpp +++ b/src/tools/clangbackend/source/codecompletionsextractor.cpp @@ -25,15 +25,19 @@ #include "codecompletionsextractor.h" +#include "clangbackend_global.h" #include "clangstring.h" #include "codecompletionchunkconverter.h" +#include "sourcerange.h" #include <QDebug> namespace ClangBackEnd { -CodeCompletionsExtractor::CodeCompletionsExtractor(CXCodeCompleteResults *cxCodeCompleteResults) - : cxCodeCompleteResults(cxCodeCompleteResults) +CodeCompletionsExtractor::CodeCompletionsExtractor(CXTranslationUnit cxTranslationUnit, + CXCodeCompleteResults *cxCodeCompleteResults) + : cxTranslationUnit(cxTranslationUnit) + , cxCodeCompleteResults(cxCodeCompleteResults) { } @@ -55,6 +59,7 @@ bool CodeCompletionsExtractor::next() extractBriefComment(); extractCompletionChunks(); adaptPriority(); + extractRequiredFixIts(); ++cxCodeCompleteResultIndex; @@ -171,6 +176,9 @@ void CodeCompletionsExtractor::extractText() void CodeCompletionsExtractor::extractMethodCompletionKind() { CXCompletionString cxCompletionString = cxCodeCompleteResults->Results[cxCodeCompleteResultIndex].CompletionString; + + const unsigned long long contexts = clang_codeCompleteGetContexts(cxCodeCompleteResults); + const uint annotationCount = clang_getCompletionNumAnnotations(cxCompletionString); for (uint annotationIndex = 0; annotationIndex < annotationCount; ++annotationIndex) { @@ -187,7 +195,11 @@ void CodeCompletionsExtractor::extractMethodCompletionKind() } } - currentCodeCompletion_.completionKind = CodeCompletion::FunctionCompletionKind; + currentCodeCompletion_.completionKind = CodeCompletion::FunctionDefinitionCompletionKind; + if ((contexts & CXCompletionContext_DotMemberAccess) + || (contexts & CXCompletionContext_ArrowMemberAccess)) { + currentCodeCompletion_.completionKind = CodeCompletion::FunctionCompletionKind; + } } void CodeCompletionsExtractor::extractMacroCompletionKind() @@ -260,6 +272,27 @@ void CodeCompletionsExtractor::extractCompletionChunks() currentCodeCompletion_.chunks = CodeCompletionChunkConverter::extract(currentCxCodeCompleteResult.CompletionString); } +void CodeCompletionsExtractor::extractRequiredFixIts() +{ +#ifdef IS_COMPLETION_FIXITS_BACKPORTED + unsigned fixItsNumber = clang_getCompletionNumFixIts(cxCodeCompleteResults, + cxCodeCompleteResultIndex); + + if (!fixItsNumber) + return; + + CXSourceRange range; + for (unsigned i = 0; i < fixItsNumber; ++i) { + ClangString fixIt = clang_getCompletionFixIt(cxCodeCompleteResults, + cxCodeCompleteResultIndex, + i, + &range); + currentCodeCompletion_.requiredFixIts.push_back( + FixItContainer(Utf8String(fixIt), SourceRange(cxTranslationUnit, range))); + } +#endif +} + void CodeCompletionsExtractor::adaptPriority() { decreasePriorityForDestructors(); diff --git a/src/tools/clangbackend/source/codecompletionsextractor.h b/src/tools/clangbackend/source/codecompletionsextractor.h index bbb3611bf6..1c5f963c14 100644 --- a/src/tools/clangbackend/source/codecompletionsextractor.h +++ b/src/tools/clangbackend/source/codecompletionsextractor.h @@ -38,7 +38,8 @@ namespace ClangBackEnd { class CodeCompletionsExtractor { public: - CodeCompletionsExtractor(CXCodeCompleteResults *cxCodeCompleteResults); + CodeCompletionsExtractor(CXTranslationUnit cxTranslationUnit, + CXCodeCompleteResults *cxCodeCompleteResults); CodeCompletionsExtractor(CodeCompletionsExtractor&) = delete; CodeCompletionsExtractor &operator=(CodeCompletionsExtractor&) = delete; @@ -63,6 +64,7 @@ private: void extractHasParameters(); void extractBriefComment(); void extractCompletionChunks(); + void extractRequiredFixIts(); void adaptPriority(); void decreasePriorityForNonAvailableCompletions(); @@ -75,6 +77,7 @@ private: private: CodeCompletion currentCodeCompletion_; + CXTranslationUnit cxTranslationUnit; CXCompletionResult currentCxCodeCompleteResult; CXCodeCompleteResults *cxCodeCompleteResults; uint cxCodeCompleteResultIndex = 0; diff --git a/src/tools/clangbackend/source/fulltokeninfo.cpp b/src/tools/clangbackend/source/fulltokeninfo.cpp index 283798d0be..e850e0495c 100644 --- a/src/tools/clangbackend/source/fulltokeninfo.cpp +++ b/src/tools/clangbackend/source/fulltokeninfo.cpp @@ -24,6 +24,7 @@ ****************************************************************************/ #include "clangstring.h" +#include "clangtooltipinfocollector.h" #include "cursor.h" #include "fulltokeninfo.h" #include "sourcerange.h" @@ -46,29 +47,27 @@ FullTokenInfo::operator TokenInfoContainer() const return TokenInfoContainer(line(), column(), length(), m_types, m_extraInfo); } -static Utf8String fullyQualifiedType(const Cursor &cursor) -{ - Utf8String typeSpelling = cursor.type().canonical().utf8Spelling(); - if (typeSpelling.isEmpty()) { - // Only if it's the namespaces level. - typeSpelling = cursor.unifiedSymbolResolution(); - typeSpelling.replace(Utf8StringLiteral("c:@N@"), Utf8StringLiteral("")); - typeSpelling.replace(Utf8StringLiteral("@N@"), Utf8StringLiteral("::")); - typeSpelling.replace(Utf8StringLiteral("c:@aN"), Utf8StringLiteral("(anonymous)")); +static Utf8String fullyQualifiedType(const Cursor &cursor) { + Utf8String prefix; + if (cursor.kind() == CXCursor_ClassTemplate || cursor.kind() == CXCursor_Namespace) { + if (cursor.unifiedSymbolResolution() == "c:@aN") + return Utf8String::fromUtf8("(anonymous)"); + return qualificationPrefix(cursor) + cursor.displayName(); } - return typeSpelling; + return cursor.type().canonical().spelling(); } void FullTokenInfo::updateTypeSpelling(const Cursor &cursor, bool functionLike) { - m_extraInfo.typeSpelling = fullyQualifiedType(cursor); m_extraInfo.semanticParentTypeSpelling = fullyQualifiedType(cursor.semanticParent()); - if (!functionLike) + if (!functionLike) { + m_extraInfo.typeSpelling = fullyQualifiedType(cursor); return; - Type type = cursor.type().canonical(); + } + m_extraInfo.token = cursor.displayName(); // On the client side full type is typeSpelling + token. - m_extraInfo.typeSpelling = type.resultType().utf8Spelling(); + m_extraInfo.typeSpelling = cursor.type().resultType().utf8Spelling(); } static Utf8String propertyParentSpelling(CXTranslationUnit cxTranslationUnit, diff --git a/src/tools/clangpchmanagerbackend/source/pchmanagerserver.cpp b/src/tools/clangpchmanagerbackend/source/pchmanagerserver.cpp index 90d315a0f1..1e9ea5ea46 100644 --- a/src/tools/clangpchmanagerbackend/source/pchmanagerserver.cpp +++ b/src/tools/clangpchmanagerbackend/source/pchmanagerserver.cpp @@ -28,6 +28,7 @@ #include <pchmanagerclientinterface.h> #include <precompiledheadersupdatedmessage.h> #include <removeprojectpartsmessage.h> +#include <updategeneratedfilesmessage.h> #include <updateprojectpartsmessage.h> #include <utils/smallstring.h> @@ -54,8 +55,6 @@ void PchManagerServer::end() void PchManagerServer::updateProjectParts(UpdateProjectPartsMessage &&message) { - m_pchCreator.setGeneratedFiles(message.takeGeneratedFiles()); - m_pchCreator.generatePchs(m_projectParts.update(message.takeProjectsParts())); m_fileSystemWatcher.updateIdPaths(m_pchCreator.takeProjectsIncludes()); @@ -68,6 +67,16 @@ void PchManagerServer::removeProjectParts(RemoveProjectPartsMessage &&message) m_projectParts.remove(message.projectsPartIds); } +void PchManagerServer::updateGeneratedFiles(UpdateGeneratedFilesMessage &&message) +{ + m_pchCreator.setGeneratedFiles(message.takeGeneratedFiles()); +} + +void PchManagerServer::removeGeneratedFiles(RemoveGeneratedFilesMessage &&message) +{ + // TODO +} + void PchManagerServer::pathsWithIdsChanged(const Utils::SmallStringVector &ids) { m_pchCreator.generatePchs(m_projectParts.projects(ids)); diff --git a/src/tools/clangpchmanagerbackend/source/pchmanagerserver.h b/src/tools/clangpchmanagerbackend/source/pchmanagerserver.h index 0921ce772c..b188b0e6bb 100644 --- a/src/tools/clangpchmanagerbackend/source/pchmanagerserver.h +++ b/src/tools/clangpchmanagerbackend/source/pchmanagerserver.h @@ -53,6 +53,8 @@ public: void end() override; void updateProjectParts(UpdateProjectPartsMessage &&message) override; void removeProjectParts(RemoveProjectPartsMessage &&message) override; + void updateGeneratedFiles(UpdateGeneratedFilesMessage &&message) override; + void removeGeneratedFiles(RemoveGeneratedFilesMessage &&message) override; void pathsWithIdsChanged(const Utils::SmallStringVector &ids) override; void pathsChanged(const FilePathIds &filePathIds) override; diff --git a/src/tools/clangrefactoringbackend/source/clangrefactoringbackend-source.pri b/src/tools/clangrefactoringbackend/source/clangrefactoringbackend-source.pri index 2a78fc0e11..c0d8efe87a 100644 --- a/src/tools/clangrefactoringbackend/source/clangrefactoringbackend-source.pri +++ b/src/tools/clangrefactoringbackend/source/clangrefactoringbackend-source.pri @@ -21,7 +21,8 @@ HEADERS += \ $$PWD/projectpartartefactexception.h \ $$PWD/projectpartartefact.h \ $$PWD/filestatuscache.h \ - $$PWD/indexdataconsumer.h + $$PWD/indexdataconsumer.h \ + $$PWD/projectpartqueue.h !isEmpty(LIBTOOLING_LIBS) { SOURCES += \ @@ -66,4 +67,5 @@ SOURCES += \ $$PWD/sourcerangefilter.cpp \ $$PWD/symbolindexer.cpp \ $$PWD/projectpartartefact.cpp \ - $$PWD/filestatuscache.cpp + $$PWD/filestatuscache.cpp \ + $$PWD/projectpartqueue.cpp diff --git a/src/tools/clangrefactoringbackend/source/collectsymbolsaction.h b/src/tools/clangrefactoringbackend/source/collectsymbolsaction.h index ad91ecd5c5..59e860b729 100644 --- a/src/tools/clangrefactoringbackend/source/collectsymbolsaction.h +++ b/src/tools/clangrefactoringbackend/source/collectsymbolsaction.h @@ -74,8 +74,8 @@ private: { clang::index::IndexingOptions options; - options.SystemSymbolFilter = clang::index::IndexingOptions::SystemSymbolFilterKind::All; - options.IndexFunctionLocals = true; + options.SystemSymbolFilter = clang::index::IndexingOptions::SystemSymbolFilterKind::None; + options.IndexFunctionLocals = false; return options; } diff --git a/src/tools/clangrefactoringbackend/source/projectpartqueue.cpp b/src/tools/clangrefactoringbackend/source/projectpartqueue.cpp new file mode 100644 index 0000000000..d1fdc5a83d --- /dev/null +++ b/src/tools/clangrefactoringbackend/source/projectpartqueue.cpp @@ -0,0 +1,147 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "projectpartqueue.h" + +namespace ClangBackEnd { + +ProjectPartQueue::ProjectPartQueue() +{ + +} + +namespace { + +template<class InputIt1, + class InputIt2, + class OutputIt, + class Compare, + class Merge> +OutputIt set_union_merge(InputIt1 first1, + InputIt1 last1, + InputIt2 first2, + InputIt2 last2, + OutputIt d_first, + Compare comp, + Merge merge) +{ + for (; first1 != last1; ++d_first) { + if (first2 == last2) + return std::copy(first1, last1, d_first); + if (comp(*first2, *first1)) { + *d_first = *first2++; + } else { + if (comp(*first1, *first2)) { + *d_first = *first1; + } else { + *d_first = merge(*first1, *first2); + ++first2; + } + ++first1; + } + } + return std::copy(first2, last2, d_first); +} + +} + +void ProjectPartQueue::addProjectParts(V2::ProjectPartContainers &&projectParts) +{ + auto compare = [](const V2::ProjectPartContainer &first, const V2::ProjectPartContainer &second) { + return first.projectPartId < second.projectPartId; + }; + + auto merge = [](V2::ProjectPartContainer &&first, + V2::ProjectPartContainer &&second) { + first.arguments = std::move(second.arguments); + first.compilerMacros = std::move(second.compilerMacros); + first.includeSearchPaths = std::move(second.includeSearchPaths); + FilePathIds headerPathIds; + headerPathIds.reserve(first.headerPathIds.size() + second.headerPathIds.size()); + std::set_union(first.headerPathIds.begin(), + first.headerPathIds.end(), + second.headerPathIds.begin(), + second.headerPathIds.end(), + std::back_inserter(headerPathIds)); + first.headerPathIds = std::move(headerPathIds); + FilePathIds sourcePathIds; + headerPathIds.reserve(first.sourcePathIds.size() + second.sourcePathIds.size()); + std::set_union(first.sourcePathIds.begin(), + first.sourcePathIds.end(), + second.sourcePathIds.begin(), + second.sourcePathIds.end(), + std::back_inserter(sourcePathIds)); + first.sourcePathIds = std::move(sourcePathIds); + + return first; + }; + + V2::ProjectPartContainers mergedProjectParts; + mergedProjectParts.reserve(m_projectParts.size() + projectParts.size()); + set_union_merge(std::make_move_iterator(m_projectParts.begin()), + std::make_move_iterator(m_projectParts.end()), + std::make_move_iterator(projectParts.begin()), + std::make_move_iterator(projectParts.end()), + std::back_inserter(mergedProjectParts), + compare, + merge); + + m_projectParts = std::move(mergedProjectParts); +} + +class CompareDifference +{ +public: + bool operator()(const V2::ProjectPartContainer &first, const Utils::SmallString &second) + { + return first.projectPartId < second; + } + + bool operator()(const Utils::SmallString &first, const V2::ProjectPartContainer &second) + { + return first < second.projectPartId; + } +}; + +void ProjectPartQueue::removeProjectParts(const Utils::SmallStringVector &projectsPartIds) +{ + V2::ProjectPartContainers notToBeRemovedProjectParts; + notToBeRemovedProjectParts.reserve(m_projectParts.size()); + std::set_difference(std::make_move_iterator(m_projectParts.begin()), + std::make_move_iterator(m_projectParts.end()), + projectsPartIds.begin(), + projectsPartIds.end(), + std::back_inserter(notToBeRemovedProjectParts), + CompareDifference{}); + + m_projectParts = std::move(notToBeRemovedProjectParts); +} + +const V2::ProjectPartContainers &ProjectPartQueue::projectParts() const +{ + return m_projectParts; +} + +} // namespace ClangBackEnd diff --git a/src/tools/clangrefactoringbackend/source/projectpartqueue.h b/src/tools/clangrefactoringbackend/source/projectpartqueue.h new file mode 100644 index 0000000000..b885a1ccb2 --- /dev/null +++ b/src/tools/clangrefactoringbackend/source/projectpartqueue.h @@ -0,0 +1,46 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include <projectpartcontainerv2.h> + +namespace ClangBackEnd { + +class ProjectPartQueue +{ +public: + ProjectPartQueue(); + + void addProjectParts(V2::ProjectPartContainers &&projectParts); + void removeProjectParts(const Utils::SmallStringVector &projectsPartIds); + + const V2::ProjectPartContainers &projectParts() const; + +private: + V2::ProjectPartContainers m_projectParts; +}; + +} // namespace ClangBackEnd diff --git a/src/tools/clangrefactoringbackend/source/refactoringserver.cpp b/src/tools/clangrefactoringbackend/source/refactoringserver.cpp index 68aa24cbcd..799901a520 100644 --- a/src/tools/clangrefactoringbackend/source/refactoringserver.cpp +++ b/src/tools/clangrefactoringbackend/source/refactoringserver.cpp @@ -97,12 +97,23 @@ void RefactoringServer::requestSourceRangesForQueryMessage(RequestSourceRangesFo void RefactoringServer::updateProjectParts(UpdateProjectPartsMessage &&message) { - m_symbolIndexing.updateProjectParts(message.takeProjectsParts(), message.takeGeneratedFiles()); + m_symbolIndexing.updateProjectParts(message.takeProjectsParts(), + m_generatedFiles.fileContainers()); +} + +void RefactoringServer::updateGeneratedFiles(UpdateGeneratedFilesMessage &&message) +{ + m_generatedFiles.update(message.takeGeneratedFiles()); } void RefactoringServer::removeProjectParts(RemoveProjectPartsMessage &&) { + // TODO +} +void RefactoringServer::removeGeneratedFiles(RemoveGeneratedFilesMessage &&message) +{ + m_generatedFiles.remove(message.generatedFiles); } void RefactoringServer::cancel() diff --git a/src/tools/clangrefactoringbackend/source/refactoringserver.h b/src/tools/clangrefactoringbackend/source/refactoringserver.h index 1823174335..ce18aaf548 100644 --- a/src/tools/clangrefactoringbackend/source/refactoringserver.h +++ b/src/tools/clangrefactoringbackend/source/refactoringserver.h @@ -31,6 +31,7 @@ #include <ipcclientprovider.h> #include <filepathcachinginterface.h> +#include <generatedfiles.h> #include <utils/smallstring.h> @@ -62,7 +63,10 @@ public: void requestSourceRangesAndDiagnosticsForQueryMessage(RequestSourceRangesAndDiagnosticsForQueryMessage &&message) override; void requestSourceRangesForQueryMessage(RequestSourceRangesForQueryMessage &&message) override; void updateProjectParts(UpdateProjectPartsMessage &&message) override; + void updateGeneratedFiles(UpdateGeneratedFilesMessage &&message) override; void removeProjectParts(RemoveProjectPartsMessage &&message) override; + void removeGeneratedFiles(RemoveGeneratedFilesMessage &&message) override; + void cancel() override; bool isCancelingJobs() const; @@ -81,6 +85,7 @@ private: private: ClangQueryGatherer m_gatherer; + GeneratedFiles m_generatedFiles; QTimer m_pollTimer; SymbolIndexingInterface &m_symbolIndexing; FilePathCachingInterface &m_filePathCache; diff --git a/src/tools/clangrefactoringbackend/source/symbolindexer.cpp b/src/tools/clangrefactoringbackend/source/symbolindexer.cpp index 51785e7870..58450cdc4d 100644 --- a/src/tools/clangrefactoringbackend/source/symbolindexer.cpp +++ b/src/tools/clangrefactoringbackend/source/symbolindexer.cpp @@ -43,7 +43,7 @@ SymbolIndexer::SymbolIndexer(SymbolsCollectorInterface &symbolsCollector, pathWatcher.setNotifier(this); } -void SymbolIndexer::updateProjectParts(V2::ProjectPartContainers &&projectParts, V2::FileContainers &&generatedFiles) +void SymbolIndexer::updateProjectParts(V2::ProjectPartContainers &&projectParts, const V2::FileContainers &generatedFiles) { for (V2::ProjectPartContainer &projectPart : projectParts) updateProjectPart(std::move(projectPart), generatedFiles); diff --git a/src/tools/clangrefactoringbackend/source/symbolindexer.h b/src/tools/clangrefactoringbackend/source/symbolindexer.h index 42ab387662..4fc66fee0f 100644 --- a/src/tools/clangrefactoringbackend/source/symbolindexer.h +++ b/src/tools/clangrefactoringbackend/source/symbolindexer.h @@ -46,7 +46,7 @@ public: Sqlite::TransactionInterface &transactionInterface); void updateProjectParts(V2::ProjectPartContainers &&projectParts, - V2::FileContainers &&generatedFiles); + const V2::FileContainers &generatedFiles); void updateProjectPart(V2::ProjectPartContainer &&projectPart, const V2::FileContainers &generatedFiles); diff --git a/src/tools/clangrefactoringbackend/source/symbolindexing.cpp b/src/tools/clangrefactoringbackend/source/symbolindexing.cpp index a9e772b168..c1e934eb2e 100644 --- a/src/tools/clangrefactoringbackend/source/symbolindexing.cpp +++ b/src/tools/clangrefactoringbackend/source/symbolindexing.cpp @@ -27,9 +27,10 @@ namespace ClangBackEnd { -void SymbolIndexing::updateProjectParts(V2::ProjectPartContainers &&projectParts, V2::FileContainers &&generatedFiles) +void SymbolIndexing::updateProjectParts(V2::ProjectPartContainers &&projectParts, + const V2::FileContainers &generatedFiles) { - m_indexer.updateProjectParts(std::move(projectParts), std::move(generatedFiles)); + m_indexer.updateProjectParts(std::move(projectParts), generatedFiles); } } // namespace ClangBackEnd diff --git a/src/tools/clangrefactoringbackend/source/symbolindexing.h b/src/tools/clangrefactoringbackend/source/symbolindexing.h index ffd2936986..f6c4e79628 100644 --- a/src/tools/clangrefactoringbackend/source/symbolindexing.h +++ b/src/tools/clangrefactoringbackend/source/symbolindexing.h @@ -62,7 +62,7 @@ public: } void updateProjectParts(V2::ProjectPartContainers &&projectParts, - V2::FileContainers &&generatedFiles); + const V2::FileContainers &generatedFiles) override; private: FilePathCachingInterface &m_filePathCache; diff --git a/src/tools/clangrefactoringbackend/source/symbolindexinginterface.h b/src/tools/clangrefactoringbackend/source/symbolindexinginterface.h index 72806e54a1..0151f29f7e 100644 --- a/src/tools/clangrefactoringbackend/source/symbolindexinginterface.h +++ b/src/tools/clangrefactoringbackend/source/symbolindexinginterface.h @@ -38,7 +38,7 @@ public: SymbolIndexingInterface &operator=(const SymbolIndexingInterface&) = delete; virtual void updateProjectParts(V2::ProjectPartContainers &&projectParts, - V2::FileContainers &&generatedFiles) = 0; + const V2::FileContainers &generatedFiles) = 0; protected: ~SymbolIndexingInterface() = default; diff --git a/src/tools/iconlister/iconlister.cpp b/src/tools/iconlister/iconlister.cpp index 06bacd31ba..509214cc25 100644 --- a/src/tools/iconlister/iconlister.cpp +++ b/src/tools/iconlister/iconlister.cpp @@ -311,8 +311,7 @@ void IconLister::addProjectExplorerIcons() {MODE_PROJECT_FLAT_ACTIVE.icon(), "MODE_PROJECT_FLAT_ACTIVE", prefix, ""}, - {OPTIONS_CATEGORY_KITS.icon(), "OPTIONS_CATEGORY_KITS", prefix, - ""}, + {Utils::Icon({{":/projectexplorer/images/settingscategory_kits.png", Utils::Theme::PanelTextColorDark}}, Utils::Icon::Tint).icon(), "OPTIONS_CATEGORY_KITS", prefix, ""}, {QIcon(":/projectexplorer/images/fileoverlay_qml.png"), "fileoverlay_qml.png", prefix, ""}, @@ -824,55 +823,56 @@ void IconLister::addUtilsIcons() void IconLister::addCPlusPlusIcons() { + using namespace Utils::CodeModelIcon; const QString prefix = "CPlusPlus"; const QList<IconInfo> icons = { - {CPlusPlus::Icons::iconForType(CPlusPlus::Icons::ClassIconType), "ClassIconType", prefix, + {iconForType(Class), "Class", prefix, ""}, - {CPlusPlus::Icons::iconForType(CPlusPlus::Icons::StructIconType), "StructIconType", prefix, + {iconForType(Struct), "Struct", prefix, ""}, - {CPlusPlus::Icons::iconForType(CPlusPlus::Icons::EnumIconType), "EnumIconType", prefix, + {iconForType(Enum), "Enum", prefix, ""}, - {CPlusPlus::Icons::iconForType(CPlusPlus::Icons::EnumeratorIconType), "EnumeratorIconType", prefix, + {iconForType(Enumerator), "Enumerator", prefix, ""}, - {CPlusPlus::Icons::iconForType(CPlusPlus::Icons::FuncPublicIconType), "FuncPublicIconType", prefix, + {iconForType(FuncPublic), "FuncPublic", prefix, ""}, - {CPlusPlus::Icons::iconForType(CPlusPlus::Icons::FuncProtectedIconType), "FuncProtectedIconType", prefix, + {iconForType(FuncProtected), "FuncProtected", prefix, ""}, - {CPlusPlus::Icons::iconForType(CPlusPlus::Icons::FuncPrivateIconType), "FuncPrivateIconType", prefix, + {iconForType(FuncPrivate), "FuncPrivate", prefix, ""}, - {CPlusPlus::Icons::iconForType(CPlusPlus::Icons::FuncPublicStaticIconType), "FuncPublicStaticIconType", prefix, + {iconForType(FuncPublicStatic), "FuncPublicStatic", prefix, ""}, - {CPlusPlus::Icons::iconForType(CPlusPlus::Icons::FuncProtectedStaticIconType), "FuncProtectedStaticIconType", prefix, + {iconForType(FuncProtectedStatic), "FuncProtectedStatic", prefix, ""}, - {CPlusPlus::Icons::iconForType(CPlusPlus::Icons::FuncPrivateStaticIconType), "FuncPrivateStaticIconType", prefix, + {iconForType(FuncPrivateStatic), "FuncPrivateStatic", prefix, ""}, - {CPlusPlus::Icons::iconForType(CPlusPlus::Icons::NamespaceIconType), "NamespaceIconType", prefix, + {iconForType(Namespace), "Namespace", prefix, ""}, - {CPlusPlus::Icons::iconForType(CPlusPlus::Icons::VarPublicIconType), "VarPublicIconType", prefix, + {iconForType(VarPublic), "VarPublic", prefix, ""}, - {CPlusPlus::Icons::iconForType(CPlusPlus::Icons::VarProtectedIconType), "VarProtectedIconType", prefix, + {iconForType(VarProtected), "VarProtected", prefix, ""}, - {CPlusPlus::Icons::iconForType(CPlusPlus::Icons::VarPrivateIconType), "VarPrivateIconType", prefix, + {iconForType(VarPrivate), "VarPrivate", prefix, ""}, - {CPlusPlus::Icons::iconForType(CPlusPlus::Icons::VarPublicStaticIconType), "VarPublicStaticIconType", prefix, + {iconForType(VarPublicStatic), "VarPublicStatic", prefix, ""}, - {CPlusPlus::Icons::iconForType(CPlusPlus::Icons::VarProtectedStaticIconType), "VarProtectedStaticIconType", prefix, + {iconForType(VarProtectedStatic), "VarProtectedStatic", prefix, ""}, - {CPlusPlus::Icons::iconForType(CPlusPlus::Icons::VarPrivateStaticIconType), "VarPrivateStaticIconType", prefix, + {iconForType(VarPrivateStatic), "VarPrivateStatic", prefix, ""}, - {CPlusPlus::Icons::iconForType(CPlusPlus::Icons::SignalIconType), "SignalIconType", prefix, + {iconForType(Signal), "Signal", prefix, ""}, - {CPlusPlus::Icons::iconForType(CPlusPlus::Icons::SlotPublicIconType), "SlotPublicIconType", prefix, + {iconForType(SlotPublic), "SlotPublic", prefix, ""}, - {CPlusPlus::Icons::iconForType(CPlusPlus::Icons::SlotProtectedIconType), "SlotProtectedIconType", prefix, + {iconForType(SlotProtected), "SlotProtected", prefix, ""}, - {CPlusPlus::Icons::iconForType(CPlusPlus::Icons::SlotPrivateIconType), "SlotPrivateIconType", prefix, + {iconForType(SlotPrivate), "SlotPrivate", prefix, ""}, - {CPlusPlus::Icons::iconForType(CPlusPlus::Icons::KeywordIconType), "KeywordIconType", prefix, + {iconForType(Keyword), "Keyword", prefix, ""}, - {CPlusPlus::Icons::iconForType(CPlusPlus::Icons::MacroIconType), "MacroIconType", prefix, + {iconForType(Macro), "Macro", prefix, ""}, - {CPlusPlus::Icons::iconForType(CPlusPlus::Icons::PropertyIconType), "PropertyIconType", prefix, + {iconForType(Property), "Property", prefix, ""} }; m_icons.append(icons); @@ -1030,19 +1030,19 @@ void IconLister::addQmlDesignerIcons() void IconLister::addProfilerTimelineIcons() { - Q_INIT_RESOURCE(timeline); + Q_INIT_RESOURCE(tracing); using namespace Utils; const QString prefix = "Profiler"; const QList<IconInfo> icons = { - {Icon({{":/timeline/ico_rangeselection.png", Theme::IconsBaseColor}}).icon(), "rangeselection", prefix, + {Icon({{":/tracing/ico_rangeselection.png", Theme::IconsBaseColor}}).icon(), "rangeselection", prefix, ""}, - {Icon({{":/timeline/ico_rangeselected.png", Theme::IconsBaseColor}}).icon(), "rangeselected", prefix, + {Icon({{":/tracing/ico_rangeselected.png", Theme::IconsBaseColor}}).icon(), "rangeselected", prefix, ""}, - {Icon({{":/timeline/ico_selectionmode.png", Theme::IconsBaseColor}}).icon(), "selectionmode", prefix, + {Icon({{":/tracing/ico_selectionmode.png", Theme::IconsBaseColor}}).icon(), "selectionmode", prefix, ""}, - {Icon({{":/timeline/ico_edit.png", Theme::IconsBaseColor}}).icon(), "edit", prefix, + {Icon({{":/tracing/ico_edit.png", Theme::IconsBaseColor}}).icon(), "edit", prefix, ""}, - {Icon({{":/timeline/range_handle.png", Theme::IconsBaseColor}}).icon(), "range_handle", prefix, + {Icon({{":/tracing/range_handle.png", Theme::IconsBaseColor}}).icon(), "range_handle", prefix, ""}, }; m_icons.append(icons); diff --git a/src/tools/iconlister/iconlister.pro b/src/tools/iconlister/iconlister.pro index 0fdfbfed4d..371b01a281 100644 --- a/src/tools/iconlister/iconlister.pro +++ b/src/tools/iconlister/iconlister.pro @@ -35,7 +35,7 @@ RESOURCES += \ $$IDE_SOURCE_TREE/src/plugins/android/android.qrc \ $$IDE_SOURCE_TREE/src/plugins/qnx/qnx.qrc \ $$IDE_SOURCE_TREE/src/plugins/winrt/winrt.qrc \ - $$IDE_SOURCE_TREE/src/libs/timeline/qml/timeline.qrc \ + $$IDE_SOURCE_TREE/src/libs/tracing/qml/tracing.qrc \ DEFINES += \ IDE_SOURCE_TREE='\\"$$IDE_SOURCE_TREE\\"' diff --git a/src/tools/icons/qtcreatoricons.svg b/src/tools/icons/qtcreatoricons.svg index 66fa8dfc87..95f5e2fb3a 100644 --- a/src/tools/icons/qtcreatoricons.svg +++ b/src/tools/icons/qtcreatoricons.svg @@ -6275,7 +6275,7 @@ style="display:inline" /> </g> <g - id="src/libs/cplusplus/images/member" + id="src/libs/utils/images/member" transform="translate(-28,0)"> <rect style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1" @@ -6292,7 +6292,7 @@ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> </g> <g - id="src/libs/cplusplus/images/signal"> + id="src/libs/utils/images/signal"> <rect style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1" id="rect4853-8-7" @@ -6355,7 +6355,7 @@ </g> <g transform="translate(4,0)" - id="src/libs/cplusplus/images/slot"> + id="src/libs/utils/images/slot"> <rect style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1" id="rect4853-8-0" @@ -6385,7 +6385,7 @@ height="100%" /> </g> <g - id="src/libs/cplusplus/images/protected" + id="src/libs/utils/images/protected" transform="translate(36,0)"> <rect y="552" @@ -6418,7 +6418,7 @@ </g> </g> <g - id="src/libs/cplusplus/images/protectedbackground" + id="src/libs/utils/images/protectedbackground" transform="translate(52,0)"> <rect y="552" @@ -6451,7 +6451,7 @@ </g> </g> <g - id="src/libs/cplusplus/images/private" + id="src/libs/utils/images/private" transform="translate(36,0)"> <rect y="552" @@ -6497,7 +6497,7 @@ sodipodi:nodetypes="zzzzz" /> </g> <g - id="src/libs/cplusplus/images/privatebackground" + id="src/libs/utils/images/privatebackground" transform="translate(52,0)"> <rect y="552" @@ -6537,7 +6537,7 @@ inkscape:connector-curvature="0" /> </g> <g - id="src/libs/cplusplus/images/static" + id="src/libs/utils/images/static" transform="translate(68,0)"> <rect y="552" @@ -6554,7 +6554,7 @@ sodipodi:nodetypes="cczczcc" /> </g> <g - id="src/libs/cplusplus/images/staticbackground" + id="src/libs/utils/images/staticbackground" transform="translate(84,0)"> <rect y="552" @@ -6571,7 +6571,7 @@ sodipodi:nodetypes="cczczcc" /> </g> <g - id="src/libs/cplusplus/images/classparent" + id="src/libs/utils/images/classparent" transform="translate(84,0)"> <rect y="552" @@ -6588,7 +6588,7 @@ sodipodi:nodetypes="ccccc" /> </g> <g - id="src/libs/cplusplus/images/classmemberfunction" + id="src/libs/utils/images/classmemberfunction" transform="translate(100,0)"> <rect y="552" @@ -6606,7 +6606,7 @@ inkscape:label="#path4895-4" /> </g> <g - id="src/libs/cplusplus/images/classmembervariable" + id="src/libs/utils/images/classmembervariable" transform="translate(116,0)"> <rect y="552" @@ -6625,7 +6625,7 @@ height="100%" /> </g> <g - id="src/libs/cplusplus/images/classrelation" + id="src/libs/utils/images/classrelation" transform="translate(148,0)"> <rect y="552" @@ -6648,7 +6648,7 @@ sodipodi:nodetypes="cc" /> </g> <g - id="src/libs/cplusplus/images/classrelationbackground" + id="src/libs/utils/images/classrelationbackground" transform="translate(164,0)"> <rect y="552" @@ -6671,7 +6671,7 @@ sodipodi:nodetypes="cc" /> </g> <g - id="src/libs/cplusplus/images/keyword"> + id="src/libs/utils/images/keyword"> <rect style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1" id="rect4853-8-9-8-3-7-5-1-9" @@ -6729,7 +6729,7 @@ x="0" /> </g> <g - id="src/libs/cplusplus/images/macro"> + id="src/libs/utils/images/macro"> <rect style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1" id="rect4853-8-9-8-3-7-5-1-9-9-5" @@ -6786,7 +6786,7 @@ </g> </g> <g - id="src/libs/cplusplus/images/enum" + id="src/libs/utils/images/enum" transform="translate(16,0)"> <rect y="552" @@ -6823,7 +6823,7 @@ </g> </g> <g - id="src/libs/cplusplus/images/enumerator" + id="src/libs/utils/images/enumerator" transform="translate(32,0)"> <rect y="552" @@ -6856,7 +6856,7 @@ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> </g> <g - id="src/libs/cplusplus/images/property" + id="src/libs/utils/images/property" transform="translate(292)"> <rect y="552" @@ -6881,7 +6881,7 @@ rx="1" /> </g> <g - id="src/libs/cplusplus/images/propertybackground"> + id="src/libs/utils/images/propertybackground"> <rect y="552" x="441" diff --git a/src/tools/qml2puppet/qml2puppet.qbs b/src/tools/qml2puppet/qml2puppet.qbs index bb3d0726d3..25c3f39309 100644 --- a/src/tools/qml2puppet/qml2puppet.qbs +++ b/src/tools/qml2puppet/qml2puppet.qbs @@ -176,6 +176,8 @@ QtcTool { "instances/qmlstatenodeinstance.h", "instances/qmltransitionnodeinstance.cpp", "instances/qmltransitionnodeinstance.h", + "instances/qt3dpresentationnodeinstance.cpp", + "instances/qt3dpresentationnodeinstance.h", "instances/qt5informationnodeinstanceserver.cpp", "instances/qt5informationnodeinstanceserver.h", "instances/qt5nodeinstanceclientproxy.cpp", diff --git a/src/tools/sdktool/addabiflavor.cpp b/src/tools/sdktool/addabiflavor.cpp new file mode 100644 index 0000000000..e24b444cfe --- /dev/null +++ b/src/tools/sdktool/addabiflavor.cpp @@ -0,0 +1,174 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "addabiflavor.h" + +#include "addkeysoperation.h" +#include "findkeyoperation.h" +#include "findvalueoperation.h" +#include "getoperation.h" +#include "rmkeysoperation.h" + +#include "settings.h" + +#include <QDir> + +#include <iostream> + +static char VERSION[] = "Version"; +static char FLAVORS[] = "Flavors"; +static char ABI_FILE_ID[] = "abi"; + +QString AddAbiFlavor::name() const +{ + return QLatin1String("addAbiFlavor"); +} + +QString AddAbiFlavor::helpText() const +{ + return QLatin1String("add an ABI flavor"); +} + +QString AddAbiFlavor::argumentsHelpText() const +{ + return QLatin1String(" --flavor <NAME> Name of new ABI flavor (required)\n" + " --oses <OS>(,<OS>)* OSes the flavor applies to (required)\n"); +} + +bool AddAbiFlavor::setArguments(const QStringList &args) +{ + for (int i = 0; i < args.count(); ++i) { + const QString current = args.at(i); + const QString next = ((i + 1) < args.count()) ? args.at(i + 1) : QString(); + + if (next.isNull() && current.startsWith("--")) { + std::cerr << "No parameter for option '" << qPrintable(current) << "' given." << std::endl << std::endl; + return false; + } + + if (current == QLatin1String("--flavor")) { + ++i; // skip next; + m_flavor = next; + continue; + } + + if (current == QLatin1String("--oses")) { + ++i; // skip next; + m_oses = next.split(','); + continue; + } + + std::cerr << "Unknown parameter: " << qPrintable(current) << std::endl << std::endl; + return false; + } + + if (m_flavor.isEmpty()) + std::cerr << "Error no flavor was passed." << std::endl << std::endl; + + if (m_oses.isEmpty()) + std::cerr << "Error no OSes name was passed." << std::endl << std::endl; + + return !m_flavor.isEmpty() && !m_oses.isEmpty(); +} + +int AddAbiFlavor::execute() const +{ + QVariantMap map = load(QLatin1String(ABI_FILE_ID)); + if (map.isEmpty()) + map = initializeAbiFlavors(); + + QVariantMap result = addAbiFlavor(map, m_oses, m_flavor); + + if (result.isEmpty() || result == map) + return 2; + + return save(result, QLatin1String(ABI_FILE_ID)) ? 0 : 3; +} + +#ifdef WITH_TESTS +bool AddAbiFlavor::test() const +{ + QVariantMap map = initializeAbiFlavors(); + if (map.count() != 1 + || !map.contains(QLatin1String(VERSION))) + return false; + + map = addAbiFlavor(map, {"linux", "windows"}, "foo"); + + if (map.count() != 2 + || !map.contains(QLatin1String(VERSION)) + || !map.contains(QLatin1String(FLAVORS))) + return false; + + const QVariantMap flavorMap = map.value(QLatin1String(FLAVORS)).toMap(); + if (flavorMap.count() != 1 + || flavorMap.value("foo").toStringList() != QStringList({"linux", "windows"})) + return false; + + // Ignore known flavors: + const QVariantMap result = addAbiFlavor(map, {"linux"}, "foo"); + + if (map != result) + return false; + + return true; +} +#endif + +QVariantMap AddAbiFlavor::addAbiFlavor(const QVariantMap &map, + const QStringList &oses, + const QString &flavor) +{ + // Sanity check: Is flavor already set in abi file? + if (exists(map, flavor)) { + std::cerr << "Error: flavor " << qPrintable(flavor) << " already defined as extra ABI flavor." << std::endl; + return map; + } + + QVariantMap result = map; + QVariantMap flavorMap = map.value(QLatin1String(FLAVORS)).toMap(); + flavorMap.insert(flavor, oses); + result.insert(QLatin1String(FLAVORS), flavorMap); + return result; +} + +QVariantMap AddAbiFlavor::initializeAbiFlavors() +{ + QVariantMap map; + map.insert(QLatin1String(VERSION), 1); + return map; +} + +bool AddAbiFlavor::exists(const QString &flavor) +{ + QVariantMap map = load(QLatin1String(ABI_FILE_ID)); + return exists(map, flavor); +} + +bool AddAbiFlavor::exists(const QVariantMap &map, const QString &flavor) +{ + const QVariantMap flavorMap = map.value(QLatin1String(FLAVORS)).toMap(); + return flavorMap.contains(flavor); +} diff --git a/src/tools/sdktool/addabiflavor.h b/src/tools/sdktool/addabiflavor.h new file mode 100644 index 0000000000..61c817b879 --- /dev/null +++ b/src/tools/sdktool/addabiflavor.h @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include "operation.h" + +#include <QString> + +class AddAbiFlavor : public Operation +{ +public: + QString name() const; + QString helpText() const; + QString argumentsHelpText() const; + + bool setArguments(const QStringList &args); + + int execute() const; + +#ifdef WITH_TESTS + bool test() const; +#endif + + static QVariantMap addAbiFlavor(const QVariantMap &map, + const QStringList &oses, const QString &flavor); + + static QVariantMap initializeAbiFlavors(); + + static bool exists(const QString &flavor); + static bool exists(const QVariantMap &map, const QString &flavor); + +private: + QStringList m_oses; + QString m_flavor; +}; diff --git a/src/tools/sdktool/addcmakeoperation.cpp b/src/tools/sdktool/addcmakeoperation.cpp index bddf275c51..bc8d9a66bc 100644 --- a/src/tools/sdktool/addcmakeoperation.cpp +++ b/src/tools/sdktool/addcmakeoperation.cpp @@ -143,7 +143,7 @@ bool AddCMakeOperation::test() const || !map.contains(QString::fromLatin1(PREFIX) + '0')) return false; QVariantMap cmData = map.value(QString::fromLatin1(PREFIX) + '0').toMap(); - if (cmData.count() != 8 + if (cmData.count() != 5 || cmData.value(ID_KEY).toString() != "testId" || cmData.value(DISPLAYNAME_KEY).toString() != "name" || cmData.value(AUTODETECTED_KEY).toBool() != true @@ -165,7 +165,7 @@ bool AddCMakeOperation::test() const || !map.contains(QString::fromLatin1(PREFIX) + '1')) return false; cmData = map.value(QString::fromLatin1(PREFIX) + '0').toMap(); - if (cmData.count() != 8 + if (cmData.count() != 5 || cmData.value(ID_KEY).toString() != "testId" || cmData.value(DISPLAYNAME_KEY).toString() != "name" || cmData.value(AUTODETECTED_KEY).toBool() != true @@ -173,7 +173,7 @@ bool AddCMakeOperation::test() const || cmData.value("ExtraKey").toString() != "ExtraValue") return false; cmData = map.value(QString::fromLatin1(PREFIX) + '1').toMap(); - if (cmData.count() != 8 + if (cmData.count() != 5 || cmData.value(ID_KEY).toString() != "{some-cm-id}" || cmData.value(DISPLAYNAME_KEY).toString() != "name2" || cmData.value(AUTODETECTED_KEY).toBool() != true diff --git a/src/tools/sdktool/addkitoperation.cpp b/src/tools/sdktool/addkitoperation.cpp index e5767be7e8..a58e1257c2 100644 --- a/src/tools/sdktool/addkitoperation.cpp +++ b/src/tools/sdktool/addkitoperation.cpp @@ -318,7 +318,7 @@ bool AddKitOperation::test() const QVariantMap qtMap = AddQtOperation::initializeQtVersions(); qtMap = AddQtOperation::addQt(qtMap, "{qt-id}", "Qt", "desktop-qt", "/usr/bin/qmake", - KeyValuePairList()); + KeyValuePairList(), {}); QVariantMap devMap = AddDeviceOperation::initializeDevices(); devMap = AddDeviceOperation::addDevice(devMap, "{dev-id}", "Dev", 0, 0, diff --git a/src/tools/sdktool/addqtoperation.cpp b/src/tools/sdktool/addqtoperation.cpp index 59a0b1b555..c71676433b 100644 --- a/src/tools/sdktool/addqtoperation.cpp +++ b/src/tools/sdktool/addqtoperation.cpp @@ -46,6 +46,7 @@ const char ID[] = "Id"; const char DISPLAYNAME[] = "Name"; const char AUTODETECTED[] = "isAutodetected"; const char AUTODETECTION_SOURCE[] = "autodetectionSource"; +const char ABIS[] = "Abis"; const char QMAKE[] = "QMakePath"; const char TYPE[] = "QtVersion.Type"; @@ -72,6 +73,7 @@ QString AddQtOperation::argumentsHelpText() const " --name <NAME> display name of the new Qt version. (required)\n" " --qmake <PATH> path to qmake. (required)\n" " --type <TYPE> type of Qt version to add. (required)\n" + " --abis <ABI>(,<ABI>)* ABIs of Qt version (leave out for auto-detection!)\n" " <KEY> <TYPE:VALUE> extra key value pairs\n"); } @@ -121,6 +123,16 @@ bool AddQtOperation::setArguments(const QStringList &args) continue; } + if (current == "--abis") { + if (next.isNull()) { + std::cerr << "Error parsing after --abis." << std::endl << std::endl; + return false; + } + ++i; // skip next; + m_abis = next.split(','); + continue; + } + if (next.isNull()) { std::cerr << "Unknown parameter: " << qPrintable(current) << std::endl << std::endl; return false; @@ -155,7 +167,7 @@ int AddQtOperation::execute() const if (map.isEmpty()) map = initializeQtVersions(); - QVariantMap result = addQt(map, m_id, m_displayName, m_type, m_qmake, m_extra); + QVariantMap result = addQt(map, m_id, m_displayName, m_type, m_qmake, m_extra, m_abis); if (result.isEmpty() || result == map) return 2; @@ -176,11 +188,13 @@ bool AddQtOperation::test() const #if defined Q_OS_WIN map = addQt(map, QLatin1String("{some-qt-id}"), QLatin1String("Test Qt Version"), QLatin1String("testType"), QLatin1String("/tmp//../tmp/test\\qmake"), - KeyValuePairList() << KeyValuePair(QLatin1String("extraData"), QVariant(QLatin1String("extraValue")))); + KeyValuePairList() << KeyValuePair(QLatin1String("extraData"), QVariant(QLatin1String("extraValue"))), + QStringList()); #else map = addQt(map, QLatin1String("{some-qt-id}"), QLatin1String("Test Qt Version"), QLatin1String("testType"), QLatin1String("/tmp//../tmp/test/qmake"), - KeyValuePairList() << KeyValuePair(QLatin1String("extraData"), QVariant(QLatin1String("extraValue")))); + KeyValuePairList() << KeyValuePair(QLatin1String("extraData"), QVariant(QLatin1String("extraValue"))), + QStringList()); #endif if (map.count() != 2 @@ -190,7 +204,7 @@ bool AddQtOperation::test() const return false; QVariantMap version0 = map.value(QLatin1String("QtVersion.0")).toMap(); - if (version0.count() != 7 + if (version0.count() != 8 || !version0.contains(QLatin1String(ID)) || version0.value(QLatin1String(ID)).toInt() != -1 || !version0.contains(QLatin1String(DISPLAYNAME)) @@ -201,6 +215,8 @@ bool AddQtOperation::test() const || version0.value(QLatin1String(AUTODETECTION_SOURCE)).toString() != QLatin1String("SDK.{some-qt-id}") || !version0.contains(QLatin1String(TYPE)) || version0.value(QLatin1String(TYPE)).toString() != QLatin1String("testType") + || !version0.contains(QLatin1String(ABIS)) + || version0.value(QLatin1String(ABIS)).toStringList() != QStringList() || !version0.contains(QLatin1String(QMAKE)) || version0.value(QLatin1String(QMAKE)).toString() != QLatin1String("/tmp/test/qmake") || !version0.contains(QLatin1String("extraData")) @@ -210,14 +226,16 @@ bool AddQtOperation::test() const // Ignore existing ids: QVariantMap result = addQt(map, QLatin1String("{some-qt-id}"), QLatin1String("Test Qt Version2"), QLatin1String("testType2"), QLatin1String("/tmp/test/qmake2"), - KeyValuePairList() << KeyValuePair(QLatin1String("extraData"), QVariant(QLatin1String("extraValue")))); + KeyValuePairList() << KeyValuePair(QLatin1String("extraData"), QVariant(QLatin1String("extraValue"))), + QStringList()); if (!result.isEmpty()) return false; // Make sure name is unique: map = addQt(map, QLatin1String("testId2"), QLatin1String("Test Qt Version"), QLatin1String("testType3"), - QLatin1String("/tmp/test/qmake2"), - KeyValuePairList() << KeyValuePair(QLatin1String("extraData"), QVariant(QLatin1String("extraValue")))); + QLatin1String("/tmp/test/qmake2"), + KeyValuePairList() << KeyValuePair(QLatin1String("extraData"), QVariant(QLatin1String("extraValue"))), + QStringList()); if (map.count() != 3 || !map.contains(QLatin1String(VERSION)) || map.value(QLatin1String(VERSION)).toInt() != 1 @@ -229,7 +247,7 @@ bool AddQtOperation::test() const return false; QVariantMap version1 = map.value(QLatin1String("QtVersion.1")).toMap(); - if (version1.count() != 7 + if (version1.count() != 8 || !version1.contains(QLatin1String(ID)) || version1.value(QLatin1String(ID)).toInt() != -1 || !version1.contains(QLatin1String(DISPLAYNAME)) @@ -240,6 +258,8 @@ bool AddQtOperation::test() const || version1.value(QLatin1String(AUTODETECTION_SOURCE)).toString() != QLatin1String("SDK.testId2") || !version1.contains(QLatin1String(TYPE)) || version1.value(QLatin1String(TYPE)).toString() != QLatin1String("testType3") + || !version1.contains(QLatin1String(ABIS)) + || version1.value(QLatin1String(ABIS)).toStringList() != QStringList() || !version1.contains(QLatin1String(QMAKE)) || version1.value(QLatin1String(QMAKE)).toString() != QLatin1String("/tmp/test/qmake2") || !version1.contains(QLatin1String("extraData")) @@ -252,7 +272,8 @@ bool AddQtOperation::test() const QVariantMap AddQtOperation::addQt(const QVariantMap &map, const QString &id, const QString &displayName, const QString &type, - const QString &qmake, const KeyValuePairList &extra) + const QString &qmake, const KeyValuePairList &extra, + const QStringList &abis) { QString sdkId = extendId(id); @@ -293,6 +314,7 @@ QVariantMap AddQtOperation::addQt(const QVariantMap &map, data << KeyValuePair(QStringList() << qt << QLatin1String(AUTODETECTION_SOURCE), QVariant(sdkId)); data << KeyValuePair(QStringList() << qt << QLatin1String(QMAKE), QVariant(saneQmake)); data << KeyValuePair(QStringList() << qt << QLatin1String(TYPE), QVariant(type)); + data << KeyValuePair(QStringList() << qt << ABIS, QVariant(abis)); KeyValuePairList qtExtraList; foreach (const KeyValuePair &pair, extra) @@ -322,10 +344,8 @@ bool AddQtOperation::exists(const QVariantMap &map, const QString &id) // Sanity check: Make sure autodetection source is not in use already: QStringList valueKeys = FindValueOperation::findValue(map, sdkId); foreach (const QString &k, valueKeys) { - if (k.endsWith(QString(QLatin1Char('/')) + QLatin1String(AUTODETECTION_SOURCE))) { + if (k.endsWith(QString(QLatin1Char('/')) + QLatin1String(AUTODETECTION_SOURCE))) return true; - break; - } } return false; } diff --git a/src/tools/sdktool/addqtoperation.h b/src/tools/sdktool/addqtoperation.h index 2712556767..65e31ff835 100644 --- a/src/tools/sdktool/addqtoperation.h +++ b/src/tools/sdktool/addqtoperation.h @@ -46,7 +46,8 @@ public: static QVariantMap addQt(const QVariantMap &map, const QString &id, const QString &displayName, const QString &type, - const QString &qmake, const KeyValuePairList &extra); + const QString &qmake, const KeyValuePairList &extra, + const QStringList &abis); static QVariantMap initializeQtVersions(); @@ -58,5 +59,6 @@ private: QString m_displayName; QString m_type; QString m_qmake; + QStringList m_abis; KeyValuePairList m_extra; }; diff --git a/src/tools/sdktool/addtoolchainoperation.cpp b/src/tools/sdktool/addtoolchainoperation.cpp index 51f98fe555..335b72ec76 100644 --- a/src/tools/sdktool/addtoolchainoperation.cpp +++ b/src/tools/sdktool/addtoolchainoperation.cpp @@ -183,7 +183,7 @@ bool AddToolChainOperation::test() const QVariantMap tcData = map.value(QString::fromLatin1(PREFIX) + '0').toMap(); if (tcData.count() != 8 || tcData.value(ID).toString() != "testId" - || tcData.value(LANGUAGE_KEY).toString() != "langId" + || tcData.value(LANGUAGE_KEY_V2).toString() != "langId" || tcData.value(DISPLAYNAME).toString() != "name" || tcData.value(AUTODETECTED).toBool() != true || tcData.value(PATH).toString() != "/tmp/test" @@ -209,7 +209,7 @@ bool AddToolChainOperation::test() const tcData = map.value(QString::fromLatin1(PREFIX) + '0').toMap(); if (tcData.count() != 8 || tcData.value(ID).toString() != "testId" - || tcData.value(LANGUAGE_KEY).toString() != "langId" + || tcData.value(LANGUAGE_KEY_V2).toString() != "langId" || tcData.value(DISPLAYNAME).toString() != "name" || tcData.value(AUTODETECTED).toBool() != true || tcData.value(PATH).toString() != "/tmp/test" @@ -220,7 +220,7 @@ bool AddToolChainOperation::test() const tcData = map.value(QString::fromLatin1(PREFIX) + '1').toMap(); if (tcData.count() != 8 || tcData.value(ID).toString() != "{some-tc-id}" - || tcData.value(LANGUAGE_KEY).toString() != "langId2" + || tcData.value(LANGUAGE_KEY_V2).toString() != "langId2" || tcData.value(DISPLAYNAME).toString() != "name2" || tcData.value(AUTODETECTED).toBool() != true || tcData.value(PATH).toString() != "/tmp/test" diff --git a/src/tools/sdktool/main.cpp b/src/tools/sdktool/main.cpp index f480543fbb..444752a5a4 100644 --- a/src/tools/sdktool/main.cpp +++ b/src/tools/sdktool/main.cpp @@ -30,6 +30,7 @@ #include "addcmakeoperation.h" #include "adddebuggeroperation.h" #include "adddeviceoperation.h" +#include "addabiflavor.h" #include "addkeysoperation.h" #include "addkitoperation.h" #include "addqtoperation.h" @@ -62,13 +63,13 @@ void printHelp(const Operation *op) std::cout << std::endl; } -const QString tabular(const Operation *o) +const QString tabular(const std::unique_ptr<Operation> &o) { const QString name = o->name(); return name + QString(16 - name.length(), QChar::Space) + o->helpText(); } -void printHelp(const QList<Operation *> &operations) +void printHelp(const std::vector<std::unique_ptr<Operation>> &operations) { std::cout << Core::Constants::IDE_DISPLAY_NAME << "SDK setup tool." << std::endl; std::cout << " Usage: " << qPrintable(QCoreApplication::arguments().at(0)) @@ -79,7 +80,7 @@ void printHelp(const QList<Operation *> &operations) std::cout << "OPERATION:" << std::endl; std::cout << " One of:" << std::endl; - foreach (const Operation *o, operations) + for (const std::unique_ptr<Operation> &o : operations) std::cout << " " << qPrintable(tabular(o)) << std::endl; std::cout << std::endl; std::cout << "OPERATION_ARGS:" << std::endl; @@ -88,7 +89,8 @@ void printHelp(const QList<Operation *> &operations) std::cout << std::endl; } -int parseArguments(const QStringList &args, Settings *s, const QList<Operation *> &operations) +int parseArguments(const QStringList &args, Settings *s, + const std::vector<std::unique_ptr<Operation>> &operations) { QStringList opArgs; int argCount = args.count(); @@ -101,9 +103,9 @@ int parseArguments(const QStringList &args, Settings *s, const QList<Operation * // help if (current == QLatin1String("-h") || current == QLatin1String("--help")) { if (!next.isEmpty()) { - foreach (Operation *o, operations) { + for (const std::unique_ptr<Operation> &o : operations) { if (o->name() == next) { - printHelp(o); + printHelp(o.get()); return 0; } } @@ -129,9 +131,9 @@ int parseArguments(const QStringList &args, Settings *s, const QList<Operation * } // operation - foreach (Operation *o, operations) { + for (const std::unique_ptr<Operation> &o : operations) { if (o->name() == current) { - s->operation = o; + s->operation = o.get(); break; } } @@ -156,7 +158,7 @@ int parseArguments(const QStringList &args, Settings *s, const QList<Operation * if (!s->operation->setArguments(opArgs)) { std::cerr << "Argument parsing failed." << std::endl << std::endl; printHelp(s->operation); - s->operation = 0; + s->operation = nullptr; return 1; } @@ -176,47 +178,46 @@ int main(int argc, char *argv[]) Settings settings; - QList<Operation *> operations; - operations << new AddKeysOperation + std::vector<std::unique_ptr<Operation>> operations; + operations.emplace_back(std::make_unique<AddKeysOperation>()); - << new AddCMakeOperation - << new AddDebuggerOperation - << new AddDeviceOperation - << new AddQtOperation - << new AddToolChainOperation + operations.emplace_back(std::make_unique<AddAbiFlavor>()); + operations.emplace_back(std::make_unique<AddCMakeOperation>()); + operations.emplace_back(std::make_unique<AddDebuggerOperation>()); + operations.emplace_back(std::make_unique<AddDeviceOperation>()); + operations.emplace_back(std::make_unique<AddQtOperation>()); + operations.emplace_back(std::make_unique<AddToolChainOperation>()); - << new AddKitOperation + operations.emplace_back(std::make_unique<AddKitOperation>()); - << new GetOperation + operations.emplace_back(std::make_unique<GetOperation>()); - << new RmCMakeOperation - << new RmKitOperation - << new RmDebuggerOperation - << new RmDeviceOperation - << new RmKeysOperation - << new RmQtOperation - << new RmToolChainOperation + operations.emplace_back(std::make_unique<RmCMakeOperation>()); + operations.emplace_back(std::make_unique<RmKitOperation>()); + operations.emplace_back(std::make_unique<RmDebuggerOperation>()); + operations.emplace_back(std::make_unique<RmDeviceOperation>()); + operations.emplace_back(std::make_unique<RmKeysOperation>()); + operations.emplace_back(std::make_unique<RmQtOperation>()); + operations.emplace_back(std::make_unique<RmToolChainOperation>()); - << new FindKeyOperation - << new FindValueOperation; + operations.emplace_back(std::make_unique<FindKeyOperation>()); + operations.emplace_back(std::make_unique<FindValueOperation>()); #ifdef WITH_TESTS if (argc == 2 && !strcmp(argv[1], "-test")) { std::cerr << std::endl << std::endl << "Starting tests..." << std::endl; int res = 0; - foreach (Operation *o, operations) + for (const std::unique_ptr<Operation> &o : operations) { if (!o->test()) { std::cerr << "!!!! Test failed for: " << qPrintable(o->name()) << " !!!!" << std::endl; ++res; } + } std::cerr << "Tests done." << std::endl << std::endl; return res; } #endif int result = parseArguments(a.arguments(), &settings, operations); - if (!settings.operation) - return result; // nothing to do:-) - - return settings.operation->execute(); + return settings.operation ? settings.operation->execute() : result; } diff --git a/src/tools/sdktool/rmcmakeoperation.cpp b/src/tools/sdktool/rmcmakeoperation.cpp index 2eaf84b9d0..a5583c3f84 100644 --- a/src/tools/sdktool/rmcmakeoperation.cpp +++ b/src/tools/sdktool/rmcmakeoperation.cpp @@ -97,6 +97,7 @@ bool RmCMakeOperation::test() const { // Add cmakes: QVariantMap map = AddCMakeOperation::initializeCMake(); + const QVariantMap emptyMap = map; map = AddCMakeOperation::addCMake(map, "testId", "name", "/tmp/test", KeyValuePairList({KeyValuePair("ExtraKey", QVariant("ExtraValue"))})); map = AddCMakeOperation::addCMake(map, "testId2", "other name", "/tmp/test2", KeyValuePairList()); @@ -109,21 +110,25 @@ bool RmCMakeOperation::test() const if (result != map) return false; + // Remove from map with both testId and testId2: result = rmCMake(map, "testId2"); if (result == map || result.value(COUNT, 0).toInt() != 1 - || !result.contains("CMake.0") || result.value("CMake.0") != map.value("CMake.0")) + || !result.contains(QString::fromLatin1(PREFIX) + "0") + || result.value(QString::fromLatin1(PREFIX) + "0") != map.value(QString::fromLatin1(PREFIX) + "0")) return false; + // Remove from map with both testId and testId2: result = rmCMake(map, "testId"); if (result == map || result.value(COUNT, 0).toInt() != 1 - || !result.contains("CMake.0") || result.value("CMake.0") != map.value("CMake.1")) + || !result.contains(QString::fromLatin1(PREFIX) + "0") + || result.value(QString::fromLatin1(PREFIX) + "0") != map.value(QString::fromLatin1(PREFIX) + "1")) return false; + // Remove from map without testId! result = rmCMake(result, "testId2"); - if (result == map - || result.value(COUNT, 0).toInt() != 0) + if (result != emptyMap) return false; return true; diff --git a/src/tools/sdktool/rmkitoperation.cpp b/src/tools/sdktool/rmkitoperation.cpp index 5abfe9ecdd..4e7487f40b 100644 --- a/src/tools/sdktool/rmkitoperation.cpp +++ b/src/tools/sdktool/rmkitoperation.cpp @@ -105,7 +105,7 @@ bool RmKitOperation::test() const QVariantMap qtMap = AddQtOperation::initializeQtVersions(); qtMap = AddQtOperation::addQt(qtMap, "{qt-id}", "Qt", "desktop-qt", "/usr/bin/qmake", - KeyValuePairList()); + KeyValuePairList(), QStringList()); QVariantMap devMap = AddDeviceOperation::initializeDevices(); devMap = AddDeviceOperation::addDevice(devMap, "{dev-id}", "Dev", 0, 0, diff --git a/src/tools/sdktool/rmqtoperation.cpp b/src/tools/sdktool/rmqtoperation.cpp index 292b8fdb3f..53f3b76001 100644 --- a/src/tools/sdktool/rmqtoperation.cpp +++ b/src/tools/sdktool/rmqtoperation.cpp @@ -103,10 +103,11 @@ bool RmQtOperation::test() const map = AddQtOperation::addQt(map, QLatin1String("testId"), QLatin1String("name"), QLatin1String("type"), QLatin1String("/tmp/test"), - KeyValuePairList() << KeyValuePair(QLatin1String("ExtraKey"), QVariant(QLatin1String("ExtraValue")))); + KeyValuePairList() << KeyValuePair(QLatin1String("ExtraKey"), QVariant(QLatin1String("ExtraValue"))), + QStringList()); map = AddQtOperation::addQt(map, QLatin1String("testId2"), QLatin1String("other name"), QLatin1String("type"), QLatin1String("/tmp/test2"), - KeyValuePairList()); + KeyValuePairList(), QStringList()); result = rmQt(map, QLatin1String("nonexistant")); if (result != map) diff --git a/src/tools/sdktool/sdktool.pro b/src/tools/sdktool/sdktool.pro index d3d1babf2e..098897f1e2 100644 --- a/src/tools/sdktool/sdktool.pro +++ b/src/tools/sdktool/sdktool.pro @@ -10,6 +10,7 @@ win32: LIBS += -luser32 -lshell32 SOURCES += \ main.cpp \ + addabiflavor.cpp \ addcmakeoperation.cpp \ adddebuggeroperation.cpp \ adddeviceoperation.cpp \ @@ -36,6 +37,7 @@ SOURCES += \ $$UTILS/savefile.cpp \ HEADERS += \ + addabiflavor.h \ addcmakeoperation.h \ adddebuggeroperation.h \ adddeviceoperation.h \ diff --git a/src/tools/sdktool/sdktool.qbs b/src/tools/sdktool/sdktool.qbs index 60095bdb87..67b1d8e3c3 100644 --- a/src/tools/sdktool/sdktool.qbs +++ b/src/tools/sdktool/sdktool.qbs @@ -26,6 +26,7 @@ QtcTool { cpp.includePaths: base.concat([libsDir]) files: [ + "addabiflavor.cpp", "addabiflavor.h", "addcmakeoperation.cpp", "addcmakeoperation.h", "adddebuggeroperation.cpp", "adddebuggeroperation.h", "adddeviceoperation.cpp", "adddeviceoperation.h", diff --git a/src/tools/sdktool/settings.cpp b/src/tools/sdktool/settings.cpp index fa57542fbe..e4c74cc19e 100644 --- a/src/tools/sdktool/settings.cpp +++ b/src/tools/sdktool/settings.cpp @@ -60,7 +60,7 @@ Utils::FileName Settings::getPath(const QString &file) const QString lowerFile = file.toLower(); const QStringList identical = QStringList({ "android", "cmaketools", "debuggers", "devices", - "profiles", "qtversions", "toolchains" }); + "profiles", "qtversions", "toolchains", "abi" }); if (lowerFile == "cmake") result.appendPath("cmaketools"); else if (lowerFile == "kits") diff --git a/src/tools/tools.pro b/src/tools/tools.pro index cce61a59a7..07246b95fe 100644 --- a/src/tools/tools.pro +++ b/src/tools/tools.pro @@ -23,8 +23,8 @@ mac { SUBDIRS += clangbackend -QTC_NO_CLANG_LIBTOOLING=$$(QTC_NO_CLANG_LIBTOOLING) -isEmpty(QTC_NO_CLANG_LIBTOOLING) { +QTC_ENABLE_CLANG_LIBTOOLING=$$(QTC_ENABLE_CLANG_LIBTOOLING) +!isEmpty(QTC_ENABLE_CLANG_LIBTOOLING) { SUBDIRS += clangrefactoringbackend SUBDIRS += clangpchmanagerbackend } else { diff --git a/tests/auto/tracing/timelinemodel/tst_timelinemodel.cpp b/tests/auto/tracing/timelinemodel/tst_timelinemodel.cpp index be527af127..812f51d226 100644 --- a/tests/auto/tracing/timelinemodel/tst_timelinemodel.cpp +++ b/tests/auto/tracing/timelinemodel/tst_timelinemodel.cpp @@ -108,6 +108,7 @@ void DummyModel::loadData() computeNesting(); setCollapsedRowCount(2); setExpandedRowCount(3); + emit contentChanged(); } tst_TimelineModel::tst_TimelineModel() : @@ -216,7 +217,6 @@ void tst_TimelineModel::height() int heightAfterLastSignal = 0; int heightChangedSignals = 0; connect(&dummy, &Timeline::TimelineModel::heightChanged, [&](){ - QVERIFY(dummy.height() != heightAfterLastSignal); ++heightChangedSignals; heightAfterLastSignal = dummy.height(); }); @@ -432,20 +432,17 @@ void tst_TimelineModel::insertStartEnd() void tst_TimelineModel::rowCount() { DummyModel dummy(&aggregator); - QSignalSpy expandedSpy(&dummy, SIGNAL(expandedRowCountChanged())); - QSignalSpy collapsedSpy(&dummy, SIGNAL(collapsedRowCountChanged())); + QSignalSpy contentSpy(&dummy, SIGNAL(contentChanged())); QCOMPARE(dummy.rowCount(), 1); dummy.setExpanded(true); QCOMPARE(dummy.rowCount(), 1); dummy.loadData(); - QCOMPARE(expandedSpy.count(), 1); - QCOMPARE(collapsedSpy.count(), 1); + QCOMPARE(contentSpy.count(), 1); QCOMPARE(dummy.rowCount(), 3); dummy.setExpanded(false); QCOMPARE(dummy.rowCount(), 2); dummy.clear(); - QCOMPARE(expandedSpy.count(), 2); - QCOMPARE(collapsedSpy.count(), 2); + QCOMPARE(contentSpy.count(), 2); QCOMPARE(dummy.rowCount(), 1); } diff --git a/tests/system/suite_tools/tst_git_clone/test.py b/tests/system/suite_tools/tst_git_clone/test.py index 6421456e60..6da11764ea 100644 --- a/tests/system/suite_tools/tst_git_clone/test.py +++ b/tests/system/suite_tools/tst_git_clone/test.py @@ -65,10 +65,11 @@ def verifyVersionControlView(targetDir, canceled): vcsLog = str(waitForObject("{type='Core::OutputWindow' unnamed='1' visible='1' " "window=':Qt Creator_Core::Internal::MainWindow'}").plainText) test.log("Clone log is: %s" % vcsLog) - test.verify("Running in " + targetDir + ":" in vcsLog, - "Searching for target directory in clone log") - test.verify(" ".join(["clone", "--progress", cloneUrl, cloneDir]) in vcsLog, - "Searching for git parameters in clone log") + if not JIRA.isBugStillOpen(20813): + test.verify("Running in " + targetDir + ":" in vcsLog, + "Searching for target directory in clone log") + test.verify(" ".join(["clone", "--progress", cloneUrl, cloneDir]) in vcsLog, + "Searching for git parameters in clone log") test.verify(canceled == (" terminated abnormally" in vcsLog), "Searching for result in clone log") clickButton(waitForObject(":*Qt Creator.Clear_QToolButton")) diff --git a/tests/unit/mockup/projectexplorer/abi.h b/tests/unit/mockup/projectexplorer/abi.h new file mode 100644 index 0000000000..25baca234a --- /dev/null +++ b/tests/unit/mockup/projectexplorer/abi.h @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +namespace ProjectExplorer { +class Abi +{ +public: + enum OSFlavor { + // BSDs + FreeBsdFlavor, + NetBsdFlavor, + OpenBsdFlavor, + + // Linux + AndroidLinuxFlavor, + + // Unix + SolarisUnixFlavor, + + // Windows + WindowsMsvc2005Flavor, + WindowsMsvc2008Flavor, + WindowsMsvc2010Flavor, + WindowsMsvc2012Flavor, + WindowsMsvc2013Flavor, + WindowsMsvc2015Flavor, + WindowsMsvc2017Flavor, + WindowsMSysFlavor, + WindowsCEFlavor, + + // Embedded + VxWorksFlavor, + + // Generic: + RtosFlavor, + GenericFlavor, + + UnknownFlavor // keep last in this enum! + }; + + OSFlavor osFlavor() const { return UnknownFlavor; } + unsigned char wordWidth() const { return 64; } +}; +} diff --git a/tests/unit/mockup/projectexplorer/project.h b/tests/unit/mockup/projectexplorer/project.h index ea040fbc49..78b4211dca 100644 --- a/tests/unit/mockup/projectexplorer/project.h +++ b/tests/unit/mockup/projectexplorer/project.h @@ -36,6 +36,10 @@ public: Utils::FileName projectDirectory() const { return Utils::FileName(); } + + Utils::FileName rootProjectDirectory() const { + return Utils::FileName(); + } }; } diff --git a/tests/unit/unittest/clangcodemodelserver-test.cpp b/tests/unit/unittest/clangcodemodelserver-test.cpp index bde56e2160..9a1cc8c7b4 100644 --- a/tests/unit/unittest/clangcodemodelserver-test.cpp +++ b/tests/unit/unittest/clangcodemodelserver-test.cpp @@ -603,7 +603,7 @@ void ClangCodeModelServer::expectCompletionFromFileAUnsavedMethodVersion1() { const CodeCompletion completion(Utf8StringLiteral("Method2"), 34, - CodeCompletion::FunctionCompletionKind); + CodeCompletion::FunctionDefinitionCompletionKind); expectCompletion(completion); } @@ -612,7 +612,7 @@ void ClangCodeModelServer::expectCompletionFromFileAUnsavedMethodVersion2() { const CodeCompletion completion(Utf8StringLiteral("Method3"), 34, - CodeCompletion::FunctionCompletionKind); + CodeCompletion::FunctionDefinitionCompletionKind); expectCompletion(completion); } diff --git a/tests/unit/unittest/clientserverinprocess-test.cpp b/tests/unit/unittest/clientserverinprocess-test.cpp index 68dd598e59..4e201fdcee 100644 --- a/tests/unit/unittest/clientserverinprocess-test.cpp +++ b/tests/unit/unittest/clientserverinprocess-test.cpp @@ -176,9 +176,7 @@ TEST_F(ClientServerInProcess, SendRequestAnnotationsMessage) TEST_F(ClientServerInProcess, SendCompletionsMessage) { ClangBackEnd::CodeCompletions codeCompletions({Utf8StringLiteral("newFunction()")}); - ClangBackEnd::CompletionsMessage message(codeCompletions, - ClangBackEnd::CompletionCorrection::NoCorrection, - 1); + ClangBackEnd::CompletionsMessage message(codeCompletions, 1); EXPECT_CALL(mockClangCodeModelClient, completions(message)) .Times(1); diff --git a/tests/unit/unittest/codecompleter-test.cpp b/tests/unit/unittest/codecompleter-test.cpp index c55a9a0514..ed07ecdc04 100644 --- a/tests/unit/unittest/codecompleter-test.cpp +++ b/tests/unit/unittest/codecompleter-test.cpp @@ -67,6 +67,11 @@ MATCHER_P2(IsCodeCompletion, text, completionKind, return true; } +MATCHER(HasFixIts, "") +{ + return !arg.requiredFixIts.empty(); +} + class CodeCompleter : public ::testing::Test { protected: @@ -372,8 +377,7 @@ TEST_F(CodeCompleterSlowTest, ArrowCompletion) ASSERT_THAT(completions, Contains(IsCodeCompletion(Utf8StringLiteral("member"), CodeCompletion::VariableCompletionKind))); - ASSERT_THAT(myCompleter.neededCorrection(), - ClangBackEnd::CompletionCorrection::NoCorrection); + ASSERT_THAT(completions, Not(Contains(HasFixIts()))); } TEST_F(CodeCompleterSlowTest, DotToArrowCompletionForPointer) @@ -385,8 +389,7 @@ TEST_F(CodeCompleterSlowTest, DotToArrowCompletionForPointer) ASSERT_THAT(completions, Contains(IsCodeCompletion(Utf8StringLiteral("member"), CodeCompletion::VariableCompletionKind))); - ASSERT_THAT(myCompleter.neededCorrection(), - ClangBackEnd::CompletionCorrection::DotToArrowCorrection); + ASSERT_THAT(completions, Contains(HasFixIts())); } TEST_F(CodeCompleterSlowTest, DotToArrowCompletionForPointerInOutdatedDocument) @@ -406,8 +409,7 @@ TEST_F(CodeCompleterSlowTest, DotToArrowCompletionForPointerInOutdatedDocument) ASSERT_THAT(completions, Contains(IsCodeCompletion(Utf8StringLiteral("member"), CodeCompletion::VariableCompletionKind))); - ASSERT_THAT(myCompleter.neededCorrection(), - ClangBackEnd::CompletionCorrection::DotToArrowCorrection); + ASSERT_THAT(completions, Contains(HasFixIts())); } TEST_F(CodeCompleterSlowTest, NoDotToArrowCompletionForObject) @@ -419,7 +421,7 @@ TEST_F(CodeCompleterSlowTest, NoDotToArrowCompletionForObject) ASSERT_THAT(completions, Contains(IsCodeCompletion(Utf8StringLiteral("member"), CodeCompletion::VariableCompletionKind))); - ASSERT_THAT(myCompleter.neededCorrection(), ClangBackEnd::CompletionCorrection::NoCorrection); + ASSERT_THAT(completions, Not(Contains(HasFixIts()))); } TEST_F(CodeCompleterSlowTest, NoDotToArrowCompletionForFloat) @@ -429,7 +431,6 @@ TEST_F(CodeCompleterSlowTest, NoDotToArrowCompletionForFloat) const ClangBackEnd::CodeCompletions completions = myCompleter.complete(3, 18); ASSERT_TRUE(completions.isEmpty()); - ASSERT_THAT(myCompleter.neededCorrection(), ClangBackEnd::CompletionCorrection::NoCorrection); } TEST_F(CodeCompleterSlowTest, NoDotArrowCorrectionForObjectWithArrowOperator) @@ -441,7 +442,7 @@ TEST_F(CodeCompleterSlowTest, NoDotArrowCorrectionForObjectWithArrowOperator) ASSERT_THAT(completions, Contains(IsCodeCompletion(Utf8StringLiteral("member"), CodeCompletion::VariableCompletionKind))); - ASSERT_THAT(myCompleter.neededCorrection(), ClangBackEnd::CompletionCorrection::NoCorrection); + ASSERT_THAT(completions, Not(Contains(HasFixIts()))); } TEST_F(CodeCompleterSlowTest, NoDotArrowCorrectionForDotDot) @@ -451,7 +452,6 @@ TEST_F(CodeCompleterSlowTest, NoDotArrowCorrectionForDotDot) const ClangBackEnd::CodeCompletions completions = myCompleter.complete(5, 10); ASSERT_TRUE(completions.isEmpty()); - ASSERT_THAT(myCompleter.neededCorrection(), ClangBackEnd::CompletionCorrection::NoCorrection); } TEST_F(CodeCompleterSlowTest, NoDotArrowCorrectionForArrowDot) @@ -461,7 +461,6 @@ TEST_F(CodeCompleterSlowTest, NoDotArrowCorrectionForArrowDot) const ClangBackEnd::CodeCompletions completions = myCompleter.complete(5, 11); ASSERT_TRUE(completions.isEmpty()); - ASSERT_THAT(myCompleter.neededCorrection(), ClangBackEnd::CompletionCorrection::NoCorrection); } TEST_F(CodeCompleterSlowTest, NoDotArrowCorrectionForOnlyDot) @@ -471,7 +470,6 @@ TEST_F(CodeCompleterSlowTest, NoDotArrowCorrectionForOnlyDot) const ClangBackEnd::CodeCompletions completions = myCompleter.complete(5, 6); ASSERT_TRUE(completions.isEmpty()); - ASSERT_THAT(myCompleter.neededCorrection(), ClangBackEnd::CompletionCorrection::NoCorrection); } TEST_F(CodeCompleterSlowTest, GlobalCompletionForSpaceAfterOnlyDot) @@ -489,16 +487,7 @@ TEST_F(CodeCompleterSlowTest, NoDotArrowCorrectionForColonColon) auto myCompleter = setupCompleter(noDotArrowCorrectionForColonColonFileContainer); const ClangBackEnd::CodeCompletions completions = myCompleter.complete(1, 7); - ASSERT_THAT(myCompleter.neededCorrection(), ClangBackEnd::CompletionCorrection::NoCorrection); -} - -TEST_F(CodeCompleterSlowTest, DotArrowCorrectionForForwardDeclaredClassPointer) -{ - auto myCompleter = setupCompleter(dotArrowCorrectionForForwardDeclaredClassPointer); - const ClangBackEnd::CodeCompletions completions = myCompleter.complete(5, 9); - - ASSERT_TRUE(completions.isEmpty()); - ASSERT_THAT(myCompleter.neededCorrection(), ClangBackEnd::CompletionCorrection::DotToArrowCorrection); + ASSERT_THAT(completions, Not(Contains(HasFixIts()))); } TEST_F(CodeCompleterSlowTest, NoGlobalCompletionAfterForwardDeclaredClassPointer) @@ -507,7 +496,6 @@ TEST_F(CodeCompleterSlowTest, NoGlobalCompletionAfterForwardDeclaredClassPointer const ClangBackEnd::CodeCompletions completions = myCompleter.complete(5, 10); ASSERT_TRUE(completions.isEmpty()); - ASSERT_THAT(myCompleter.neededCorrection(), ClangBackEnd::CompletionCorrection::NoCorrection); } TEST_F(CodeCompleterSlowTest, GlobalCompletionAfterForwardDeclaredClassPointer) @@ -516,7 +504,6 @@ TEST_F(CodeCompleterSlowTest, GlobalCompletionAfterForwardDeclaredClassPointer) const ClangBackEnd::CodeCompletions completions = myCompleter.complete(6, 4); ASSERT_TRUE(!completions.isEmpty()); - ASSERT_THAT(myCompleter.neededCorrection(), ClangBackEnd::CompletionCorrection::NoCorrection); } ClangBackEnd::CodeCompleter CodeCompleter::setupCompleter( diff --git a/tests/unit/unittest/codecompletionsextractor-test.cpp b/tests/unit/unittest/codecompletionsextractor-test.cpp index 553392700f..0facfadecb 100644 --- a/tests/unit/unittest/codecompletionsextractor-test.cpp +++ b/tests/unit/unittest/codecompletionsextractor-test.cpp @@ -169,7 +169,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, Function) { ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + functionDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("Function"), CodeCompletion::FunctionCompletionKind, @@ -180,7 +182,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, TemplateFunction) { ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + functionDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("TemplateFunction"), CodeCompletion::TemplateFunctionCompletionKind, @@ -191,7 +195,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, Variable) { ClangCodeCompleteResults completeResults(getResults(variableDocument, 4)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + variableDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("Var"), CodeCompletion::VariableCompletionKind, @@ -202,7 +208,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, NonTypeTemplateParameter) { ClangCodeCompleteResults completeResults(getResults(variableDocument, 25, 19)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + variableDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("NonTypeTemplateParameter"), CodeCompletion::VariableCompletionKind, @@ -214,7 +222,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, VariableReference) { ClangCodeCompleteResults completeResults(getResults(variableDocument, 12)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + variableDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("Var"), CodeCompletion::VariableCompletionKind, @@ -225,7 +235,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, Parameter) { ClangCodeCompleteResults completeResults(getResults(variableDocument, 4)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + variableDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("Parameter"), CodeCompletion::VariableCompletionKind, @@ -236,7 +248,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, Field) { ClangCodeCompleteResults completeResults(getResults(variableDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + variableDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("Field"), CodeCompletion::VariableCompletionKind, @@ -247,7 +261,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, Class) { ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + classDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("Class"), CodeCompletion::ClassCompletionKind, @@ -258,7 +274,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, Struct) { ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + classDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("Struct"), CodeCompletion::ClassCompletionKind, @@ -269,7 +287,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, Union) { ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + classDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("Union"), CodeCompletion::ClassCompletionKind, @@ -280,7 +300,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, Typedef) { ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + classDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("TypeDef"), CodeCompletion::TypeAliasCompletionKind, @@ -291,7 +313,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, UsingAsTypeAlias) { ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + classDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("UsingClass"), CodeCompletion::TypeAliasCompletionKind, @@ -302,7 +326,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, TemplateTypeParameter) { ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + classDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("TemplateTypeParameter"), CodeCompletion::ClassCompletionKind, @@ -313,7 +339,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, TemplateClass) { ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + classDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("TemplateClass"), CodeCompletion::TemplateClassCompletionKind, @@ -324,7 +352,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, TemplateTemplateParameter) { ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + classDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("TemplateTemplateParameter"), CodeCompletion::TemplateClassCompletionKind, @@ -335,7 +365,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, ClassTemplatePartialSpecialization) { ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + classDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("ClassTemplatePartialSpecialization"), CodeCompletion::TemplateClassCompletionKind, @@ -346,7 +378,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, Namespace) { ClangCodeCompleteResults completeResults(getResults(namespaceDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + namespaceDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("Namespace"), CodeCompletion::NamespaceCompletionKind, @@ -357,7 +391,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, NamespaceAlias) { ClangCodeCompleteResults completeResults(getResults(namespaceDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + namespaceDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("NamespaceAlias"), CodeCompletion::NamespaceCompletionKind, @@ -368,7 +404,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, Enumeration) { ClangCodeCompleteResults completeResults(getResults(enumerationDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + enumerationDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("Enumeration"), CodeCompletion::EnumerationCompletionKind, @@ -379,7 +417,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, Enumerator) { ClangCodeCompleteResults completeResults(getResults(enumerationDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + enumerationDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("Enumerator"), CodeCompletion::EnumeratorCompletionKind, @@ -390,7 +430,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, Constructor) { ClangCodeCompleteResults completeResults(getResults(constructorDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + constructorDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("Constructor"), CodeCompletion::ConstructorCompletionKind, @@ -401,7 +443,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, Destructor) { ClangCodeCompleteResults completeResults(getResults(constructorDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + constructorDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("~Constructor"), CodeCompletion::DestructorCompletionKind, @@ -412,10 +456,12 @@ TEST_F(CodeCompletionsExtractorSlowTest, Method) { ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + functionDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("Method"), - CodeCompletion::FunctionCompletionKind, + CodeCompletion::FunctionDefinitionCompletionKind, CodeCompletion::Available)); ASSERT_FALSE(extractor.currentCodeCompletion().hasParameters); } @@ -424,10 +470,12 @@ TEST_F(CodeCompletionsExtractorSlowTest, MethodWithParameters) { ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + functionDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("MethodWithParameters"), - CodeCompletion::FunctionCompletionKind, + CodeCompletion::FunctionDefinitionCompletionKind, CodeCompletion::Available)); ASSERT_TRUE(extractor.currentCodeCompletion().hasParameters); } @@ -436,7 +484,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, Slot) { ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + functionDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("Slot"), CodeCompletion::SlotCompletionKind, @@ -447,7 +497,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, Signal) { ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + functionDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("Signal"), CodeCompletion::SignalCompletionKind, @@ -458,7 +510,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, MacroDefinition) { ClangCodeCompleteResults completeResults(getResults(variableDocument, 35)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + variableDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("MacroDefinition"), CodeCompletion::PreProcessorCompletionKind, @@ -469,7 +523,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, FunctionMacro) { ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + functionDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("FunctionMacro"), CodeCompletion::FunctionCompletionKind, @@ -480,7 +536,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, IntKeyword) { ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + functionDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("int"), CodeCompletion::KeywordCompletionKind, @@ -491,7 +549,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, SwitchKeyword) { ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + functionDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("switch"), CodeCompletion::KeywordCompletionKind, @@ -502,7 +562,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, ClassKeyword) { ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + functionDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("class"), CodeCompletion::KeywordCompletionKind, @@ -513,10 +575,12 @@ TEST_F(CodeCompletionsExtractorSlowTest, DeprecatedFunction) { ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + functionDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("DeprecatedFunction"), - CodeCompletion::FunctionCompletionKind, + CodeCompletion::FunctionDefinitionCompletionKind, CodeCompletion::Deprecated)); } @@ -524,10 +588,12 @@ TEST_F(CodeCompletionsExtractorSlowTest, NotAccessibleFunction) { ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + functionDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("NotAccessibleFunction"), - CodeCompletion::FunctionCompletionKind, + CodeCompletion::FunctionDefinitionCompletionKind, CodeCompletion::NotAccessible)); } @@ -535,10 +601,12 @@ TEST_F(CodeCompletionsExtractorSlowTest, NotAvailableFunction) { ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + functionDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("NotAvailableFunction"), - CodeCompletion::FunctionCompletionKind, + CodeCompletion::FunctionDefinitionCompletionKind, CodeCompletion::NotAvailable)); } @@ -549,10 +617,12 @@ TEST_F(CodeCompletionsExtractorSlowTest, UnsavedFile) TESTDATA_DIR"/complete_extractor_function_unsaved.cpp")}); ClangCodeCompleteResults completeResults(getResults(document, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + document.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("Method2"), - CodeCompletion::FunctionCompletionKind, + CodeCompletion::FunctionDefinitionCompletionKind, CodeCompletion::Available)); } @@ -566,10 +636,12 @@ TEST_F(CodeCompletionsExtractorSlowTest, ChangeUnsavedFile) TESTDATA_DIR"/complete_extractor_function_unsaved_2.cpp")}); completeResults = getResults(document, 20); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + document.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("Method3"), - CodeCompletion::FunctionCompletionKind, + CodeCompletion::FunctionDefinitionCompletionKind, CodeCompletion::Available)); } @@ -578,7 +650,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, ArgumentDefinition) project.setArguments({Utf8StringLiteral("-DArgumentDefinition"), Utf8StringLiteral("-std=gnu++14")}); ClangCodeCompleteResults completeResults(getResults(variableDocument, 35)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + variableDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("ArgumentDefinitionVariable"), CodeCompletion::VariableCompletionKind, @@ -590,7 +664,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, NoArgumentDefinition) project.setArguments({Utf8StringLiteral("-std=gnu++14")}); ClangCodeCompleteResults completeResults(getResults(variableDocument, 35)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + variableDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, Not(HasCompletion(Utf8StringLiteral("ArgumentDefinitionVariable"), CodeCompletion::VariableCompletionKind, @@ -601,7 +677,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, CompletionChunksFunction) { ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + functionDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletionChunks(Utf8StringLiteral("Function"), CodeCompletionChunks({{CodeCompletionChunk::ResultType, Utf8StringLiteral("void")}, @@ -614,7 +692,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, CompletionChunksFunctionWithOptionalChu { ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + functionDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletionChunks(Utf8StringLiteral("FunctionWithOptional"), CodeCompletionChunks({{CodeCompletionChunk::ResultType, Utf8StringLiteral("void")}, @@ -632,7 +712,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, CompletionChunksField) { ClangCodeCompleteResults completeResults(getResults(variableDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + variableDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletionChunks(Utf8StringLiteral("Field"), CodeCompletionChunks({{CodeCompletionChunk::ResultType, Utf8StringLiteral("int")}, @@ -643,7 +725,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, CompletionChunksEnumerator) { ClangCodeCompleteResults completeResults(getResults(enumerationDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + enumerationDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletionChunks(Utf8StringLiteral("Enumerator"), CodeCompletionChunks({{CodeCompletionChunk::ResultType, Utf8StringLiteral("Enumeration")}, @@ -654,7 +738,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, CompletionChunksEnumeration) { ClangCodeCompleteResults completeResults(getResults(enumerationDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + enumerationDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletionChunks(Utf8StringLiteral("Enumeration"), CodeCompletionChunks({{CodeCompletionChunk::TypedText, Utf8StringLiteral("Enumeration")}}))); @@ -664,7 +750,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, CompletionChunksClass) { ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + classDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletionChunks(Utf8StringLiteral("Class"), CodeCompletionChunks({{CodeCompletionChunk::TypedText, Utf8StringLiteral("Class")}}))); @@ -675,7 +763,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, BriefComment) ClangCodeCompleteResults completeResults(getResults(briefCommentDocument, 10, 1, /*needsReparse=*/ true)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + briefCommentDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasBriefComment(Utf8StringLiteral("BriefComment"), Utf8StringLiteral("A brief comment"))); } @@ -684,7 +774,9 @@ TEST_F(CodeCompletionsExtractorSlowTest, OverloadCandidate) { ClangCodeCompleteResults completeResults(getResults(functionOverloadDocument, 8, 13)); - ::CodeCompletionsExtractor extractor(completeResults.data()); + ::CodeCompletionsExtractor extractor( + functionOverloadDocument.translationUnit().cxTranslationUnit(), + completeResults.data()); ASSERT_THAT(extractor, HasCompletionChunks(Utf8String(), CodeCompletionChunks({ diff --git a/tests/unit/unittest/data/symbolindexing_main1.cpp b/tests/unit/unittest/data/symbolindexing_main1.cpp index 58df77916a..f0d60a5842 100644 --- a/tests/unit/unittest/data/symbolindexing_main1.cpp +++ b/tests/unit/unittest/data/symbolindexing_main1.cpp @@ -34,3 +34,8 @@ void f() void f(int); void f(double); + +void f2() +{ + function(); +} diff --git a/tests/unit/unittest/generatedfiles-test.cpp b/tests/unit/unittest/generatedfiles-test.cpp new file mode 100644 index 0000000000..a042f1679c --- /dev/null +++ b/tests/unit/unittest/generatedfiles-test.cpp @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "googletest.h" + +#include <generatedfiles.h> + +namespace { + +using ClangBackEnd::V2::FileContainer; +using ClangBackEnd::V2::FileContainers; + +class GeneratedFiles : public testing::Test +{ +protected: + FileContainer file1{"/file1", "content1"}; + FileContainer file1b{"/file1", "content1b"}; + FileContainer file2{"/file2", "content2"}; + FileContainer file2b{"/file2", "content2b"}; + FileContainer file3{"/file3", "content3"}; + FileContainer file4{"/file4", "content4"}; + ClangBackEnd::GeneratedFiles generatedFiles; +}; + +TEST_F(GeneratedFiles, AddGeneratedFiles) +{ + generatedFiles.update({file1, file2}); + + ASSERT_THAT(generatedFiles.fileContainers(), ElementsAre(file1, file2)); +} + +TEST_F(GeneratedFiles, UpdateGeneratedFiles) +{ + generatedFiles.update({{file1, file3}}); + + generatedFiles.update({file1b, file2b, file4}); + + ASSERT_THAT(generatedFiles.fileContainers(), ElementsAre(file1b, file2b, file3, file4)); +} + +TEST_F(GeneratedFiles, RemoveGeneratedFiles) +{ + generatedFiles.update({file1, file2, file3, file4}); + + generatedFiles.remove({"/file2", "/file4"}); + + ASSERT_THAT(generatedFiles.fileContainers(), ElementsAre(file1, file3)); +} + +} diff --git a/tests/unit/unittest/gtest-creator-printing.cpp b/tests/unit/unittest/gtest-creator-printing.cpp index a3e5a8982b..28cbf6b788 100644 --- a/tests/unit/unittest/gtest-creator-printing.cpp +++ b/tests/unit/unittest/gtest-creator-printing.cpp @@ -143,6 +143,11 @@ std::ostream &operator<<(std::ostream &out, const LineColumn &lineColumn) return out << "(" << lineColumn.line << ", " << lineColumn.column << ")"; } +void PrintTo(Utils::SmallStringView text, ::std::ostream *os) +{ + *os << text; +} + void PrintTo(const Utils::SmallString &text, ::std::ostream *os) { *os << text; @@ -299,23 +304,10 @@ std::ostream &operator<<(std::ostream &os, const AliveMessage &/*message*/) return os << "()"; } -#define RETURN_TEXT_FOR_CASE(enumValue) case CompletionCorrection::enumValue: return #enumValue -static const char *completionCorrectionToText(CompletionCorrection correction) -{ - switch (correction) { - RETURN_TEXT_FOR_CASE(NoCorrection); - RETURN_TEXT_FOR_CASE(DotToArrowCorrection); - } - - return ""; -} -#undef RETURN_TEXT_FOR_CASE - std::ostream &operator<<(std::ostream &os, const CompletionsMessage &message) { os << "(" << message.codeCompletions << ", " - << completionCorrectionToText(message.neededCorrection) << ", " << message.ticketNumber << ")"; @@ -538,6 +530,8 @@ static const char *highlightingTypeToCStringLiteral(HighlightingType type) RETURN_TEXT_FOR_CASE(ObjectiveCImplementation); RETURN_TEXT_FOR_CASE(ObjectiveCProperty); RETURN_TEXT_FOR_CASE(ObjectiveCMethod); + RETURN_TEXT_FOR_CASE(TemplateTypeParameter); + RETURN_TEXT_FOR_CASE(TemplateTemplateParameter); } return ""; @@ -992,6 +986,16 @@ std::ostream &operator<<(std::ostream &out, SymbolTags symbolTags) return out; } +std::ostream &operator<<(std::ostream &out, const UpdateGeneratedFilesMessage &message) +{ + return out << "(" << message.generatedFiles << ")"; +} + +std::ostream &operator<<(std::ostream &out, const RemoveGeneratedFilesMessage &message) +{ + return out << "(" << message.generatedFiles << ")"; +} + void PrintTo(const FilePath &filePath, ::std::ostream *os) { *os << filePath; @@ -1031,6 +1035,7 @@ std::ostream &operator<<(std::ostream &out, const ProjectPartContainer &containe << container.projectPartId << ", " << container.arguments << ", " << container.headerPathIds << ", " + << container.sourcePathIds << ", " << container.compilerMacros << ", " << container.includeSearchPaths << ")"; diff --git a/tests/unit/unittest/gtest-creator-printing.h b/tests/unit/unittest/gtest-creator-printing.h index a7c200daad..91c1e7fd37 100644 --- a/tests/unit/unittest/gtest-creator-printing.h +++ b/tests/unit/unittest/gtest-creator-printing.h @@ -67,6 +67,7 @@ std::ostream &operator<<(std::ostream &out, const Macro ¯o); namespace Utils { class LineColumn; +class SmallStringView; std::ostream &operator<<(std::ostream &out, const LineColumn &lineColumn); @@ -85,6 +86,7 @@ void PrintTo(const Utils::optional<Type> &optional, ::std::ostream *os) *os << optional; } +void PrintTo(Utils::SmallStringView text, ::std::ostream *os); void PrintTo(const Utils::SmallString &text, ::std::ostream *os); void PrintTo(const Utils::PathString &text, ::std::ostream *os); @@ -165,6 +167,8 @@ class SymbolEntry; enum class SymbolKind : uchar; enum class SymbolTag : uchar; using SymbolTags = Utils::SizedArray<SymbolTag, 7>; +class UpdateGeneratedFilesMessage; +class RemoveGeneratedFilesMessage; std::ostream &operator<<(std::ostream &out, const SourceLocationEntry &entry); std::ostream &operator<<(std::ostream &out, const IdPaths &idPaths); @@ -242,6 +246,8 @@ std::ostream &operator<<(std::ostream &out, const SymbolEntry &symbolEntry); std::ostream &operator<<(std::ostream &out, SymbolKind symbolKind); std::ostream &operator<<(std::ostream &out, SymbolTag symbolTag); std::ostream &operator<<(std::ostream &out, SymbolTags symbolTags); +std::ostream &operator<<(std::ostream &out, const UpdateGeneratedFilesMessage &message); +std::ostream &operator<<(std::ostream &out, const RemoveGeneratedFilesMessage &message); void PrintTo(const FilePath &filePath, ::std::ostream *os); void PrintTo(const FilePathView &filePathView, ::std::ostream *os); diff --git a/tests/unit/unittest/mockpchmanagerserver.h b/tests/unit/unittest/mockpchmanagerserver.h index 766abd95ab..906903efd0 100644 --- a/tests/unit/unittest/mockpchmanagerserver.h +++ b/tests/unit/unittest/mockpchmanagerserver.h @@ -38,6 +38,10 @@ public: void (const ClangBackEnd::UpdateProjectPartsMessage&)); MOCK_METHOD1(removeProjectParts, void (const ClangBackEnd::RemoveProjectPartsMessage&)); + MOCK_METHOD1(updateGeneratedFiles, + void (const ClangBackEnd::UpdateGeneratedFilesMessage&)); + MOCK_METHOD1(removeGeneratedFiles, + void (const ClangBackEnd::RemoveGeneratedFilesMessage&)); void updateProjectParts(ClangBackEnd::UpdateProjectPartsMessage &&message) override { @@ -48,4 +52,14 @@ public: { removeProjectParts(message); } + + void updateGeneratedFiles(ClangBackEnd::UpdateGeneratedFilesMessage &&message) override + { + updateGeneratedFiles(message); + } + + void removeGeneratedFiles(ClangBackEnd::RemoveGeneratedFilesMessage &&message) override + { + removeGeneratedFiles(message); + } }; diff --git a/tests/unit/unittest/mockrefactoringserver.h b/tests/unit/unittest/mockrefactoringserver.h index 091807e203..9de1a18e2b 100644 --- a/tests/unit/unittest/mockrefactoringserver.h +++ b/tests/unit/unittest/mockrefactoringserver.h @@ -47,9 +47,15 @@ public: MOCK_METHOD1(updateProjectParts, void (const ClangBackEnd::UpdateProjectPartsMessage&)); + MOCK_METHOD1(updateGeneratedFiles, + void (const ClangBackEnd::UpdateGeneratedFilesMessage&)); + MOCK_METHOD1(removeProjectParts, void (const ClangBackEnd::RemoveProjectPartsMessage&)); + MOCK_METHOD1(removeGeneratedFiles, + void (const ClangBackEnd::RemoveGeneratedFilesMessage&)); + MOCK_METHOD0(cancel, void()); @@ -73,8 +79,18 @@ public: updateProjectParts(message); } + void updateGeneratedFiles(ClangBackEnd::UpdateGeneratedFilesMessage &&message) override + { + updateGeneratedFiles(message); + } + void removeProjectParts(ClangBackEnd::RemoveProjectPartsMessage &&message) override { removeProjectParts(message); } + + void removeGeneratedFiles(ClangBackEnd::RemoveGeneratedFilesMessage &&message) override + { + removeGeneratedFiles(message); + } }; diff --git a/tests/unit/unittest/mocksymbolindexing.h b/tests/unit/unittest/mocksymbolindexing.h index 8a42ebfbc9..967a5f6aab 100644 --- a/tests/unit/unittest/mocksymbolindexing.h +++ b/tests/unit/unittest/mocksymbolindexing.h @@ -37,7 +37,7 @@ public: const ClangBackEnd::V2::FileContainers &generatedFiles)); void updateProjectParts(ClangBackEnd::V2::ProjectPartContainers &&projectParts, - ClangBackEnd::V2::FileContainers &&generatedFiles) override + const ClangBackEnd::V2::FileContainers &generatedFiles) override { updateProjectParts(projectParts, generatedFiles); } diff --git a/tests/unit/unittest/pchmanagerclient-test.cpp b/tests/unit/unittest/pchmanagerclient-test.cpp index 9e40a21249..8c13055c5e 100644 --- a/tests/unit/unittest/pchmanagerclient-test.cpp +++ b/tests/unit/unittest/pchmanagerclient-test.cpp @@ -35,7 +35,9 @@ #include <filepathcaching.h> #include <refactoringdatabaseinitializer.h> #include <precompiledheadersupdatedmessage.h> +#include <removegeneratedfilesmessage.h> #include <removeprojectpartsmessage.h> +#include <updategeneratedfilesmessage.h> #include <updateprojectpartsmessage.h> namespace { @@ -167,7 +169,6 @@ TEST_F(PchManagerClient, ProjectPartPchRemovedFromDatabase) { EXPECT_CALL(mockPrecompiledHeaderStorage, deletePrecompiledHeader(TypedEq<Utils::SmallStringView>(projectPartId))); - projectUpdater.removeProjectParts({QString(projectPartId)}); } diff --git a/tests/unit/unittest/pchmanagerclientserverinprocess-test.cpp b/tests/unit/unittest/pchmanagerclientserverinprocess-test.cpp index f37fe2ae5e..248e9abf63 100644 --- a/tests/unit/unittest/pchmanagerclientserverinprocess-test.cpp +++ b/tests/unit/unittest/pchmanagerclientserverinprocess-test.cpp @@ -32,7 +32,9 @@ #include <pchmanagerclientproxy.h> #include <pchmanagerserverproxy.h> #include <precompiledheadersupdatedmessage.h> +#include <removegeneratedfilesmessage.h> #include <removeprojectpartsmessage.h> +#include <updategeneratedfilesmessage.h> #include <updateprojectpartsmessage.h> #include <QBuffer> @@ -41,10 +43,12 @@ #include <vector> +using ClangBackEnd::UpdateGeneratedFilesMessage; using ClangBackEnd::UpdateProjectPartsMessage; +using ClangBackEnd::RemoveGeneratedFilesMessage; +using ClangBackEnd::RemoveProjectPartsMessage; using ClangBackEnd::V2::FileContainer; using ClangBackEnd::V2::ProjectPartContainer; -using ClangBackEnd::RemoveProjectPartsMessage; using ClangBackEnd::PrecompiledHeadersUpdatedMessage; using ::testing::Args; @@ -98,8 +102,7 @@ TEST_F(PchManagerClientServerInProcess, SendUpdateProjectPartsMessage) {"/includes"}, {{1, 1}}, {{1, 2}}}; - FileContainer fileContainer{{"/path/to/", "file"}, "content", {}}; - UpdateProjectPartsMessage message{{projectPart2}, {fileContainer}}; + UpdateProjectPartsMessage message{{projectPart2}}; EXPECT_CALL(mockPchManagerServer, updateProjectParts(message)); @@ -107,6 +110,17 @@ TEST_F(PchManagerClientServerInProcess, SendUpdateProjectPartsMessage) scheduleServerMessages(); } +TEST_F(PchManagerClientServerInProcess, SendUpdateGeneratedFilesMessage) +{ + FileContainer fileContainer{{"/path/to/", "file"}, "content", {}}; + UpdateGeneratedFilesMessage message{{fileContainer}}; + + EXPECT_CALL(mockPchManagerServer, updateGeneratedFiles(message)); + + serverProxy.updateGeneratedFiles(message.clone()); + scheduleServerMessages(); +} + TEST_F(PchManagerClientServerInProcess, SendRemoveProjectPartsMessage) { RemoveProjectPartsMessage message{{"projectPartId1", "projectPartId2"}}; @@ -117,6 +131,16 @@ TEST_F(PchManagerClientServerInProcess, SendRemoveProjectPartsMessage) scheduleServerMessages(); } +TEST_F(PchManagerClientServerInProcess, SendRemoveGeneratedFilesMessage) +{ + RemoveGeneratedFilesMessage message{{{"/path/to/", "file"}}}; + + EXPECT_CALL(mockPchManagerServer, removeGeneratedFiles(message)); + + serverProxy.removeGeneratedFiles(message.clone()); + scheduleServerMessages(); +} + TEST_F(PchManagerClientServerInProcess, SendPrecompiledHeaderUpdatedMessage) { PrecompiledHeadersUpdatedMessage message{{{"projectPartId", "/path/to/pch", 1}}}; diff --git a/tests/unit/unittest/pchmanagerserver-test.cpp b/tests/unit/unittest/pchmanagerserver-test.cpp index 995045d0ff..276aed07b2 100644 --- a/tests/unit/unittest/pchmanagerserver-test.cpp +++ b/tests/unit/unittest/pchmanagerserver-test.cpp @@ -35,6 +35,7 @@ #include <precompiledheadersupdatedmessage.h> #include <refactoringdatabaseinitializer.h> #include <removeprojectpartsmessage.h> +#include <updategeneratedfilesmessage.h> #include <updateprojectpartsmessage.h> namespace { @@ -82,14 +83,14 @@ protected: {id(main2Path)}}; std::vector<ProjectPartContainer> projectParts{projectPart1, projectPart2}; FileContainer generatedFile{{"/path/to/", "file"}, "content", {}}; - ClangBackEnd::UpdateProjectPartsMessage UpdateProjectPartsMessage{Utils::clone(projectParts), - {generatedFile}}; + ClangBackEnd::UpdateProjectPartsMessage updateProjectPartsMessage{Utils::clone(projectParts)}; + ClangBackEnd::UpdateGeneratedFilesMessage updateGeneratedFilesMessage{{generatedFile}}; ClangBackEnd::ProjectPartPch projectPartPch1{projectPart1.projectPartId.clone(), "/path1/to/pch", 1}; ClangBackEnd::ProjectPartPch projectPartPch2{projectPart2.projectPartId.clone(), "/path2/to/pch", 1}; std::vector<ClangBackEnd::ProjectPartPch> projectPartPchs{projectPartPch1, projectPartPch2}; ClangBackEnd::PrecompiledHeadersUpdatedMessage precompiledHeaderUpdatedMessage1{{projectPartPch1}}; ClangBackEnd::PrecompiledHeadersUpdatedMessage precompiledHeaderUpdatedMessage2{{projectPartPch2}}; - ClangBackEnd::RemoveProjectPartsMessage RemoveProjectPartsMessage{{projectPart1.projectPartId.clone(), + ClangBackEnd::RemoveProjectPartsMessage removeProjectPartsMessage{{projectPart1.projectPartId.clone(), projectPart2.projectPartId.clone()}}; }; @@ -109,41 +110,46 @@ TEST_F(PchManagerServer, DoNotCallPrecompiledHeadersForUnsuccessfullyFinishedTas } TEST_F(PchManagerServer, CallBuildInPchCreator) +{; + EXPECT_CALL(mockPchCreator, generatePchs(updateProjectPartsMessage.projectsParts)); + + server.updateProjectParts(updateProjectPartsMessage.clone()); +} + +TEST_F(PchManagerServer, CallSetGeneratedFiles) { - auto &&callSetGeneratedFiles = EXPECT_CALL(mockPchCreator, - setGeneratedFiles(UpdateProjectPartsMessage.generatedFiles)); - EXPECT_CALL(mockPchCreator, generatePchs(UpdateProjectPartsMessage.projectsParts)) - .After(callSetGeneratedFiles); + EXPECT_CALL(mockPchCreator, + setGeneratedFiles(updateGeneratedFilesMessage.generatedFiles)); - server.updateProjectParts(UpdateProjectPartsMessage.clone()); + server.updateGeneratedFiles(updateGeneratedFilesMessage.clone()); } TEST_F(PchManagerServer, UpdateIncludesOfFileWatcher) { EXPECT_CALL(mockClangPathWatcher, updateIdPaths(idPaths)); - server.updateProjectParts(UpdateProjectPartsMessage.clone()); + server.updateProjectParts(updateProjectPartsMessage.clone()); } TEST_F(PchManagerServer, GetChangedProjectPartsFromProjectParts) { EXPECT_CALL(mockProjectParts, update(_)); - server.updateProjectParts(UpdateProjectPartsMessage.clone()); + server.updateProjectParts(updateProjectPartsMessage.clone()); } TEST_F(PchManagerServer, RemoveIncludesFromFileWatcher) { - EXPECT_CALL(mockClangPathWatcher, removeIds(RemoveProjectPartsMessage.projectsPartIds)); + EXPECT_CALL(mockClangPathWatcher, removeIds(removeProjectPartsMessage.projectsPartIds)); - server.removeProjectParts(RemoveProjectPartsMessage.clone()); + server.removeProjectParts(removeProjectPartsMessage.clone()); } TEST_F(PchManagerServer, RemoveProjectPartsFromProjectParts) { - EXPECT_CALL(mockProjectParts, remove(RemoveProjectPartsMessage.projectsPartIds)); + EXPECT_CALL(mockProjectParts, remove(removeProjectPartsMessage.projectsPartIds)); - server.removeProjectParts(RemoveProjectPartsMessage.clone()); + server.removeProjectParts(removeProjectPartsMessage.clone()); } TEST_F(PchManagerServer, SetPathWatcherNotifier) @@ -155,7 +161,7 @@ TEST_F(PchManagerServer, SetPathWatcherNotifier) TEST_F(PchManagerServer, CallProjectsInProjectPartsForIncludeChange) { - server.updateProjectParts(UpdateProjectPartsMessage.clone()); + server.updateProjectParts(updateProjectPartsMessage.clone()); EXPECT_CALL(mockProjectParts, projects(ElementsAre(projectPart1.projectPartId))); @@ -164,7 +170,7 @@ TEST_F(PchManagerServer, CallProjectsInProjectPartsForIncludeChange) TEST_F(PchManagerServer, CallGeneratePchsInPchCreatorForIncludeChange) { - server.updateProjectParts(UpdateProjectPartsMessage.clone()); + server.updateProjectParts(updateProjectPartsMessage.clone()); EXPECT_CALL(mockPchCreator, generatePchs(ElementsAre(projectPart1))); @@ -173,7 +179,7 @@ TEST_F(PchManagerServer, CallGeneratePchsInPchCreatorForIncludeChange) TEST_F(PchManagerServer, CallUpdateIdPathsInFileSystemWatcherForIncludeChange) { - server.updateProjectParts(UpdateProjectPartsMessage.clone()); + server.updateProjectParts(updateProjectPartsMessage.clone()); EXPECT_CALL(mockClangPathWatcher, updateIdPaths(idPaths)); diff --git a/tests/unit/unittest/projectpartqueue-test.cpp b/tests/unit/unittest/projectpartqueue-test.cpp new file mode 100644 index 0000000000..f13d0f5578 --- /dev/null +++ b/tests/unit/unittest/projectpartqueue-test.cpp @@ -0,0 +1,104 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "googletest.h" + +#include <projectpartqueue.h> + +namespace { + +class ProjectPartQueue : public testing::Test +{ +protected: + ClangBackEnd::ProjectPartQueue queue; + ClangBackEnd::V2::ProjectPartContainer projectPart1{"ProjectPart1", + {"--yi"}, + {{"YI","1"}}, + {"/yi"}, + {{1, 1}}, + {{1, 2}}}; + ClangBackEnd::V2::ProjectPartContainer projectPart2{"ProjectPart2", + {"--er"}, + {{"ER","2"}}, + {"/bar"}, + {{2, 1}}, + {{2, 2}}}; + ClangBackEnd::V2::ProjectPartContainer projectPart2b{"ProjectPart2", + {"--liang"}, + {{"LIANG","3"}}, + {"/liang"}, + {{2, 3}}, + {{2, 2}, {2, 4}}}; + ClangBackEnd::V2::ProjectPartContainer projectPart3{"ProjectPart3", + {"--san"}, + {{"SAN","2"}}, + {"/SAN"}, + {{3, 1}}, + {{3, 2}}}; + ClangBackEnd::V2::ProjectPartContainer projectPartMerged{"ProjectPart2", + {"--liang"}, + {{"LIANG","3"}}, + {"/liang"}, + {{2, 1}, {2, 3}}, + {{2, 2}, {2, 4}}}; +}; + +TEST_F(ProjectPartQueue, AddProjectPart) +{ + queue.addProjectParts({projectPart1}); + + queue.addProjectParts({projectPart2}); + + ASSERT_THAT(queue.projectParts(), ElementsAre(projectPart1, projectPart2)); +} + +TEST_F(ProjectPartQueue, IgnoreIdenticalProjectPart) +{ + queue.addProjectParts({projectPart1, projectPart2}); + + queue.addProjectParts({projectPart1, projectPart2}); + + ASSERT_THAT(queue.projectParts(), ElementsAre(projectPart1, projectPart2)); +} + +TEST_F(ProjectPartQueue, MergeSameProjectPartWithSameId) +{ + queue.addProjectParts({projectPart1, projectPart2}); + + queue.addProjectParts({projectPart1, projectPart2b, projectPart3}); + + ASSERT_THAT(queue.projectParts(), ElementsAre(projectPart1, projectPartMerged, projectPart3)); +} + +TEST_F(ProjectPartQueue, RemoveProjectPart) +{ + queue.addProjectParts({projectPart1, projectPart2, projectPart3}); + + queue.removeProjectParts({projectPart2.projectPartId}); + + ASSERT_THAT(queue.projectParts(), ElementsAre(projectPart1, projectPart3)); +} + +} diff --git a/tests/unit/unittest/projectupdater-test.cpp b/tests/unit/unittest/projectupdater-test.cpp index a77dfc0b5b..0dd63c2558 100644 --- a/tests/unit/unittest/projectupdater-test.cpp +++ b/tests/unit/unittest/projectupdater-test.cpp @@ -37,7 +37,9 @@ #include <precompiledheaderstorage.h> #include <precompiledheadersupdatedmessage.h> #include <refactoringdatabaseinitializer.h> +#include <removegeneratedfilesmessage.h> #include <removeprojectpartsmessage.h> +#include <updategeneratedfilesmessage.h> #include <updateprojectpartsmessage.h> #include <cpptools/compileroptionsbuilder.h> @@ -81,11 +83,19 @@ protected: projectPart.files.push_back(source1ProjectFile); projectPart.files.push_back(source2ProjectFile); projectPart.displayName = QString(projectPartId); - projectPart.projectMacros.push_back({"DEFINE", "1"}); + projectPart.projectMacros = {{"FOO", "2"}, {"BAR", "1"}}; + projectPart2.files.push_back(header2ProjectFile); + projectPart2.files.push_back(header1ProjectFile); + projectPart2.files.push_back(source2ProjectFile); + projectPart2.files.push_back(source1ProjectFile); + projectPart2.displayName = QString(projectPartId2); + projectPart2.projectMacros = {{"BAR", "1"}, {"FOO", "2"}}; Utils::SmallStringVector arguments{ClangPchManager::ProjectUpdater::compilerArguments( &projectPart)}; + Utils::SmallStringVector arguments2{ClangPchManager::ProjectUpdater::compilerArguments( + &projectPart2)}; expectedContainer = {projectPartId.clone(), arguments.clone(), @@ -93,6 +103,12 @@ protected: {}, {filePathId(headerPaths[1])}, {filePathIds(sourcePaths)}}; + expectedContainer2 = {projectPartId2.clone(), + arguments2.clone(), + Utils::clone(compilerMacros), + {}, + {filePathId(headerPaths[1])}, + {filePathIds(sourcePaths)}}; } protected: @@ -108,25 +124,73 @@ protected: Utils::SmallString projectPartId2{"project2"}; Utils::PathStringVector headerPaths = {"/path/to/header1.h", "/path/to/header2.h"}; Utils::PathStringVector sourcePaths = {"/path/to/source1.cpp", "/path/to/source2.cpp"}; - ClangBackEnd::CompilerMacros compilerMacros = {{"DEFINE", "1"}}; + ClangBackEnd::CompilerMacros compilerMacros = {{"BAR", "1"}, {"FOO", "2"}}; CppTools::ProjectFile header1ProjectFile{QString(headerPaths[0]), CppTools::ProjectFile::CXXHeader}; CppTools::ProjectFile header2ProjectFile{QString(headerPaths[1]), CppTools::ProjectFile::CXXHeader}; CppTools::ProjectFile source1ProjectFile{QString(sourcePaths[0]), CppTools::ProjectFile::CXXSource}; CppTools::ProjectFile source2ProjectFile{QString(sourcePaths[1]), CppTools::ProjectFile::CXXSource}; CppTools::ProjectPart projectPart; + CppTools::ProjectPart projectPart2; ProjectPartContainer expectedContainer; + ProjectPartContainer expectedContainer2; FileContainer generatedFile{{"/path/to", "header1.h"}, "content", {}}; + FileContainer generatedFile2{{"/path/to2", "header1.h"}, "content", {}}; + FileContainer generatedFile3{{"/path/to", "header2.h"}, "content", {}}; }; TEST_F(ProjectUpdater, CallUpdateProjectParts) { - std::vector<CppTools::ProjectPart*> projectParts = {&projectPart, &projectPart}; - ClangBackEnd::UpdateProjectPartsMessage message{{expectedContainer.clone(), expectedContainer.clone()}, - {generatedFile}}; + std::vector<CppTools::ProjectPart*> projectParts = {&projectPart2, &projectPart}; + ClangBackEnd::UpdateProjectPartsMessage message{{expectedContainer.clone(), expectedContainer2.clone()}}; + updater.updateGeneratedFiles({generatedFile}); EXPECT_CALL(mockPchManagerServer, updateProjectParts(message)); - updater.updateProjectParts(projectParts, {generatedFile}); + updater.updateProjectParts(projectParts); +} + +TEST_F(ProjectUpdater, CallUpdateGeneratedFilesWithSortedEntries) +{ + ClangBackEnd::UpdateGeneratedFilesMessage message{{generatedFile, generatedFile3, generatedFile2}}; + + EXPECT_CALL(mockPchManagerServer, updateGeneratedFiles(message)); + + updater.updateGeneratedFiles({generatedFile2, generatedFile3, generatedFile}); +} + +TEST_F(ProjectUpdater, GeneratedFilesAddedAreSorted) +{ + updater.updateGeneratedFiles({generatedFile2, generatedFile3, generatedFile}); + + ASSERT_THAT(updater.generatedFiles().fileContainers(), + ElementsAre(generatedFile, generatedFile3, generatedFile2)); +} + +TEST_F(ProjectUpdater, GeneratedFilesAddedToExcludePaths) +{ + updater.updateGeneratedFiles({generatedFile2, generatedFile3, generatedFile}); + + ASSERT_THAT(updater.excludedPaths(), ElementsAre(generatedFile.filePath, + generatedFile3.filePath, + generatedFile2.filePath)); +} + +TEST_F(ProjectUpdater, CallRemoveGeneratedFiles) +{ + ClangBackEnd::RemoveGeneratedFilesMessage message{{{"/path/to/header1.h"}}}; + + EXPECT_CALL(mockPchManagerServer, removeGeneratedFiles(message)); + + updater.removeGeneratedFiles({{"/path/to/header1.h"}}); +} + +TEST_F(ProjectUpdater, GeneratedFilesRemovedFromExcludePaths) +{ + updater.updateGeneratedFiles({generatedFile}); + + updater.removeGeneratedFiles({generatedFile.filePath}); + + ASSERT_THAT(updater.excludedPaths(), IsEmpty()); } TEST_F(ProjectUpdater, CallRemoveProjectParts) @@ -142,6 +206,7 @@ TEST_F(ProjectUpdater, CallPrecompiledHeaderRemovedInPchManagerProjectUpdater) { ClangPchManager::PchManagerProjectUpdater pchUpdater{mockPchManagerServer, pchManagerClient, filePathCache}; ClangBackEnd::RemoveProjectPartsMessage message{{projectPartId, projectPartId2}}; + EXPECT_CALL(mockPrecompiledHeaderStorage, deletePrecompiledHeader(_)).Times(AnyNumber()); EXPECT_CALL(mockPchManagerNotifier, precompiledHeaderRemoved(projectPartId.toQString())); EXPECT_CALL(mockPchManagerNotifier, precompiledHeaderRemoved(projectPartId2.toQString())); @@ -165,29 +230,34 @@ TEST_F(ProjectUpdater, ConvertProjectPartToProjectPartContainersHaveSameSizeLike ASSERT_THAT(containers, SizeIs(2)); } -TEST_F(ProjectUpdater, CreateExcludedPaths) +TEST_F(ProjectUpdater, CreateSortedExcludedPaths) { - auto excludedPaths = updater.createExcludedPaths({generatedFile}); + auto excludedPaths = updater.createExcludedPaths({generatedFile2, generatedFile3, generatedFile}); - ASSERT_THAT(excludedPaths, ElementsAre("/path/to/header1.h")); + ASSERT_THAT(excludedPaths, ElementsAre(ClangBackEnd::FilePath{"/path/to/header1.h"}, + ClangBackEnd::FilePath{"/path/to/header2.h"}, + ClangBackEnd::FilePath{"/path/to2/header1.h"})); } -TEST_F(ProjectUpdater, CreateCompilerMacros) +TEST_F(ProjectUpdater, CreateSortedCompilerMacros) { - auto paths = updater.createCompilerMacros({{"DEFINE", "1"}}); + auto paths = updater.createCompilerMacros({{"DEFINE", "1"}, {"FOO", "2"}, {"BAR", "1"}}); - ASSERT_THAT(paths, ElementsAre(CompilerMacro{"DEFINE", "1"})); + ASSERT_THAT(paths, ElementsAre(CompilerMacro{"BAR", "1"}, + CompilerMacro{"FOO", "2"}, + CompilerMacro{"DEFINE", "1"})); } -TEST_F(ProjectUpdater, CreateIncludeSearchPaths) +TEST_F(ProjectUpdater, CreateSortedIncludeSearchPaths) { - ProjectPartHeaderPath includePath{"/to/path", ProjectPartHeaderPath::IncludePath}; + ProjectPartHeaderPath includePath{"/to/path1", ProjectPartHeaderPath::IncludePath}; + ProjectPartHeaderPath includePath2{"/to/path2", ProjectPartHeaderPath::IncludePath}; ProjectPartHeaderPath invalidPath; ProjectPartHeaderPath frameworkPath{"/framework/path", ProjectPartHeaderPath::FrameworkPath}; - auto paths = updater.createIncludeSearchPaths({includePath, invalidPath, frameworkPath}); + auto paths = updater.createIncludeSearchPaths({frameworkPath, includePath2, includePath, invalidPath}); - ASSERT_THAT(paths, ElementsAre(includePath.path, frameworkPath.path)); + ASSERT_THAT(paths, ElementsAre(includePath.path, includePath2.path, frameworkPath.path)); } } diff --git a/tests/unit/unittest/readandwritemessageblock-test.cpp b/tests/unit/unittest/readandwritemessageblock-test.cpp index bceeab7038..4a02631e13 100644 --- a/tests/unit/unittest/readandwritemessageblock-test.cpp +++ b/tests/unit/unittest/readandwritemessageblock-test.cpp @@ -214,9 +214,7 @@ TEST_F(ReadAndWriteMessageBlock, CompareCompletionsMessage) { ClangBackEnd::CodeCompletions codeCompletions({Utf8StringLiteral("newFunction()")}); - CompareMessage(ClangBackEnd::CompletionsMessage(codeCompletions, - ClangBackEnd::CompletionCorrection::NoCorrection, - 1)); + CompareMessage(ClangBackEnd::CompletionsMessage(codeCompletions, 1)); } TEST_F(ReadAndWriteMessageBlock, CompareAnnotationsMessage) @@ -299,9 +297,7 @@ TEST_F(ReadAndWriteMessageBlock, ReadMessageAfterInterruption) ClangBackEnd::MessageEnvelop ReadAndWriteMessageBlock::writeCompletionsMessage() { ClangBackEnd::CompletionsMessage message( - ClangBackEnd::CodeCompletions({Utf8StringLiteral("newFunction()")}), - ClangBackEnd::CompletionCorrection::NoCorrection, - 1); + ClangBackEnd::CodeCompletions({Utf8StringLiteral("newFunction()")}), 1); writeMessageBlock.write(message); diff --git a/tests/unit/unittest/refactoringclientserverinprocess-test.cpp b/tests/unit/unittest/refactoringclientserverinprocess-test.cpp index a5658ab178..278c33efa3 100644 --- a/tests/unit/unittest/refactoringclientserverinprocess-test.cpp +++ b/tests/unit/unittest/refactoringclientserverinprocess-test.cpp @@ -47,10 +47,12 @@ using ::testing::Args; using ::testing::Property; using ::testing::Eq; +using ClangBackEnd::RemoveGeneratedFilesMessage; +using ClangBackEnd::RemoveProjectPartsMessage; using ClangBackEnd::UpdateProjectPartsMessage; +using ClangBackEnd::UpdateGeneratedFilesMessage; using ClangBackEnd::V2::FileContainer; using ClangBackEnd::V2::ProjectPartContainer; -using ClangBackEnd::RemoveProjectPartsMessage; class RefactoringClientServerInProcess : public ::testing::Test { @@ -182,8 +184,7 @@ TEST_F(RefactoringClientServerInProcess, SendUpdateProjectPartsMessage) {"/includes"}, {{1, 1}}, {{1, 2}}}; - FileContainer fileContainer{{"/path/to/", "file"}, "content", {}}; - UpdateProjectPartsMessage message{{projectPart2}, {fileContainer}}; + UpdateProjectPartsMessage message{{projectPart2}}; EXPECT_CALL(mockRefactoringServer, updateProjectParts(message)); @@ -191,6 +192,17 @@ TEST_F(RefactoringClientServerInProcess, SendUpdateProjectPartsMessage) scheduleServerMessages(); } +TEST_F(RefactoringClientServerInProcess, SendUpdateGeneratedFilesMessage) +{ + FileContainer fileContainer{{"/path/to/", "file"}, "content", {}}; + UpdateGeneratedFilesMessage message{{fileContainer}}; + + EXPECT_CALL(mockRefactoringServer, updateGeneratedFiles(message)); + + serverProxy.updateGeneratedFiles(message.clone()); + scheduleServerMessages(); +} + TEST_F(RefactoringClientServerInProcess, SendRemoveProjectPartsMessage) { RemoveProjectPartsMessage message{{"projectPartId1", "projectPartId2"}}; @@ -201,6 +213,16 @@ TEST_F(RefactoringClientServerInProcess, SendRemoveProjectPartsMessage) scheduleServerMessages(); } +TEST_F(RefactoringClientServerInProcess, SendRemoveGeneratedFilesMessage) +{ + RemoveGeneratedFilesMessage message{{{"/path/to/", "file"}}}; + + EXPECT_CALL(mockRefactoringServer, removeGeneratedFiles(message)); + + serverProxy.removeGeneratedFiles(message.clone()); + scheduleServerMessages(); +} + TEST_F(RefactoringClientServerInProcess, CancelMessage) { EXPECT_CALL(mockRefactoringServer, cancel()); diff --git a/tests/unit/unittest/refactoringengine-test.cpp b/tests/unit/unittest/refactoringengine-test.cpp index 1a7c0d3b92..57b11a9523 100644 --- a/tests/unit/unittest/refactoringengine-test.cpp +++ b/tests/unit/unittest/refactoringengine-test.cpp @@ -149,7 +149,7 @@ void RefactoringEngine::SetUp() projectPart = CppTools::ProjectPart::Ptr(new CppTools::ProjectPart); projectPart->files.push_back(projectFile); - CompilerOptionsBuilder optionsBuilder(*projectPart, CLANG_VERSION, CLANG_RESOURCE_DIR); + CompilerOptionsBuilder optionsBuilder(*projectPart); commandLine = Utils::SmallStringVector(optionsBuilder.build( projectFile.kind, CompilerOptionsBuilder::PchUsage::None)); diff --git a/tests/unit/unittest/refactoringserver-test.cpp b/tests/unit/unittest/refactoringserver-test.cpp index 0abe22f1b6..51cae8697e 100644 --- a/tests/unit/unittest/refactoringserver-test.cpp +++ b/tests/unit/unittest/refactoringserver-test.cpp @@ -298,6 +298,20 @@ TEST_F(RefactoringServerSlowTest, ForInvalidRequestSourceRangesAndDiagnosticsGet refactoringServer.requestSourceRangesAndDiagnosticsForQueryMessage(std::move(message)); } +TEST_F(RefactoringServer, UpdateGeneratedFilesSetMemberWhichIsUsedForSymbolIndexing) +{ + FileContainers unsaved{{{TESTDATA_DIR, "query_simplefunction.h"}, + "void f();", + {}}}; + + + EXPECT_CALL(mockSymbolIndexing, + updateProjectParts(_, unsaved)); + + refactoringServer.updateGeneratedFiles(Utils::clone(unsaved)); + refactoringServer.updateProjectParts({}); +} + TEST_F(RefactoringServer, UpdateProjectPartsCallsSymbolIndexingUpdateProjectParts) { ProjectPartContainers projectParts{{{"projectPartId", @@ -306,17 +320,15 @@ TEST_F(RefactoringServer, UpdateProjectPartsCallsSymbolIndexingUpdateProjectPart {"/includes"}, {filePathId("header1.h")}, {filePathId("main.cpp")}}}}; - FileContainers unsaved{{{TESTDATA_DIR, "query_simplefunction.h"}, - "void f();", - {}}}; EXPECT_CALL(mockSymbolIndexing, - updateProjectParts(projectParts, unsaved)); + updateProjectParts(projectParts, _)); - refactoringServer.updateProjectParts({Utils::clone(projectParts), Utils::clone(unsaved)}); + refactoringServer.updateProjectParts({Utils::clone(projectParts)}); } + void RefactoringServer::SetUp() { temporaryFile.open(); diff --git a/tests/unit/unittest/symbolindexing-test.cpp b/tests/unit/unittest/symbolindexing-test.cpp index 1d6c8d720b..1971379fd6 100644 --- a/tests/unit/unittest/symbolindexing-test.cpp +++ b/tests/unit/unittest/symbolindexing-test.cpp @@ -97,11 +97,12 @@ TEST_F(SymbolIndexing, Locations) { indexing.indexer().updateProjectParts({projectPart1}, {}); - auto locations = query.locationsAt(filePathId(TESTDATA_DIR "/symbolindexing_main1.cpp"), 6, 5); + auto locations = query.locationsAt(filePathId(TESTDATA_DIR "/symbolindexing_main1.cpp"), 1, 6); ASSERT_THAT(locations, ElementsAre( - IsLocation(filePathId(TESTDATA_DIR "/symbolindexing_main1.cpp"), 5, 9), - IsLocation(filePathId(TESTDATA_DIR "/symbolindexing_main1.cpp"), 6, 5))); + IsLocation(filePathId(TESTDATA_DIR "/symbolindexing_main1.cpp"), 1, 6), + IsLocation(filePathId(TESTDATA_DIR "/symbolindexing_main1.cpp"), 3, 6), + IsLocation(filePathId(TESTDATA_DIR "/symbolindexing_main1.cpp"), 40, 5))); } TEST_F(SymbolIndexing, DISABLED_TemplateFunction) @@ -121,11 +122,12 @@ TEST_F(SymbolIndexing, PathsAreUpdated) indexing.indexer().pathsChanged({filePathId(main1Path)}); indexing.indexer().pathsChanged({filePathId(main1Path)}); - auto locations = query.locationsAt(filePathId(TESTDATA_DIR "/symbolindexing_main1.cpp"), 6, 5); + auto locations = query.locationsAt(filePathId(TESTDATA_DIR "/symbolindexing_main1.cpp"), 1, 6); ASSERT_THAT(locations, ElementsAre( - IsLocation(filePathId(TESTDATA_DIR "/symbolindexing_main1.cpp"), 5, 9), - IsLocation(filePathId(TESTDATA_DIR "/symbolindexing_main1.cpp"), 6, 5))); + IsLocation(filePathId(TESTDATA_DIR "/symbolindexing_main1.cpp"), 1, 6), + IsLocation(filePathId(TESTDATA_DIR "/symbolindexing_main1.cpp"), 3, 6), + IsLocation(filePathId(TESTDATA_DIR "/symbolindexing_main1.cpp"), 40, 5))); } } diff --git a/tests/unit/unittest/symbolscollector-test.cpp b/tests/unit/unittest/symbolscollector-test.cpp index 1dcc4d95c7..ec2535a9a1 100644 --- a/tests/unit/unittest/symbolscollector-test.cpp +++ b/tests/unit/unittest/symbolscollector-test.cpp @@ -168,7 +168,7 @@ TEST_F(SymbolsCollector, CollectSymbolName) collector.collectSymbols(); ASSERT_THAT(collector.symbols(), - Contains(HasSymbolName("x"))); + Contains(HasSymbolName("function"))); } TEST_F(SymbolsCollector, SymbolMatchesLocation) diff --git a/tests/unit/unittest/tokenprocessor-test.cpp b/tests/unit/unittest/tokenprocessor-test.cpp index 50ee2cd9d0..e618104af0 100644 --- a/tests/unit/unittest/tokenprocessor-test.cpp +++ b/tests/unit/unittest/tokenprocessor-test.cpp @@ -959,7 +959,8 @@ TEST_F(TokenProcessor, TemplateTypeParameter) { const auto infos = translationUnit.tokenInfosInRange(sourceRange(265, 135)); - ASSERT_THAT(infos[3], HasOnlyType(HighlightingType::Type)); + ASSERT_THAT(infos[3], HasTwoTypes(HighlightingType::Type, + HighlightingType::TemplateTypeParameter)); } TEST_F(TokenProcessor, TemplateDefaultParameter) @@ -987,7 +988,8 @@ TEST_F(TokenProcessor, TemplateTemplateParameter) { const auto infos = translationUnit.tokenInfosInRange(sourceRange(265, 135)); - ASSERT_THAT(infos[17], HasOnlyType(HighlightingType::Type)); + ASSERT_THAT(infos[17], HasTwoTypes(HighlightingType::Type, + HighlightingType::TemplateTemplateParameter)); } TEST_F(TokenProcessor, TemplateTemplateParameterDefaultArgument) @@ -1008,7 +1010,8 @@ TEST_F(TokenProcessor, TemplateTypeParameterReference) { const auto infos = translationUnit.tokenInfosInRange(sourceRange(268, 58)); - ASSERT_THAT(infos[0], HasOnlyType(HighlightingType::Type)); + ASSERT_THAT(infos[0], HasTwoTypes(HighlightingType::Type, + HighlightingType::TemplateTypeParameter)); } TEST_F(TokenProcessor, TemplateTypeParameterDeclarationReference) @@ -1036,14 +1039,16 @@ TEST_F(TokenProcessor, TemplateTemplateParameterReference) { const auto infos = translationUnit.tokenInfosInRange(sourceRange(270, 89)); - ASSERT_THAT(infos[0], HasOnlyType(HighlightingType::Type)); + ASSERT_THAT(infos[0], HasTwoTypes(HighlightingType::Type, + HighlightingType::TemplateTemplateParameter)); } TEST_F(TokenProcessor, TemplateTemplateContainerParameterReference) { const auto infos = translationUnit.tokenInfosInRange(sourceRange(270, 89)); - ASSERT_THAT(infos[2], HasOnlyType(HighlightingType::Type)); + ASSERT_THAT(infos[2], HasTwoTypes(HighlightingType::Type, + HighlightingType::TemplateTypeParameter)); } TEST_F(TokenProcessor, TemplateTemplateParameterReferenceVariable) diff --git a/tests/unit/unittest/unittest.pro b/tests/unit/unittest/unittest.pro index 88d5606250..b191d1a1d8 100644 --- a/tests/unit/unittest/unittest.pro +++ b/tests/unit/unittest/unittest.pro @@ -92,7 +92,9 @@ SOURCES += \ projectpartartefact-test.cpp \ filestatuscache-test.cpp \ highlightingresultreporter-test.cpp \ - precompiledheaderstorage-test.cpp + precompiledheaderstorage-test.cpp \ + projectpartqueue-test.cpp \ + generatedfiles-test.cpp !isEmpty(LIBCLANG_LIBS) { SOURCES += \ |