From f248d0a7377918b5ffbb3fede9f8df9d45e16ab6 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 5 Jul 2021 11:24:37 +0200 Subject: [PATCH 01/16] ClangFormat: Add xfailing unit test Task-number: QTCREATORBUG-25966 Change-Id: If8f28bd5195f2681cca209b41bcc93fad0695541 Reviewed-by: Christian Stenger --- tests/unit/unittest/clangformat-test.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/unit/unittest/clangformat-test.cpp b/tests/unit/unittest/clangformat-test.cpp index 2ce3eba24ab..b6312866927 100644 --- a/tests/unit/unittest/clangformat-test.cpp +++ b/tests/unit/unittest/clangformat-test.cpp @@ -957,6 +957,28 @@ TEST_F(ClangFormat, ChainedMemberFunctionCalls) " .func();")); } +TEST_F(ClangFormat, DISABLED_CommentBlock) +{ + insertLines({"/****************************************************************************", + "**", + "** Copyright (C) 2021 The Qt Company Ltd.", + "** Contact: https://www.qt.io/licensing/", + "**", + "** This file is part of Qt Creator.", + "**", + "****************************************************************************/"}); + indenter.indent(cursor, QChar::Null, TextEditor::TabSettings()); + ASSERT_THAT(documentLines(), ElementsAre( + "/****************************************************************************", + "**", + "** Copyright (C) 2021 The Qt Company Ltd.", + "** Contact: https://www.qt.io/licensing/", + "**", + "** This file is part of Qt Creator.", + "**", + "****************************************************************************/")); +} + // clang-format on } // namespace From de2c26f7f589aea34afdb8bfce68ee60f8358389 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 5 Jul 2021 11:31:29 +0200 Subject: [PATCH 02/16] ClangFormat: Prevent adding/removing lines when indenting In indentation-only mode, any edit that adds or removes newlines is wrong by definition. Change-Id: Ida6e729f4d5e8dcd7893fb2bb9407e596661f942 Reviewed-by: Christian Stenger --- src/plugins/clangformat/clangformatbaseindenter.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/plugins/clangformat/clangformatbaseindenter.cpp b/src/plugins/clangformat/clangformatbaseindenter.cpp index 4a595dd4116..e210263770f 100644 --- a/src/plugins/clangformat/clangformatbaseindenter.cpp +++ b/src/plugins/clangformat/clangformatbaseindenter.cpp @@ -92,6 +92,11 @@ clang::tooling::Replacements filteredReplacements(const QByteArray &buffer, llvm::StringRef text = replacementsToKeep == ReplacementsToKeep::OnlyIndent ? clearExtraNewline(replacement.getReplacementText()) : replacement.getReplacementText(); + if (replacementsToKeep == ReplacementsToKeep::OnlyIndent && int(text.count('\n')) + != buffer.mid(replacementOffset, replacement.getLength()).count('\n')) { + continue; + } + llvm::Error error = filtered.add( clang::tooling::Replacement(replacement.getFilePath(), From 100c5f5c2625492bd5297d12d5d3b114b334eeb4 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 24 Jun 2021 17:02:14 +0200 Subject: [PATCH 03/16] Doc: Update screenshot of text editor color schemes The code elements for which users can define colors are not listed in the docs, but the updated screenshot shows the new parameters setting. Task-number: QTCREATORBUG-25642 Change-Id: I5cd640b85f16d3bcd8be9c4b61f93c0da80c3d98 Reviewed-by: David Schulz --- .../images/qtcreator-font-colors.png | Bin 16846 -> 16917 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/qtcreator/images/qtcreator-font-colors.png b/doc/qtcreator/images/qtcreator-font-colors.png index ef6653319bf5757d14a62adde79c3f8a825d6d7a..8dfb7451e5a02c0124e0334f5c286cadb1592197 100644 GIT binary patch literal 16917 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 RfA|Da^n~bqfFh literal 16846 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ΞrHE8ZXIs_o_o12b28(i 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

$t`EGElr&p&9X#ldYe!?@|f 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 From fd71cbf1354c4a53882eda3f4422310a8373bcca Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 5 Jul 2021 13:39:18 +0200 Subject: [PATCH 04/16] Docker: Properly map back DockerDevice::directoryEntries() result Even though the file is accessible in the local path, not mapping back loses its relation do the docker container used for further decisions like FilePath::needsDevice(). Change-Id: I7c693d604364b9e42bf7310c072be0f33d149626 Reviewed-by: Christian Stenger --- src/plugins/docker/dockerdevice.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 26950d285fe..accf6895c11 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -1037,15 +1037,19 @@ FilePath DockerDevice::searchInPath(const FilePath &filePath) const return mapToGlobalPath(FilePath::fromString(output)); } -QList DockerDevice::directoryEntries(const FilePath &filePath, - const QStringList &nameFilters, - QDir::Filters filters, - QDir::SortFlags sort) const +FilePaths DockerDevice::directoryEntries(const FilePath &filePath, + const QStringList &nameFilters, + QDir::Filters filters, + QDir::SortFlags sort) const { QTC_ASSERT(handlesFile(filePath), return {}); tryCreateLocalFileAccess(); - if (hasLocalFileAccess()) - return mapToLocalAccess(filePath).dirEntries(nameFilters, filters, sort); + if (hasLocalFileAccess()) { + const FilePaths entries = mapToLocalAccess(filePath).dirEntries(nameFilters, filters, sort); + return Utils::transform(entries, [this](const FilePath &entry) { + return mapFromLocalAccess(entry); + }); + } QTC_CHECK(false); // FIXME: Implement return {}; From 2eef40bb8505f97b0b714e00aa1401e941f1183a Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Fri, 25 Jun 2021 19:55:52 +0200 Subject: [PATCH 05/16] qmldesigner: fix error output at puppet crashes Change-Id: I6c2a8d655e996e6f935d069a97a45e64ad0ef5b9 Reviewed-by: Qt CI Bot Reviewed-by: Marco Bubke --- .../instances/baseconnectionmanager.cpp | 4 ++-- .../designercore/instances/baseconnectionmanager.h | 2 +- .../instances/capturingconnectionmanager.cpp | 6 +++--- .../instances/capturingconnectionmanager.h | 2 +- .../designercore/instances/connectionmanager.cpp | 13 ++++--------- .../designercore/instances/connectionmanager.h | 2 +- .../instances/connectionmanagerinterface.h | 2 +- .../instances/interactiveconnectionmanager.cpp | 2 +- 8 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/instances/baseconnectionmanager.cpp b/src/plugins/qmldesigner/designercore/instances/baseconnectionmanager.cpp index 794c1a436c0..39590beadf7 100644 --- a/src/plugins/qmldesigner/designercore/instances/baseconnectionmanager.cpp +++ b/src/plugins/qmldesigner/designercore/instances/baseconnectionmanager.cpp @@ -66,9 +66,9 @@ bool BaseConnectionManager::isActive() const void BaseConnectionManager::showCannotConnectToPuppetWarningAndSwitchToEditMode() {} -void BaseConnectionManager::processFinished() +void BaseConnectionManager::processFinished(const QString &reason) { - processFinished(-1, QProcess::CrashExit); + processFinished(-1, QProcess::CrashExit, reason); } void BaseConnectionManager::writeCommandToIODevice(const QVariant &command, diff --git a/src/plugins/qmldesigner/designercore/instances/baseconnectionmanager.h b/src/plugins/qmldesigner/designercore/instances/baseconnectionmanager.h index fca035682fc..58588542f7f 100644 --- a/src/plugins/qmldesigner/designercore/instances/baseconnectionmanager.h +++ b/src/plugins/qmldesigner/designercore/instances/baseconnectionmanager.h @@ -64,7 +64,7 @@ protected: void dispatchCommand(const QVariant &command, Connection &connection) override; virtual void showCannotConnectToPuppetWarningAndSwitchToEditMode(); using ConnectionManagerInterface::processFinished; - void processFinished(); + void processFinished(const QString &reason); static void writeCommandToIODevice(const QVariant &command, QIODevice *ioDevice, unsigned int commandCounter); diff --git a/src/plugins/qmldesigner/designercore/instances/capturingconnectionmanager.cpp b/src/plugins/qmldesigner/designercore/instances/capturingconnectionmanager.cpp index 90f4226217d..3e68e3342c1 100644 --- a/src/plugins/qmldesigner/designercore/instances/capturingconnectionmanager.cpp +++ b/src/plugins/qmldesigner/designercore/instances/capturingconnectionmanager.cpp @@ -54,17 +54,17 @@ void CapturingConnectionManager::setUp(NodeInstanceServerInterface *nodeInstance } } -void CapturingConnectionManager::processFinished(int exitCode, QProcess::ExitStatus exitStatus) +void CapturingConnectionManager::processFinished(int exitCode, QProcess::ExitStatus exitStatus, const QString &connectionName) { if (m_captureFileForTest.isOpen()) { m_captureFileForTest.close(); Core::AsynchronousMessageBox::warning( - tr("QML Emulation Layer (QML Puppet) Crashed"), + tr("QML Emulation Layer (QML Puppet - %1) Crashed").arg(connectionName), tr("You are recording a puppet stream and the emulations layer crashed. " "It is recommended to reopen the Qt Quick Designer and start again.")); } - InteractiveConnectionManager::processFinished(exitCode, exitStatus); + InteractiveConnectionManager::processFinished(exitCode, exitStatus, connectionName); } void CapturingConnectionManager::writeCommand(const QVariant &command) diff --git a/src/plugins/qmldesigner/designercore/instances/capturingconnectionmanager.h b/src/plugins/qmldesigner/designercore/instances/capturingconnectionmanager.h index 91b73687c80..7552fa27902 100644 --- a/src/plugins/qmldesigner/designercore/instances/capturingconnectionmanager.h +++ b/src/plugins/qmldesigner/designercore/instances/capturingconnectionmanager.h @@ -39,7 +39,7 @@ public: ProjectExplorer::Target *target, AbstractView *view) override; - void processFinished(int exitCode, QProcess::ExitStatus exitStatus) override; + void processFinished(int exitCode, QProcess::ExitStatus exitStatus, const QString &connectionName) override; void writeCommand(const QVariant &command) override; diff --git a/src/plugins/qmldesigner/designercore/instances/connectionmanager.cpp b/src/plugins/qmldesigner/designercore/instances/connectionmanager.cpp index 77ea8706bf1..3f28389b539 100644 --- a/src/plugins/qmldesigner/designercore/instances/connectionmanager.cpp +++ b/src/plugins/qmldesigner/designercore/instances/connectionmanager.cpp @@ -69,7 +69,7 @@ void ConnectionManager::setUp(NodeInstanceServerInterface *nodeInstanceServerPro socketToken, [&] { printProcessOutput(connection.qmlPuppetProcess.get(), connection.name); }, [&](int exitCode, QProcess::ExitStatus exitStatus) { - processFinished(exitCode, exitStatus); + processFinished(exitCode, exitStatus, connection.name); }); const int second = 1000; @@ -122,15 +122,10 @@ void ConnectionManager::writeCommand(const QVariant &command) m_writeCommandCounter++; } -void ConnectionManager::processFinished(int exitCode, QProcess::ExitStatus exitStatus) +void ConnectionManager::processFinished(int exitCode, QProcess::ExitStatus exitStatus, const QString &connectionName) { - auto finishedProcess = qobject_cast(sender()); - if (finishedProcess) - qWarning() << "Process" << (exitStatus == QProcess::CrashExit ? "crashed:" : "finished:") - << finishedProcess->arguments() << "exitCode:" << exitCode; - else - qWarning() << "Process" << (exitStatus == QProcess::CrashExit ? "crashed:" : "finished:") - << sender() << "exitCode:" << exitCode; + qWarning() << "Process" << connectionName <<(exitStatus == QProcess::CrashExit ? "crashed:" : "finished:") + << "with exitCode:" << exitCode; writeCommand(QVariant::fromValue(EndPuppetCommand())); diff --git a/src/plugins/qmldesigner/designercore/instances/connectionmanager.h b/src/plugins/qmldesigner/designercore/instances/connectionmanager.h index c3c2c34afbf..fec3adac060 100644 --- a/src/plugins/qmldesigner/designercore/instances/connectionmanager.h +++ b/src/plugins/qmldesigner/designercore/instances/connectionmanager.h @@ -58,7 +58,7 @@ public: protected: using BaseConnectionManager::processFinished; - void processFinished(int exitCode, QProcess::ExitStatus exitStatus) override; + void processFinished(int exitCode, QProcess::ExitStatus exitStatus, const QString &connectionName) override; std::vector &connections() { return m_connections; } quint32 &writeCommandCounter() { return m_writeCommandCounter; } diff --git a/src/plugins/qmldesigner/designercore/instances/connectionmanagerinterface.h b/src/plugins/qmldesigner/designercore/instances/connectionmanagerinterface.h index 2fc75c61c22..319c7407676 100644 --- a/src/plugins/qmldesigner/designercore/instances/connectionmanagerinterface.h +++ b/src/plugins/qmldesigner/designercore/instances/connectionmanagerinterface.h @@ -79,7 +79,7 @@ public: protected: virtual void dispatchCommand(const QVariant &command, Connection &connection) = 0; - virtual void processFinished(int exitCode, QProcess::ExitStatus exitStatus) = 0; + virtual void processFinished(int exitCode, QProcess::ExitStatus exitStatus, const QString &connectionName) = 0; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/instances/interactiveconnectionmanager.cpp b/src/plugins/qmldesigner/designercore/instances/interactiveconnectionmanager.cpp index a8c1ecd5fee..dd2f47e5558 100644 --- a/src/plugins/qmldesigner/designercore/instances/interactiveconnectionmanager.cpp +++ b/src/plugins/qmldesigner/designercore/instances/interactiveconnectionmanager.cpp @@ -107,7 +107,7 @@ void InteractiveConnectionManager::puppetTimeout(Connection &connection) return; } - processFinished(); + processFinished(connection.name + "_timeout"); } void InteractiveConnectionManager::puppetAlive(Connection &connection) From dbb5ab932c678f7468f345f3b49f5213ce6b9f96 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 5 Jul 2021 12:45:24 +0200 Subject: [PATCH 06/16] CMake build: Don't re-link libraries unnecessarily If a library changes its implementation only, don't relink all libraries that depend on it. This is usually not necessary since the API stayed the same. Fixes: QTCREATORBUG-25962 Change-Id: I0221b09afd92463c3dad40bd0107ba0d5668ac79 Reviewed-by: hjk Reviewed-by: Cristian Adam --- cmake/QtCreatorAPI.cmake | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmake/QtCreatorAPI.cmake b/cmake/QtCreatorAPI.cmake index ed3602e6d6d..fafa5180e74 100644 --- a/cmake/QtCreatorAPI.cmake +++ b/cmake/QtCreatorAPI.cmake @@ -241,6 +241,7 @@ function(add_qtc_library name) qtc_output_binary_dir(_output_binary_dir) string(REGEX MATCH "^[0-9]*" IDE_VERSION_MAJOR ${IDE_VERSION}) set_target_properties(${name} PROPERTIES + LINK_DEPENDS_NO_SHARED ON SOURCES_DIR "${CMAKE_CURRENT_SOURCE_DIR}" VERSION "${IDE_VERSION}" SOVERSION "${IDE_VERSION_MAJOR}" @@ -497,6 +498,7 @@ function(add_qtc_plugin target_name) qtc_output_binary_dir(_output_binary_dir) set_target_properties(${target_name} PROPERTIES + LINK_DEPENDS_NO_SHARED ON SOURCES_DIR "${CMAKE_CURRENT_SOURCE_DIR}" MACHO_CURRENT_VERSION ${IDE_VERSION} MACHO_COMPATIBILITY_VERSION ${IDE_VERSION_COMPAT} @@ -694,6 +696,7 @@ function(add_qtc_executable name) qtc_output_binary_dir(_output_binary_dir) set_target_properties("${name}" PROPERTIES + LINK_DEPENDS_NO_SHARED ON BUILD_RPATH "${build_rpath}" INSTALL_RPATH "${install_rpath}" RUNTIME_OUTPUT_DIRECTORY "${_output_binary_dir}/${_DESTINATION}" @@ -844,6 +847,7 @@ function(add_qtc_test name) ) set_target_properties(${name} PROPERTIES + LINK_DEPENDS_NO_SHARED ON CXX_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN ON BUILD_RPATH "${_RPATH_BASE}/${_RPATH}" From dcf692d3ff198f1ceea5e1b563c569d4384d6d45 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Mon, 5 Jul 2021 15:48:37 +0300 Subject: [PATCH 07/16] CMake build: Purge copying settings from Nokia directory It is not used, and not supported in the other build systems. Change-Id: I38049e145595490058e255b94cdb8dd13c3f6fb2 Reviewed-by: Eike Ziller --- cmake/QtCreatorIDEBranding.cmake | 1 - src/app/app_version.h.cmakein | 1 - src/app/app_version.h.in | 6 ----- src/app/main.cpp | 45 +------------------------------- 4 files changed, 1 insertion(+), 52 deletions(-) diff --git a/cmake/QtCreatorIDEBranding.cmake b/cmake/QtCreatorIDEBranding.cmake index bcd788bc6f1..bf5ec9e4e76 100644 --- a/cmake/QtCreatorIDEBranding.cmake +++ b/cmake/QtCreatorIDEBranding.cmake @@ -4,7 +4,6 @@ set(IDE_VERSION_DISPLAY "5.0.0-beta1") # The IDE display version. set(IDE_COPYRIGHT_YEAR "2021") # The IDE current copyright year. set(IDE_SETTINGSVARIANT "QtProject") # The IDE settings variation. -set(IDE_COPY_SETTINGSVARIANT "Nokia") # The IDE settings to initially import. set(IDE_DISPLAY_NAME "Qt Creator") # The IDE display name. set(IDE_ID "qtcreator") # The IDE id (no spaces, lowercase!) set(IDE_CASED_ID "QtCreator") # The cased IDE id (no spaces!) diff --git a/src/app/app_version.h.cmakein b/src/app/app_version.h.cmakein index 49abfc4ec88..453ab5875aa 100644 --- a/src/app/app_version.h.cmakein +++ b/src/app/app_version.h.cmakein @@ -49,7 +49,6 @@ const char IDE_REVISION_URL[] = "${IDE_REVISION_URL}"; // changes the path where the settings are saved to const char IDE_SETTINGSVARIANT_STR[] = "${IDE_SETTINGSVARIANT}"; -const char IDE_COPY_SETTINGS_FROM_VARIANT_STR[] = "${IDE_COPY_SETTINGSVARIANT}"; } // Constants } // Core diff --git a/src/app/app_version.h.in b/src/app/app_version.h.in index 7a525bf211f..7c24e9eb9ec 100644 --- a/src/app/app_version.h.in +++ b/src/app/app_version.h.in @@ -65,12 +65,6 @@ const char IDE_SETTINGSVARIANT_STR[] = STRINGIFY(IDE_SETTINGSVARIANT); const char IDE_SETTINGSVARIANT_STR[] = \"QtProject\"; #endif -#ifdef IDE_COPY_SETTINGS_FROM_VARIANT -const char IDE_COPY_SETTINGS_FROM_VARIANT_STR[] = STRINGIFY(IDE_COPY_SETTINGS_FROM_VARIANT); -#else -const char IDE_COPY_SETTINGS_FROM_VARIANT_STR[] = \"\"; -#endif - #undef IDE_VERSION_COMPAT_DEF #undef IDE_VERSION_DISPLAY_DEF #undef IDE_VERSION diff --git a/src/app/main.cpp b/src/app/main.cpp index 77c08cbd088..418f2f7ada6 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -290,49 +290,6 @@ static Utils::QtcSettings *createUserSettings() QLatin1String(Core::Constants::IDE_CASED_ID)); } -static inline Utils::QtcSettings *userSettings() -{ - Utils::QtcSettings *settings = createUserSettings(); - const QString fromVariant = QLatin1String(Core::Constants::IDE_COPY_SETTINGS_FROM_VARIANT_STR); - if (fromVariant.isEmpty()) - return settings; - - // Copy old settings to new ones: - QFileInfo pathFi = QFileInfo(settings->fileName()); - if (pathFi.exists()) // already copied. - return settings; - - QDir destDir = pathFi.absolutePath(); - if (!destDir.exists()) - destDir.mkpath(pathFi.absolutePath()); - - QDir srcDir = destDir; - srcDir.cdUp(); - if (!srcDir.cd(fromVariant)) - return settings; - - if (srcDir == destDir) // Nothing to copy and no settings yet - return settings; - - const QStringList entries = srcDir.entryList(); - for (const QString &file : entries) { - const QString lowerFile = file.toLower(); - if (lowerFile.startsWith(QLatin1String("profiles.xml")) - || lowerFile.startsWith(QLatin1String("toolchains.xml")) - || lowerFile.startsWith(QLatin1String("qtversion.xml")) - || lowerFile.startsWith(QLatin1String("devices.xml")) - || lowerFile.startsWith(QLatin1String("debuggers.xml")) - || lowerFile.startsWith(QLatin1String(Core::Constants::IDE_ID) + ".")) - QFile::copy(srcDir.absoluteFilePath(file), destDir.absoluteFilePath(file)); - if (file == QLatin1String(Core::Constants::IDE_ID)) - copyRecursively(srcDir.absoluteFilePath(file), destDir.absoluteFilePath(file)); - } - - // Make sure to use the copied settings: - delete settings; - return createUserSettings(); -} - static void setHighDpiEnvironmentVariable() { @@ -595,7 +552,7 @@ int main(int argc, char **argv) /*Initialize global settings and resetup install settings with QApplication::applicationDirPath */ setupInstallSettings(options.installSettingsPath); - Utils::QtcSettings *settings = userSettings(); + Utils::QtcSettings *settings = createUserSettings(); Utils::QtcSettings *globalSettings = new Utils::QtcSettings(QSettings::IniFormat, QSettings::SystemScope, From 8cc4bbe4d823053c13d1e0c46fb25987d1ab18bc Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 5 Jul 2021 13:25:29 +0200 Subject: [PATCH 08/16] ClangFormat: Prepend a space character to our inserted line comment Otherwise, we could introduce unwanted syntactical constructs, for instance if the previous character is an asterisk. Fixes: QTCREATORBUG-25966 Change-Id: Ic0b535861bc1cb4f5f93d06bb11d0f3c7c583893 Reviewed-by: Eike Ziller --- src/plugins/clangformat/clangformatbaseindenter.cpp | 4 ++-- tests/unit/unittest/clangformat-test.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/clangformat/clangformatbaseindenter.cpp b/src/plugins/clangformat/clangformatbaseindenter.cpp index e210263770f..fa95514ca32 100644 --- a/src/plugins/clangformat/clangformatbaseindenter.cpp +++ b/src/plugins/clangformat/clangformatbaseindenter.cpp @@ -300,8 +300,8 @@ int forceIndentWithExtraText(QByteArray &buffer, if (block.previous().isValid()) { const int prevEndOffset = Utils::Text::utf8NthLineOffset(block.document(), buffer, block.blockNumber()) + block.previous().text().length(); - buffer.insert(prevEndOffset, "//"); - extraLength += 2; + buffer.insert(prevEndOffset, " //"); + extraLength += 3; } } buffer.insert(utf8Offset + extraLength, dummyText); diff --git a/tests/unit/unittest/clangformat-test.cpp b/tests/unit/unittest/clangformat-test.cpp index b6312866927..9aec542edfd 100644 --- a/tests/unit/unittest/clangformat-test.cpp +++ b/tests/unit/unittest/clangformat-test.cpp @@ -957,7 +957,7 @@ TEST_F(ClangFormat, ChainedMemberFunctionCalls) " .func();")); } -TEST_F(ClangFormat, DISABLED_CommentBlock) +TEST_F(ClangFormat, CommentBlock) { insertLines({"/****************************************************************************", "**", From 2e9604c0920701ba32f058ceebb11d72292a1dff Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 2 Jul 2021 15:37:12 +0200 Subject: [PATCH 09/16] Utils: Do not save file upon PersistentSettingsWriter destruction The m_savedData member is set on two occasions: Once directly after reading the same file that is going to be written, and once directly after a successful file save. In neither case do we have to write it out again. Fixes: QTCREATORBUG-25921 Change-Id: Ie369e280f4189aefb6b2ad291426ee9e6f1ed16d Reviewed-by: Eike Ziller --- src/libs/utils/persistentsettings.cpp | 5 ----- src/libs/utils/persistentsettings.h | 1 - 2 files changed, 6 deletions(-) diff --git a/src/libs/utils/persistentsettings.cpp b/src/libs/utils/persistentsettings.cpp index eda01977de0..4cebb43c7ca 100644 --- a/src/libs/utils/persistentsettings.cpp +++ b/src/libs/utils/persistentsettings.cpp @@ -427,11 +427,6 @@ PersistentSettingsWriter::PersistentSettingsWriter(const FilePath &fileName, con m_fileName(fileName), m_docType(docType) { } -PersistentSettingsWriter::~PersistentSettingsWriter() -{ - write(m_savedData, nullptr); -} - bool PersistentSettingsWriter::save(const QVariantMap &data, QString *errorString) const { if (data == m_savedData) diff --git a/src/libs/utils/persistentsettings.h b/src/libs/utils/persistentsettings.h index 92dbf0d8c98..20802ea2630 100644 --- a/src/libs/utils/persistentsettings.h +++ b/src/libs/utils/persistentsettings.h @@ -52,7 +52,6 @@ class QTCREATOR_UTILS_EXPORT PersistentSettingsWriter { public: PersistentSettingsWriter(const FilePath &fileName, const QString &docType); - ~PersistentSettingsWriter(); bool save(const QVariantMap &data, QString *errorString) const; #ifdef QT_GUI_LIB From 1e11f3eadef2ecefe3d487c5a026431d37fa96de Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 5 Jul 2021 16:16:12 +0200 Subject: [PATCH 10/16] ProjectExplorer: Introduce DeviceManager::defaultDesktopDevice() Just syntactic sugar to make doing the right thing less painful. Change-Id: Ia51cda20e5395925215f226b9a379af66fddfd8b Reviewed-by: Christian Kandeler --- src/plugins/perfprofiler/perftracepointdialog.cpp | 4 +--- .../projectexplorer/customexecutablerunconfiguration.cpp | 2 +- src/plugins/projectexplorer/devicesupport/devicemanager.cpp | 5 +++++ src/plugins/projectexplorer/devicesupport/devicemanager.h | 2 ++ src/plugins/projectexplorer/kitinformation.cpp | 3 +-- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/plugins/perfprofiler/perftracepointdialog.cpp b/src/plugins/perfprofiler/perftracepointdialog.cpp index c6ca317d913..771471b186f 100644 --- a/src/plugins/perfprofiler/perftracepointdialog.cpp +++ b/src/plugins/perfprofiler/perftracepointdialog.cpp @@ -63,10 +63,8 @@ PerfTracePointDialog::PerfTracePointDialog() : } if (!m_device) { - const DeviceManager *deviceManager = DeviceManager::instance(); - // There should at least be a desktop device. - m_device = deviceManager->defaultDevice(Constants::DESKTOP_DEVICE_TYPE); + m_device = DeviceManager::defaultDesktopDevice(); QTC_ASSERT(m_device, return); } diff --git a/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp b/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp index 1c8b125b578..b59113d25f6 100644 --- a/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp +++ b/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp @@ -104,7 +104,7 @@ Runnable CustomExecutableRunConfiguration::runnable() const r.setCommandLine(commandLine()); r.environment = aspect()->environment(); r.workingDirectory = workingDirectory.toString(); - r.device = DeviceManager::instance()->defaultDevice(Constants::DESKTOP_DEVICE_TYPE); + r.device = DeviceManager::defaultDesktopDevice(); if (!r.executable.isEmpty()) { const QString expanded = macroExpander()->expand(r.executable.toString()); diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp index 532240b1331..97c700eb2b5 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp @@ -331,6 +331,11 @@ IDevice::ConstPtr DeviceManager::deviceForPath(const FilePath &path) return {}; } +IDevice::ConstPtr DeviceManager::defaultDesktopDevice() +{ + return m_instance->defaultDevice(Constants::DESKTOP_DEVICE_TYPE); +} + void DeviceManager::setDefaultDevice(Utils::Id id) { QTC_ASSERT(this != instance(), return); diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.h b/src/plugins/projectexplorer/devicesupport/devicemanager.h index ef8047e0a57..466adb36b9b 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.h +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.h @@ -69,7 +69,9 @@ public: void setDeviceState(Utils::Id deviceId, IDevice::DeviceState deviceState); bool isLoaded() const; + static IDevice::ConstPtr deviceForPath(const Utils::FilePath &path); + static IDevice::ConstPtr defaultDesktopDevice(); signals: void deviceAdded(Utils::Id id); diff --git a/src/plugins/projectexplorer/kitinformation.cpp b/src/plugins/projectexplorer/kitinformation.cpp index f6f651b8688..2b1fd0d711b 100644 --- a/src/plugins/projectexplorer/kitinformation.cpp +++ b/src/plugins/projectexplorer/kitinformation.cpp @@ -1231,8 +1231,7 @@ BuildDeviceKitAspect::BuildDeviceKitAspect() QVariant BuildDeviceKitAspect::defaultValue(const Kit *k) const { Q_UNUSED(k); - IDevice::ConstPtr defaultDevice = - DeviceManager::instance()->defaultDevice(Constants::DESKTOP_DEVICE_TYPE); + IDevice::ConstPtr defaultDevice = DeviceManager::defaultDesktopDevice(); return defaultDevice->id().toString(); } From e4376e6b3d9e9d8c65d24c7fc693667fd0c52203 Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Mon, 5 Jul 2021 21:39:48 +0200 Subject: [PATCH 11/16] QmlDesigner: QtTest is a better check QtQuick.2 was moved to QtQuick in Qt6 Task-number: QDS-4661 Change-Id: I514fcb51c2b46dbef5cc9af79672abc3e86ebbbc Reviewed-by: Tim Jenssen --- .../qmldesigner/designercore/instances/puppetcreator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp b/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp index 9a40a6a8ced..7051164bb1a 100644 --- a/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp +++ b/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp @@ -452,7 +452,7 @@ static void filterOutQtBaseImportPath(QStringList *stringList) { Utils::erase(*stringList, [](const QString &string) { QDir dir(string); - return dir.dirName() == "qml" && !dir.entryInfoList(QStringList("QtQuick.2"), QDir::Dirs).isEmpty(); + return dir.dirName() == "qml" && !dir.entryInfoList(QStringList("QtTest"), QDir::Dirs).isEmpty(); }); } From 5d33982513e0bbb517120d2cb216490a0c110de6 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 5 Jul 2021 09:45:44 +0200 Subject: [PATCH 12/16] LSP: reload semantic token if we encounter corrupted data Change-Id: I73185b0b7be57d348fc1a461b1db0383313d7208 Reviewed-by: Christian Kandeler Reviewed-by: Qt CI Bot --- .../semantichighlightsupport.cpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/plugins/languageclient/semantichighlightsupport.cpp b/src/plugins/languageclient/semantichighlightsupport.cpp index db6cd9f907d..3aafaf5b42f 100644 --- a/src/plugins/languageclient/semantichighlightsupport.cpp +++ b/src/plugins/languageclient/semantichighlightsupport.cpp @@ -39,10 +39,11 @@ using namespace LanguageServerProtocol; using namespace TextEditor; namespace LanguageClient { -namespace SemanticHighligtingSupport { static Q_LOGGING_CATEGORY(LOGLSPHIGHLIGHT, "qtc.languageclient.highlight", QtWarningMsg); +namespace SemanticHighligtingSupport { + static const QList> highlightScopes(const ServerCapabilities &capabilities) { return capabilities.semanticHighlighting() @@ -399,15 +400,27 @@ void SemanticTokenSupport::handleSemanticTokensDelta( newData.reserve(newDataSize); auto it = data.begin(); + const auto end = data.end(); for (const SemanticTokensEdit &edit : qAsConst(edits)) { if (edit.start() > data.size()) // prevent edits after the previously reported data return; for (const auto start = data.begin() + edit.start(); it < start; ++it) newData.append(*it); newData.append(edit.data().value_or(QList())); - it += edit.deleteCount(); + int deleteCount = edit.deleteCount(); + if (deleteCount > std::distance(it, end)) { + qCDebug(LOGLSPHIGHLIGHT) + << "We shall delete more highlight data entries than we actually have, " + "so we are out of sync with the server. " + "Request full semantic tokens again."; + TextDocument *doc = TextDocument::textDocumentForFilePath(filePath); + if (doc && LanguageClientManager::clientForDocument(doc) == m_client) + reloadSemanticTokens(doc); + return; + } + it += deleteCount; } - for (const auto end = data.end(); it != end; ++it) + for (; it != end; ++it) newData.append(*it); tokens.setData(newData); From 10ca1c711edcdf20921052158e76e53747f23cc4 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 1 Jul 2021 17:59:15 +0200 Subject: [PATCH 13/16] Docker: Partially split out kit item autodetection Most of it is independent of the docker device as such, this should be centralized somehow. This here is a first step. Change-Id: If32063559a4c7c6c3cecf1973e1ef1f634e5f8f4 Reviewed-by: Christian Stenger --- src/plugins/docker/dockerdevice.cpp | 184 ++++++++++++++++------------ src/plugins/docker/dockerdevice.h | 18 +++ 2 files changed, 124 insertions(+), 78 deletions(-) diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index accf6895c11..b2a7af5c985 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -232,6 +232,49 @@ class DockerPortsGatheringMethod : public PortsGatheringMethod } }; +class KitDetectorPrivate +{ + Q_DECLARE_TR_FUNCTIONS(ProjectExplorer::KitItemDetector) + +public: + KitDetectorPrivate(KitDetector *parent, const IDevice::ConstPtr &device) + : q(parent), m_device(device) + {} + + void autoDetect(); + void undoAutoDetect() const; + + QList autoDetectQtVersions() const; + QList autoDetectToolChains(); + void autoDetectCMake(); + void autoDetectDebugger(); + + KitDetector *q; + IDevice::ConstPtr m_device; + QString m_sharedId; +}; + +KitDetector::KitDetector(const IDevice::ConstPtr &device) + : d(new KitDetectorPrivate(this, device)) +{} + +KitDetector::~KitDetector() +{ + delete d; +} + +void KitDetector::autoDetect(const QString &sharedId) const +{ + d->m_sharedId = sharedId; + d->autoDetect(); +} + +void KitDetector::undoAutoDetect(const QString &sharedId) const +{ + d->m_sharedId = sharedId; + d->undoAutoDetect(); +} + class DockerDevicePrivate : public QObject { Q_DECLARE_TR_FUNCTIONS(Docker::Internal::DockerDevice) @@ -255,14 +298,6 @@ public: void tryCreateLocalFileAccess(); - void autoDetect(QTextBrowser *log); - void undoAutoDetect(QTextBrowser *log) const; - - QList autoDetectQtVersions(QTextBrowser *log) const; - QList autoDetectToolChains(QTextBrowser *log); - void autoDetectCMake(QTextBrowser *log); - void autoDetectDebugger(QTextBrowser *log); - void fetchSystemEnviroment(); DockerDevice *q; @@ -283,54 +318,59 @@ class DockerDeviceWidget final : public IDeviceWidget public: explicit DockerDeviceWidget(const IDevice::Ptr &device) - : IDeviceWidget(device) + : IDeviceWidget(device), m_kitItemDetector(device) { auto dockerDevice = device.dynamicCast(); QTC_ASSERT(dockerDevice, return); - auto idLabel = new QLabel(tr("Image ID:")); + DockerDeviceData &data = dockerDevice->data(); + + auto idLabel = new QLabel(tr("Image Id:")); m_idLineEdit = new QLineEdit; - m_idLineEdit->setText(dockerDevice->data().imageId); + m_idLineEdit->setText(data.imageId); m_idLineEdit->setEnabled(false); auto repoLabel = new QLabel(tr("Repository:")); m_repoLineEdit = new QLineEdit; - m_repoLineEdit->setText(dockerDevice->data().repo); + m_repoLineEdit->setText(data.repo); m_repoLineEdit->setEnabled(false); m_runAsOutsideUser = new QCheckBox(tr("Run as outside user")); m_runAsOutsideUser->setToolTip(tr("Use user ID and group ID of the user running Qt Creator " "in the Docker container.")); - m_runAsOutsideUser->setChecked(dockerDevice->data().useLocalUidGid); + m_runAsOutsideUser->setChecked(data.useLocalUidGid); m_runAsOutsideUser->setEnabled(HostOsInfo::isLinuxHost()); - connect(m_runAsOutsideUser, &QCheckBox::toggled, this, [dockerDevice](bool on) { - dockerDevice->data().useLocalUidGid = on; + connect(m_runAsOutsideUser, &QCheckBox::toggled, this, [&data](bool on) { + data.useLocalUidGid = on; }); m_pathsLineEdit = new QLineEdit; - m_pathsLineEdit->setText(dockerDevice->data().repo); + m_pathsLineEdit->setText(data.repo); m_pathsLineEdit->setToolTip(tr("Paths in this semi-colon separated list will be " "mapped one-to-one into the Docker container.")); - m_pathsLineEdit->setText(dockerDevice->data().mounts.join(';')); + m_pathsLineEdit->setText(data.mounts.join(';')); - connect(m_pathsLineEdit, &QLineEdit::textChanged, this, [dockerDevice](const QString &text) { - dockerDevice->data().mounts = text.split(';'); + connect(m_pathsLineEdit, &QLineEdit::textChanged, this, [&data](const QString &text) { + data.mounts = text.split(';'); }); auto logView = new QTextBrowser; + connect(&m_kitItemDetector, &KitDetector::logOutput, + logView, &QTextBrowser::append); auto autoDetectButton = new QPushButton(tr("Auto-detect Kit Items")); auto undoAutoDetectButton = new QPushButton(tr("Remove Auto-Detected Kit Items")); - connect(autoDetectButton, &QPushButton::clicked, this, [logView, dockerDevice] { + connect(autoDetectButton, &QPushButton::clicked, this, [this, logView, id = data.id(), dockerDevice] { logView->clear(); - dockerDevice->d->autoDetect(logView); + dockerDevice->tryCreateLocalFileAccess(); + m_kitItemDetector.autoDetect(id); }); - connect(undoAutoDetectButton, &QPushButton::clicked, this, [logView, dockerDevice] { + connect(undoAutoDetectButton, &QPushButton::clicked, this, [this, logView, id = data.id()] { logView->clear(); - dockerDevice->d->undoAutoDetect(logView); + m_kitItemDetector.undoAutoDetect(id); }); using namespace Layouting; @@ -356,6 +396,8 @@ private: QLineEdit *m_repoLineEdit; QCheckBox *m_runAsOutsideUser; QLineEdit *m_pathsLineEdit; + + KitDetector m_kitItemDetector; }; IDeviceWidget *DockerDevice::createWidget() @@ -424,146 +466,132 @@ DockerDeviceData &DockerDevice::data() return d->m_data; } -void DockerDevicePrivate::undoAutoDetect(QTextBrowser *log) const +void KitDetectorPrivate::undoAutoDetect() const { - const QString id = q->id().toString(); - for (Kit *kit : KitManager::kits()) { - if (kit->autoDetectionSource() == id) { - if (log) - log->append(tr("Removing kit: %1").arg(kit->displayName())); + if (kit->autoDetectionSource() == m_sharedId) { + emit q->logOutput(tr("Removing kit: %1").arg(kit->displayName())); KitManager::deregisterKit(kit); } }; for (BaseQtVersion *qtVersion : QtVersionManager::versions()) { - if (qtVersion->autodetectionSource() == id) { - if (log) - log->append(tr("Removing Qt version: %1").arg(qtVersion->displayName())); + if (qtVersion->autodetectionSource() == m_sharedId) { + emit q->logOutput(tr("Removing Qt version: %1").arg(qtVersion->displayName())); QtVersionManager::removeVersion(qtVersion); } }; - if (log) - log->append(tr("Tool chains not removed.")); + emit q->logOutput(tr("Tool chains not removed.")); // for (ToolChain *toolChain : ToolChainManager::toolChains()) { // if (toolChain->autoDetectionSource() == id.toString()) // // FIXME: Implement // }; - if (log) - log->append(tr("Removal of previously auto-detected kit items finished.") + '\n'); + emit q->logOutput(tr("Removal of previously auto-detected kit items finished.") + '\n'); } -QList DockerDevicePrivate::autoDetectQtVersions(QTextBrowser *log) const +QList KitDetectorPrivate::autoDetectQtVersions() const { QList qtVersions; QString error; const QStringList candidates = {"qmake-qt6", "qmake-qt5", "qmake"}; - if (log) - log->append('\n' + tr("Searching Qt installations...")); + emit q->logOutput('\n' + tr("Searching Qt installations...")); for (const QString &candidate : candidates) { - if (log) - log->append(tr("Searching for %1 executable...").arg(candidate)); - const FilePath qmake = q->searchInPath(FilePath::fromString(candidate)); + emit q->logOutput(tr("Searching for %1 executable...").arg(candidate)); + const FilePath qmake = m_device->searchInPath(FilePath::fromString(candidate)); if (qmake.isEmpty()) continue; - BaseQtVersion *qtVersion = QtVersionFactory::createQtVersionFromQMakePath(qmake, false, m_data.id(), &error); + BaseQtVersion *qtVersion = QtVersionFactory::createQtVersionFromQMakePath(qmake, false, m_sharedId, &error); if (!qtVersion) continue; qtVersions.append(qtVersion); QtVersionManager::addVersion(qtVersion); - if (log) - log->append(tr("Found Qt: %1").arg(qtVersion->qmakeCommand().toUserOutput())); + emit q->logOutput(tr("Found Qt: %1").arg(qtVersion->qmakeCommand().toUserOutput())); } - if (qtVersions.isEmpty() && log) - log->append(tr("No Qt installation found.")); + if (qtVersions.isEmpty()) + emit q->logOutput(tr("No Qt installation found.")); return qtVersions; } -QList DockerDevicePrivate::autoDetectToolChains(QTextBrowser *log) +QList KitDetectorPrivate::autoDetectToolChains() { const QList factories = ToolChainFactory::allToolChainFactories(); QList toolChains; QApplication::processEvents(); - log->append('\n' + tr("Searching tool chains...")); + emit q->logOutput('\n' + tr("Searching tool chains...")); for (ToolChainFactory *factory : factories) { - const QList newToolChains = factory->autoDetect(toolChains, q->sharedFromThis()); - log->append(tr("Searching tool chains of type %1").arg(factory->displayName())); + const QList newToolChains = factory->autoDetect(toolChains, m_device.constCast()); + emit q->logOutput(tr("Searching tool chains of type %1").arg(factory->displayName())); for (ToolChain *toolChain : newToolChains) { - log->append(tr("Found tool chain: %1").arg(toolChain->compilerCommand().toUserOutput())); + emit q->logOutput(tr("Found tool chain: %1").arg(toolChain->compilerCommand().toUserOutput())); ToolChainManager::registerToolChain(toolChain); toolChains.append(toolChain); } } - log->append(tr("%1 new tool chains found.").arg(toolChains.size())); + emit q->logOutput(tr("%1 new tool chains found.").arg(toolChains.size())); return toolChains; } -void DockerDevicePrivate::autoDetectCMake(QTextBrowser *log) +void KitDetectorPrivate::autoDetectCMake() { QObject *cmakeManager = ExtensionSystem::PluginManager::getObjectByName("CMakeToolManager"); if (!cmakeManager) return; - log->append('\n' + tr("Searching CMake binary...")); + emit q->logOutput('\n' + tr("Searching CMake binary...")); QString error; const QStringList candidates = {"cmake"}; for (const QString &candidate : candidates) { - const FilePath cmake = q->searchInPath(FilePath::fromString(candidate)); - QTC_CHECK(q->hasLocalFileAccess()); + const FilePath cmake = m_device->searchInPath(FilePath::fromString(candidate)); if (cmake.isExecutableFile()) { - log->append(tr("Found CMake binary: %1").arg(cmake.toUserOutput())); + emit q->logOutput(tr("Found CMake binary: %1").arg(cmake.toUserOutput())); const bool res = QMetaObject::invokeMethod(cmakeManager, "registerCMakeByPath", Q_ARG(Utils::FilePath, cmake), - Q_ARG(QString, m_data.id())); + Q_ARG(QString, m_sharedId)); QTC_CHECK(res); } } } -void DockerDevicePrivate::autoDetectDebugger(QTextBrowser *log) +void KitDetectorPrivate::autoDetectDebugger() { QObject *debuggerPlugin = ExtensionSystem::PluginManager::getObjectByName("DebuggerPlugin"); if (!debuggerPlugin) return; - if (log) - log->append('\n' + tr("Searching debuggers...")); - const FilePath deviceRoot = q->mapToGlobalPath({}); + emit q->logOutput('\n' + tr("Searching debuggers...")); + const FilePath deviceRoot = m_device->mapToGlobalPath({}); const bool res = QMetaObject::invokeMethod(debuggerPlugin, "autoDetectDebuggersForDevice", Q_ARG(Utils::FilePath, deviceRoot)); QTC_CHECK(res); } -void DockerDevicePrivate::autoDetect(QTextBrowser *log) +void KitDetectorPrivate::autoDetect() { QApplication::setOverrideCursor(Qt::WaitCursor); - undoAutoDetect(log); + undoAutoDetect(); - tryCreateLocalFileAccess(); + emit q->logOutput(tr("Starting auto-detection. This will take a while...")); - if (log) - log->append(tr("Starting auto-detection. This will take a while...")); + QList toolChains = autoDetectToolChains(); + QList qtVersions = autoDetectQtVersions(); - QList toolChains = autoDetectToolChains(log); - QList qtVersions = autoDetectQtVersions(log); - - autoDetectCMake(log); - autoDetectDebugger(log); + autoDetectCMake(); + autoDetectDebugger(); const auto initializeKit = [this, toolChains, qtVersions](Kit *k) { k->setAutoDetected(false); - k->setAutoDetectionSource(m_data.id()); + k->setAutoDetectionSource(m_sharedId); k->setUnexpandedDisplayName("%{Device:Name}"); DeviceTypeKitAspect::setDeviceTypeId(k, Constants::DOCKER_DEVICE_TYPE); - DeviceKitAspect::setDevice(k, q->sharedFromThis()); + DeviceKitAspect::setDevice(k, m_device); for (ToolChain *tc : toolChains) ToolChainKitAspect::setToolChain(k, tc); if (!qtVersions.isEmpty()) @@ -576,8 +604,7 @@ void DockerDevicePrivate::autoDetect(QTextBrowser *log) }; Kit *kit = KitManager::registerKit(initializeKit); - if (log) - log->append('\n' + tr("Registered kit %1").arg(kit->displayName())); + emit q->logOutput('\n' + tr("Registered kit %1").arg(kit->displayName())); QApplication::restoreOverrideCursor(); } @@ -1116,7 +1143,8 @@ Environment DockerDevice::systemEnvironment() const void DockerDevice::aboutToBeRemoved() const { - d->undoAutoDetect(nullptr); + KitDetector detector(sharedFromThis()); + detector.undoAutoDetect(d->m_data.id()); } void DockerDevicePrivate::fetchSystemEnviroment() diff --git a/src/plugins/docker/dockerdevice.h b/src/plugins/docker/dockerdevice.h index 1bed2eb9ce4..509bd2deeeb 100644 --- a/src/plugins/docker/dockerdevice.h +++ b/src/plugins/docker/dockerdevice.h @@ -122,6 +122,24 @@ private: friend class DockerDeviceWidget; }; +class KitDetector : public QObject +{ + Q_OBJECT + +public: + explicit KitDetector(const ProjectExplorer::IDevice::ConstPtr &device); + ~KitDetector() override; + + void autoDetect(const QString &sharedId) const; + void undoAutoDetect(const QString &sharedId) const; + +signals: + void logOutput(const QString &msg); + +private: + class KitDetectorPrivate *d = nullptr; +}; + class DockerDeviceFactory final : public ProjectExplorer::IDeviceFactory { public: From 7a6c099c08378b0c5eb501bef2dcb140ae6d7b7d Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 5 Jul 2021 16:17:53 +0200 Subject: [PATCH 14/16] Nim: Use remote device when searching compilers there Change-Id: Iab1cb1dbaaf789d2ad328ab70c3dec8839d4ffcc Reviewed-by: Christian Stenger --- src/plugins/nim/project/nimtoolchainfactory.cpp | 7 ++++--- tests/manual/docker/Dockerfile-qt-5-ubuntu-20.04-build | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/plugins/nim/project/nimtoolchainfactory.cpp b/src/plugins/nim/project/nimtoolchainfactory.cpp index c7ff4500f5d..1d11d1bd873 100644 --- a/src/plugins/nim/project/nimtoolchainfactory.cpp +++ b/src/plugins/nim/project/nimtoolchainfactory.cpp @@ -28,6 +28,8 @@ #include "nimconstants.h" #include "nimtoolchain.h" +#include + #include #include #include @@ -52,11 +54,10 @@ NimToolChainFactory::NimToolChainFactory() QList NimToolChainFactory::autoDetect(const QList &alreadyKnown, const IDevice::Ptr &device) { - Q_UNUSED(device); QList result; - Environment systemEnvironment = Environment::systemEnvironment(); - const FilePath compilerPath = systemEnvironment.searchInPath("nim"); + IDevice::ConstPtr dev = device ? device : DeviceManager::defaultDesktopDevice(); + const FilePath compilerPath = dev->searchInPath(FilePath::fromString("nim")); if (compilerPath.isEmpty()) return result; diff --git a/tests/manual/docker/Dockerfile-qt-5-ubuntu-20.04-build b/tests/manual/docker/Dockerfile-qt-5-ubuntu-20.04-build index f0d9b9de363..473d3256fc3 100644 --- a/tests/manual/docker/Dockerfile-qt-5-ubuntu-20.04-build +++ b/tests/manual/docker/Dockerfile-qt-5-ubuntu-20.04-build @@ -18,5 +18,6 @@ RUN apt-get update \ g++ \ gdb \ ninja-build \ + nim \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* From 86df204bad51e8bf3790ef570a8de76f4910321c Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Mon, 5 Jul 2021 17:34:35 +0300 Subject: [PATCH 15/16] Git: Fix regression in log output on Windows Current path appeared instead of the committer date. This is probably due to the changes in handling commands. The command has %cD%Creset. %cD% is interpreted as current directory, unless escaped. Change-Id: Id564c338dc1f4d882e4449430000b7dcebdd7288 Reviewed-by: hjk --- src/plugins/git/gitclient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 6c3896a9cc5..c9173666133 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -1085,7 +1085,7 @@ static QStringList normalLogArguments() "--pretty=format:" "commit %C(%1)%H%Creset %C(%2)%d%Creset%n" "Author: %C(%3)%an <%ae>%Creset%n" - "Date: %C(%4)%cD%Creset%n%n" + "Date: %C(%4)%cD %Creset%n%n" "%C(%5)%w(0,4,4)%s%Creset%n%n%b" ).arg(commitHash, decoration, authorName, commitDate, commitSubject); From 4eec360563f0433705608b6d4a3b41704575fbd8 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 6 Jul 2021 09:12:35 +0200 Subject: [PATCH 16/16] Utils: Remove one ProcessArgs::expandMacros overload Only used once. Also allow logging of expansion failures. Change-Id: I357ed6ed28fe379d482358c46b495bc727f86902 Reviewed-by: Christian Stenger --- src/libs/utils/commandline.cpp | 7 ------- src/libs/utils/commandline.h | 2 -- src/libs/utils/macroexpander.cpp | 8 +++++++- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/libs/utils/commandline.cpp b/src/libs/utils/commandline.cpp index 3ae7984275f..da44b02e089 100644 --- a/src/libs/utils/commandline.cpp +++ b/src/libs/utils/commandline.cpp @@ -1089,13 +1089,6 @@ bool ProcessArgs::expandMacros(QString *cmd, AbstractMacroExpander *mx, OsType o return true; } -QString ProcessArgs::expandMacros(const QString &str, AbstractMacroExpander *mx, OsType osType) -{ - QString ret = str; - expandMacros(&ret, mx, osType); - return ret; -} - bool ProcessArgs::ArgIterator::next() { // We delay the setting of m_prev so we can still delete the last argument diff --git a/src/libs/utils/commandline.h b/src/libs/utils/commandline.h index 473c2677206..a2a43a82e16 100644 --- a/src/libs/utils/commandline.h +++ b/src/libs/utils/commandline.h @@ -81,8 +81,6 @@ public: //! Safely replace the expandos in a shell command static bool expandMacros(QString *cmd, AbstractMacroExpander *mx, OsType osType = HostOsInfo::hostOs()); - static QString expandMacros(const QString &str, AbstractMacroExpander *mx, - OsType osType = HostOsInfo::hostOs()); /*! Iterate over arguments from a command line. * Assumes that the name of the actual command is *not* part of the line. diff --git a/src/libs/utils/macroexpander.cpp b/src/libs/utils/macroexpander.cpp index 5e203762132..5cf279660ed 100644 --- a/src/libs/utils/macroexpander.cpp +++ b/src/libs/utils/macroexpander.cpp @@ -35,11 +35,14 @@ #include #include #include +#include #include namespace Utils { namespace Internal { +static Q_LOGGING_CATEGORY(expanderLog, "qtc.utils.macroexpander", QtWarningMsg) + const char kFilePathPostfix[] = ":FilePath"; const char kPathPostfix[] = ":Path"; const char kNativeFilePathPostfix[] = ":NativeFilePath"; @@ -327,7 +330,10 @@ QVariant MacroExpander::expandVariant(const QVariant &v) const QString MacroExpander::expandProcessArgs(const QString &argsWithVariables) const { - return ProcessArgs::expandMacros(argsWithVariables, d); + QString result = argsWithVariables; + const bool ok = ProcessArgs::expandMacros(&result, d); + QTC_ASSERT(ok, qCDebug(expanderLog) << "Expanding failed: " << argsWithVariables); + return result; } static QByteArray fullPrefix(const QByteArray &prefix)