diff --git a/cmake/FindQt5.cmake b/cmake/FindQt5.cmake index ae58487eea7..dbbb07681f3 100644 --- a/cmake/FindQt5.cmake +++ b/cmake/FindQt5.cmake @@ -48,6 +48,7 @@ else() if(dcIndex GREATER_EQUAL 0) find_package(Qt6${possible_private_libs}Private CONFIG QUIET) if(TARGET Qt6::${possible_private_libs}Private) + set_property(TARGET Qt6::${possible_private_libs}Private PROPERTY IMPORTED_GLOBAL TRUE) add_library(Qt5::${possible_private_libs} ALIAS Qt6::${possible_private_libs}Private) list(REMOVE_AT Qt5_FIND_COMPONENTS ${dcIndex}) endif() diff --git a/dist/changes-5.0.0.md b/dist/changes-5.0.0.md index bceddafe821..8bcf9440bc6 100644 --- a/dist/changes-5.0.0.md +++ b/dist/changes-5.0.0.md @@ -21,17 +21,20 @@ Editing * Added line ending and indentation to file properties information * Added menu item and shortcut for editing bookmark comments (QTCREATORBUG-25696) +* Fixed folding for Markdown (QTCREATORBUG-25882) ### C++ +* Added experimental support for `clangd` (no code completion yet, requires + development build of `clangd`) * Added highlighting option for function parameters (QTCREATORBUG-24880) -* Added experimental support for `clangd` for global index (`Find References`, - `Rename Symbol`, `Follow Symbol`) * Added template parameters to symbols in Locator * Fixed that project-unrelated files were selected by default when renaming symbols (QTCREATORBUG-8561) * Fixed highlighting of string literals with multi-byte characters (QTCREATORBUG-25715) +* Fixed code model for changed but not yet built `.ui` and `.scxml` files + (QTCREATORBUG-25937) ### QML @@ -57,10 +60,17 @@ Editing Projects -------- +* Added experimental support for building and running on Docker devices +* Added option `Show Source and Header Groups` to project tree + (QTCREATORBUG-25313) * Fixed crash when closing project while changing current configuration (QTCREATORBUG-25655) * Fixed that output of custom targets was interpreted as errors (QTCREATORBUG-25677) +* Fixed missing update of run configuration environment (QTCREATORBUG-25947) +* Fixed that user files were unnecessarily saved with new time stamp + (QTCREATORBUG-25921) +* Reduced UI freeze after loading projects (QTCREATORBUG-25783) ### CMake @@ -69,6 +79,12 @@ Projects * Added CMake output to right side of `Projects` mode (QTCREATORBUG-25522) * Fixed `Jump to File` for file names with special characters (QTCREATORBUG-25572) +* Fixed updating of available targets (QTCREATORBUG-24914, QTCREATORBUG-25906) +* Fixed persistence of CMake tool options (QTCREATORBUG-25911) + +### Qbs + +* Improved performance of registering profiles (QTCREATORBUG-25463) Debugging --------- @@ -87,6 +103,14 @@ Debugging * Implemented `Load QML Stack` for LLDB (QTCREATORBUG-25554) +Analyzer +-------- + +### Clang + +* Fixed URL for `clang-tidy` checks (QTCREATORBUG-25902) +* Fixed application of options to checks (QTCREATORBUG-25827) + FakeVim ------- @@ -103,6 +127,11 @@ Platforms * Fixed performance issue with registering file watches after loading projects +### Android + +* Fixed detection of `_prepare_apk_dir` target for CMake projects + (QTCREATORBUG-25216) + ### QNX * Fixed device configuration @@ -138,6 +167,7 @@ Jaroslaw Kobus Jochen Becher Johanna Vanhatapio Kai Köhne +Kama Wójcik Knud Dollereder Leena Miettinen Lukas Holecek @@ -149,6 +179,7 @@ Michael Weghorn Miikka Heikkinen Miina Puuronen Miklós Márton +Nodir Temirkhodjaev Oliver Wolff Orgad Shaneh Pekka Kaikkonen @@ -158,4 +189,5 @@ Tim Blechmann Tim Jenssen Tom Praschan Vikas Pachdha +Wojciech Smigaj Youri Westerman diff --git a/doc/qtcreator/images/qtcreator-gdb-options.png b/doc/qtcreator/images/qtcreator-gdb-options.png index d8f3f59be02..e1ec43cc37b 100644 Binary files a/doc/qtcreator/images/qtcreator-gdb-options.png and b/doc/qtcreator/images/qtcreator-gdb-options.png differ diff --git a/doc/qtcreator/images/qtcreator-mcu-device.png b/doc/qtcreator/images/qtcreator-mcu-device.png index 4159ec10c65..2a2dd2beab5 100644 Binary files a/doc/qtcreator/images/qtcreator-mcu-device.png and b/doc/qtcreator/images/qtcreator-mcu-device.png differ diff --git a/doc/qtcreator/images/qtcreator-mcu-kit.png b/doc/qtcreator/images/qtcreator-mcu-kit.png index e91f784a39a..112707e22a1 100644 Binary files a/doc/qtcreator/images/qtcreator-mcu-kit.png and b/doc/qtcreator/images/qtcreator-mcu-kit.png differ diff --git a/doc/qtcreator/images/qtcreator-mcu-options.png b/doc/qtcreator/images/qtcreator-mcu-options.png index 40313111870..eafc35d51c9 100644 Binary files a/doc/qtcreator/images/qtcreator-mcu-options.png and b/doc/qtcreator/images/qtcreator-mcu-options.png differ diff --git a/doc/qtcreator/src/debugger/creator-debugger-common.qdocinc b/doc/qtcreator/src/debugger/creator-debugger-common.qdocinc index ecd69024923..4abf8997e7d 100644 --- a/doc/qtcreator/src/debugger/creator-debugger-common.qdocinc +++ b/doc/qtcreator/src/debugger/creator-debugger-common.qdocinc @@ -162,6 +162,10 @@ editor, select \uicontrol GDB > \uicontrol {Adjust breakpoint locations} or \uicontrol CDB > \uicontrol {Correct breakpoint location}. + When using GDB as backend, you can extend the ordinary GDB + breakpoint class by using Python. Select \uicontrol GDB > + \uicontrol {Use pseudo message tracepoints}. + When using CDB as backend, you can specify that the debugger should break on specific events, such as C++ exceptions, thread creation or exit, loading or unloading \l{Viewing Modules}{application modules}, or particular output. diff --git a/doc/qtcreator/src/debugger/creator-only/creator-debugger-settings.qdocinc b/doc/qtcreator/src/debugger/creator-only/creator-debugger-settings.qdocinc index 72cd80d3a30..f1d74a9d8e9 100644 --- a/doc/qtcreator/src/debugger/creator-only/creator-debugger-settings.qdocinc +++ b/doc/qtcreator/src/debugger/creator-only/creator-debugger-settings.qdocinc @@ -112,6 +112,10 @@ By default, GDB shows AT&T style disassembly. To switch to the Intel style, select the \uicontrol {Use Intel style disassembly} check box. + To have GDB automatically save a copy of its symbol index in a cache + on disk and retrieve it from there when loading the same binary in the + future, select the \uicontrol {Use automatic symbol cache} check box. + To execute GDB commands after GDB has been started, but before the debugged program is started or attached, and before the debugging helpers are initialized, enter them in the \uicontrol {Additional Startup Commands} diff --git a/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc b/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc index 67b271053d2..34ecaa1785a 100644 --- a/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc +++ b/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc @@ -1540,8 +1540,16 @@ \section1 Built-in Debugger Is Slow During Startup and Runtime - The part of the slowness that is related to the loading of debug information - is hard to avoid. Another part stems from maintaining breakpoints inside + Slowness that is related to the loading of debug information is hard to + avoid. + + When using GDB as backend, you can automatically save a copy of + its symbol index in a cache on disk and retrieve it from there + when loading the same binary in the future. Select \uicontrol Tools + > \uicontrol Options > \uicontrol Debugger > \uicontrol GDB > + \uicontrol {Use automatic symbol cache}. + + Some slowness stems from maintaining breakpoints inside the debugger (under some circumstances all breakpoints need to be inserted and removed again for each step) and the evaluation of expressions after each step. We recommend that you minimize the number of breakpoints and diff --git a/doc/qtcreator/src/mcu/creator-mcu-dev.qdoc b/doc/qtcreator/src/mcu/creator-mcu-dev.qdoc index b6682931bef..479ae52ea4e 100644 --- a/doc/qtcreator/src/mcu/creator-mcu-dev.qdoc +++ b/doc/qtcreator/src/mcu/creator-mcu-dev.qdoc @@ -171,6 +171,9 @@ the kit's toolkits and SDKs, and keeps them synchronized when selecting \uicontrol Apply or \uicontrol OK. + The \uicontrol {MCU dependencies} field displays paths to 3rd party + software required for MCU development with the current kit. + \section1 Running Applications on MCUs You can use a wizard to set up a project for developing an application that diff --git a/doc/qtcreator/src/user-interface/creator-projects-view.qdoc b/doc/qtcreator/src/user-interface/creator-projects-view.qdoc index cfcc814521d..a9f50806f49 100644 --- a/doc/qtcreator/src/user-interface/creator-projects-view.qdoc +++ b/doc/qtcreator/src/user-interface/creator-projects-view.qdoc @@ -133,6 +133,9 @@ not enabled for the current target, \li \uicontrol {Hide Empty Directories} hides directories that do not contain any files. + \li \uicontrol {Show Source and Header Groups} shows source and header + files grouped together in the view, regardless of their location in + the file system. \endlist To stop synchronizing the position in the project tree with the file diff --git a/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate.h b/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate.h index b0b68907edd..6577b3a4f5a 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate.h +++ b/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate.h @@ -71,9 +71,7 @@ public: PropertyNameList propertyNameListForWritableProperties(QObject *object, const PropertyName &baseName = PropertyName(), QObjectList *inspectedObjects = nullptr); - PropertyNameList allPropertyNames(QObject *object, - const PropertyName &baseName = PropertyName(), - QObjectList *inspectedObjects = nullptr); + PropertyNameList allPropertyNames(QObject *object); bool hasFullImplementedListInterface(const QQmlListReference &list); void registerCustomData(QObject *object); diff --git a/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate_56.cpp b/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate_56.cpp index 2f775d05346..f0ef76cb19d 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate_56.cpp +++ b/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate_56.cpp @@ -68,8 +68,8 @@ static void addToPropertyNameListIfNotBlackListed( } PropertyNameList allPropertyNamesInline(QObject *object, - const PropertyName &baseName, - QObjectList *inspectedObjects, + const PropertyName &baseName = {}, + QObjectList *inspectedObjects = nullptr, int depth = 0) { QQuickDesignerSupport::PropertyNameList propertyNameList; @@ -136,24 +136,20 @@ PropertyNameList allPropertyNamesInline(QObject *object, } #endif -PropertyNameList allPropertyNames(QObject *object, - const PropertyName &baseName, - QObjectList *inspectedObjects) +PropertyNameList allPropertyNames(QObject *object) { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) - return QQuickDesignerSupportProperties::allPropertyNames(object, baseName, inspectedObjects); + return QQuickDesignerSupportProperties::allPropertyNames(object); #elif QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) - return allPropertyNamesInline(object, baseName, inspectedObjects); + return allPropertyNamesInline(object); #else - return QQuickDesignerSupportProperties::allPropertyNames(object, baseName, inspectedObjects); + return QQuickDesignerSupportProperties::allPropertyNames(object); #endif } -PropertyNameList propertyNameListForWritableProperties(QObject *object, - const PropertyName &baseName, - QObjectList *inspectedObjects) +PropertyNameList propertyNameListForWritableProperties(QObject *object) { - return QQuickDesignerSupportProperties::propertyNameListForWritableProperties(object, baseName, inspectedObjects); + return QQuickDesignerSupportProperties::propertyNameListForWritableProperties(object); } void tweakObjects(QObject *object) diff --git a/src/libs/languageserverprotocol/icontent.h b/src/libs/languageserverprotocol/icontent.h index a6ecb407142..ea19b25a92d 100644 --- a/src/libs/languageserverprotocol/icontent.h +++ b/src/libs/languageserverprotocol/icontent.h @@ -92,7 +92,7 @@ struct ResponseHandler using ResponseHandlers = std::function; using MethodHandler = std::function; -inline uint qHash(const LanguageServerProtocol::MessageId &id) +inline auto qHash(const LanguageServerProtocol::MessageId &id) { if (Utils::holds_alternative(id)) return QT_PREPEND_NAMESPACE(qHash(Utils::get(id))); diff --git a/src/libs/modelinglib/qmt/infrastructure/uid.h b/src/libs/modelinglib/qmt/infrastructure/uid.h index 757f5c11b03..852daea248f 100644 --- a/src/libs/modelinglib/qmt/infrastructure/uid.h +++ b/src/libs/modelinglib/qmt/infrastructure/uid.h @@ -55,7 +55,7 @@ private: QUuid m_uuid; }; -inline uint qHash(const Uid &uid) +inline auto qHash(const Uid &uid) { return qHash(uid.get()); } diff --git a/src/libs/modelinglib/qmt/stereotype/customrelation.h b/src/libs/modelinglib/qmt/stereotype/customrelation.h index 0b72be20fdf..d74bd0dd4e4 100644 --- a/src/libs/modelinglib/qmt/stereotype/customrelation.h +++ b/src/libs/modelinglib/qmt/stereotype/customrelation.h @@ -151,15 +151,15 @@ private: QColor m_color; }; -inline uint qHash(CustomRelation::Relationship relationship) { +inline auto qHash(CustomRelation::Relationship relationship) { return ::qHash(static_cast(relationship)); } -inline uint qHash(CustomRelation::ShaftPattern pattern) { +inline auto qHash(CustomRelation::ShaftPattern pattern) { return ::qHash(static_cast(pattern)); } -inline uint qHash(CustomRelation::Head head) { +inline auto qHash(CustomRelation::Head head) { return ::qHash(static_cast(head)); } diff --git a/src/libs/modelinglib/qmt/stereotype/stereotypecontroller.cpp b/src/libs/modelinglib/qmt/stereotype/stereotypecontroller.cpp index ae1974717bd..925b7bb19ab 100644 --- a/src/libs/modelinglib/qmt/stereotype/stereotypecontroller.cpp +++ b/src/libs/modelinglib/qmt/stereotype/stereotypecontroller.cpp @@ -77,7 +77,7 @@ bool operator==(const IconKey &lhs, const IconKey &rhs) { && lhs.m_lineWidth == rhs.m_lineWidth; } -uint qHash(const IconKey &key) { +auto qHash(const IconKey &key) { return ::qHash(key.m_element) + qHash(key.m_stereotypes) + qHash(key.m_defaultIconPath) + qHash(key.m_styleUid) + ::qHash(key.m_size.width()) + ::qHash(key.m_size.height()); } diff --git a/src/libs/sqlite/utf8string.h b/src/libs/sqlite/utf8string.h index 0c6a1fb3341..28e77be487a 100644 --- a/src/libs/sqlite/utf8string.h +++ b/src/libs/sqlite/utf8string.h @@ -302,7 +302,7 @@ public: return datastream; } - friend uint qHash(const Utf8String &utf8String) + friend auto qHash(const Utf8String &utf8String) { return qHash(utf8String.byteArray); } diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index e44faa5e087..c739b74ec31 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -1378,15 +1378,25 @@ FilePath FilePath::onDevice(const FilePath &deviceTemplate) const assert(fullPath == FilePath::fromUrl("docker://123/usr/bin/make")) \endcode */ -FilePath FilePath::onDeviceSearchInPath() const +FilePath FilePath::onDeviceSearchInPath(const FilePaths &additionalDirs) const { if (needsDevice()) { QTC_ASSERT(s_deviceHooks.searchInPath, return {}); - return s_deviceHooks.searchInPath(*this); + return s_deviceHooks.searchInPath(*this, additionalDirs); } - return Environment::systemEnvironment().searchInPath(path()); + return Environment::systemEnvironment().searchInPath(path(), additionalDirs); } +Environment FilePath::deviceEnvironment() const +{ + if (needsDevice()) { + QTC_ASSERT(s_deviceHooks.environment, return {}); + return s_deviceHooks.environment(*this); + } + return Environment::systemEnvironment(); +} + + FilePath FilePath::pathAppended(const QString &path) const { FilePath fn = *this; diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index 0d8d48d0285..24da9d380d1 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -40,7 +40,10 @@ #include #include -namespace Utils { class FilePath; } +namespace Utils { +class Environment; +class FilePath; +} // Utils QT_BEGIN_NAMESPACE class QDataStream; @@ -82,7 +85,7 @@ public: std::function removeRecursively; std::function copyFile; std::function renameFile; - std::function searchInPath; + std::function &)> searchInPath; std::function symLinkTarget; std::function(const FilePath &, const QStringList &, QDir::Filters, QDir::SortFlags)> dirEntries; @@ -91,6 +94,7 @@ public: std::function lastModified; std::function permissions; std::function osType; + std::function environment; }; class QTCREATOR_UTILS_EXPORT FilePath @@ -212,7 +216,8 @@ public: static void setDeviceFileHooks(const DeviceFileHooks &hooks); - FilePath onDeviceSearchInPath() const; + FilePath onDeviceSearchInPath(const QList &additionalDirs = {}) const; + Environment deviceEnvironment() const; private: friend class ::tst_fileutils; diff --git a/src/libs/utils/mimetypes/mimetype.h b/src/libs/utils/mimetypes/mimetype.h index 4d64de32754..ff0acaae347 100644 --- a/src/libs/utils/mimetypes/mimetype.h +++ b/src/libs/utils/mimetypes/mimetype.h @@ -120,7 +120,7 @@ protected: QExplicitlySharedDataPointer d; }; -inline uint qHash(const MimeType &mime) { return qHash(mime.name()); } +inline auto qHash(const MimeType &mime) { return qHash(mime.name()); } } // Utils diff --git a/src/libs/utils/smallstringio.h b/src/libs/utils/smallstringio.h index 2ab190da345..10690f8ad85 100644 --- a/src/libs/utils/smallstringio.h +++ b/src/libs/utils/smallstringio.h @@ -155,7 +155,7 @@ namespace std { template<> struct hash { using argument_type = Utils::SmallString; - using result_type = uint; + using result_type = std::size_t; result_type operator()(const argument_type& string) const { return qHashBits(string.data(), string.size()); diff --git a/src/plugins/autotest/itestparser.cpp b/src/plugins/autotest/itestparser.cpp index fd021df42ef..b11393b9520 100644 --- a/src/plugins/autotest/itestparser.cpp +++ b/src/plugins/autotest/itestparser.cpp @@ -37,6 +37,7 @@ namespace Autotest { using LookupInfo = QPair; static QHash s_pchLookupCache; +Q_GLOBAL_STATIC(QMutex, s_cacheMutex); CppParser::CppParser(ITestFramework *framework) : ITestParser(framework) @@ -96,6 +97,7 @@ bool precompiledHeaderContains(const CPlusPlus::Snapshot &snapshot, } return it.value(); }; + QMutexLocker l(s_cacheMutex()); return Utils::anyOf(precompiledHeaders, headerContains); } @@ -127,6 +129,7 @@ void CppParser::release() { m_cppSnapshot = CPlusPlus::Snapshot(); m_workingCopy = CppTools::WorkingCopy(); + QMutexLocker l(s_cacheMutex()); s_pchLookupCache.clear(); } diff --git a/src/plugins/autotest/testresult.h b/src/plugins/autotest/testresult.h index e1081fe9523..241b0f711f2 100644 --- a/src/plugins/autotest/testresult.h +++ b/src/plugins/autotest/testresult.h @@ -75,7 +75,7 @@ enum class ResultType { LAST_TYPE = Invalid }; -inline uint qHash(const ResultType &result) +inline auto qHash(const ResultType &result) { return QT_PREPEND_NAMESPACE(qHash(int(result))); } diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp index e20e89bc824..351484ee67e 100644 --- a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp +++ b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp @@ -30,6 +30,7 @@ #include "debugserverproviderchooser.h" #include +#include #include diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwizard.cpp b/src/plugins/baremetal/baremetaldeviceconfigurationwizard.cpp index 2555b9f5914..bb8a3f6b96f 100644 --- a/src/plugins/baremetal/baremetaldeviceconfigurationwizard.cpp +++ b/src/plugins/baremetal/baremetaldeviceconfigurationwizard.cpp @@ -29,6 +29,8 @@ #include "baremetaldeviceconfigurationwizard.h" #include "baremetaldeviceconfigurationwizardpages.h" +#include + namespace BareMetal { namespace Internal { diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp b/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp index 7b5a58ff49d..52849a9efa7 100644 --- a/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp +++ b/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp @@ -30,6 +30,7 @@ #include "debugserverproviderchooser.h" #include +#include #include #include diff --git a/src/plugins/classview/classviewsymbolinformation.h b/src/plugins/classview/classviewsymbolinformation.h index 8d5394aaddd..c6189c0b39e 100644 --- a/src/plugins/classview/classviewsymbolinformation.h +++ b/src/plugins/classview/classviewsymbolinformation.h @@ -46,7 +46,7 @@ public: inline const QString &name() const { return m_name; } inline const QString &type() const { return m_type; } inline int iconType() const { return m_iconType; } - inline uint hash() const { return m_hash; } + inline auto hash() const { return m_hash; } inline bool operator==(const SymbolInformation &other) const { return hash() == other.hash() && iconType() == other.iconType() && name() == other.name() @@ -64,7 +64,7 @@ private: }; //! qHash overload for QHash/QSet -inline uint qHash(const SymbolInformation &information) +inline auto qHash(const SymbolInformation &information) { return information.hash(); } diff --git a/src/plugins/coreplugin/find/searchresultcolor.h b/src/plugins/coreplugin/find/searchresultcolor.h index 0291133c0b8..ec1b4c1bd42 100644 --- a/src/plugins/coreplugin/find/searchresultcolor.h +++ b/src/plugins/coreplugin/find/searchresultcolor.h @@ -55,7 +55,7 @@ public: }; -inline uint qHash(SearchResultColor::Style style) +inline auto qHash(SearchResultColor::Style style) { return QT_PREPEND_NAMESPACE(qHash(int(style))); } diff --git a/src/plugins/cppeditor/cppeditorwidget.cpp b/src/plugins/cppeditor/cppeditorwidget.cpp index ee242640bc0..d2abe8699f8 100644 --- a/src/plugins/cppeditor/cppeditorwidget.cpp +++ b/src/plugins/cppeditor/cppeditorwidget.cpp @@ -49,6 +49,7 @@ #include #include #include +#include #include #include #include @@ -114,11 +115,15 @@ class CppEditorWidgetPrivate public: CppEditorWidgetPrivate(CppEditorWidget *q); + bool shouldOfferOutline() const { return CppModelManager::supportsOutline(m_cppEditorDocument); } + public: QPointer m_modelManager; CppEditorDocument *m_cppEditorDocument; CppEditorOutline *m_cppEditorOutline = nullptr; + QAction *m_outlineAction = nullptr; + QTimer m_outlineTimer; QTimer m_updateFunctionDeclDefLinkTimer; SemanticInfo m_lastSemanticInfo; @@ -159,11 +164,11 @@ void CppEditorWidget::finalizeInitialization() // clang-format off // function combo box sorting - if (CppModelManager::supportsOutline(d->m_cppEditorDocument)) { - d->m_cppEditorOutline = new CppEditorOutline(this); - connect(CppEditorPlugin::instance(), &CppEditorPlugin::outlineSortingChanged, - outline(), &CppEditorOutline::setSorted); - } + d->m_cppEditorOutline = new CppEditorOutline(this); + + // TODO: Nobody emits this signal... Remove? + connect(CppEditorPlugin::instance(), &CppEditorPlugin::outlineSortingChanged, + outline(), &CppEditorOutline::setSorted); connect(d->m_cppEditorDocument, &CppEditorDocument::codeWarningsUpdated, this, &CppEditorWidget::onCodeWarningsUpdated); @@ -197,10 +202,10 @@ void CppEditorWidget::finalizeInitialization() }); connect(&d->m_localRenaming, &CppLocalRenaming::processKeyPressNormally, this, &CppEditorWidget::processKeyNormally); - if (d->m_cppEditorOutline) { - connect(this, &QPlainTextEdit::cursorPositionChanged, - d->m_cppEditorOutline, &CppEditorOutline::updateIndex); - } + connect(this, &QPlainTextEdit::cursorPositionChanged, this, [this] { + if (d->shouldOfferOutline()) + d->m_cppEditorOutline->updateIndex(); + }); connect(cppEditorDocument(), &CppEditorDocument::preprocessorSettingsChanged, this, [this](bool customSettings) { @@ -236,8 +241,8 @@ void CppEditorWidget::finalizeInitialization() }); // Toolbar: Outline/Overview combo box - if (d->m_cppEditorOutline) - insertExtraToolBarWidget(TextEditorWidget::Left, d->m_cppEditorOutline->widget()); + d->m_outlineAction = insertExtraToolBarWidget(TextEditorWidget::Left, + d->m_cppEditorOutline->widget()); // clang-format on // Toolbar: '#' Button @@ -261,6 +266,20 @@ void CppEditorWidget::finalizeInitialization() }); connect(&cppEditorDocument()->minimizableInfoBars(), &MinimizableInfoBars::showAction, this, &CppEditorWidget::onShowInfoBarAction); + + d->m_outlineTimer.setInterval(5000); + d->m_outlineTimer.setSingleShot(true); + connect(&d->m_outlineTimer, &QTimer::timeout, this, [this] { + d->m_outlineAction->setVisible(d->shouldOfferOutline()); + if (d->m_outlineAction->isVisible()) { + d->m_cppEditorOutline->update(); + d->m_cppEditorOutline->updateIndex(); + } + }); + connect(&ClangdSettings::instance(), &ClangdSettings::changed, + &d->m_outlineTimer, qOverload<>(&QTimer::start)); + connect(d->m_cppEditorDocument, &CppEditorDocument::changed, + &d->m_outlineTimer, qOverload<>(&QTimer::start)); } void CppEditorWidget::finalizeInitializationAfterDuplication(TextEditorWidget *other) @@ -271,7 +290,7 @@ void CppEditorWidget::finalizeInitializationAfterDuplication(TextEditorWidget *o if (cppEditorWidget->isSemanticInfoValidExceptLocalUses()) updateSemanticInfo(cppEditorWidget->semanticInfo()); - if (d->m_cppEditorOutline) + if (d->shouldOfferOutline()) d->m_cppEditorOutline->update(); const Id selectionKind = CodeWarningsSelection; setExtraSelections(selectionKind, cppEditorWidget->extraSelections(selectionKind)); @@ -331,7 +350,7 @@ void CppEditorWidget::selectAll() void CppEditorWidget::onCppDocumentUpdated() { - if (d->m_cppEditorOutline) + if (d->shouldOfferOutline()) d->m_cppEditorOutline->update(); } diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h index 20bd7365a12..b20555cae45 100644 --- a/src/plugins/debugger/breakhandler.h +++ b/src/plugins/debugger/breakhandler.h @@ -223,9 +223,9 @@ using SubBreakpoints = const QList; using BreakHandlerModel = Utils::TreeModel, BreakpointItem, SubBreakpointItem>; using BreakpointManagerModel = Utils::TreeModel, GlobalBreakpointItem>; -inline uint qHash(const Debugger::Internal::SubBreakpoint &b) { return qHash(b.data()); } -inline uint qHash(const Debugger::Internal::Breakpoint &b) { return qHash(b.data()); } -inline uint qHash(const Debugger::Internal::GlobalBreakpoint &b) { return qHash(b.data()); } +inline auto qHash(const Debugger::Internal::SubBreakpoint &b) { return qHash(b.data()); } +inline auto qHash(const Debugger::Internal::Breakpoint &b) { return qHash(b.data()); } +inline auto qHash(const Debugger::Internal::GlobalBreakpoint &b) { return qHash(b.data()); } class BreakHandler : public BreakHandlerModel { diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index b2a7af5c985..d90c83ee485 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -57,6 +57,7 @@ #include #include #include +#include #include #include @@ -1045,23 +1046,33 @@ FilePath DockerDevice::symLinkTarget(const FilePath &filePath) const return {}; } -FilePath DockerDevice::searchInPath(const FilePath &filePath) const +FilePath DockerDevice::searchInPath(const FilePath &filePath, const FilePaths &additionalDirs) const { + QTC_ASSERT(handlesFile(filePath), return {}); + tryCreateLocalFileAccess(); + const QString path = filePath.path(); + // FIXME: Check whether local search via deviceEnvironment/PATH is faster? CommandLine dcmd{"docker", {"exec", d->m_container, "which", path}}; QtcProcess proc; proc.setCommand(dcmd); - proc.setWorkingDirectory(QDir::tempPath()); proc.start(); proc.waitForFinished(); LOG("Run sync:" << dcmd.toUserOutput() << " result: " << proc.exitCode()); - if (proc.exitCode() != 0) - return {}; + if (proc.exitCode() == 0) { + const QString output = proc.stdOut().trimmed(); + return mapToGlobalPath(FilePath::fromString(output)); + } - const QString output = proc.stdOut().trimmed(); - return mapToGlobalPath(FilePath::fromString(output)); + for (const FilePath &dir : additionalDirs) { + const FilePath candidate = dir / filePath.path(); + if (candidate.exists()) + return candidate; + } + + return {}; } FilePaths DockerDevice::directoryEntries(const FilePath &filePath, diff --git a/src/plugins/docker/dockerdevice.h b/src/plugins/docker/dockerdevice.h index 509bd2deeeb..0c994e73082 100644 --- a/src/plugins/docker/dockerdevice.h +++ b/src/plugins/docker/dockerdevice.h @@ -88,7 +88,8 @@ public: bool removeRecursively(const Utils::FilePath &filePath) const override; bool copyFile(const Utils::FilePath &filePath, const Utils::FilePath &target) const override; bool renameFile(const Utils::FilePath &filePath, const Utils::FilePath &target) const override; - Utils::FilePath searchInPath(const Utils::FilePath &filePath) const override; + Utils::FilePath searchInPath(const Utils::FilePath &filePath, + const Utils::FilePaths &additionalDirs) const override; Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const override; QList directoryEntries(const Utils::FilePath &filePath, const QStringList &nameFilters, diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index c9173666133..c1bbeec724c 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -1823,7 +1823,7 @@ bool GitClient::isRemoteCommit(const QString &workingDirectory, const QString &c { QtcProcess proc; vcsFullySynchronousExec(proc, workingDirectory, {"branch", "-r", "--contains", commit}, silentFlags); - return proc.rawStdOut().isEmpty(); + return !proc.rawStdOut().isEmpty(); } bool GitClient::isFastForwardMerge(const QString &workingDirectory, const QString &branch) diff --git a/src/plugins/nim/project/nimtoolchainfactory.cpp b/src/plugins/nim/project/nimtoolchainfactory.cpp index 1d11d1bd873..7876cd30a68 100644 --- a/src/plugins/nim/project/nimtoolchainfactory.cpp +++ b/src/plugins/nim/project/nimtoolchainfactory.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include diff --git a/src/plugins/projectexplorer/abi.h b/src/plugins/projectexplorer/abi.h index fbc868cb5e3..2ddfdfa8817 100644 --- a/src/plugins/projectexplorer/abi.h +++ b/src/plugins/projectexplorer/abi.h @@ -193,7 +193,7 @@ private: QString m_param; }; -inline int qHash(const ProjectExplorer::Abi &abi) +inline auto qHash(const ProjectExplorer::Abi &abi) { int h = abi.architecture() + (abi.os() << 3) diff --git a/src/plugins/projectexplorer/buildtargetinfo.h b/src/plugins/projectexplorer/buildtargetinfo.h index 28af0330a4f..7d786de3ca7 100644 --- a/src/plugins/projectexplorer/buildtargetinfo.h +++ b/src/plugins/projectexplorer/buildtargetinfo.h @@ -70,7 +70,7 @@ inline bool operator!=(const BuildTargetInfo &ti1, const BuildTargetInfo &ti2) return !(ti1 == ti2); } -inline uint qHash(const BuildTargetInfo &ti) +inline auto qHash(const BuildTargetInfo &ti) { return qHash(ti.displayName) ^ qHash(ti.buildKey); } diff --git a/src/plugins/projectexplorer/devicesupport/desktopprocesssignaloperation.cpp b/src/plugins/projectexplorer/devicesupport/desktopprocesssignaloperation.cpp index 333a264bbe5..8afa9611052 100644 --- a/src/plugins/projectexplorer/devicesupport/desktopprocesssignaloperation.cpp +++ b/src/plugins/projectexplorer/devicesupport/desktopprocesssignaloperation.cpp @@ -30,6 +30,7 @@ #include #include +#include #include #include diff --git a/src/plugins/projectexplorer/devicesupport/devicefactoryselectiondialog.cpp b/src/plugins/projectexplorer/devicesupport/devicefactoryselectiondialog.cpp index f2e9688df17..6ba62b26c49 100644 --- a/src/plugins/projectexplorer/devicesupport/devicefactoryselectiondialog.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicefactoryselectiondialog.cpp @@ -29,6 +29,8 @@ #include "idevice.h" #include "idevicefactory.h" +#include + #include namespace ProjectExplorer { diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp index 97c700eb2b5..3d7439522dd 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp @@ -458,10 +458,10 @@ DeviceManager::DeviceManager(bool isInstance) : d(std::make_uniquerenameFile(filePath, target); }; - deviceHooks.searchInPath = [](const FilePath &filePath) { + deviceHooks.searchInPath = [](const FilePath &filePath, const FilePaths &additionalDirs) { auto device = DeviceManager::deviceForPath(filePath); QTC_ASSERT(device, return FilePath{}); - return device->searchInPath(filePath); + return device->searchInPath(filePath, additionalDirs); }; deviceHooks.symLinkTarget = [](const FilePath &filePath) { @@ -507,6 +507,12 @@ DeviceManager::DeviceManager(bool isInstance) : d(std::make_uniqueosType(); }; + deviceHooks.environment = [](const FilePath &filePath) { + auto device = DeviceManager::deviceForPath(filePath); + QTC_ASSERT(device, return Environment{}); + return device->systemEnvironment(); + }; + FilePath::setDeviceFileHooks(deviceHooks); DeviceProcessHooks processHooks; diff --git a/src/plugins/projectexplorer/devicesupport/devicemanagermodel.cpp b/src/plugins/projectexplorer/devicesupport/devicemanagermodel.cpp index 6f01cc8749c..f38f7e8e7b2 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanagermodel.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanagermodel.cpp @@ -28,6 +28,7 @@ #include "devicemanager.h" #include +#include #include diff --git a/src/plugins/projectexplorer/devicesupport/deviceprocess.cpp b/src/plugins/projectexplorer/devicesupport/deviceprocess.cpp index dd6b89d4c70..766e21cb999 100644 --- a/src/plugins/projectexplorer/devicesupport/deviceprocess.cpp +++ b/src/plugins/projectexplorer/devicesupport/deviceprocess.cpp @@ -28,6 +28,7 @@ #include "idevice.h" #include +#include namespace ProjectExplorer { diff --git a/src/plugins/projectexplorer/devicesupport/deviceprocesslist.cpp b/src/plugins/projectexplorer/devicesupport/deviceprocesslist.cpp index 04059561005..50ccc5c66b9 100644 --- a/src/plugins/projectexplorer/devicesupport/deviceprocesslist.cpp +++ b/src/plugins/projectexplorer/devicesupport/deviceprocesslist.cpp @@ -28,6 +28,7 @@ #include #include +#include using namespace Utils; diff --git a/src/plugins/projectexplorer/devicesupport/devicetestdialog.cpp b/src/plugins/projectexplorer/devicesupport/devicetestdialog.cpp index fd4dc1385b7..3c28a48fd14 100644 --- a/src/plugins/projectexplorer/devicesupport/devicetestdialog.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicetestdialog.cpp @@ -26,6 +26,8 @@ #include "devicetestdialog.h" #include "ui_devicetestdialog.h" +#include + #include #include #include diff --git a/src/plugins/projectexplorer/devicesupport/idevice.cpp b/src/plugins/projectexplorer/devicesupport/idevice.cpp index 8983576c033..d51040d5862 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevice.cpp @@ -311,7 +311,7 @@ bool IDevice::renameFile(const FilePath &filePath, const FilePath &target) const return false; } -FilePath IDevice::searchInPath(const FilePath &filePath) const +FilePath IDevice::searchInPath(const FilePath &filePath, const FilePaths &additionalDirs) const { return Environment::systemEnvironment().searchInPath(filePath.path()); } diff --git a/src/plugins/projectexplorer/devicesupport/idevice.h b/src/plugins/projectexplorer/devicesupport/idevice.h index 46122f0144b..d5ad9858ad0 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.h +++ b/src/plugins/projectexplorer/devicesupport/idevice.h @@ -249,7 +249,8 @@ public: virtual bool removeRecursively(const Utils::FilePath &filePath) const; virtual bool copyFile(const Utils::FilePath &filePath, const Utils::FilePath &target) const; virtual bool renameFile(const Utils::FilePath &filePath, const Utils::FilePath &target) const; - virtual Utils::FilePath searchInPath(const Utils::FilePath &filePath) const; + virtual Utils::FilePath searchInPath(const Utils::FilePath &filePath, + const QList &additionalDirs = {}) const; virtual Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const; virtual QList directoryEntries(const Utils::FilePath &filePath, const QStringList &nameFilters, diff --git a/src/plugins/projectexplorer/devicesupport/sshdeviceprocesslist.cpp b/src/plugins/projectexplorer/devicesupport/sshdeviceprocesslist.cpp index d8107458fd5..32d58dc5dce 100644 --- a/src/plugins/projectexplorer/devicesupport/sshdeviceprocesslist.cpp +++ b/src/plugins/projectexplorer/devicesupport/sshdeviceprocesslist.cpp @@ -29,6 +29,7 @@ #include #include +#include using namespace QSsh; diff --git a/src/plugins/projectexplorer/headerpath.h b/src/plugins/projectexplorer/headerpath.h index 26e10315fcc..09337684b34 100644 --- a/src/plugins/projectexplorer/headerpath.h +++ b/src/plugins/projectexplorer/headerpath.h @@ -59,7 +59,7 @@ public: HeaderPathType type = HeaderPathType::User; }; -inline uint qHash(const HeaderPath &key, uint seed = 0) +inline auto qHash(const HeaderPath &key, uint seed = 0) { return ((qHash(key.path) << 2) | uint(key.type)) ^ seed; } diff --git a/src/plugins/projectexplorer/projectmacro.h b/src/plugins/projectexplorer/projectmacro.h index 2a4537aaf89..76125b53af4 100644 --- a/src/plugins/projectexplorer/projectmacro.h +++ b/src/plugins/projectexplorer/projectmacro.h @@ -85,7 +85,7 @@ private: }; inline -uint qHash(const Macro ¯o) +auto qHash(const Macro ¯o) { using QT_PREPEND_NAMESPACE(qHash); return qHash(macro.key) ^ qHash(macro.value) ^ qHash(int(macro.type)); diff --git a/src/plugins/qmljseditor/qmljscomponentnamedialog.cpp b/src/plugins/qmljseditor/qmljscomponentnamedialog.cpp index 293f6e385be..55e374676ea 100644 --- a/src/plugins/qmljseditor/qmljscomponentnamedialog.cpp +++ b/src/plugins/qmljseditor/qmljscomponentnamedialog.cpp @@ -163,13 +163,13 @@ QString ComponentNameDialog::isValid() const QString compName = ui->componentNameEdit->text(); if (compName.isEmpty() || !compName[0].isUpper()) - return tr("Invalid component name"); + return tr("Invalid component name."); if (!ui->pathEdit->isValid()) - return tr("Invalid path"); + return tr("Invalid path."); if (QDir(ui->pathEdit->path()).exists(compName + u".qml")) - return tr("Component already exists"); + return tr("Component already exists."); return QString(); } diff --git a/src/plugins/qmljstools/qmljsmodelmanager.cpp b/src/plugins/qmljstools/qmljsmodelmanager.cpp index 5eb23083685..c3092bf1cbb 100644 --- a/src/plugins/qmljstools/qmljsmodelmanager.cpp +++ b/src/plugins/qmljstools/qmljsmodelmanager.cpp @@ -148,7 +148,7 @@ ModelManagerInterface::ProjectInfo ModelManager::defaultProjectInfoForProject( projectInfo.tryQmlDump = project && qtVersion->type() == QLatin1String(QtSupport::Constants::DESKTOPQT); projectInfo.qtQmlPath = qtVersion->qmlPath().toFileInfo().canonicalFilePath(); projectInfo.qtVersionString = qtVersion->qtVersionString(); - } else if (!activeKit->value(QtSupport::SuppliesQtQuickImportPath::id(), false).toBool()) { + } else if (!activeKit || !activeKit->value(QtSupport::SuppliesQtQuickImportPath::id(), false).toBool()) { projectInfo.qtQmlPath = QFileInfo(QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath)).canonicalFilePath(); projectInfo.qtVersionString = QLatin1String(qVersion()); } diff --git a/src/plugins/qmlprofiler/qmleventlocation.h b/src/plugins/qmlprofiler/qmleventlocation.h index b29440987cc..5faf9071019 100644 --- a/src/plugins/qmlprofiler/qmleventlocation.h +++ b/src/plugins/qmlprofiler/qmleventlocation.h @@ -76,7 +76,7 @@ inline bool operator!=(const QmlEventLocation &location1, const QmlEventLocation return !(location1 == location2); } -inline uint qHash(const QmlEventLocation &location) +inline auto qHash(const QmlEventLocation &location) { return qHash(location.filename()) ^ ((location.line() & 0xfff) // 12 bits of line number diff --git a/src/plugins/qnx/qnxdeviceprocesslist.cpp b/src/plugins/qnx/qnxdeviceprocesslist.cpp index 81b2fb531b9..1269ea3c165 100644 --- a/src/plugins/qnx/qnxdeviceprocesslist.cpp +++ b/src/plugins/qnx/qnxdeviceprocesslist.cpp @@ -26,6 +26,7 @@ #include "qnxdeviceprocesslist.h" #include +#include #include #include diff --git a/src/plugins/qnx/qnxdeviceprocesssignaloperation.cpp b/src/plugins/qnx/qnxdeviceprocesssignaloperation.cpp index df2f95913fb..be72624d7ce 100644 --- a/src/plugins/qnx/qnxdeviceprocesssignaloperation.cpp +++ b/src/plugins/qnx/qnxdeviceprocesssignaloperation.cpp @@ -25,6 +25,8 @@ #include "qnxdeviceprocesssignaloperation.h" +#include + using namespace Qnx; using namespace Qnx::Internal; diff --git a/src/plugins/qnx/qnxdevicetester.cpp b/src/plugins/qnx/qnxdevicetester.cpp index f4a88b62b62..17787274c0f 100644 --- a/src/plugins/qnx/qnxdevicetester.cpp +++ b/src/plugins/qnx/qnxdevicetester.cpp @@ -28,6 +28,7 @@ #include #include +#include namespace Qnx { namespace Internal { diff --git a/src/plugins/remotelinux/genericlinuxdeviceconfigurationwizard.cpp b/src/plugins/remotelinux/genericlinuxdeviceconfigurationwizard.cpp index e4c7565b037..63596622e82 100644 --- a/src/plugins/remotelinux/genericlinuxdeviceconfigurationwizard.cpp +++ b/src/plugins/remotelinux/genericlinuxdeviceconfigurationwizard.cpp @@ -30,6 +30,7 @@ #include "remotelinux_constants.h" #include +#include using namespace ProjectExplorer; using namespace QSsh; diff --git a/src/plugins/remotelinux/remotelinuxcheckforfreediskspaceservice.cpp b/src/plugins/remotelinux/remotelinuxcheckforfreediskspaceservice.cpp index e1d2447c510..4f75d409557 100644 --- a/src/plugins/remotelinux/remotelinuxcheckforfreediskspaceservice.cpp +++ b/src/plugins/remotelinux/remotelinuxcheckforfreediskspaceservice.cpp @@ -26,6 +26,7 @@ #include "remotelinuxcheckforfreediskspaceservice.h" #include +#include namespace RemoteLinux { namespace Internal { diff --git a/src/plugins/remotelinux/remotelinuxcustomcommanddeployservice.cpp b/src/plugins/remotelinux/remotelinuxcustomcommanddeployservice.cpp index 471ace1a0e6..7b7f59efd5c 100644 --- a/src/plugins/remotelinux/remotelinuxcustomcommanddeployservice.cpp +++ b/src/plugins/remotelinux/remotelinuxcustomcommanddeployservice.cpp @@ -26,6 +26,7 @@ #include "remotelinuxcustomcommanddeployservice.h" #include +#include #include using namespace QSsh; diff --git a/src/plugins/remotelinux/remotelinuxkillappservice.cpp b/src/plugins/remotelinux/remotelinuxkillappservice.cpp index c3ce06c2548..73e7b697e5c 100644 --- a/src/plugins/remotelinux/remotelinuxkillappservice.cpp +++ b/src/plugins/remotelinux/remotelinuxkillappservice.cpp @@ -25,6 +25,8 @@ #include "remotelinuxkillappservice.h" +#include +# namespace RemoteLinux { namespace Internal { class RemoteLinuxKillAppServicePrivate diff --git a/src/plugins/remotelinux/remotelinuxpackageinstaller.cpp b/src/plugins/remotelinux/remotelinuxpackageinstaller.cpp index bf27f6d03ea..e61a0bb7e9d 100644 --- a/src/plugins/remotelinux/remotelinuxpackageinstaller.cpp +++ b/src/plugins/remotelinux/remotelinuxpackageinstaller.cpp @@ -26,6 +26,7 @@ #include "remotelinuxpackageinstaller.h" #include +#include #include using namespace ProjectExplorer; diff --git a/src/plugins/remotelinux/remotelinuxsignaloperation.cpp b/src/plugins/remotelinux/remotelinuxsignaloperation.cpp index 5a5def6bb31..b2dcdf1233b 100644 --- a/src/plugins/remotelinux/remotelinuxsignaloperation.cpp +++ b/src/plugins/remotelinux/remotelinuxsignaloperation.cpp @@ -28,6 +28,7 @@ #include #include #include +#include using namespace RemoteLinux; using namespace ProjectExplorer;