diff options
Diffstat (limited to 'src')
38 files changed, 287 insertions, 273 deletions
diff --git a/src/libs/ssh/sshconnectionmanager.cpp b/src/libs/ssh/sshconnectionmanager.cpp index fff3db499ea..800c4f14f19 100644 --- a/src/libs/ssh/sshconnectionmanager.cpp +++ b/src/libs/ssh/sshconnectionmanager.cpp @@ -151,6 +151,7 @@ private: disconnect(connection, nullptr, this, nullptr); connection->deleteLater(); + m_connections.erase(it); } void removeInactiveConnections() diff --git a/src/libs/ssh/sshremoteprocessrunner.cpp b/src/libs/ssh/sshremoteprocessrunner.cpp index 2d34ab4eae3..edbc7219b17 100644 --- a/src/libs/ssh/sshremoteprocessrunner.cpp +++ b/src/libs/ssh/sshremoteprocessrunner.cpp @@ -185,7 +185,6 @@ void SshRemoteProcessRunner::setState(int newState) } } -QString SshRemoteProcessRunner::command() const { return d->m_command; } QString SshRemoteProcessRunner::lastConnectionErrorString() const { return d->m_lastConnectionErrorString; } diff --git a/src/libs/ssh/sshremoteprocessrunner.h b/src/libs/ssh/sshremoteprocessrunner.h index 22ed6613fbf..21c4f6b8f68 100644 --- a/src/libs/ssh/sshremoteprocessrunner.h +++ b/src/libs/ssh/sshremoteprocessrunner.h @@ -40,7 +40,7 @@ public: ~SshRemoteProcessRunner(); void run(const QString &command, const SshConnectionParameters &sshParams); - QString command() const; + void runInTerminal(const QString &command, const SshConnectionParameters &sshParams); QString lastConnectionErrorString() const; diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index 05f92666e65..04561a5af8b 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -227,8 +227,8 @@ public: virtual void setWorkingDirectory(const QString &dir) = 0; virtual void start(const QString &program, const QStringList &arguments, const QByteArray &writeData) = 0; - virtual void customStart(const CommandLine &command, const FilePath &workingDirectory, - const Environment &environment) { QTC_CHECK(false); } + virtual void customStart(const CommandLine &, const FilePath &workingDirectory, + const Environment &) { Q_UNUSED(workingDirectory); QTC_CHECK(false); } virtual bool isCustomStart() const { return false; } virtual void terminate() = 0; virtual void kill() = 0; @@ -312,9 +312,9 @@ public: QByteArray readAllStandardOutput() override { QTC_CHECK(false); return {}; } QByteArray readAllStandardError() override { QTC_CHECK(false); return {}; } - void setProcessEnvironment(const QProcessEnvironment &environment) override { QTC_CHECK(false); } - void setWorkingDirectory(const QString &dir) override { QTC_CHECK(false); } - void start(const QString &program, const QStringList &arguments, const QByteArray &writeData) override + void setProcessEnvironment(const QProcessEnvironment &) override { QTC_CHECK(false); } + void setWorkingDirectory(const QString &) override { QTC_CHECK(false); } + void start(const QString &, const QStringList &, const QByteArray &) override { QTC_CHECK(false); } void customStart(const CommandLine &command, const FilePath &workingDirectory, const Environment &environment) override @@ -330,7 +330,7 @@ public: void terminate() override { m_terminal.stopProcess(); } void kill() override { m_terminal.stopProcess(); } void close() override { m_terminal.stopProcess(); } - qint64 write(const QByteArray &data) override { QTC_CHECK(false); return -1; } + qint64 write(const QByteArray &) override { QTC_CHECK(false); return -1; } void setStandardInputFile(const QString &fileName) override { Q_UNUSED(fileName) QTC_CHECK(false); } // intentionally no-op without an assert @@ -343,13 +343,13 @@ public: int exitCode() const override { return m_terminal.exitCode(); } QProcess::ExitStatus exitStatus() const override { return m_terminal.exitStatus(); } QString errorString() const override { return m_terminal.errorString(); } - void setErrorString(const QString &str) override { QTC_CHECK(false); } + void setErrorString(const QString &) override { QTC_CHECK(false); } // intentionally no-op without an assert - bool waitForStarted(int msecs) override { return false; } - bool waitForReadyRead(int msecs) override { QTC_CHECK(false); return false; } + bool waitForStarted(int) override { return false; } + bool waitForReadyRead(int) override { QTC_CHECK(false); return false; } // intentionally no-op without an assert - bool waitForFinished(int msecs) override { return false; } + bool waitForFinished(int) override { return false; } void kickoffProcess() override { m_terminal.kickoffProcess(); } void interruptProcess() override { m_terminal.interruptProcess(); } @@ -748,9 +748,11 @@ static QtcProcess::ProcessImpl defaultProcessImpl() return QtcProcess::ProcessLauncherImpl; } -QtcProcess::QtcProcess(ProcessImpl processImpl, ProcessMode processMode, TerminalMode terminalMode, - QObject *parent) - : QObject(parent), d(new QtcProcessPrivate(this, processImpl, processMode, terminalMode)) +QtcProcess::QtcProcess(const Setup &setup, QObject *parent) + : QObject(parent), + d(new QtcProcessPrivate(this, + setup.processImpl == DefaultImpl ? defaultProcessImpl() : setup.processImpl, + setup.processMode, setup.terminalMode)) { static int qProcessExitStatusMeta = qRegisterMetaType<QProcess::ExitStatus>(); static int qProcessProcessErrorMeta = qRegisterMetaType<QProcess::ProcessError>(); @@ -758,17 +760,9 @@ QtcProcess::QtcProcess(ProcessImpl processImpl, ProcessMode processMode, Termina Q_UNUSED(qProcessProcessErrorMeta) } -QtcProcess::QtcProcess(ProcessImpl processImpl, QObject *parent) - : QtcProcess(processImpl, ProcessMode::Reader, TerminalMode::TerminalOff, parent) {} - -QtcProcess::QtcProcess(ProcessMode processMode, QObject *parent) - : QtcProcess(defaultProcessImpl(), processMode, TerminalMode::TerminalOff, parent) {} - -QtcProcess::QtcProcess(TerminalMode terminalMode, QObject *parent) - : QtcProcess(defaultProcessImpl(), ProcessMode::Reader, terminalMode, parent) {} - QtcProcess::QtcProcess(QObject *parent) - : QtcProcess(defaultProcessImpl(), ProcessMode::Reader, TerminalMode::TerminalOff, parent) {} + : QtcProcess({}, parent) +{} QtcProcess::~QtcProcess() { diff --git a/src/libs/utils/qtcprocess.h b/src/libs/utils/qtcprocess.h index 57783e38ade..592830041e1 100644 --- a/src/libs/utils/qtcprocess.h +++ b/src/libs/utils/qtcprocess.h @@ -62,7 +62,8 @@ class QTCREATOR_UTILS_EXPORT QtcProcess : public QObject public: enum ProcessImpl { QProcessImpl, - ProcessLauncherImpl + ProcessLauncherImpl, + DefaultImpl, }; enum TerminalMode { @@ -73,12 +74,19 @@ public: TerminalOn = TerminalRun // default mode for ON }; - QtcProcess(ProcessImpl processImpl, ProcessMode processMode, TerminalMode terminalMode, - QObject *parent = nullptr); - QtcProcess(ProcessImpl processImpl, QObject *parent = nullptr); - QtcProcess(ProcessMode processMode, QObject *parent = nullptr); - QtcProcess(TerminalMode terminalMode, QObject *parent = nullptr); - QtcProcess(QObject *parent = nullptr); + struct Setup { + Setup() {} + Setup(ProcessImpl processImpl) : processImpl(processImpl) {} + Setup(ProcessMode processMode) : processMode(processMode) {} + Setup(TerminalMode terminalMode) : terminalMode(terminalMode) {} + + ProcessImpl processImpl = DefaultImpl; + ProcessMode processMode = ProcessMode::Reader; + TerminalMode terminalMode = TerminalOff; + }; + + QtcProcess(const Setup &setup = {}, QObject *parent = nullptr); + QtcProcess(QObject *parent); ~QtcProcess(); ProcessMode processMode() const; diff --git a/src/libs/utils/terminalprocess.cpp b/src/libs/utils/terminalprocess.cpp index 1f74153e9f6..a12107e1715 100644 --- a/src/libs/utils/terminalprocess.cpp +++ b/src/libs/utils/terminalprocess.cpp @@ -186,63 +186,6 @@ const CommandLine &TerminalProcess::commandLine() const return d->m_commandLine; } -static QString quoteWinCommand(const QString &program) -{ - const QChar doubleQuote = QLatin1Char('"'); - - // add the program as the first arg ... it works better - QString programName = program; - programName.replace(QLatin1Char('/'), QLatin1Char('\\')); - if (!programName.startsWith(doubleQuote) && !programName.endsWith(doubleQuote) - && programName.contains(QLatin1Char(' '))) { - programName.prepend(doubleQuote); - programName.append(doubleQuote); - } - return programName; -} - -static QString quoteWinArgument(const QString &arg) -{ - if (arg.isEmpty()) - return QString::fromLatin1("\"\""); - - QString ret(arg); - // Quotes are escaped and their preceding backslashes are doubled. - ret.replace(QRegularExpression("(\\\\*)\""), "\\1\\1\\\""); - if (ret.contains(QRegularExpression("\\s"))) { - // The argument must not end with a \ since this would be interpreted - // as escaping the quote -- rather put the \ behind the quote: e.g. - // rather use "foo"\ than "foo\" - int i = ret.length(); - while (i > 0 && ret.at(i - 1) == QLatin1Char('\\')) - --i; - ret.insert(i, QLatin1Char('"')); - ret.prepend(QLatin1Char('"')); - } - return ret; -} - -// Quote a Windows command line correctly for the "CreateProcess" API -static QString createWinCommandline(const QString &program, const QStringList &args) -{ - QString programName = quoteWinCommand(program); - for (const QString &arg : args) { - programName += QLatin1Char(' '); - programName += quoteWinArgument(arg); - } - return programName; -} - -static QString createWinCommandline(const QString &program, const QString &args) -{ - QString programName = quoteWinCommand(program); - if (!args.isEmpty()) { - programName += QLatin1Char(' '); - programName += args; - } - return programName; -} - void TerminalProcess::setAbortOnMetaChars(bool abort) { d->m_abortOnMetaChars = abort; @@ -334,15 +277,66 @@ void TerminalProcess::start() if (!workDir.isEmpty() && !workDir.endsWith(QLatin1Char('\\'))) workDir.append(QLatin1Char('\\')); + // Quote a Windows command line correctly for the "CreateProcess" API + static const auto quoteWinCommand = [](const QString &program) { + const QChar doubleQuote = QLatin1Char('"'); + + // add the program as the first arg ... it works better + QString programName = program; + programName.replace(QLatin1Char('/'), QLatin1Char('\\')); + if (!programName.startsWith(doubleQuote) && !programName.endsWith(doubleQuote) + && programName.contains(QLatin1Char(' '))) { + programName.prepend(doubleQuote); + programName.append(doubleQuote); + } + return programName; + }; + static const auto quoteWinArgument = [](const QString &arg) { + if (arg.isEmpty()) + return QString::fromLatin1("\"\""); + + QString ret(arg); + // Quotes are escaped and their preceding backslashes are doubled. + ret.replace(QRegularExpression("(\\\\*)\""), "\\1\\1\\\""); + if (ret.contains(QRegularExpression("\\s"))) { + // The argument must not end with a \ since this would be interpreted + // as escaping the quote -- rather put the \ behind the quote: e.g. + // rather use "foo"\ than "foo\" + int i = ret.length(); + while (i > 0 && ret.at(i - 1) == QLatin1Char('\\')) + --i; + ret.insert(i, QLatin1Char('"')); + ret.prepend(QLatin1Char('"')); + } + return ret; + }; + static const auto createWinCommandlineMultiArgs = [](const QString &program, const QStringList &args) { + QString programName = quoteWinCommand(program); + for (const QString &arg : args) { + programName += QLatin1Char(' '); + programName += quoteWinArgument(arg); + } + return programName; + }; + static const auto createWinCommandlineSingleArg = [](const QString &program, const QString &args) + { + QString programName = quoteWinCommand(program); + if (!args.isEmpty()) { + programName += QLatin1Char(' '); + programName += args; + } + return programName; + }; + QStringList stubArgs; stubArgs << modeOption(d->m_terminalMode) << d->m_stubServer.fullServerName() << workDir << (d->m_tempFile ? d->m_tempFile->fileName() : QString()) - << createWinCommandline(pcmd, pargs) + << createWinCommandlineSingleArg(pcmd, pargs) << msgPromptToClose(); - const QString cmdLine = createWinCommandline( + const QString cmdLine = createWinCommandlineMultiArgs( QCoreApplication::applicationDirPath() + QLatin1String("/qtcreator_process_stub.exe"), stubArgs); bool success = CreateProcessW(0, (WCHAR*)cmdLine.utf16(), diff --git a/src/plugins/android/androidsdkdownloader.cpp b/src/plugins/android/androidsdkdownloader.cpp index 28837ca8d4e..c9512b464a9 100644 --- a/src/plugins/android/androidsdkdownloader.cpp +++ b/src/plugins/android/androidsdkdownloader.cpp @@ -24,13 +24,13 @@ ****************************************************************************/ #include "androidsdkdownloader.h" -#include "utils/filepath.h" -#include "utils/qtcprocess.h" + +#include <utils/archive.h> +#include <utils/filepath.h> + #include <coreplugin/icore.h> #include <QCryptographicHash> -#include <QDir> -#include <QDirIterator> #include <QLoggingCategory> #include <QStandardPaths> @@ -61,22 +61,7 @@ void AndroidSdkDownloader::sslErrors(const QList<QSslError> &sslErrors) } #endif -static void setSdkFilesExecPermission( const FilePath &sdkExtractPath) -{ - const FilePath filePath = sdkExtractPath / "tools"; - - filePath.iterateDirectory( - [](const FilePath &filePath) { - if (!filePath.fileName().contains('.')) { - QFlags<QFileDevice::Permission> currentPermissions = filePath.permissions(); - filePath.setPermissions(currentPermissions | QFileDevice::ExeOwner); - } - return true; - }, - {{"*"}, QDir::Files, QDirIterator::Subdirectories}); -} - -void AndroidSdkDownloader::downloadAndExtractSdk(const FilePath &jdkPath, const FilePath &sdkExtractPath) +void AndroidSdkDownloader::downloadAndExtractSdk(const FilePath &sdkExtractPath) { if (m_androidConfig.sdkToolsUrl().isEmpty()) { logError(tr("The SDK Tools download URL is empty.")); @@ -103,34 +88,16 @@ void AndroidSdkDownloader::downloadAndExtractSdk(const FilePath &jdkPath, const connect(m_progressDialog, &QProgressDialog::canceled, this, &AndroidSdkDownloader::cancel); - connect(this, &AndroidSdkDownloader::sdkPackageWriteFinished, this, [this, jdkPath, sdkExtractPath]() { - if (extractSdk(jdkPath, sdkExtractPath)) { - setSdkFilesExecPermission(sdkExtractPath); - emit sdkExtracted(); + connect(this, &AndroidSdkDownloader::sdkPackageWriteFinished, this, [this, sdkExtractPath]() { + if (Archive *archive = Archive::unarchive(m_sdkFilename, sdkExtractPath)) { + connect(archive, &Archive::finished, [this, sdkExtractPath](bool success){ + if (success) + emit sdkExtracted(); + }); } }); } -bool AndroidSdkDownloader::extractSdk(const FilePath &jdkPath, const FilePath &sdkExtractPath) -{ - QDir sdkDir = sdkExtractPath.toDir(); - if (!sdkDir.exists()) { - if (!sdkDir.mkpath(".")) { - logError(QString(tr("Could not create the SDK folder %1.")) - .arg(sdkExtractPath.toUserOutput())); - return false; - } - } - - QtcProcess jarExtractProc; - jarExtractProc.setWorkingDirectory(sdkExtractPath); - FilePath jarCmdPath(jdkPath / "/bin/jar"); - jarExtractProc.setCommand({jarCmdPath, {"xf", m_sdkFilename.path()}}); - jarExtractProc.runBlocking(); - - return jarExtractProc.exitCode() ? false : true; -} - bool AndroidSdkDownloader::verifyFileIntegrity() { QFile f(m_sdkFilename.toString()); @@ -170,7 +137,7 @@ void AndroidSdkDownloader::logError(const QString &error) emit sdkDownloaderError(error); } -QString AndroidSdkDownloader::getSaveFilename(const QUrl &url) +FilePath AndroidSdkDownloader::getSaveFilename(const QUrl &url) { QString path = url.path(); QString basename = QFileInfo(path).fileName(); @@ -186,9 +153,8 @@ QString AndroidSdkDownloader::getSaveFilename(const QUrl &url) basename += QString::number(i); } - QString fullPath = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation) - + QDir::separator() + basename; - return fullPath; + return FilePath::fromString(QStandardPaths::writableLocation(QStandardPaths::DownloadLocation)) + / basename; } bool AndroidSdkDownloader::saveToDisk(const FilePath &filename, QIODevice *data) @@ -223,7 +189,7 @@ void AndroidSdkDownloader::downloadFinished(QNetworkReply *reply) if (isHttpRedirect(reply)) { cancelWithError(QString(tr("Download from %1 was redirected.")).arg(url.toString())); } else { - m_sdkFilename = FilePath::fromString(getSaveFilename(url)); + m_sdkFilename = getSaveFilename(url); if (saveToDisk(m_sdkFilename, reply) && verifyFileIntegrity()) emit sdkPackageWriteFinished(); else diff --git a/src/plugins/android/androidsdkdownloader.h b/src/plugins/android/androidsdkdownloader.h index a018d3d10cd..76375132397 100644 --- a/src/plugins/android/androidsdkdownloader.h +++ b/src/plugins/android/androidsdkdownloader.h @@ -43,7 +43,7 @@ class AndroidSdkDownloader : public QObject public: AndroidSdkDownloader(); - void downloadAndExtractSdk(const Utils::FilePath &jdkPath, const Utils::FilePath &sdkExtractPath); + void downloadAndExtractSdk(const Utils::FilePath &sdkExtractPath); static QString dialogTitle(); void cancel(); @@ -54,11 +54,10 @@ signals: void sdkDownloaderError(const QString &error); private: - static QString getSaveFilename(const QUrl &url); + static Utils::FilePath getSaveFilename(const QUrl &url); bool saveToDisk(const Utils::FilePath &filename, QIODevice *data); static bool isHttpRedirect(QNetworkReply *m_reply); - bool extractSdk(const Utils::FilePath &jdkPath, const Utils::FilePath &sdkExtractPath); bool verifyFileIntegrity(); void cancelWithError(const QString &error); void logError(const QString &error); diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index abbbe2dd871..fda3366a95f 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -712,14 +712,8 @@ void AndroidSettingsWidget::downloadSdk() .arg(m_ui.SDKLocationPathChooser->filePath().cleanPath().toUserOutput()); auto userInput = QMessageBox::information(this, AndroidSdkDownloader::dialogTitle(), message, QMessageBox::Yes | QMessageBox::No); - if (userInput == QMessageBox::Yes) { - if (m_androidSummary->rowsOk({JavaPathExistsAndWritableRow})) { - auto javaPath = m_ui.OpenJDKLocationPathChooser->filePath(); - m_sdkDownloader.downloadAndExtractSdk( - javaPath, - m_ui.SDKLocationPathChooser->filePath().cleanPath()); - } - } + if (userInput == QMessageBox::Yes) + m_sdkDownloader.downloadAndExtractSdk(m_ui.SDKLocationPathChooser->filePath().cleanPath()); } // AndroidSettingsPage diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index 7ce3cc243ff..78d3793b502 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -2458,6 +2458,13 @@ QTextCursor ClangdClient::Private::adjustedCursor(const QTextCursor &cursor, } return cursor; } + + // ~My|Class + if (const DestructorNameAST * const destrAst = (*it)->asDestructorName()) { + QTextCursor c = cursor; + c.setPosition(posForToken(destrAst->tilde_token)); + return c; + } } return cursor; } diff --git a/src/plugins/clangformat/CMakeLists.txt b/src/plugins/clangformat/CMakeLists.txt index 49eeb53e342..dbeaed94888 100644 --- a/src/plugins/clangformat/CMakeLists.txt +++ b/src/plugins/clangformat/CMakeLists.txt @@ -1,5 +1,5 @@ add_qtc_plugin(ClangFormat - CONDITION TARGET libclang AND LLVM_PACKAGE_VERSION VERSION_GREATER_EQUAL 10.0.0 AND QTC_CLANG_BUILDMODE_MATCH + CONDITION TARGET libclang AND LLVM_PACKAGE_VERSION VERSION_GREATER_EQUAL 10.0.0 AND (QTC_CLANG_BUILDMODE_MATCH OR CLANGTOOLING_LINK_CLANG_DYLIB) DEPENDS Utils Qt5::Widgets ${CLANG_FORMAT_LIB} INCLUDES "${CLANG_INCLUDE_DIRS}" PLUGIN_DEPENDS Core TextEditor CppEditor ProjectExplorer @@ -15,6 +15,10 @@ add_qtc_plugin(ClangFormat clangformatutils.cpp clangformatutils.h ) +if(MSVC AND TARGET ClangFormat) + target_compile_options(ClangFormat PUBLIC /wd4267 /wd4624) +endif() + extend_qtc_plugin(ClangFormat CONDITION UNIX AND NOT APPLE PROPERTIES LINK_FLAGS "-Wl,--exclude-libs,ALL" diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 6facbb8cab7..d7ecacc0668 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -353,6 +353,8 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) m_showProgressTimer.start(); }); + m_configModel->setMacroExpander(m_buildConfiguration->macroExpander()); + if (bc->buildSystem()->isParsing()) m_showProgressTimer.start(); else { @@ -368,6 +370,7 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) m_configModel->setInitialParametersConfiguration( m_buildConfiguration->initialCMakeConfiguration()); m_buildConfiguration->filterConfigArgumentsFromAdditionalCMakeArguments(); + updateFromKit(); m_configView->expandAll(); m_configView->setEnabled(true); stretcher->stretch(); diff --git a/src/plugins/cmakeprojectmanager/configmodel.cpp b/src/plugins/cmakeprojectmanager/configmodel.cpp index 83e326e530d..aa74f3986b6 100644 --- a/src/plugins/cmakeprojectmanager/configmodel.cpp +++ b/src/plugins/cmakeprojectmanager/configmodel.cpp @@ -26,6 +26,7 @@ #include "configmodel.h" #include <utils/algorithm.h> +#include <utils/macroexpander.h> #include <utils/qtcassert.h> #include <utils/theme/theme.h> @@ -315,34 +316,37 @@ void ConfigModel::setConfiguration(const QList<ConfigModel::InternalDataItem> &c generateTree(); } +Utils::MacroExpander *ConfigModel::macroExpander() const +{ + return m_macroExpander; +} + +void ConfigModel::setMacroExpander(Utils::MacroExpander *newExpander) +{ + m_macroExpander = newExpander; +} + void ConfigModel::generateTree() { + QHash<QString, InternalDataItem> initialHash; + for (const InternalDataItem &di : m_configuration) + if (di.isInitial) + initialHash.insert(di.key, di); + auto root = new Utils::TreeItem; - for (InternalDataItem &di : m_configuration) + for (InternalDataItem &di : m_configuration) { + auto it = initialHash.find(di.key); + if (it != initialHash.end()) + di.initialValue = macroExpander()->expand(it->value); + root->appendChild(new Internal::ConfigModelTreeItem(&di)); + } setRootItem(root); } ConfigModel::InternalDataItem::InternalDataItem(const ConfigModel::DataItem &item) : DataItem(item) { } -QString ConfigModel::InternalDataItem::toolTip() const -{ - QString desc = description; - if (isAdvanced) - desc += QCoreApplication::translate("CMakeProjectManager::ConfigModel", " (ADVANCED)"); - QStringList tooltip(desc); - if (inCMakeCache) { - if (value != newValue) - tooltip << QCoreApplication::translate("CMakeProjectManager", "Current CMake: %1").arg(value); - } else { - tooltip << QCoreApplication::translate("CMakeProjectManager", "Not in CMakeCache.txt").arg(value); - } - if (!kitValue.isEmpty()) - tooltip << QCoreApplication::translate("CMakeProjectManager::ConfigModel", "Current kit: %1").arg(kitValue); - return tooltip.join("<br>"); -} - QString ConfigModel::InternalDataItem::currentValue() const { if (isUnset) @@ -414,9 +418,15 @@ QVariant ConfigModelTreeItem::data(int column, int role) const font.setStrikeOut((!dataItem->inCMakeCache && !dataItem->isUserNew) || dataItem->isUnset); return font; } - case Qt::ForegroundRole: - return Utils::creatorTheme()->color((!dataItem->kitValue.isNull() && dataItem->kitValue != value) - ? Utils::Theme::TextColorHighlight : Utils::Theme::TextColorNormal); + case Qt::ForegroundRole: { + bool mismatch = false; + if (dataItem->isInitial) + mismatch = !dataItem->kitValue.isEmpty() && dataItem->kitValue != value; + else + mismatch = !dataItem->initialValue.isEmpty() && dataItem->initialValue != value; + return Utils::creatorTheme()->color(mismatch ? Utils::Theme::TextColorHighlight + : Utils::Theme::TextColorNormal); + } case Qt::ToolTipRole: { return toolTip(); } @@ -492,16 +502,36 @@ Qt::ItemFlags ConfigModelTreeItem::flags(int column) const QString ConfigModelTreeItem::toolTip() const { QTC_ASSERT(dataItem, return QString()); - QStringList tooltip(dataItem->description); - if (!dataItem->kitValue.isEmpty()) - tooltip << QCoreApplication::translate("CMakeProjectManager", "Value requested by kit: %1").arg(dataItem->kitValue); - if (dataItem->inCMakeCache) { + QStringList tooltip; + if (!dataItem->description.isEmpty()) + tooltip << dataItem->description; + + if (dataItem->isInitial) { + if (!dataItem->kitValue.isEmpty()) + tooltip << QCoreApplication::translate("CMakeProjectManager", "<p>Kit: <b>%1</b></p>") + .arg(dataItem->kitValue); + if (dataItem->value != dataItem->newValue) - tooltip << QCoreApplication::translate("CMakeProjectManager", "Current CMake: %1").arg(dataItem->value); - } else { - tooltip << QCoreApplication::translate("CMakeProjectManager", "Not in CMakeCache.txt"); + tooltip << QCoreApplication::translate("CMakeProjectManager", + "<p>Initial Configuration: <b>%1</b></p>") + .arg(dataItem->value); + } else { + if (!dataItem->initialValue.isEmpty()) + tooltip << QCoreApplication::translate("CMakeProjectManager", + "<p>Initial Configuration: <b>%1</b></p>") + .arg(dataItem->initialValue); + + if (dataItem->inCMakeCache) { + if (dataItem->value != dataItem->newValue) + tooltip << QCoreApplication::translate("CMakeProjectManager", + "<p>Current Configuration: <b>%1</b></p>") + .arg(dataItem->value); + } else { + tooltip << QCoreApplication::translate("CMakeProjectManager", + "<p>Not in CMakeCache.txt</p>"); + } } - return tooltip.join("<br>"); + return tooltip.join(""); } QString ConfigModelTreeItem::currentValue() const diff --git a/src/plugins/cmakeprojectmanager/configmodel.h b/src/plugins/cmakeprojectmanager/configmodel.h index 03192cad6ff..87f37fcaed6 100644 --- a/src/plugins/cmakeprojectmanager/configmodel.h +++ b/src/plugins/cmakeprojectmanager/configmodel.h @@ -162,6 +162,8 @@ public: QList<DataItem> configurationForCMake() const; + Utils::MacroExpander *macroExpander() const; + void setMacroExpander(Utils::MacroExpander *newExpander); private: class InternalDataItem : public DataItem @@ -170,13 +172,13 @@ private: InternalDataItem(const DataItem &item); InternalDataItem(const InternalDataItem &item) = default; - QString toolTip() const; QString currentValue() const; bool isUserChanged = false; bool isUserNew = false; QString newValue; QString kitValue; + QString initialValue; }; void generateTree(); @@ -184,6 +186,7 @@ private: void setConfiguration(const QList<InternalDataItem> &config); QList<InternalDataItem> m_configuration; KitConfiguration m_kitConfiguration; + Utils::MacroExpander *m_macroExpander = nullptr; friend class Internal::ConfigModelTreeItem; }; diff --git a/src/plugins/coreplugin/fileutils.cpp b/src/plugins/coreplugin/fileutils.cpp index 538e2120f0c..004d661cafb 100644 --- a/src/plugins/coreplugin/fileutils.cpp +++ b/src/plugins/coreplugin/fileutils.cpp @@ -137,21 +137,6 @@ void FileUtils::showInFileSystemView(const FilePath &path) navWidget->syncWithFilePath(path); } -static QString quoteWinCommand(const QString &program) -{ - const QChar doubleQuote = QLatin1Char('"'); - - // add the program as the first arg ... it works better - QString programName = program; - programName.replace(QLatin1Char('/'), QLatin1Char('\\')); - if (!programName.startsWith(doubleQuote) && !programName.endsWith(doubleQuote) - && programName.contains(QLatin1Char(' '))) { - programName.prepend(doubleQuote); - programName.append(doubleQuote); - } - return programName; -} - static void startTerminalEmulator(const QString &workingDir, const Environment &env) { #ifdef Q_OS_WIN @@ -162,6 +147,19 @@ static void startTerminalEmulator(const QString &workingDir, const Environment & PROCESS_INFORMATION pinfo; ZeroMemory(&pinfo, sizeof(pinfo)); + static const auto quoteWinCommand = [](const QString &program) { + const QChar doubleQuote = QLatin1Char('"'); + + // add the program as the first arg ... it works better + QString programName = program; + programName.replace(QLatin1Char('/'), QLatin1Char('\\')); + if (!programName.startsWith(doubleQuote) && !programName.endsWith(doubleQuote) + && programName.contains(QLatin1Char(' '))) { + programName.prepend(doubleQuote); + programName.append(doubleQuote); + } + return programName; + }; const QString cmdLine = quoteWinCommand(QString::fromLocal8Bit(qgetenv("COMSPEC"))); // cmdLine is assumed to be detached - // https://blogs.msdn.microsoft.com/oldnewthing/20090601-00/?p=18083 diff --git a/src/plugins/cppeditor/cppcodemodelsettings.cpp b/src/plugins/cppeditor/cppcodemodelsettings.cpp index ef5c5fb10ab..9c7f995c064 100644 --- a/src/plugins/cppeditor/cppcodemodelsettings.cpp +++ b/src/plugins/cppeditor/cppcodemodelsettings.cpp @@ -72,7 +72,7 @@ static QString indexerFileSizeLimitKey() { return QLatin1String(Constants::CPPEDITOR_INDEXER_FILE_SIZE_LIMIT); } static QString clangdSettingsKey() { return QLatin1String("ClangdSettings"); } -static QString useClangdKey() { return QLatin1String("UseClangd"); } +static QString useClangdKey() { return QLatin1String("UseClangdV7"); } static QString clangdPathKey() { return QLatin1String("ClangdPath"); } static QString clangdIndexingKey() { return QLatin1String("ClangdIndexing"); } static QString clangdHeaderInsertionKey() { return QLatin1String("ClangdHeaderInsertion"); } @@ -485,7 +485,7 @@ QVariantMap ClangdSettings::Data::toMap() const void ClangdSettings::Data::fromMap(const QVariantMap &map) { - useClangd = map.value(useClangdKey(), false).toBool(); + useClangd = map.value(useClangdKey(), true).toBool(); executableFilePath = FilePath::fromString(map.value(clangdPathKey()).toString()); enableIndexing = map.value(clangdIndexingKey(), true).toBool(); autoIncludeHeaders = map.value(clangdHeaderInsertionKey(), false).toBool(); diff --git a/src/plugins/cppeditor/cppcodemodelsettings.h b/src/plugins/cppeditor/cppcodemodelsettings.h index fc7fd6ee61f..7550c011b2d 100644 --- a/src/plugins/cppeditor/cppcodemodelsettings.h +++ b/src/plugins/cppeditor/cppcodemodelsettings.h @@ -122,7 +122,7 @@ public: Utils::FilePath executableFilePath; QStringList sessionsWithOneClangd; int workerThreadLimit = 0; - bool useClangd = false; + bool useClangd = true; bool enableIndexing = true; bool autoIncludeHeaders = false; int documentUpdateThreshold = 500; diff --git a/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp b/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp index 8cfff10c658..81b410a3cda 100644 --- a/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp +++ b/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp @@ -263,10 +263,6 @@ F2TestCase::F2TestCase(CppEditorAction action, QSKIP("fuzzy matching is not supposed to work with clangd"); // TODO: Implement fallback as we do with libclang if (tag == "baseClassFunctionIntroducedByUsingDeclaration") QSKIP("clangd points to the using declaration"); - if (tag == "classDestructor" || tag == "fromDestructorDefinitionSymbol" - || tag == "fromDestructorBody") { - QSKIP("clangd wants the cursor before the ~ character"); - } if (curTestName == "testFollowClassOperatorInOp") QSKIP("clangd goes to operator name first"); } @@ -438,6 +434,10 @@ F2TestCase::F2TestCase(CppEditorAction action, } else { currentTextEditor->convertPosition(targetTestFile->m_targetCursorPosition, &expectedLine, &expectedColumn); + if (useClangd && (tag == "classDestructor" || tag == "fromDestructorDefinitionSymbol" + || tag == "fromDestructorBody")) { + --expectedColumn; // clangd goes before the ~, built-in code model after + } } // qDebug() << "Expected line:" << expectedLine; // qDebug() << "Expected column:" << expectedColumn; diff --git a/src/plugins/debugger/debuggeritemmanager.cpp b/src/plugins/debugger/debuggeritemmanager.cpp index fbe0aeb3fac..93b91c55591 100644 --- a/src/plugins/debugger/debuggeritemmanager.cpp +++ b/src/plugins/debugger/debuggeritemmanager.cpp @@ -1053,19 +1053,23 @@ void DebuggerItemManager::removeDetectedDebuggers(const QString &detectionSource QString *logMessage) { QStringList logMessages{tr("Removing debugger entries...")}; - d->m_model->forItemsAtLevel<2>([detectionSource, &logMessages](DebuggerTreeItem *titem) { + QList<DebuggerTreeItem *> toBeRemoved; + + d->m_model->forItemsAtLevel<2>([detectionSource, &toBeRemoved](DebuggerTreeItem *titem) { if (titem->m_item.detectionSource() == detectionSource) { - logMessages.append(tr("Removed \"%1\"").arg(titem->m_item.displayName())); - d->m_model->destroyItem(titem); + toBeRemoved.append(titem); return; } // FIXME: These items appeared in early docker development. Ok to remove for Creator 7.0. FilePath filePath = titem->m_item.command(); - if (filePath.scheme() + ':' + filePath.host() == detectionSource) { - logMessages.append(tr("Removed \"%1\"").arg(titem->m_item.displayName())); - d->m_model->destroyItem(titem); - } + if (filePath.scheme() + ':' + filePath.host() == detectionSource) + toBeRemoved.append(titem); }); + for (DebuggerTreeItem *current : toBeRemoved) { + logMessages.append(tr("Removed \"%1\"").arg(current->m_item.displayName())); + d->m_model->destroyItem(current); + } + if (logMessage) *logMessage = logMessages.join('\n'); } diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 1f6744d3894..a2284f50a81 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -154,7 +154,7 @@ void DockerDeviceProcess::start(const Runnable &runnable) m_process.setCommand(command); m_process.setEnvironment(runnable.environment); m_process.setWorkingDirectory(runnable.workingDirectory); - connect(&m_process, &QtcProcess::errorOccurred, this, &DeviceProcess::error); + connect(&m_process, &QtcProcess::errorOccurred, this, &DeviceProcess::errorOccurred); connect(&m_process, &QtcProcess::finished, this, &DeviceProcess::finished); connect(&m_process, &QtcProcess::readyReadStandardOutput, this, &DeviceProcess::readyReadStandardOutput); @@ -569,7 +569,7 @@ DockerDevice::DockerDevice(const DockerDeviceData &data) } proc->deleteLater(); }); - QObject::connect(proc, &DeviceProcess::error, [proc] { + QObject::connect(proc, &DeviceProcess::errorOccurred, [proc] { MessageManager::writeDisrupting(tr("Error starting remote shell.")); proc->deleteLater(); }); @@ -628,9 +628,9 @@ void KitDetectorPrivate::undoAutoDetect() const }; emit q->logOutput('\n' + tr("Removing toolchain entries...")); - for (ToolChain *toolChain : ToolChainManager::toolchains()) { - QString detectionSource = toolChain->detectionSource(); - if (toolChain->detectionSource() == m_sharedId) { + const Toolchains toolchains = ToolChainManager::toolchains(); + for (ToolChain *toolChain : toolchains) { + if (toolChain && toolChain->detectionSource() == m_sharedId) { emit q->logOutput(tr("Removed \"%1\"").arg(toolChain->displayName())); ToolChainManager::deregisterToolChain(toolChain); } @@ -709,20 +709,26 @@ QtVersions KitDetectorPrivate::autoDetectQtVersions() const QtVersions qtVersions; QString error; + + const auto handleQmake = [this, &qtVersions, &error](const FilePath &qmake) { + if (QtVersion *qtVersion = QtVersionFactory::createQtVersionFromQMakePath(qmake, false, m_sharedId, &error)) { + qtVersions.append(qtVersion); + QtVersionManager::addVersion(qtVersion); + emit q->logOutput(tr("Found \"%1\"").arg(qtVersion->qmakeFilePath().toUserOutput())); + } + return true; + }; + + emit q->logOutput(tr("Searching for qmake executables...")); + const QStringList candidates = {"qmake-qt6", "qmake-qt5", "qmake"}; - emit q->logOutput('\n' + tr("Searching Qt installations...")); - for (const QString &candidate : candidates) { - emit q->logOutput(tr("Searching for %1 executable...").arg(candidate)); - const FilePath qmake = m_device->searchExecutable(candidate, m_searchPaths); - if (qmake.isEmpty()) - continue; - QtVersion *qtVersion = QtVersionFactory::createQtVersionFromQMakePath(qmake, false, m_sharedId, &error); - if (!qtVersion) - continue; - qtVersions.append(qtVersion); - QtVersionManager::addVersion(qtVersion); - emit q->logOutput(tr("Found \"%1\"").arg(qtVersion->qmakeFilePath().toUserOutput())); + for (const FilePath &searchPath : m_searchPaths) { + searchPath.iterateDirectory(handleQmake, {candidates, QDir::Files | QDir::Executable, + QDirIterator::Subdirectories}); } + + if (!error.isEmpty()) + emit q->logOutput(tr("Error: %1.").arg(error)); if (qtVersions.isEmpty()) emit q->logOutput(tr("No Qt installation found.")); return qtVersions; @@ -793,19 +799,20 @@ void KitDetectorPrivate::autoDetect() emit q->logOutput(tr("Starting auto-detection. This will take a while...")); - QList<ToolChain *> toolChains = autoDetectToolChains(); - QtVersions qtVersions = autoDetectQtVersions(); + const Toolchains toolchains = autoDetectToolChains(); + const QtVersions qtVersions = autoDetectQtVersions(); autoDetectCMake(); autoDetectDebugger(); - const auto initializeKit = [this, toolChains, qtVersions](Kit *k) { + const auto initializeKit = [this, toolchains, qtVersions](Kit *k) { k->setAutoDetected(false); k->setAutoDetectionSource(m_sharedId); k->setUnexpandedDisplayName("%{Device:Name}"); DeviceTypeKitAspect::setDeviceTypeId(k, Constants::DOCKER_DEVICE_TYPE); DeviceKitAspect::setDevice(k, m_device); + QtVersion *qt = nullptr; if (!qtVersions.isEmpty()) { qt = qtVersions.at(0); @@ -1495,17 +1502,19 @@ void DockerDevice::iterateWithFind(const FilePath &filePath, const QString nameOption = (filters & QDir::CaseSensitive) ? QString{"-name"} : QString{"-iname"}; - QStringList criticalWildcards; if (!filter.nameFilters.isEmpty()) { const QRegularExpression oneChar("\\[.*?\\]"); - for (int i = 0, len = filter.nameFilters.size(); i < len; ++i) { - if (i > 0) + bool addedFirst = false; + for (const QString ¤t : filter.nameFilters) { + if (current.indexOf(oneChar) != -1) { + LOG("Skipped" << current << "due to presence of [] wildcard"); + continue; + } + + if (addedFirst) filterOptions << "-o"; - QString current = filter.nameFilters.at(i); - if (current.indexOf(oneChar) != -1) - criticalWildcards.append(current); - current.replace(oneChar, "?"); // BAD! but still better than nothing filterOptions << nameOption << current; + addedFirst = true; } } arguments << filterOptions; @@ -1522,17 +1531,6 @@ void DockerDevice::iterateWithFind(const FilePath &filePath, continue; const FilePath fp = FilePath::fromString(entry); - if (!criticalWildcards.isEmpty() && - !Utils::anyOf(criticalWildcards, - [name = fp.fileName()](const QString &pattern) { - const QRegularExpression regex(QRegularExpression::wildcardToRegularExpression(pattern)); - if (regex.match(name).hasMatch()) - return true; - return false; - })) { - continue; - } - if (!callBack(fp.onDevice(filePath))) break; } diff --git a/src/plugins/perfprofiler/perfconfigwidget.cpp b/src/plugins/perfprofiler/perfconfigwidget.cpp index d201a08ff0d..b58900c5d60 100644 --- a/src/plugins/perfprofiler/perfconfigwidget.cpp +++ b/src/plugins/perfprofiler/perfconfigwidget.cpp @@ -149,7 +149,7 @@ void PerfConfigWidget::setTarget(ProjectExplorer::Target *target) connect(m_process.get(), &ProjectExplorer::DeviceProcess::finished, this, &PerfConfigWidget::handleProcessFinished); - connect(m_process.get(), &ProjectExplorer::DeviceProcess::error, + connect(m_process.get(), &ProjectExplorer::DeviceProcess::errorOccurred, this, &PerfConfigWidget::handleProcessError); useTracePointsButton->setEnabled(true); diff --git a/src/plugins/perfprofiler/perfprofilerruncontrol.cpp b/src/plugins/perfprofiler/perfprofilerruncontrol.cpp index 4bdecd52dbb..684918bb6a8 100644 --- a/src/plugins/perfprofiler/perfprofilerruncontrol.cpp +++ b/src/plugins/perfprofiler/perfprofilerruncontrol.cpp @@ -133,7 +133,7 @@ public: connect(m_process, &DeviceProcess::started, this, &RunWorker::reportStarted); connect(m_process, &DeviceProcess::finished, this, &RunWorker::reportStopped); - connect(m_process, &DeviceProcess::error, [this](QProcess::ProcessError e) { + connect(m_process, &DeviceProcess::errorOccurred, [this](QProcess::ProcessError e) { // The terminate() below will frequently lead to QProcess::Crashed. We're not interested // in that. FailedToStart is the only actual failure. if (e == QProcess::FailedToStart) { diff --git a/src/plugins/perfprofiler/perftracepointdialog.cpp b/src/plugins/perfprofiler/perftracepointdialog.cpp index b439fd7cbe9..3bb2197ea58 100644 --- a/src/plugins/perfprofiler/perftracepointdialog.cpp +++ b/src/plugins/perfprofiler/perftracepointdialog.cpp @@ -113,7 +113,7 @@ void PerfTracePointDialog::runScript() connect(m_process.get(), &DeviceProcess::finished, this, &PerfTracePointDialog::handleProcessFinished); - connect(m_process.get(), &DeviceProcess::error, + connect(m_process.get(), &DeviceProcess::errorOccurred, this, &PerfTracePointDialog::handleProcessError); m_process->start(runnable); diff --git a/src/plugins/projectexplorer/applicationlauncher.cpp b/src/plugins/projectexplorer/applicationlauncher.cpp index 63621eab68c..475622c7038 100644 --- a/src/plugins/projectexplorer/applicationlauncher.cpp +++ b/src/plugins/projectexplorer/applicationlauncher.cpp @@ -424,7 +424,7 @@ void ApplicationLauncherPrivate::start(const Runnable &runnable, const IDevice:: this, &ApplicationLauncherPrivate::handleRemoteStdout); connect(m_deviceProcess, &DeviceProcess::readyReadStandardError, this, &ApplicationLauncherPrivate::handleRemoteStderr); - connect(m_deviceProcess, &DeviceProcess::error, + connect(m_deviceProcess, &DeviceProcess::errorOccurred, this, &ApplicationLauncherPrivate::handleApplicationError); connect(m_deviceProcess, &DeviceProcess::finished, this, &ApplicationLauncherPrivate::handleApplicationFinished); diff --git a/src/plugins/projectexplorer/devicesupport/desktopdeviceprocess.cpp b/src/plugins/projectexplorer/devicesupport/desktopdeviceprocess.cpp index 0bb27f3435d..004eef0af51 100644 --- a/src/plugins/projectexplorer/devicesupport/desktopdeviceprocess.cpp +++ b/src/plugins/projectexplorer/devicesupport/desktopdeviceprocess.cpp @@ -42,7 +42,7 @@ DesktopDeviceProcess::DesktopDeviceProcess(const QSharedPointer<const IDevice> & : DeviceProcess(device, parent) , m_process(ProcessMode::Writer) { - connect(&m_process, &QtcProcess::errorOccurred, this, &DeviceProcess::error); + connect(&m_process, &QtcProcess::errorOccurred, this, &DeviceProcess::errorOccurred); connect(&m_process, &QtcProcess::finished, this, &DeviceProcess::finished); connect(&m_process, &QtcProcess::readyReadStandardOutput, this, &DeviceProcess::readyReadStandardOutput); diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp index 32c6add09c1..256b93b6157 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp @@ -112,7 +112,7 @@ void DeviceManager::replaceInstance() const QList<Id> newIds = Utils::transform(DeviceManagerPrivate::clonedInstance->d->devices, &IDevice::id); - for (const IDevice::ConstPtr &dev : qAsConst(m_instance->d->devices)) { + for (const IDevice::Ptr &dev : qAsConst(m_instance->d->devices)) { if (!newIds.contains(dev->id())) dev->aboutToBeRemoved(); } @@ -144,7 +144,7 @@ DeviceManager *DeviceManager::cloneInstance() void DeviceManager::copy(const DeviceManager *source, DeviceManager *target, bool deep) { if (deep) { - for (const IDevice::ConstPtr &device : qAsConst(source->d->devices)) + for (const IDevice::Ptr &device : qAsConst(source->d->devices)) target->d->devices << device->clone(); } else { target->d->devices = source->d->devices; @@ -265,7 +265,7 @@ QVariantMap DeviceManager::toMap() const } map.insert(QLatin1String(DefaultDevicesKey), defaultDeviceMap); QVariantList deviceList; - for (const IDevice::ConstPtr &device : qAsConst(d->devices)) + for (const IDevice::Ptr &device : qAsConst(d->devices)) deviceList << device->toMap(); map.insert(QLatin1String(DeviceListKey), deviceList); return map; @@ -276,7 +276,7 @@ void DeviceManager::addDevice(const IDevice::ConstPtr &_device) const IDevice::Ptr device = _device->clone(); QStringList names; - for (const IDevice::ConstPtr &tmp : qAsConst(d->devices)) { + for (const IDevice::Ptr &tmp : qAsConst(d->devices)) { if (tmp->id() != device->id()) names << tmp->displayName(); } @@ -366,7 +366,7 @@ bool DeviceManager::isLoaded() const IDevice::ConstPtr DeviceManager::deviceForPath(const FilePath &path) { const QList<IDevice::Ptr> devices = instance()->d->deviceList(); - for (const IDevice::ConstPtr &dev : devices) { + for (const IDevice::Ptr &dev : devices) { // TODO: ensure handlesFile is thread safe if (dev->handlesFile(path)) return dev; diff --git a/src/plugins/projectexplorer/devicesupport/deviceprocess.h b/src/plugins/projectexplorer/devicesupport/deviceprocess.h index 4aa197666c3..c097bc6d09b 100644 --- a/src/plugins/projectexplorer/devicesupport/deviceprocess.h +++ b/src/plugins/projectexplorer/devicesupport/deviceprocess.h @@ -62,7 +62,7 @@ public: signals: void started(); void finished(); - void error(QProcess::ProcessError error); + void errorOccurred(QProcess::ProcessError error); void readyReadStandardOutput(); void readyReadStandardError(); diff --git a/src/plugins/projectexplorer/devicesupport/deviceusedportsgatherer.cpp b/src/plugins/projectexplorer/devicesupport/deviceusedportsgatherer.cpp index 377be1d5206..d2d3961a015 100644 --- a/src/plugins/projectexplorer/devicesupport/deviceusedportsgatherer.cpp +++ b/src/plugins/projectexplorer/devicesupport/deviceusedportsgatherer.cpp @@ -79,7 +79,7 @@ void DeviceUsedPortsGatherer::start(const IDevice::ConstPtr &device) connect(d->process.data(), &DeviceProcess::finished, this, &DeviceUsedPortsGatherer::handleProcessFinished); - connect(d->process.data(), &DeviceProcess::error, + connect(d->process.data(), &DeviceProcess::errorOccurred, this, &DeviceUsedPortsGatherer::handleProcessError); connect(d->process.data(), &DeviceProcess::readyReadStandardOutput, this, &DeviceUsedPortsGatherer::handleRemoteStdOut); diff --git a/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp b/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp index 7ef0a864465..6456cdacfb3 100644 --- a/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp +++ b/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp @@ -193,7 +193,7 @@ void SshDeviceProcess::handleConnected() d->process->requestX11Forwarding(display); if (runInTerminal()) { connect(&d->consoleProcess, &QtcProcess::errorOccurred, - this, &DeviceProcess::error); + this, &DeviceProcess::errorOccurred); connect(&d->consoleProcess, &QtcProcess::started, this, &SshDeviceProcess::handleProcessStarted); connect(&d->consoleProcess, &QtcProcess::finished, @@ -230,7 +230,7 @@ void SshDeviceProcess::handleDisconnected() switch (oldState) { case SshDeviceProcessPrivate::Connecting: case SshDeviceProcessPrivate::Connected: - emit error(QProcess::FailedToStart); + emit errorOccurred(QProcess::FailedToStart); break; case SshDeviceProcessPrivate::ProcessRunning: d->exitStatus = QProcess::CrashExit; @@ -316,7 +316,7 @@ void SshDeviceProcess::SshDeviceProcessPrivate::doSignal(Signal signal) case SshDeviceProcessPrivate::Connecting: errorMessage = tr("Terminated by request."); setState(SshDeviceProcessPrivate::Inactive); - emit q->error(QProcess::FailedToStart); + emit q->errorOccurred(QProcess::FailedToStart); break; case SshDeviceProcessPrivate::Connected: case SshDeviceProcessPrivate::ProcessRunning: diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp index bd48cc84daf..c03baf88482 100644 --- a/src/plugins/projectexplorer/session.cpp +++ b/src/plugins/projectexplorer/session.cpp @@ -791,7 +791,8 @@ QStringList SessionManager::sessions() { if (d->m_sessions.isEmpty()) { // We are not initialized yet, so do that now - const FilePaths sessionFiles = ICore::userResourcePath().dirEntries({{"*qws"}}, QDir::Time); + const FilePaths sessionFiles = + ICore::userResourcePath().dirEntries({{"*qws"}}, QDir::Time | QDir::Reversed); for (const FilePath &file : sessionFiles) { const QString &name = file.completeBaseName(); d->m_sessionDateTimes.insert(name, file.lastModified()); diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp index 8070cacac02..386f6a1137f 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp @@ -92,6 +92,8 @@ Edit3DWidget *Edit3DView::edit3DWidget() const void Edit3DView::selectedNodesChanged(const QList<ModelNode> &selectedNodeList, const QList<ModelNode> &lastSelectedNodeList) { + Q_UNUSED(selectedNodeList) + Q_UNUSED(lastSelectedNodeList) SelectionContext selectionContext(this); selectionContext.setUpdateMode(SelectionContext::UpdateMode::Fast); if (m_alignCamerasAction) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 10c2a9cc10c..d9c369e3dd8 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -1348,7 +1348,7 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, syncExpressionProperty(modelProperty, astValue, astType, differenceHandler); } modelPropertyNames.remove(astName.toUtf8()); - } else if (auto source = AST::cast<AST::UiSourceElement *>(member)) { + } else if (AST::cast<AST::UiSourceElement *>(member)) { // function et al } else { qWarning() << "Found an unknown QML value."; diff --git a/src/plugins/qnx/qnxdevice.cpp b/src/plugins/qnx/qnxdevice.cpp index 37d29516583..4c88743f2ad 100644 --- a/src/plugins/qnx/qnxdevice.cpp +++ b/src/plugins/qnx/qnxdevice.cpp @@ -104,7 +104,7 @@ void QnxDevice::updateVersionNumber() const QEventLoop eventLoop; SshDeviceProcess versionNumberProcess(sharedFromThis()); QObject::connect(&versionNumberProcess, &SshDeviceProcess::finished, &eventLoop, &QEventLoop::quit); - QObject::connect(&versionNumberProcess, &DeviceProcess::error, &eventLoop, &QEventLoop::quit); + QObject::connect(&versionNumberProcess, &DeviceProcess::errorOccurred, &eventLoop, &QEventLoop::quit); Runnable r; r.command = {"uname", {"-r"}}; diff --git a/src/plugins/qnx/slog2inforunner.cpp b/src/plugins/qnx/slog2inforunner.cpp index cd341899ade..c5209fdfe54 100644 --- a/src/plugins/qnx/slog2inforunner.cpp +++ b/src/plugins/qnx/slog2inforunner.cpp @@ -60,7 +60,7 @@ Slog2InfoRunner::Slog2InfoRunner(RunControl *runControl) m_logProcess = new QnxDeviceProcess(device(), this); connect(m_logProcess, &DeviceProcess::readyReadStandardOutput, this, &Slog2InfoRunner::readLogStandardOutput); connect(m_logProcess, &DeviceProcess::readyReadStandardError, this, &Slog2InfoRunner::readLogStandardError); - connect(m_logProcess, &DeviceProcess::error, this, &Slog2InfoRunner::handleLogError); + connect(m_logProcess, &DeviceProcess::errorOccurred, this, &Slog2InfoRunner::handleLogError); } void Slog2InfoRunner::printMissingWarning() diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index 9387b46b7cd..63f7e0ff72c 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -201,7 +201,7 @@ public: { delete m_shell; m_shell = nullptr; - DEBUG("Failed to connect to " << parameters.host()); + qCDebug(linuxDeviceLog) << "Failed to connect to" << parameters.host(); return false; } @@ -324,7 +324,7 @@ LinuxDevice::LinuxDevice() } proc->deleteLater(); }); - QObject::connect(proc, &DeviceProcess::error, [proc] { + QObject::connect(proc, &DeviceProcess::errorOccurred, [proc] { Core::MessageManager::writeDisrupting(tr("Error starting remote shell.")); proc->deleteLater(); }); @@ -440,7 +440,7 @@ bool LinuxDevice::handlesFile(const FilePath &filePath) const return filePath.scheme() == "ssh" && filePath.host() == userAtHost(); } -void LinuxDevice::runProcess(QtcProcess &process) const +void LinuxDevice::runProcess(QtcProcess &) const { QTC_CHECK(false); // FIXME: Implement } diff --git a/src/plugins/remotelinux/linuxdevice.h b/src/plugins/remotelinux/linuxdevice.h index d2906b230c3..d914e8b223b 100644 --- a/src/plugins/remotelinux/linuxdevice.h +++ b/src/plugins/remotelinux/linuxdevice.h @@ -82,7 +82,7 @@ public: QByteArray fileContents(const Utils::FilePath &filePath, qint64 limit, qint64 offset) const override; bool writeFileContents(const Utils::FilePath &filePath, const QByteArray &data) const override; QDateTime lastModified(const Utils::FilePath &filePath) const override; - void runProcess(Utils::QtcProcess &process) const override; + void runProcess(Utils::QtcProcess &) const override; qint64 fileSize(const Utils::FilePath &filePath) const override; qint64 bytesAvailable(const Utils::FilePath &filePath) const override; QFileDevice::Permissions permissions(const Utils::FilePath &filePath) const override; diff --git a/src/plugins/remotelinux/remotelinuxenvironmentreader.cpp b/src/plugins/remotelinux/remotelinuxenvironmentreader.cpp index 6f477bdcce6..fd59e384317 100644 --- a/src/plugins/remotelinux/remotelinuxenvironmentreader.cpp +++ b/src/plugins/remotelinux/remotelinuxenvironmentreader.cpp @@ -54,7 +54,7 @@ void RemoteLinuxEnvironmentReader::start() } m_stop = false; m_deviceProcess = m_device->createProcess(this); - connect(m_deviceProcess, &DeviceProcess::error, + connect(m_deviceProcess, &DeviceProcess::errorOccurred, this, &RemoteLinuxEnvironmentReader::handleError); connect(m_deviceProcess, &DeviceProcess::finished, this, &RemoteLinuxEnvironmentReader::remoteProcessFinished); diff --git a/src/tools/qml2puppet/CMakeLists.txt b/src/tools/qml2puppet/CMakeLists.txt index 4a642acbd9a..86d9894edaf 100644 --- a/src/tools/qml2puppet/CMakeLists.txt +++ b/src/tools/qml2puppet/CMakeLists.txt @@ -178,6 +178,15 @@ extend_qtc_executable(qml2puppet DEFINES QUICK3D_PARTICLES_MODULE ) +# Quick3DAssetUtils optionally depends on QuickTimeline, so find also it to make the CI build work +find_package(Qt5 5.15.0 COMPONENTS Quick3DAssetUtils QuickTimeline QUIET) +extend_qtc_executable(qml2puppet + CONDITION TARGET Qt5::Quick3DAssetUtils + FEATURE_INFO "Qt Quick 3D asset utils" + DEPENDS Qt5::Quick3DAssetUtilsPrivate + DEFINES QUICK3D_ASSET_UTILS_MODULE +) + extend_qtc_executable(qml2puppet CONDITION Qt5_VERSION VERSION_GREATER_EQUAL 6.0.0 |