From 108ed5a40046863ebb8713c544d8787df71c17f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sivert=20Kr=C3=B8vel?= Date: Mon, 10 Jun 2024 10:13:32 +0200 Subject: [PATCH 01/36] McuSupport: Update getPath() test expectations After the recent change 3be0b263a87c4289f26ad778829c2b38643178a5, SettingsHandler::getPath() can be called one additional time in the McuPackage constructor. Take this into account in test expectations Change-Id: Ib302de2b2d446a9b8884f8c3d0bfabd4223b8d87 Reviewed-by: Eike Ziller Reviewed-by: Christian Stenger --- src/plugins/mcusupport/test/unittest.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/plugins/mcusupport/test/unittest.cpp b/src/plugins/mcusupport/test/unittest.cpp index d523d6a4bf1..74e98a0ec41 100644 --- a/src/plugins/mcusupport/test/unittest.cpp +++ b/src/plugins/mcusupport/test/unittest.cpp @@ -75,6 +75,7 @@ using ProjectExplorer::ToolchainManager; using testing::_; using testing::Return; +using testing::Between; namespace { const char empty[]{""}; @@ -506,6 +507,7 @@ void McuSupportTest::init() void McuSupportTest::cleanup() { + QVERIFY(settingsMockPtr.get()); QVERIFY(testing::Mock::VerifyAndClearExpectations(settingsMockPtr.get())); QVERIFY(testing::Mock::VerifyAndClearExpectations(freeRtosPackage)); QVERIFY(testing::Mock::VerifyAndClearExpectations(sdkPackage)); @@ -854,7 +856,7 @@ void McuSupportTest::test_useFallbackPathForToolchainWhenPathFromSettingsIsNotAv McuTargetDescription::Toolchain toolchainDescription{armGcc, {}, compilerDescription, {}}; EXPECT_CALL(*settingsMockPtr, getPath(Key{armGccDirectorySetting}, _, FilePath{fallbackDir})) - .Times(2) + .Times(Between(2,3)) .WillRepeatedly(Return(FilePath{fallbackDir})); McuToolchainPackage *toolchain = targetFactory.createToolchain(toolchainDescription); @@ -1559,7 +1561,7 @@ void McuSupportTest::test_legacy_createThirdPartyPackage() QFETCH(QString, detectionPath); EXPECT_CALL(*settingsMockPtr, getPath(Key{setting}, _, _)) - .Times(2) + .Times(Between(2,3)) .WillRepeatedly(Return(FilePath::fromUserInput(defaultPath))); McuPackagePtr thirdPartyPackage{creator()}; @@ -1644,7 +1646,7 @@ void McuSupportTest::test_createThirdPartyPackage() .WillOnce(Return(FilePath::fromUserInput(defaultPath))); EXPECT_CALL(*settingsMockPtr, getPath(Key{setting}, QSettings::UserScope, _)) - .Times(testing::AtMost(1)) + .Times(testing::AtMost(2)) .WillOnce(Return(FilePath::fromUserInput(path))); auto [targets, packages] = targetFactory.createTargets(targetDescription, sdkPackagePtr); @@ -1668,7 +1670,7 @@ void McuSupportTest::test_createThirdPartyPackage() void McuSupportTest::test_legacy_createCypressProgrammer3rdPartyPackage() { EXPECT_CALL(*settingsMockPtr, getPath(Key{cypressProgrammerSetting}, _, _)) - .Times(2) + .Times(Between(2,3)) .WillRepeatedly(Return(FilePath::fromUserInput(defaultToolPath))); McuPackagePtr thirdPartyPackage{Legacy::createCypressProgrammerPackage(settingsMockPtr)}; @@ -1692,7 +1694,7 @@ void McuSupportTest::test_createJLink3rdPartyPackage() .WillOnce(Return(FilePath::fromUserInput(jlinkPath))); EXPECT_CALL(*settingsMockPtr, getPath(Key{jlinkSetting}, QSettings::UserScope, _)) - .Times(testing::AtMost(1)) + .Times(testing::AtMost(2)) .WillOnce(Return(FilePath::fromUserInput(jlinkPath))); auto [targets, packages] = targetFactory.createTargets(targetDescription, sdkPackagePtr); From 3ea08f9b6f9f4d4c91ad1d1e74dfc1b1c1db81da Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 11 Jun 2024 16:03:23 +0200 Subject: [PATCH 02/36] ProjectExplorer: Make the timeout between TERM and KILL configurable Fixes: QTCREATORBUG-31025 Change-Id: Ibb5b9f3a946e1603fb55b57511c4b6d90b1d6217 Reviewed-by: hjk --- .../projectexplorersettings.cpp | 22 +++++++++++++++++++ .../projectexplorer/projectexplorersettings.h | 1 + src/plugins/projectexplorer/runcontrol.cpp | 8 ++++--- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/plugins/projectexplorer/projectexplorersettings.cpp b/src/plugins/projectexplorer/projectexplorersettings.cpp index 1780a53eff7..3e36b84ab75 100644 --- a/src/plugins/projectexplorer/projectexplorersettings.cpp +++ b/src/plugins/projectexplorer/projectexplorersettings.cpp @@ -25,6 +25,7 @@ #include #include #include +#include using namespace Core; using namespace Utils; @@ -33,6 +34,7 @@ namespace ProjectExplorer { namespace Internal { namespace Constants { +const char REAPER_TIMEOUT_SETTINGS_KEY[] = "ProjectExplorer/Settings/ReaperTimeout"; const char BUILD_BEFORE_DEPLOY_SETTINGS_KEY[] = "ProjectExplorer/Settings/BuildBeforeDeploy"; const char DEPLOY_BEFORE_RUN_SETTINGS_KEY[] = "ProjectExplorer/Settings/DeployBeforeRun"; const char SAVE_BEFORE_BUILD_SETTINGS_KEY[] = "ProjectExplorer/Settings/SaveBeforeBuild"; @@ -65,6 +67,7 @@ void saveProjectExplorerSettings(); static bool operator==(const ProjectExplorerSettings &p1, const ProjectExplorerSettings &p2) { return p1.buildBeforeDeploy == p2.buildBeforeDeploy + && p1.reaperTimeoutInSeconds == p2.reaperTimeoutInSeconds && p1.deployBeforeRun == p2.deployBeforeRun && p1.saveBeforeBuild == p2.saveBeforeBuild && p1.useJom == p2.useJom @@ -120,6 +123,9 @@ static void loadProjectExplorerSettings() static const ProjectExplorerSettings defaultSettings; + settings.reaperTimeoutInSeconds + = s->value(Constants::REAPER_TIMEOUT_SETTINGS_KEY, defaultSettings.reaperTimeoutInSeconds) + .toInt(); settings.deployBeforeRun = s->value(Constants::DEPLOY_BEFORE_RUN_SETTINGS_KEY, defaultSettings.deployBeforeRun) .toBool(); @@ -186,6 +192,10 @@ void saveProjectExplorerSettings() static const ProjectExplorerSettings defaultSettings; const ProjectExplorerSettings &settings = projectExplorerSettings(); + s->setValueWithDefault( + Constants::REAPER_TIMEOUT_SETTINGS_KEY, + settings.reaperTimeoutInSeconds, + defaultSettings.reaperTimeoutInSeconds); s->setValueWithDefault(Constants::BUILD_BEFORE_DEPLOY_SETTINGS_KEY, int(settings.buildBeforeDeploy), int(defaultSettings.buildBeforeDeploy)); @@ -290,6 +300,7 @@ private: QComboBox *m_terminalModeComboBox; QCheckBox *m_jomCheckbox; QCheckBox *m_showAllKitsCheckBox; + QSpinBox *m_reaperTimeoutSpinBox; Utils::ElidingLabel *m_appEnvLabel; QButtonGroup *m_directoryButtonGroup; @@ -297,6 +308,13 @@ private: ProjectExplorerSettingsWidget::ProjectExplorerSettingsWidget() { + m_reaperTimeoutSpinBox = new QSpinBox; + m_reaperTimeoutSpinBox->setMinimum(1); + m_reaperTimeoutSpinBox->setSuffix(Tr::tr("s")); + m_reaperTimeoutSpinBox->setToolTip( + Tr::tr("The amount of seconds to wait between a \"soft kill\" and a \"hard kill\" of a " + "running application")); + m_currentDirectoryRadioButton = new QRadioButton(Tr::tr("Current directory")); m_directoryRadioButton = new QRadioButton(Tr::tr("Directory")); m_projectsDirectoryPathChooser = new PathChooser; @@ -406,6 +424,8 @@ ProjectExplorerSettingsWidget::ProjectExplorerSettingsWidget() Tr::tr("Build before deploying:"), m_buildBeforeDeployComboBox, br, Tr::tr("Stop applications before building:"), m_stopBeforeBuildComboBox, br, Tr::tr("Default for \"Run in terminal\":"), m_terminalModeComboBox, br, + Tr::tr("Time to wait before force-stopping applications:"), + m_reaperTimeoutSpinBox, st, br, }, m_jomCheckbox, jomLabel, @@ -434,6 +454,7 @@ ProjectExplorerSettingsWidget::ProjectExplorerSettingsWidget() ProjectExplorerSettings ProjectExplorerSettingsWidget::settings() const { ProjectExplorerSettings s; + s.reaperTimeoutInSeconds = m_reaperTimeoutSpinBox->value(); s.buildBeforeDeploy = static_cast( m_buildBeforeDeployComboBox->currentData().toInt()); s.deployBeforeRun = m_deployProjectBeforeRunCheckBox->isChecked(); @@ -458,6 +479,7 @@ ProjectExplorerSettings ProjectExplorerSettingsWidget::settings() const void ProjectExplorerSettingsWidget::setSettings(const ProjectExplorerSettings &s) { + m_reaperTimeoutSpinBox->setValue(s.reaperTimeoutInSeconds); m_appEnvChanges = s.appEnvChanges; m_buildBeforeDeployComboBox->setCurrentIndex( m_buildBeforeDeployComboBox->findData(int(s.buildBeforeDeploy))); diff --git a/src/plugins/projectexplorer/projectexplorersettings.h b/src/plugins/projectexplorer/projectexplorersettings.h index 0a99984dc24..3a30548d60d 100644 --- a/src/plugins/projectexplorer/projectexplorersettings.h +++ b/src/plugins/projectexplorer/projectexplorersettings.h @@ -22,6 +22,7 @@ class ProjectExplorerSettings { public: BuildBeforeRunMode buildBeforeDeploy = BuildBeforeRunMode::WholeProject; + int reaperTimeoutInSeconds = 1; bool deployBeforeRun = true; bool saveBeforeBuild = false; bool useJom = true; diff --git a/src/plugins/projectexplorer/runcontrol.cpp b/src/plugins/projectexplorer/runcontrol.cpp index 02df4037afd..104dc5bf003 100644 --- a/src/plugins/projectexplorer/runcontrol.cpp +++ b/src/plugins/projectexplorer/runcontrol.cpp @@ -1320,11 +1320,12 @@ void SimpleTargetRunnerPrivate::stop() m_resultData.m_exitStatus = QProcess::CrashExit; const bool isLocal = !m_command.executable().needsDevice(); + const auto totalTimeout = 2 * m_process.reaperTimeout(); if (isLocal) { if (!isRunning()) return; m_process.stop(); - m_process.waitForFinished(); + m_process.waitForFinished(totalTimeout); QTimer::singleShot(100, this, [this] { forwardDone(); }); } else { if (m_stopRequested) @@ -1334,8 +1335,7 @@ void SimpleTargetRunnerPrivate::stop() switch (m_state) { case Run: m_process.stop(); - using namespace std::chrono_literals; - if (!m_process.waitForFinished(2s)) { // TODO: it may freeze on some devices + if (!m_process.waitForFinished(totalTimeout)) { q->appendMessage(Tr::tr("Remote process did not finish in time. " "Connectivity lost?"), ErrorMessageFormat); m_process.close(); @@ -1520,6 +1520,8 @@ void SimpleTargetRunner::start() d->m_stopReported = false; d->disconnect(this); d->m_process.setTerminalMode(useTerminal ? Utils::TerminalMode::Run : Utils::TerminalMode::Off); + d->m_process.setReaperTimeout( + std::chrono::seconds(projectExplorerSettings().reaperTimeoutInSeconds)); d->m_runAsRoot = runAsRoot; const QString msg = Tr::tr("Starting %1...").arg(d->m_command.displayName()); From d3753b97b2df1a051d6143281d8ad18e1e0b2f57 Mon Sep 17 00:00:00 2001 From: Artem Sokolovskii Date: Thu, 25 Apr 2024 15:40:52 +0200 Subject: [PATCH 03/36] AppStatisticMonitor: Add Mac support Change-Id: I1af929cb9cccd115940cbcfddcd2102c6f15a367 Reviewed-by: Eike Ziller --- .../appstatisticsmonitor/idataprovider.cpp | 71 ++++++++++++++++++- 1 file changed, 68 insertions(+), 3 deletions(-) diff --git a/src/plugins/appstatisticsmonitor/idataprovider.cpp b/src/plugins/appstatisticsmonitor/idataprovider.cpp index f8cb70fddd6..8b149caf5cd 100644 --- a/src/plugins/appstatisticsmonitor/idataprovider.cpp +++ b/src/plugins/appstatisticsmonitor/idataprovider.cpp @@ -16,8 +16,19 @@ #endif #ifdef Q_OS_WIN -#include #include +#include +#endif + +#ifdef Q_OS_MACOS +#include +#include +#include + +#include +#include +#include +#include #endif using namespace Utils; @@ -258,9 +269,63 @@ public: : IDataProvider(pid, parent) {} - double getMemoryConsumption() { return 0; } + double getCpuConsumption() + { + proc_taskallinfo taskAllInfo = {}; - double getCpuConsumption() { return 0; } + const int result + = proc_pidinfo(m_pid, PROC_PIDTASKALLINFO, 0, &taskAllInfo, sizeof(taskAllInfo)); + if (result == -1) { + return 0; + } + + mach_timebase_info_data_t sTimebase; + mach_timebase_info(&sTimebase); + double timebase_to_ns = (double) sTimebase.numer / (double) sTimebase.denom; + + const double currentTotalCpuTime = ((double) taskAllInfo.ptinfo.pti_total_user + + (double) taskAllInfo.ptinfo.pti_total_system) + * timebase_to_ns / 1e9; + + const double cpuUsageDelta = currentTotalCpuTime - m_prevCpuUsage; + + const auto elapsedTime = std::chrono::steady_clock::now() - m_prevTime; + const double elapsedTimeSeconds + = std::chrono::duration_cast(elapsedTime).count() / 1000.0; + + m_prevCpuUsage = currentTotalCpuTime; + m_prevTime = std::chrono::steady_clock::now(); + + return (cpuUsageDelta / elapsedTimeSeconds) * 100.0; + } + + double getTotalPhysicalMemory() + { + int mib[2]; + size_t length; + long long physicalMemory; + + mib[0] = CTL_HW; + mib[1] = HW_MEMSIZE; + length = sizeof(physicalMemory); + sysctl(mib, 2, &physicalMemory, &length, NULL, 0); + + return physicalMemory; + } + + double getMemoryConsumption() + { + proc_taskinfo taskInfo; + int result = proc_pidinfo(m_pid, PROC_PIDTASKINFO, 0, &taskInfo, sizeof(taskInfo)); + if (result == -1) + return 0; + + return (taskInfo.pti_resident_size / getTotalPhysicalMemory()) * 100.0; + } + +private: + std::chrono::steady_clock::time_point m_prevTime = std::chrono::steady_clock::now(); + double m_prevCpuUsage = 0; }; #endif From b56a447a83abf19126764549c4908b8ffedc0375 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 4 Jun 2024 15:53:59 +0200 Subject: [PATCH 04/36] Debugger: Prevent showing the windows error on debugger detection Change-Id: Id4a6d8fe345fa023d3a0bffe6e46fc2077cbfae5 Reviewed-by: Cristian Adam --- src/libs/utils/launcherpackets.cpp | 6 ++++-- src/libs/utils/launcherpackets.h | 1 + src/libs/utils/launchersocket.cpp | 1 + src/libs/utils/processhelper.cpp | 11 +++++++---- src/libs/utils/processhelper.h | 3 ++- src/libs/utils/processinterface.h | 1 + src/libs/utils/qtcprocess.cpp | 13 ++++++++++++- src/libs/utils/qtcprocess.h | 3 +++ src/plugins/debugger/debuggeritem.cpp | 19 ++++--------------- src/plugins/projectexplorer/runcontrol.cpp | 1 + .../processlauncher/launchersockethandler.cpp | 3 ++- 11 files changed, 38 insertions(+), 24 deletions(-) diff --git a/src/libs/utils/launcherpackets.cpp b/src/libs/utils/launcherpackets.cpp index 37261224ef5..a770e8865da 100644 --- a/src/libs/utils/launcherpackets.cpp +++ b/src/libs/utils/launcherpackets.cpp @@ -49,7 +49,8 @@ void StartProcessPacket::doSerialize(QDataStream &stream) const << unixTerminalDisabled << useCtrlCStub << reaperTimeout - << createConsoleOnWindows; + << createConsoleOnWindows + << forceDefaultErrorMode; } void StartProcessPacket::doDeserialize(QDataStream &stream) @@ -70,7 +71,8 @@ void StartProcessPacket::doDeserialize(QDataStream &stream) >> unixTerminalDisabled >> useCtrlCStub >> reaperTimeout - >> createConsoleOnWindows; + >> createConsoleOnWindows + >> forceDefaultErrorMode; processMode = Utils::ProcessMode(processModeInt); processChannelMode = QProcess::ProcessChannelMode(processChannelModeInt); } diff --git a/src/libs/utils/launcherpackets.h b/src/libs/utils/launcherpackets.h index 27e98a74e5b..d00169c1f6f 100644 --- a/src/libs/utils/launcherpackets.h +++ b/src/libs/utils/launcherpackets.h @@ -99,6 +99,7 @@ public: bool useCtrlCStub = false; int reaperTimeout = 500; bool createConsoleOnWindows = false; + bool forceDefaultErrorMode = false; private: void doSerialize(QDataStream &stream) const override; diff --git a/src/libs/utils/launchersocket.cpp b/src/libs/utils/launchersocket.cpp index 23b7d39fcd1..61796a2bb3d 100644 --- a/src/libs/utils/launchersocket.cpp +++ b/src/libs/utils/launchersocket.cpp @@ -260,6 +260,7 @@ void CallerHandle::start(const QString &program, const QStringList &arguments) p.useCtrlCStub = m_setup->m_useCtrlCStub; p.reaperTimeout = m_setup->m_reaperTimeout.count(); p.createConsoleOnWindows = m_setup->m_createConsoleOnWindows; + p.forceDefaultErrorMode = m_setup->m_forceDefaultErrorMode; sendPacket(p); } diff --git a/src/libs/utils/processhelper.cpp b/src/libs/utils/processhelper.cpp index 6045b77bec1..7e7f34cf421 100644 --- a/src/libs/utils/processhelper.cpp +++ b/src/libs/utils/processhelper.cpp @@ -55,12 +55,13 @@ void ProcessStartHandler::setNativeArguments(const QString &arguments) #endif // Q_OS_WIN } -void ProcessStartHandler::setWindowsSpecificStartupFlags(bool belowNormalPriority, - bool createConsoleWindow) +void ProcessStartHandler::setWindowsSpecificStartupFlags( + bool belowNormalPriority, bool createConsoleWindow, bool forceDefaultErrorMode) { #ifdef Q_OS_WIN m_process->setCreateProcessArgumentsModifier( - [belowNormalPriority, createConsoleWindow](QProcess::CreateProcessArguments *args) { + [belowNormalPriority, createConsoleWindow, forceDefaultErrorMode]( + QProcess::CreateProcessArguments *args) { if (createConsoleWindow) { args->flags |= CREATE_NEW_CONSOLE; args->startupInfo->dwFlags &= ~STARTF_USESTDHANDLES; @@ -69,11 +70,13 @@ void ProcessStartHandler::setWindowsSpecificStartupFlags(bool belowNormalPriorit if (belowNormalPriority) args->flags |= BELOW_NORMAL_PRIORITY_CLASS; - args->flags |= CREATE_DEFAULT_ERROR_MODE; + if (forceDefaultErrorMode) + args->flags |= CREATE_DEFAULT_ERROR_MODE; }); #else // Q_OS_WIN Q_UNUSED(belowNormalPriority) Q_UNUSED(createConsoleWindow) + Q_UNUSED(forceDefaultErrorMode) #endif } diff --git a/src/libs/utils/processhelper.h b/src/libs/utils/processhelper.h index a4efc17ae51..7c40cb3faa0 100644 --- a/src/libs/utils/processhelper.h +++ b/src/libs/utils/processhelper.h @@ -20,7 +20,8 @@ public: void handleProcessStart(); void handleProcessStarted(); void setNativeArguments(const QString &arguments); - void setWindowsSpecificStartupFlags(bool belowNormalPriority, bool createConsoleWindow); + void setWindowsSpecificStartupFlags( + bool belowNormalPriority, bool createConsoleWindow, bool forceDefaultErrorMode); private: ProcessMode m_processMode = ProcessMode::Reader; diff --git a/src/libs/utils/processinterface.h b/src/libs/utils/processinterface.h index 1e233b88abf..4d230c4ef9e 100644 --- a/src/libs/utils/processinterface.h +++ b/src/libs/utils/processinterface.h @@ -94,6 +94,7 @@ public: bool m_useCtrlCStub = false; bool m_belowNormalPriority = false; // internal, dependent on other fields and specific code path bool m_createConsoleOnWindows = false; + bool m_forceDefaultErrorMode = false; }; class QTCREATOR_UTILS_EXPORT ProcessResultData diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index dca106a7d51..5e0918ed70e 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -511,7 +511,8 @@ private: handler->setWriteData(m_setup.m_writeData); handler->setNativeArguments(m_setup.m_nativeArguments); handler->setWindowsSpecificStartupFlags(m_setup.m_belowNormalPriority, - m_setup.m_createConsoleOnWindows); + m_setup.m_createConsoleOnWindows, + m_setup.m_forceDefaultErrorMode); const QProcessEnvironment penv = m_setup.m_environment.toProcessEnvironment(); if (!penv.isEmpty()) @@ -1383,6 +1384,16 @@ bool Process::createConsoleOnWindows() const return d->m_setup.m_createConsoleOnWindows; } +void Process::setForceDefaultErrorModeOnWindows(bool force) +{ + d->m_setup.m_forceDefaultErrorMode = force; +} + +bool Process::forceDefaultErrorModeOnWindows() const +{ + return d->m_setup.m_forceDefaultErrorMode; +} + void Process::setExtraData(const QString &key, const QVariant &value) { d->m_setup.m_extraData.insert(key, value); diff --git a/src/libs/utils/qtcprocess.h b/src/libs/utils/qtcprocess.h index a7e00882a31..3f043214f96 100644 --- a/src/libs/utils/qtcprocess.h +++ b/src/libs/utils/qtcprocess.h @@ -187,6 +187,9 @@ public: void setCreateConsoleOnWindows(bool create); bool createConsoleOnWindows() const; + void setForceDefaultErrorModeOnWindows(bool force); + bool forceDefaultErrorModeOnWindows() const; + signals: void starting(); // On NotRunning -> Starting state transition void started(); // On Starting -> Running state transition diff --git a/src/plugins/debugger/debuggeritem.cpp b/src/plugins/debugger/debuggeritem.cpp index dff784341a7..6cf45ac13e1 100644 --- a/src/plugins/debugger/debuggeritem.cpp +++ b/src/plugins/debugger/debuggeritem.cpp @@ -147,27 +147,16 @@ void DebuggerItem::reinitializeFromFile(QString *error, Utils::Environment *cust Environment env = customEnv ? *customEnv : m_command.deviceEnvironment(); - // Prevent calling lldb on Windows because the lldb from the llvm package is linked against - // python but does not contain a python dll. - const bool isAndroidNdkLldb = DebuggerItem::addAndroidLldbPythonEnv(m_command, env); - const FilePath qtcreatorLldb = Core::ICore::lldbExecutable(CLANG_BINDIR); - if (HostOsInfo::isWindowsHost() && m_command.fileName().startsWith("lldb") && !isAndroidNdkLldb - && qtcreatorLldb != m_command) { - QString errorMessage; - m_version = winGetDLLVersion(WinDLLFileVersion, - m_command.absoluteFilePath().path(), - &errorMessage); - m_engineType = LldbEngineType; - m_abis = Abi::abisOfBinary(m_command); - return; - } - // QNX gdb unconditionally checks whether the QNX_TARGET env variable is // set and bails otherwise, even when it is not used by the specific // codepath triggered by the --version and --configuration arguments. The // hack below tricks it into giving us the information we want. env.set("QNX_TARGET", QString()); + // On Windows, we need to prevent the Windows Error Reporting dialog from + // popping up when a candidate is missing required DLLs. + WindowsCrashDialogBlocker blocker; + Process proc; proc.setEnvironment(env); proc.setCommand({m_command, {version}}); diff --git a/src/plugins/projectexplorer/runcontrol.cpp b/src/plugins/projectexplorer/runcontrol.cpp index 104dc5bf003..5eac3498bcf 100644 --- a/src/plugins/projectexplorer/runcontrol.cpp +++ b/src/plugins/projectexplorer/runcontrol.cpp @@ -1444,6 +1444,7 @@ void SimpleTargetRunnerPrivate::start() else m_outputCodec = QTextCodec::codecForName("utf8"); + m_process.setForceDefaultErrorModeOnWindows(true); m_process.start(); } diff --git a/src/tools/processlauncher/launchersockethandler.cpp b/src/tools/processlauncher/launchersockethandler.cpp index d7f576e434b..53ef9171295 100644 --- a/src/tools/processlauncher/launchersockethandler.cpp +++ b/src/tools/processlauncher/launchersockethandler.cpp @@ -181,7 +181,8 @@ void LauncherSocketHandler::handleStartPacket() process->setStandardInputFile(packet.standardInputFile); ProcessStartHandler *handler = process->processStartHandler(); handler->setWindowsSpecificStartupFlags(packet.belowNormalPriority, - packet.createConsoleOnWindows); + packet.createConsoleOnWindows, + packet.forceDefaultErrorMode); handler->setProcessMode(packet.processMode); handler->setWriteData(packet.writeData); handler->setNativeArguments(packet.nativeArguments); From 25290aaf054b9145d9adbb7cebe65f0e853bfd43 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 11 Jun 2024 16:16:07 +0200 Subject: [PATCH 05/36] Doc: Split up the table of C++ Quick Fixes Organize quick fixes in tables in alphabetic order according to where they are available. The one big table was getting very hard to read and new quick fixes are added all the time. Change-Id: Ieaff98b7cdb2d781b14630fa4db77b4b261f4573 Reviewed-by: Christian Kandeler --- .../creator-only/creator-cpp-quick-fixes.qdoc | 882 +++++++++--------- 1 file changed, 459 insertions(+), 423 deletions(-) diff --git a/doc/qtcreator/src/editors/creator-only/creator-cpp-quick-fixes.qdoc b/doc/qtcreator/src/editors/creator-only/creator-cpp-quick-fixes.qdoc index b3bab5c7feb..54ed36c23ba 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-cpp-quick-fixes.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-cpp-quick-fixes.qdoc @@ -103,15 +103,174 @@ \li Create function declarations and definitions \endlist - The following table summarizes the quick fixes for C++ code. The - fix is available when the cursor is in the position described in the - Activation column. + The following tables summarize the quick fixes available for C++ code, + according to the cursor position. + + \section1 Block of Code Selected + + \table + \header + \li Quick Fix + \li Description + \row + \li Assign to Local Variable + \li Adds a local variable which stores the return value of a + function call or a new expression. For example, rewrites: + + \code + QString s; + s.toLatin1(); + \endcode + + as + + \code + QString s; + QByteArray latin1 = s.toLatin1(); + \endcode + + and + + \code + new Foo; + \endcode + + as + + \code + Foo * localFoo = new Foo; + \endcode + + By default, \QC uses the \c auto variable type when creating the + variable. To label the variable with its actual type, select + \preferences > \uicontrol C++ > \uicontrol {Quick Fixes} and + clear \uicontrol {Use type "auto" when creating new variables}. + + Also available for a function call. + \row + \li Extract Function + \li Moves the selected code to a new function and replaces the block + of code with a call to the new function. Enter a name for the + function in the \uicontrol {Extract Function Refactoring} + dialog. + \row + \li Extract Constant as Function Parameter + \li Replaces the selected literal and all its occurrences with the + function parameter \c{newParameter}, which has the original + literal as the default value. + \endtable + + \section1 Class + + The following quick fixes are available when the cursor is on the definition + of a class. + + \table + \header + \li Quick Fix + \li Description + \row + \li Create Implementations for Member Functions + \li Creates implementations for all member functions in one go. + In the \uicontrol {Member Function Implementations} dialog, + specify whether the member functions are generated + inline or outside the class. + \row + \li Generate Constructor + \li Creates a constructor for a class. + \row + \li Generate Missing Q_PROPERTY Members + \li Adds missing members to a \c Q_PROPERTY: + \list + \li \c read function + \li \c write function, if there is a WRITE + \li \c {onChanged} signal, if there is a NOTIFY + \li data member with the name \c {m_} + \endlist + \row + \li Insert Virtual Functions of Base Classes + \li Inserts declarations and the corresponding definitions inside or + outside the class or in an implementation file (if it exists). + For more information, see \l{Insert virtual functions}. + \row + \li Move All Function Definitions + \li Moves all function definitions to the implementation file or + outside the class. For example, rewrites: + \code + class Foo + { + void bar() + { + // do stuff here + } + void baz() + { + // do stuff here + } + }; + \endcode + + as + + \code + class Foo + { + void bar(); + void baz(); + }; + + void Foo::bar() { + // do stuff here + } + + void Foo::baz() { + // do stuff here + } + \endcode + \endtable + + \section1 Class Member + + The following quick fixes are available when the cursor is on a member + variable in a class definition. + + \table + \header + \li Quick Fix + \li Description + \row + \li Generate Constant Q_PROPERTY and Missing Members + \li Generates a constant Q_PROPERTY and adds missing members + to it. + \row + \li Generate Getter + \li Creates a getter member function for a member variable. + \row + \li Generate Getter and Setter + \li Creates getter and setter member functions for a member + variable. + \row + \li Create Getter and Setter Member Functions + \li Creates either both getter and setter member functions for + member variables or only a getter or setter. + \row + \li Generate Q_PROPERTY and Missing Members + \li Generates a Q_PROPERTY and adds missing members to it. + \row + \li Generate Q_PROPERTY and Missing Members with Reset Function + \li Generates a Q_PROPERTY and adds missing members to it, with an + additional \c reset function. + \row + \li Generate Setter + \li Creates a setter member function for a member variable. + \endtable + + \section1 Control Statement \table \header \li Quick Fix \li Description - \li Activation \row \li Add Curly Braces \li Adds curly braces to an if statement that does not have a @@ -129,7 +288,10 @@ b; } \endcode - \li \c if + \row + \li Complete Switch Statement + \li Adds all possible cases to a switch statement of the type + \c enum. \row \li Move Declaration out of Condition \li Moves a declaration out of an if or while condition to simplify @@ -145,7 +307,188 @@ Type name = foo; if (name) {} \endcode - \li Name of the introduced variable + \row + \li Optimize for-Loop + \li Rewrites post-increment operators as pre-increment operators and + post-decrement operators as pre-decrement operators. It also + moves other than string or numeric literals and id expressions + from the condition of a for loop to its initializer. For + example, rewrites: + + \code + for (int i = 0; i < 3 * 2; i++) + \endcode + + as + + \code + for (int i = 0, total = 3 * 2; i < total; ++i) + \endcode + \endtable + + \section1 Function Declaration or Definition + + \table + \header + \li Quick Fix + \li Description + \row + \li Add Definition in ... + \li Inserts a definition stub for a function declaration either in + the header file (inside or outside the class) or in the + implementation file. For free functions, inserts the definition + after the declaration of the function or in the implementation + file. Qualified names are minimized when possible, instead of + always being fully expanded. + + For example, rewrites + + \code + Class Foo { + void bar(); + }; + \endcode + + as (inside class) + + \code + Class Foo { + void bar() { + + } + }; + \endcode + + as (outside class) + + \code + Class Foo { + void bar(); + }; + + void Foo::bar() + { + + } + \endcode + + as (in implementation file) + + \code + // Header file + Class Foo { + void bar(); + }; + + // Implementation file + void Foo::bar() + { + + } + \endcode + \row + \li Add \c Function Declaration + \li Inserts the member function declaration that matches the member + function definition into the class declaration. The function can + be \c {public}, \c {protected}, \c {private}, \c {public slot}, + \c {protected slot}, or \c {private slot}. + \row + \li Apply Changes + \li Keeps function declarations and definitions synchronized by + checking for the matching declaration or definition when you + edit a function signature and by applying the changes to the + matching code. + + When this fix is available, a light bulb icon appears: + \inlineimage icons/refactormarker.png + \row + \li Move Definition Here + \li Moves an existing function definition to its declaration. + \row + \li Move Function Definition + \li Moves a function definition to the implementation file, outside + the class or back to its declaration. For example, rewrites: + \code + class Foo + { + void bar() + { + // do stuff here + } + }; + \endcode + + as + \code + class Foo + { + void bar(); + }; + + void Foo::bar() { + // do stuff here + } + \endcode + \row + \li Move Function Documentation to Declaration/Definition + \li Moves the documentation comment for a function between its + declaration and definition. + \endtable + + \section1 Identifier + + \table + \header + \li Quick Fix + \li Description + \row + \li Add #include for undeclared or forward declared identifier + \li Adds an \c {#include} directive to the current file to make the + definition of a symbol available. + \row + \li Add Class Member + \li Adds a member declaration for the class member being + initialized if it is not yet declared. If \QC cannot + automatically detect the data type of the member, you + must add it. + \row + \li Add Forward Declaration + \li Adds a forward declaration for an undeclared identifier + operation. + \row + \li Convert to Camel Case + \li Converts a symbol name to camel case, where elements of the name + are joined without delimiter characters and the initial + character of each element is capitalized. For example, rewrites + \c an_example_symbol as \c anExampleSymbol and + \c AN_EXAMPLE_SYMBOL as \c AnExampleSymbol + \endtable + + \section1 Numeric Literal + + \table + \header + \li Quick Fix + \li Description + \row + \li Convert to Decimal + \li Converts an integer literal to decimal representation + \row + \li Convert to Hexadecimal + \li Converts an integer literal to hexadecimal representation + \row + \li Convert to Octal + \li Converts an integer literal to octal representation + \endtable + + \section1 Operator + + \table + \header + \li Quick Fix + \li Description + \li Operator + \row \li Rewrite Condition Using || \li Rewrites the expression according to De Morgan's laws. For @@ -200,21 +543,6 @@ \endlist \li \c {<=}, \c {<}, \c {>}, \c {>=}, \c {==} or \c {!=} - \row - \li Split Declaration - \li Splits a simple declaration into several declarations. For - example, rewrites: - \code - int *a, b; - \endcode - - as - - \code - int *a; - int b; - \endcode - \li Type name or variable name \row \li Split if Statement \li Splits an if statement into several statements. For example, @@ -265,18 +593,14 @@ \endcode \li \c {<=}, \c {<}, \c {>}, \c {>=}, \c {==}, \c {!=}, \c {&&} or \c {||} - \row - \li Convert to Decimal - \li Converts an integer literal to decimal representation - \li Numeric literal - \row - \li Convert to Hexadecimal - \li Converts an integer literal to hexadecimal representation - \li Numeric literal - \row - \li Convert to Octal - \li Converts an integer literal to octal representation - \li Numeric literal + \endtable + + \section1 String Literal + + \table + \header + \li Quick Fix + \li Description \row \li Convert to Objective-C String Literal \li Converts a string literal to an Objective-C string literal if @@ -294,7 +618,18 @@ \code @"abcd" \endcode - \li String literal + \row + \li Enclose in QByteArrayLiteral() + \li Converts a string to a byte array. For example, rewrites + \code + "abcd" + \endcode + + as + + \code + QByteArrayLiteral("abcd") + \endcode \row \li Enclose in QLatin1Char() \li Sets the encoding for a character to Latin-1, unless the @@ -311,7 +646,6 @@ \code QLatin1Char('a') \endcode - \li String literal \row \li Enclose in QLatin1String() \li Sets the encoding for a string to Latin-1, unless the string is @@ -326,22 +660,10 @@ \code QLatin1String("abcd") \endcode - - \li String literal \row - \li Enclose in QByteArrayLiteral() - \li Converts a string to a byte array. For example, rewrites - \code - "abcd" - \endcode - - as - - \code - QByteArrayLiteral("abcd") - \endcode - - \li String literal + \li Escape String Literal as UTF-8 + \li Escapes non-ASCII characters in a string literal to hexadecimal + escape sequences. String Literals are handled as UTF-8. \row \li Mark as Translatable \li Marks a string translatable. For example, rewrites \c "abcd" @@ -353,104 +675,37 @@ QCoreApplication::translate("CONTEXT", "abcd") QT_TRANSLATE_NOOP("GLOBAL", "abcd") \endcode - - \li String literal - \row - \li Add Definition in ... - \li Inserts a definition stub for a function declaration either in - the header file (inside or outside the class) or in the - implementation file. For free functions, inserts the definition - after the declaration of the function or in the implementation - file. Qualified names are minimized when possible, instead of - always being fully expanded. + \li Unescape String Literal as UTF-8 + \li Unescapes octal or hexadecimal escape sequences in a string + literal. String Literals are handled as UTF-8. + \endtable - For example, rewrites + \section1 \c using directive - \code - Class Foo { - void bar(); - }; - \endcode - - as (inside class) - - \code - Class Foo { - void bar() { - - } - }; - \endcode - - as (outside class) - - \code - Class Foo { - void bar(); - }; - - void Foo::bar() - { - - } - \endcode - - as (in implementation file) - - \code - // Header file - Class Foo { - void bar(); - }; - - // Implementation file - void Foo::bar() - { - - } - \endcode - - \li Function name + \table + \header + \li Quick Fix + \li Description + \row + \li Remove All Occurrences of \c {using namespace} in Global Scope + and Adjust Type Names Accordingly + \li Remove all occurrences of \c {using namespace} in the global + scope and adjust type names accordingly. \row - \li Add \c Function Declaration - \li Inserts the member function declaration that matches the member - function definition into the class declaration. The function can - be \c {public}, \c {protected}, \c {private}, \c {public slot}, - \c {protected slot}, or \c {private slot}. - \li Function name - \row - \li Add Class Member - \li Adds a member declaration for the class member being - initialized if it is not yet declared. If \QC cannot - automatically detect the data type of the member, you - must add it. - \li Identifier - \row - \li Create Implementations for Member Functions - \li Creates implementations for all member functions in one go. - In the \uicontrol {Member Function Implementations} dialog, - specify whether the member functions are generated - inline or outside the class. - \li Function name - \row - \li Switch with Next/Previous Parameter - \li Moves a parameter down or up one position in a parameter list. - \li Parameter in the declaration or definition of a function - \row - \li Extract Function - \li Moves the selected code to a new function and replaces the block - of code with a call to the new function. Enter a name for the - function in the \uicontrol {Extract Function Refactoring} - dialog. - \li Block of code selected - \row - \li Extract Constant as Function Parameter - \li Replaces the selected literal and all its occurrences with the - function parameter \c{newParameter}. The parameter - \c{newParameter} will have the original literal as the default - value. - \li Block of code selected + \li Remove \c {using namespace} and Adjust Type Names Accordingly + \li Remove occurrences of \c {using namespace} in the local scope + and adjust type names accordingly. + \endtable + + + \section1 Miscellaneous + + \table + \header + \li Quick Fix + \li Description + \li Activation \row \li Add Local Declaration \li Adds the type of an assignee, if the type of the right-hand @@ -469,63 +724,59 @@ where Type is the return type of \c {foo()} \li Assignee + \row + \li Convert connect() to Qt 5 Style + \li Converts a Qt 4 QObject::connect() to Qt 5 style. + \li QObject::connect() (Qt 4 style) + \row + \li Convert Comment to C/C++ Style + \li Converts C-style comments into C++-style comments, and vice + versa. Tries to preserve \e pretty layout and takes Doxygen and + qdoc formatting into consideration, but you might need to clean + up the results. + \li Code comment + \row + \li Convert to Pointer + \li Converts the selected stack variable to a pointer. For example, + rewrites: + \code + QByteArray foo = "foo"; + foo.append("bar"); + \endcode + + as + + \code + QByteArray *foo = new QByteArray("foo"); + foo->append("bar"); + \endcode + + This operation is limited to work only within function scope. + Also, the coding style for pointers and references is not + respected yet. + \li Stack Variable \row - \li Convert to Camel Case - \li Converts a symbol name to camel case, where elements of the name - are joined without delimiter characters and the initial - character of each element is capitalized. For example, rewrites - \c an_example_symbol as \c anExampleSymbol and - \c AN_EXAMPLE_SYMBOL as \c AnExampleSymbol - \li Identifier - \row - \li Complete Switch Statement - \li Adds all possible cases to a switch statement of the type - \c enum - \li \c switch - \row - \li Generate Missing Q_PROPERTY Members - \li Adds missing members to a \c Q_PROPERTY: - \list - \li \c read function - \li \c write function, if there is a WRITE - \li \c {onChanged} signal, if there is a NOTIFY - \li data member with the name \c {m_} - \endlist - \li \c Q_PROPERTY - \row - \li Generate Q_PROPERTY and Missing Members - \li Generates a Q_PROPERTY and adds missing members to it, as - described above. - \li Class member - \row - \li Generate Constant Q_PROPERTY and Missing Members - \li Generates a constant Q_PROPERTY and adds missing members - to it, as described above. - \li Class member - \row - \li Generate Q_PROPERTY and Missing Members with Reset Function - \li Generates a Q_PROPERTY and adds missing members to it, as - described above, but with an additional \c reset function. - \li Class member - \row - \li Apply Changes - \li Keeps function declarations and definitions synchronized by - checking for the matching declaration or definition when you - edit a function signature and by applying the changes to the - matching code. - \li Function signature. When this fix is available, a light bulb - icon appears: \inlineimage icons/refactormarker.png - \row - \li Add #include for undeclared or forward declared identifier - \li Adds an \c {#include} directive to the current file to make the - definition of a symbol available. - \li Undeclared identifier - \row - \li Add Forward Declaration - \li Adds a forward declaration for an undeclared identifier - operation. - \li Undeclared identifier + \li Convert to Stack Variable + \li Converts the selected pointer to a stack variable. For example, + rewrites: + + \code + QByteArray *foo = new QByteArray("foo"); + foo->append("bar"); + \endcode + + as + + \code + QByteArray foo("foo"); + foo.append("bar"); + \endcode + + This operation is limited to work only within function scope. + Also, the coding style for pointers and references is not + respected yet. + \li Pointer Variable \row \li Reformat Pointers or References \li Reformats declarations with pointers or references according @@ -551,239 +802,24 @@ \li Declarations with pointers or references and selections that have such declarations \row - \li Create Getter and Setter Member Functions - \li Creates either both getter and setter member functions for - member variables or only a getter or setter. - \li Member variable in class definition - \row - \li Generate Getter and Setter - \li Creates getter and setter member functions for a member - variable. - \li Member variable in class definition - \row - \li Generate Getter - \li Creates a getter member function for a member variable. - \li Member variable in class definition - \row - \li Generate Setter - \li Creates a setter member function for a member variable. - \li Member variable in class definition - \row - \li Generate Constructor - \li Creates a constructor for a class. - \li Class definition - \row - \li Move Function Definition - \li Moves a function definition to the implementation file, outside - the class or back to its declaration. For example, rewrites: - \code - class Foo - { - void bar() - { - // do stuff here - } - }; - \endcode - - as - \code - class Foo - { - void bar(); - }; - - void Foo::bar() { - // do stuff here - } - \endcode - - \li Function signature - \row - \li Move All Function Definitions - \li Moves all function definitions to the implementation file or - outside the class. For example, rewrites: - \code - class Foo - { - void bar() - { - // do stuff here - } - void baz() - { - // do stuff here - } - }; - \endcode - - as - - \code - class Foo - { - void bar(); - void baz(); - }; - - void Foo::bar() { - // do stuff here - } - - void Foo::baz() { - // do stuff here - } - \endcode - - \li Class name - \row - \li Move Definition Here - \li Moves an existing function definition to its declaration. - \li Function declaration - \row - \li Assign to Local Variable - \li Adds a local variable which stores the return value of a - function call or a new expression. For example, rewrites: - - \code - QString s; - s.toLatin1(); - \endcode - - as - - \code - QString s; - QByteArray latin1 = s.toLatin1(); - \endcode - - and - - \code - new Foo; - \endcode - - as - - \code - Foo * localFoo = new Foo; - \endcode - - By default, \QC uses the \c auto variable type when creating the - variable. To label the variable with its actual type, select - \preferences > \uicontrol C++ > - \uicontrol {Quick Fixes}, and then deselect the - \uicontrol {Use type "auto" when creating new variables} check - box. - - \li Function call or class name - \row - \li Insert Virtual Functions of Base Classes - \li Inserts declarations and the corresponding definitions inside or - outside the class or in an implementation file (if it exists). - For more information, see \l{Insert virtual functions}. - \li Class or base class name - \row - \li Optimize for-Loop - \li Rewrites post increment operators as pre increment operators and - post decrement operators as pre decrement operators. It also - moves other than string or numeric literals and id expressions - from the condition of a for loop to its initializer. For + \li Split Declaration + \li Splits a simple declaration into several declarations. For example, rewrites: - \code - for (int i = 0; i < 3 * 2; i++) + int *a, b; \endcode as \code - for (int i = 0, total = 3 * 2; i < total; ++i) + int *a; + int b; \endcode - \li \c for - + \li Type name or variable name \row - \li Escape String Literal as UTF-8 - \li Escapes non-ASCII characters in a string literal to hexadecimal - escape sequences. String Literals are handled as UTF-8. - \li String literal - - \row - \li Unescape String Literal as UTF-8 - \li Unescapes octal or hexadecimal escape sequences in a string - literal. String Literals are handled as UTF-8. - \li String literal - - \row - \li Convert to Stack Variable - \li Converts the selected pointer to a stack variable. For example, - rewrites: - - \code - QByteArray *foo = new QByteArray("foo"); - foo->append("bar"); - \endcode - - as - - \code - QByteArray foo("foo"); - foo.append("bar"); - \endcode - - This operation is limited to work only within function scope. - Also, the coding style for pointers and references is not - respected yet. - \li Pointer Variable - - \row - \li Convert to Pointer - \li Converts the selected stack variable to a pointer. For example, - rewrites: - - \code - QByteArray foo = "foo"; - foo.append("bar"); - \endcode - - as - - \code - QByteArray *foo = new QByteArray("foo"); - foo->append("bar"); - \endcode - - This operation is limited to work only within function scope. - Also, the coding style for pointers and references is not - respected yet. - \li Stack Variable - \row - \li Remove \c {using namespace} and Adjust Type Names Accordingly - \li Remove occurrences of \c {using namespace} in the local scope - and adjust type names accordingly. - \li \c using directive - \row - \li Remove All Occurrences of \c {using namespace} in Global Scope - and Adjust Type Names Accordingly - \li Remove all occurrences of \c {using namespace} in the global - scope and adjust type names accordingly. - \li \c using directive - \row - \li Convert connect() to Qt 5 Style - \li Converts a Qt 4 QObject::connect() to Qt 5 style. - \li QObject::connect() (Qt 4 style) - \row - \li Convert Comment to C/C++ Style - \li Converts C-style comments into C++-style comments, and vice - versa. Tries to preserve \e pretty layout and takes Doxygen and - qdoc formatting into consideration, but you might need to clean - up the results. - \li Code comment - \row - \li Move Function Documentation to Declaration/Definition - \li Moves the documentation comment for a function between its - declaration and definition. - \li Documentation comment for a function + \li Switch with Next/Previous Parameter + \li Moves a parameter down or up one position in a parameter list. + \li Parameter in the declaration or definition of a function \endtable \sa {Apply quick fixes}, {Find symbols}, {Rename symbols}, From d074f1a9b4b0cd0e6fadc6fd04f3a89dbfee3e26 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 12 Jun 2024 14:27:45 +0200 Subject: [PATCH 06/36] Improve the position of Open Workspace in the File menu Keep the "Recent *" menus together Change-Id: I99613201bf7ee00e91ca63b56ddcccf23f13c5c7 Reviewed-by: David Schulz --- src/plugins/coreplugin/coreconstants.h | 3 ++- src/plugins/coreplugin/icore.cpp | 3 ++- src/plugins/projectexplorer/projectexplorer.cpp | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/plugins/coreplugin/coreconstants.h b/src/plugins/coreplugin/coreconstants.h index d8d2388fb18..049ce35dec5 100644 --- a/src/plugins/coreplugin/coreconstants.h +++ b/src/plugins/coreplugin/coreconstants.h @@ -145,7 +145,8 @@ const char G_HELP[] = "QtCreator.Group.Help"; // File menu groups const char G_FILE_NEW[] = "QtCreator.Group.File.New"; const char G_FILE_OPEN[] = "QtCreator.Group.File.Open"; -const char G_FILE_SESSION[] = "QtCreator.Group.File.Recent"; +const char G_FILE_RECENT[] = "QtCreator.Group.File.Recent"; +const char G_FILE_SESSION[] = "QtCreator.Group.File.Session"; const char G_FILE_PROJECT[] = "QtCreator.Group.File.Project"; const char G_FILE_SAVE[] = "QtCreator.Group.File.Save"; const char G_FILE_EXPORT[] = "QtCreator.Group.File.Export"; diff --git a/src/plugins/coreplugin/icore.cpp b/src/plugins/coreplugin/icore.cpp index a4098963a60..83a0cb3cdc4 100644 --- a/src/plugins/coreplugin/icore.cpp +++ b/src/plugins/coreplugin/icore.cpp @@ -1629,6 +1629,7 @@ void ICorePrivate::registerDefaultContainers() filemenu->menu()->setTitle(Tr::tr("&File")); filemenu->appendGroup(Constants::G_FILE_NEW); filemenu->appendGroup(Constants::G_FILE_OPEN); + filemenu->appendGroup(Constants::G_FILE_RECENT); filemenu->appendGroup(Constants::G_FILE_SESSION); filemenu->appendGroup(Constants::G_FILE_PROJECT); filemenu->appendGroup(Constants::G_FILE_SAVE); @@ -1785,7 +1786,7 @@ void ICorePrivate::registerDefaultActions() // File->Recent Files Menu ActionContainer *ac = ActionManager::createMenu(Constants::M_FILE_RECENTFILES); - mfile->addMenu(ac, Constants::G_FILE_OPEN); + mfile->addMenu(ac, Constants::G_FILE_RECENT); ac->menu()->setTitle(Tr::tr("Recent &Files")); ac->setOnAllDisabledBehavior(ActionContainer::Show); diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index d4c5717ce3d..8838a37645b 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -1177,7 +1177,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er ActionManager::createMenu(Constants::M_RECENTPROJECTS); mrecent->menu()->setTitle(Tr::tr("Recent P&rojects")); mrecent->setOnAllDisabledBehavior(ActionContainer::Show); - mfile->addMenu(mrecent, Core::Constants::G_FILE_OPEN); + mfile->addMenu(mrecent, Core::Constants::G_FILE_RECENT); connect( m_instance, &ProjectExplorerPlugin::recentProjectsChanged, From bd6e47ce4609c152849d61e56c0735cf0df0edbc Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Wed, 12 Jun 2024 16:17:23 +0200 Subject: [PATCH 07/36] Core: Fix use after free ASAN error When closing the "Preferences..." dialog with Esc key, the ASAN address checker would report a use after free at "while (m_running)" below in the code. Fixes: QTCREATORBUG-31047 Change-Id: I484a80305ebbd903607e945eb56b331f57d40370 Reviewed-by: Eike Ziller --- src/plugins/coreplugin/dialogs/settingsdialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.cpp b/src/plugins/coreplugin/dialogs/settingsdialog.cpp index b2e4b9e969f..74fe67d8175 100644 --- a/src/plugins/coreplugin/dialogs/settingsdialog.cpp +++ b/src/plugins/coreplugin/dialogs/settingsdialog.cpp @@ -790,7 +790,7 @@ bool SettingsDialog::execDialog() ICore::settings()->setValueWithDefault(kPreferenceDialogSize, size(), initialSize); // make sure that the current "single" instance is deleted // we can't delete right away, since we still access the m_applied member - deleteLater(); + QMetaObject::invokeMethod(this, [this] { deleteLater(); }, Qt::QueuedConnection); }); } From b599edb9b7ed186066eef04bf06a054bc183751b Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Sat, 13 Jan 2024 22:55:29 +0100 Subject: [PATCH 08/36] Qt Creator redesign: Update the mode bar icons This updates the existing mode bar icons in the svg file with the new Qt Creator Design icons from Figma. The pngs are updated accordingly. For consistency, the "beetle overlay" for toolbar actions is also updated. The custom color for "active" state of a mode icon has been removed. If we keep this change, a couple of Theme::IconsMode*ActiveColor entries can be removed. Change-Id: I9b5422c79f5426e31b41e59d67ddc307b521c0af Reviewed-by: Eike Ziller Reviewed-by: hjk --- src/libs/utils/icon.cpp | 5 +- .../utils/images/debugger_overlay_small.png | Bin 158 -> 166 bytes .../images/debugger_overlay_small@2x.png | Bin 175 -> 171 bytes .../coreplugin/images/mode_design_mask.png | Bin 218 -> 287 bytes .../coreplugin/images/mode_design_mask@2x.png | Bin 362 -> 538 bytes .../coreplugin/images/mode_edit_mask.png | Bin 110 -> 111 bytes .../coreplugin/images/mode_edit_mask@2x.png | Bin 117 -> 149 bytes .../images/debugger_continue_1_mask.png | Bin 97 -> 124 bytes .../images/debugger_continue_1_mask@2x.png | Bin 101 -> 166 bytes .../images/debugger_continue_2_mask.png | Bin 157 -> 163 bytes .../images/debugger_continue_2_mask@2x.png | Bin 202 -> 278 bytes .../images/debugger_interrupt_mask.png | Bin 100 -> 126 bytes .../images/debugger_interrupt_mask@2x.png | Bin 105 -> 173 bytes .../debugger/images/debugger_stop_mask.png | Bin 100 -> 122 bytes .../debugger/images/debugger_stop_mask@2x.png | Bin 104 -> 167 bytes .../debugger/images/mode_debug_mask.png | Bin 282 -> 238 bytes .../debugger/images/mode_debug_mask@2x.png | Bin 531 -> 453 bytes src/plugins/help/images/mode_help_mask.png | Bin 312 -> 353 bytes src/plugins/help/images/mode_help_mask@2x.png | Bin 614 -> 748 bytes .../images/build_hammer_mask.png | Bin 0 -> 294 bytes .../images/build_hammer_mask@2x.png | Bin 0 -> 611 bytes .../images/build_hammerhandle_mask.png | Bin 173 -> 0 bytes .../images/build_hammerhandle_mask@2x.png | Bin 258 -> 0 bytes .../images/build_hammerhead_mask.png | Bin 183 -> 0 bytes .../images/build_hammerhead_mask@2x.png | Bin 246 -> 0 bytes .../images/debugger_beetle_mask.png | Bin 207 -> 156 bytes .../images/debugger_beetle_mask@2x.png | Bin 375 -> 261 bytes .../images/mode_project_mask.png | Bin 235 -> 359 bytes .../images/mode_project_mask@2x.png | Bin 399 -> 760 bytes .../projectexplorer/images/run_mask.png | Bin 179 -> 182 bytes .../projectexplorer/images/run_mask@2x.png | Bin 291 -> 315 bytes .../projectexplorer/projectexplorer.qrc | 6 +- .../projectexplorer/projectexplorericons.cpp | 6 +- .../welcome/images/mode_welcome_mask.png | Bin 101 -> 191 bytes .../welcome/images/mode_welcome_mask@2x.png | Bin 107 -> 285 bytes src/tools/icons/qtcreatoricons.svg | 294 +++++++++--------- 36 files changed, 154 insertions(+), 157 deletions(-) create mode 100644 src/plugins/projectexplorer/images/build_hammer_mask.png create mode 100644 src/plugins/projectexplorer/images/build_hammer_mask@2x.png delete mode 100644 src/plugins/projectexplorer/images/build_hammerhandle_mask.png delete mode 100644 src/plugins/projectexplorer/images/build_hammerhandle_mask@2x.png delete mode 100644 src/plugins/projectexplorer/images/build_hammerhead_mask.png delete mode 100644 src/plugins/projectexplorer/images/build_hammerhead_mask@2x.png diff --git a/src/libs/utils/icon.cpp b/src/libs/utils/icon.cpp index df880ac67ec..06570e6505a 100644 --- a/src/libs/utils/icon.cpp +++ b/src/libs/utils/icon.cpp @@ -210,11 +210,10 @@ QIcon Icon::sideBarIcon(const Icon &classic, const Icon &flat) return result; } -QIcon Icon::modeIcon(const Icon &classic, const Icon &flat, const Icon &flatActive) +QIcon Icon::modeIcon(const Icon &classic, const Icon &flat, + [[__maybe_unused__]] const Icon &flatActive) { QIcon result = sideBarIcon(classic, flat); - if (creatorTheme()->flag(Theme::FlatSideBarIcons)) - result.addPixmap(flatActive.pixmap(), QIcon::Active); return result; } diff --git a/src/libs/utils/images/debugger_overlay_small.png b/src/libs/utils/images/debugger_overlay_small.png index 809bf347326d98316d86250ee6985560de9bc19a..440d2b59d2842d897e5569b153dc5501066042d2 100644 GIT binary patch delta 138 zcmbQoxQuavO1(jVPlzi60|Ofy8#_BY4-b!kfPko|sDgrmnwpxctE-!vTS7v@{rmSH zJb3W%;lrm-pZ@>FVdQj@c=p2>?{FFFpVO delta 129 zcmZ3+IFE6HN|kzmPlzi61A~;5l%b)akB?7ycz8@qOhQ6JT3T8|L&Jm#6ZY@l|KP!c z|NsA2&)a*1fq}uu)5S4_BRbiFnU&{C!katHsTMyRB)CFZtrCs}@`ZJ9FtaoB&nWC^ j=2cphk;oCq%*0@A8l~_kw%>?>fq}u()z4*}Q$iB}t*tBw diff --git a/src/libs/utils/images/debugger_overlay_small@2x.png b/src/libs/utils/images/debugger_overlay_small@2x.png index c24c861cbbbe763ec9091150659d45e027839bd3..40ea20ed47b7626c24ba85db66898ff1a161a77f 100644 GIT binary patch delta 143 zcmZ3_xSDZ-N_~;1i(`mIZ}Ja+27?|giAP*HYySP+yy@U#hrWkzBH1i$xb8^axFKOv zpskV0(9HFQD@S5N1Ft35zyHq@6D=1H+=hSZ2Y1Xa!v({FmzjF&o}(zox{Muz`)_@>gTe~DWM4fM20(w delta 147 zcmZ3@xSnx>N`0B9i(`m||Jw^2IU5W_S{}yB9Jm-{-Jm?f>}AZsW1%w6)rI|=4HZ85 z9Iy(nFSxVNX~lvjC5hd6XBtHl&Ngr+{9=&fm?XlG&%o}`!(g#F$va`PkAb?u?1psK z`i3nk8$8r3W=qScX`K7A=y$psuKB7+UsdCp>bCY; zwyKg>=P_25Nuhb$9aZ!c7T+_qUP&B_zge*IZBvHGTrb%VO%g!l1N7?{{LhJSiA;n9)CxlT&S{7OPWG5Xv+ zS0!qD_Mh!C@oW>@q!itDd&@Z$-MHUI$345li%w1!^LqVDa^Zy6@Ba5H`Tt`5VIy$J Sa0dee1B0ilpUXO@geCweLwA$_ delta 190 zcmbQwbc=CleQ68SA#(=B-0|&U$!Tfk1+tv=+vN|vRNlbF)~0jkA=4IC zmL1<8hctz0B*BbF?0K6|8R1?qpc~z_Q2OdhZ{x1F38=Cmru- xC3tByXiedJ>^tL`o@_eDlDqlJT8Eh!Y>o*W_ci!X#K6G7;OXk;vd$@?2>@zJPi_DJ diff --git a/src/plugins/coreplugin/images/mode_design_mask@2x.png b/src/plugins/coreplugin/images/mode_design_mask@2x.png index 2aef9018a8ac9d6a189a12f2fc2e982f8763ffe1..9a060d749836c09286c8c94cb8b9eb51741ff9c7 100644 GIT binary patch delta 512 zcmaFGG>c_|O8rAm7srr@!*8z{dMi6h9Q#;rwoF(_-BJ7xiv<-%(O0$XB-cf?x2A%8p9EW?UB2y2N-O5JOuuh!pH6d66myWAv3t_;_p2v|e78HXgGuJBr0b;H zCZQ`IH+sn4*zYAe@#04&2JQ259xN=2dnPU0^~E7Y)@+KEdz*Qm;!VBPQ` zMWo?D$dipccPbS2XCE*>sWGwsgyM$BjUL<)zAj~#a(AnLVlepPa7^?;m#P!c$rK`eH==vSv{Z9p^~_t(vlg#+&N)5t?wW&l*a#GN6*hSo%?X#g~`&zEZKR=!*7Y a?OT67IC=K+?QaYW3=E#GelF{r5}E*}Nb-XK delta 335 zcmbQm@``DKO1+_{i(^Q{;kVb;`Y}6-us%?pWw5>>$?>7WiACWd3Kfhho}&DLhi6Y% z;Hma{;?xy8S{U5dglCGnH}{J9v)6Yo76oD_e%AM zuuZ<|u*9HYjYIkgt|@IR9I`#UR5sbQ#)r>OnPl|&MC4J0^IMDSpI%)5@mS9BS$oRf zeN{<0qHv8NPOyjLh}43>zSLy%q}jXwhPfoGe=7M4DoG44FnT!&#_s*L; tYrU}8UHeDkRNkb!}LGr%Xrm4Si5#>VFV|NnZPQnMHs7!*BS9780+lOtGJ xxg}N{ElNm8nBbKBFhITaoRrVAiD#J@)IO}cnWL)B#=yY9;OXk;vd$@?2>`8A92Nio delta 91 zcmd1Ln;;R!$jrdNz|c9fk%57MEx;$lm4Sib|Ns9>Z_dBVz`&sF>Eal|5uN;lpM_nb uL-D_%!Hvg?Pyatis8`VGYd%uK94ExU{UPgirxw@6FH=qS m_AHzJaB7^}RGuhRhRr;}(wuA)mN76eFnGH9xvXmXVo(fr05R<3|Pt2DSj75LX5UhX4QnFTFYcE&~IDmZytjh(>Vo4}Mm8 z2{y*p{LBI$F3&j1vxRG}>q09YG21hXjk<4GNJ)q>JYTu{fltyq3kC)T22WQ%mvv4F FO#l#zArt@r diff --git a/src/plugins/debugger/images/debugger_continue_1_mask.png b/src/plugins/debugger/images/debugger_continue_1_mask.png index 1f5c0c56551730d0974a7f6fbf124ce4c61f93bd..c2196afa9539dbeaa870aa40f73f096a5780ac82 100644 GIT binary patch delta 105 zcmYeSnIMtE!py+Ha3WLeBLf2ie}GSjD+2?Al$4aTwDji9oB#j+U#;2nh=GAY!_&nv zL?bx4z>%G&Iq1j)M+sk-#zs!x7DmtS7eo(!5npzH;=u>vj12M46MdOaFPq1}z`)?? L>gTe~DWM4f#bP5$ delta 78 zcmbZ_dBVz`!8p>Eal|aXtA5KMT7= hhmzz=kALdTEDUqL^vj;qlp=fS?83{1OT8(7`gxe diff --git a/src/plugins/debugger/images/debugger_continue_1_mask@2x.png b/src/plugins/debugger/images/debugger_continue_1_mask@2x.png index e3e06daa9d23c140e78ee30ae62c8a3624c3fa43..c3cb2a62becf31da536d55b0dae0c77d469963c2 100644 GIT binary patch delta 149 zcmYdY#yCNuo`so#f#H;GUn2tpgJ^(Hh${mF11~QxA0MBfpkPo?(9N4S|NsBbtaM9+ zfq}ut)5S5w<9M=%GKYlQ)E=#cGbe?(v$0Jy*yGhC*>FH)y%75ZA+bGPA`V_NK4>K- zG&~4YUF_wyOi0OyQ!ui(gU8!to4l@}`&1rHRR*pT=~{aH#Vo4}Mm8 o2{z{L#>y$K{9-ITiee1U9L0*mq$jUpU|?YIboFyt=akR{0MvsQi2wiq diff --git a/src/plugins/debugger/images/debugger_continue_2_mask.png b/src/plugins/debugger/images/debugger_continue_2_mask.png index 8b83259ed131f59f09913ee6673e36d2454f605f..ad34cf8e8ec295b294db397784393e91251192e9 100644 GIT binary patch delta 147 zcmbQsxR`N*L_G%s0|SG+PKX=>14EXli(`nz>Es{&0tP)=iea6-C%v7#BqU1WghCE2 z_}H^RQ{!1e=qE4nn=)&>{w-c{aNU#t-m+}MOkQ<6jUkL}#!A9Ht4 z>nyZn^e;9n5#+g>(j@rcS9gFv=1B0ih zi(`n!#IxrQ@-irJI0tfQ8#E~!F#SIN#F77&eZ#jOK~7m~H>yt(XpeA`+2p<4B4w&x uVTbCH5T@{@LO#hE+?28O$yE{-7)hu>Z_%G&Iq1j)M~NOmB`zMHgdTy!hC>T=n_lYs>{o6+sL#aUd$Lndo-xdtfq{X+ M)78&qol`;+0J*LpzW@LL delta 81 zcmbZ_dBVz`!8s>Eal|5uN;lpM_nb kLrIeV%H`f8Tjm;YGW<4bT)%4P9$AoXPgg&ebxsLQ0QjyNx&QzG diff --git a/src/plugins/debugger/images/debugger_interrupt_mask@2x.png b/src/plugins/debugger/images/debugger_interrupt_mask@2x.png index c7794000177e07d87c4e697d378f0fd0c6da517a..dc4ae99aa0ee0101b556eebdd33352ed2cf4ace6 100644 GIT binary patch delta 156 zcmc~?%Q!)zo`so#f#H;GUn2tpgJ^(Hh${mF11~QxA0MBfpkPo?(9N4S|NsBbtaM9+ zfq@~|)5S5w<9M=%GKYlQ)E=#cGbe?(v$0JyVCi-BG+-8(p_HNHCF2mJ!y(lz#5zGl zxaruUmPSU=el5vRqfJu;CVF<9$Z|=EP}=l2qtkL#iif5cBSY^!lW%SMy-W-Y3=E#G KelF{r5}E+RlP~1} delta 87 zcmZ3>m^ncrkdc{zfr05R<3|Pt2DSj75LX5UhX4QnFTFYcE&~IDoTrOph(>Vo4}Mm8 s2{z{L#-Gg1e>J+F>EtBZuZU#0$8j}ho$Iwf3=9kmp00i_>zopr0JBLQx&QzG diff --git a/src/plugins/debugger/images/debugger_stop_mask.png b/src/plugins/debugger/images/debugger_stop_mask.png index d56a35f4857ea097d0c8889bc98d6501cf43387c..4e0562ea142f8e32a1712c6413f5705e744427f9 100644 GIT binary patch delta 103 zcmYePnjn$H!py+Ha3WLeBLf2ie}GSjD+2?Al$4aTwDji9oB#j+U#;2nh=GAY&C|s( zMB{vNfg?MQv&)eQj4Uk^T|^Ej`FJQfPdxI4b(w#ASPdhC$L!vz^)6aQ3=9kmp00i_ I>zopr08oV>Y5)KL delta 81 zcmbZ_dBVz`!8s>Eal|5uN;lpM_nb kLrGHN)l0XeTYfWG7#wX&WOKv)b3nR1UHx3vIVCg!0L@VtaR2}S diff --git a/src/plugins/debugger/images/debugger_stop_mask@2x.png b/src/plugins/debugger/images/debugger_stop_mask@2x.png index e69d67dfaf885ff989a870bf4096527e5efb69e3..fb84f3ad793e671a47535e82945df394090c2236 100644 GIT binary patch delta 150 zcmc~;&NxA$o`so#f#H;GUn2tpgJ^(Hh${mF11~QxA0MBfpkPo?(9N4S|NsBbtaM9+ zfq}u-)5S5w<9M=%GKYlQ)E+I#Ctg9ak`EkIcveqJU{gux3hiXxBqX-ROJu@SgT&B7 z4c)e@QbJBDggd!>Qd62NF!5@~i4BWW@2;4nxRizA$I*aW0^5Hz)iN+JFnGH9xvXjfRUMjfr05R<3|Pt2DSj75LX5UhX4QnFTFYcE&~IDtfz}(h(>Vo4}Mm8 r2{z_#Mvgb`ktXSh+`k>qGBKQav)SQy!T$gT1_lOCS3j3^P6Y6_c4LZ%h^tED2Oe%|Z;-0S1ll$-g z|8M_y(|wK=hcf<8U;h99|9|c4Qf42VT|6nMxbD39%>UJWQ=aTJXS;2nv+Bwd)>#X7 zKmN}bt8jL8Wam*`xrB0qKkWf>H|DHvT;w9$J!yK6hL^v z@RE?2wrKVy7T=RWKHYX37HTBcwjXt0r{Q&HL**`cS5JE})$bxK6Q*!z+&LWZDLC;~ zx5AD|3&byr)FsX+V(pmT-7vL7r~T7L)s@>%U;ejTx8C~DCaIZT45ub-2)bpM_MCx% Ofx*+&&t;ucLK6TitasG_ diff --git a/src/plugins/debugger/images/mode_debug_mask@2x.png b/src/plugins/debugger/images/mode_debug_mask@2x.png index 5340947ec75c4569acb12d152a2e0065e4f25378..83b6893b5321085e4645e6319988de22427561bb 100644 GIT binary patch delta 427 zcmbQta+G<3N_~%~i(^Q{;kVZu{SE~PG(40~N^mq}yL%yzGlS`l^ZN(axFz%zsyXoX{>4t(^aQ;&d5@-PVyh$L@+b{PXSh;ay-6@za0xa;1QIZ~HBtSv5Y&5S9_W zesIS*)osCl4LjU^J6;J=d>d-AD`(XNg}Lv_ZiFpWRtjR@=X9aOC56W%3*9hxE4xn!|(eN$_1^VM3RevRKx6jY{`1V!Gs;w5uAN3URw)2jn1)^q(s zZ!iDE%%++ryGgVq`g5_#E$+isD!Xj!M82G;TKsOkanv_1he|ywm$u4=Wwzh;Y`n|U z*Rxmfbi9rA|JNU??(Dg}{79W-`_mPHb^m{F+WgvK{(YI&`GvOrHR-dz>77^Mef(&Z l{pocJBqu3Ke$qd|ufX^`aa#6bV+IBW22WQ%mvv4FO#qyd!pHys delta 505 zcmX@gJeg&JO8qTQ7srr@!*8#h*JeqSVE?fGZsydfhuxlR*=ebJs`V+q!>RoV!9knc zG+nRd#%iiBU854T=Cl{zj-9)-m%4UltZm*J-~KTyIA$PuN<;z#w%^R(ZYhk2M$fIID04*ZW#H^POSS;*(V@ z78Of57iqoxq5k5(PpsdjtnYb#Npj|W4k?!cW&e4)lJV;{ZS(MdDtB@^#~$a*PnL1a zSB}g-`DKFmMDa=0Q){=K(5dlEt72SWHBB+Utv&yQ&l)L)Dr28t0-MjfwC6AVYukD3 zsf_2dY0~zKB0oA#XR%I=oARt)rSd}3Jjv;6`%))2ZsA#cNcCQz;%=vunAR6gOF~<> zoSaa-p6lbCPJwKdR*#bb3BsO&i@GO-nO;ikE?KaGOOSy>d*TM3mz#2zd-k%p&U}%T z;?yFua$>UJq}9QSTP<&HlMhi8e7Jw}YNts~DzEkXLu@_!d-^_kEdO$6X5dz1%_8Sz z3rnXv?=n5(F(ES}I)-PHWmBS(4uZK?bpe-AIoOn*;lH6SnrXN-ly;r(lZqIA7ExH Sp2)z!z~JfX=d#Wzp$PyKf9)#( diff --git a/src/plugins/help/images/mode_help_mask.png b/src/plugins/help/images/mode_help_mask.png index 144871e854232c47f5d9f1bd6bebb601f0b5301e..a6542695d2d98edfbfe91442ca1f616dfdd9bf30 100644 GIT binary patch delta 327 zcmdnN^pI(Say_Glr;B5V#p$P$4gHuLC0gSb-OPy4&3K!jta5uIZARo8 z+XfcLJ<7+CD{S1pVbjH+MNy)g7uqZUQ2P9=|4Qdn6X00vCNdQg0JGHC5wc% zuwzc;=d;;muQ?yYe$#qV^O&*0Ja=|)!uzCs$9hj?>9vkcdpjmhezkC8kn{81LFWoW4b%5} mUE8*K>b*Def893kW0P1_n=8KbLh*2~7Y!BAG4# delta 286 zcmaFJw1a7aay`R;PZ!4!i_^(J`~?hn@>T7_T~-wruXbPer_=kSlq#D>KwNj|$@xia zDgmFwyM{98?3MYzhCrBfP3&E?(mII z{s&hYbc;`)wC#U?h{Oi1#^{p&^$b&%_FdiSu;FtL+mzOKccvPsuDN4yE$hpI;IbP0l+XkK7Dt7Y diff --git a/src/plugins/help/images/mode_help_mask@2x.png b/src/plugins/help/images/mode_help_mask@2x.png index 50f12d8e117487ce626bb0e0c9eb2b18e5416d52..e50cb34fea43afc7633e3187476e953a93b457ec 100644 GIT binary patch delta 724 zcmaFH@`iPSO8sU}7srr@!*8cq`vfP79Iu~L;Js1NDRJSHg-b%?3#RLe`^)>-tUWA?#|o;o~IC51%~1TTH!=xn_)?U$v=_oDph_std(mp9M- z|NU~^rxNDFY{Y7XAWomCc~KCQ!&c3rzviX z>(rV2>-!o+flDAIF+HWzp*_$^yb~eKa~+vwi-O}d+ij~V6<~y-UA;0*9q~E=)pEnL9bw$;|s@&p6xlM51Vntw5N9Xv4RA zciN-QrW*38e@}>hu+r@Z$B$CQxegwSTe_mRoWGzWaG}+QAvWrzg?1$4;iSt`YU8@C z8%+OlzhHWH^8yPBQ-_}ae(y3&ces}m|e+?Fa`E%UY!PC{xWt~$(699xUP5%G@ delta 589 zcmaFE`iy0QO1-Y9i(^Q{;p89wtOpFTPOMN|+{WYQ{7)vE_mWUbs^}HIEbD*Mb)4m< zdK)V+&g?p_BK=9Lx0jK3L+U=ovlEs&@kBIy;1c5bIrUHjbIKpJYZKPb|$w8x|V%7>3`w(wN8OgSdy$W&kMfA=f@krl2LpEwzvPfcWcVmjgf zSAFB}PTB`K)}xc;CUxk=Id7QC5cAv7 z$n=DhQU!0~;iO}Z6ONRK7?ug~Cf;Hant#HhNpZ$KPe#u2#hhIeBsM6t%cMIAUr{ye z@@I6_zQFp?y->PM@p;3dl`ooPD|jvY5i*}gm$_jlHlr0e{(0zXZR`5L@w)`EKfZS60( wHg4p6*;+D3X+5Xat!?tADOV;eOypqr$-F^l-B(*@1_lNOPgg&ebxsLQ0BFJfL;wH) diff --git a/src/plugins/projectexplorer/images/build_hammer_mask.png b/src/plugins/projectexplorer/images/build_hammer_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..c30f933962a306041d2306217643f7a4d84b8228 GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0y~yU{C^K4h9AW26>$jIR*xXx1KJJAr_~TfA|X+@D!{5 zUnXs65P9|Q(Zx$9H#SafZanye!%x*dL_)$zKitFE;K!Zgsi&@6`LS(#bp7ibo|wB9 zbAKyzbUIdDd~D&?X1k-dpkuM-c|Bih~bY%+;^SWj#ta{9RH}X^W3Q##Tklx@iLW0 zDesaWRCc+a6k|L1{1?yKilkrDtq!-maW5$dkPL(sieK*(jAGp&Y%D|wuTWr$0;E61t0PuA6b6Mw<&;$S)Z+^o7 literal 0 HcmV?d00001 diff --git a/src/plugins/projectexplorer/images/build_hammer_mask@2x.png b/src/plugins/projectexplorer/images/build_hammer_mask@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fc679b1d566d319206e1ba0ed9dcaf20175b9697 GIT binary patch literal 611 zcmeAS@N?(olHy`uVBq!ia0y~yU~mCp4h9AW2HA=;c?=9pTAnVBArXh)Ui0^uoG5eP zR1u%F@a^Ho*b7F zE9a{qkrTh#nWi`vV`Z zOAi$o_7z+bi|k}$Skb#T_P0?4=Ye0VD{mWn%9#ES{QltizLyifiu%7X>MuLjVUuU} z+wOJ3>HcdB0v+o-6w|&v{w6s4jhXxg#jq(MSNKb^ik=@;Jp5*^*iPOpD}*lW-G0^J zcp5*G?Kh9YXLGf0J}iBf!JxKw;>TWrU9V3a(p)a`|M=Q`^*lM-JsO`%=373fj8?fE zQ1!QO%Zcq9=l-w~x^~cvB_xzFMqF^>()Hh5Gxa!lYF{uYy*hP`Ip>^*bwOOW57V8A zzZrtPmfYZyDJbrBn7-}UJ(fAoizGSr1S-vc-PlpHhK+5Dt}<7M{;A9bd6AteOb0q_ ziW{PDJ-fhs5ABH2TZ~CwQmR8v>ZIM*;e95+j{Y?L^7YTBl)0~*XTX62l zIn}org<>oIs;D=#^$1nIWMB99gskc%UK7!-wGOjayKqfC;Jh=j$h~vTuLCbvd$@?2>^BL8=U|E literal 0 HcmV?d00001 diff --git a/src/plugins/projectexplorer/images/build_hammerhandle_mask.png b/src/plugins/projectexplorer/images/build_hammerhandle_mask.png deleted file mode 100644 index 15e318ac4abdcb48e1c7bf2fcc8713b1aacd3548..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173 zcmeAS@N?(olHy`uVBq!ia0y~yU{C^K4h9AW26>$jIR*xX5>FS$5R22vKl}v@dbAXy zPTDtlU(-$CtBYuo>TXtPx8LY+S}Nn=3>$B6NYq!F5cL zCwV2;Xib>%AgD2bDXfqqUglvKV{nr@YY3;EXn<<p`RuDaGsdga^Fl2JTB;wI%K59aejf|GDoGDW~Uo$jURfA zlnlB$j%X+BMo1Pdzf9OyvY!pBxio?BQ*a&}5S2Y?91oF$v?y(h7#O@gT^vI+&L>+m^GU4G z*)+AWv68Rr#7hP?Ht&$w0@nh;9ZD@H4O}?{XDF%MUf4Ck#m~~f;Oc^11=`ILvu69V mKU?rSiB;DrS*44C!FKCbW~(Jzvlti{7(8A5T-G@yGywo&AwKy4 diff --git a/src/plugins/projectexplorer/images/build_hammerhead_mask@2x.png b/src/plugins/projectexplorer/images/build_hammerhead_mask@2x.png deleted file mode 100644 index ec7ecd42b0f2673222140675cc869a864daca782..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmeAS@N?(olHy`uVBq!ia0y~yU~mCp7G?$phEukEjSLJ7DgizruFTBLEG#UFii%1~ zN?u-G)22Es{&0tP)=lA%rEozFf$pY>zvAA`rw&Hp!sdv<=Ge0*N& zk0}}k_F(}PN7gi)7hwzG%vomeCp_TC`G)HvCy)RCZ$If!dKW|Uy~pmmc$j|Z{0dZ4 k4gDCLXtFn84GY8BHF3%k?O(zf7#J8lUHx3vIVCg!0AFc45dZ)H delta 179 zcmbQkc%E^BO8qoX7sn8b)5$;l1q^z$Btx70PwrR$&!O@2(U}LISo6~h8{W7n3i$@UBk3=E#GelF{r5}E*vlT|_h diff --git a/src/plugins/projectexplorer/images/debugger_beetle_mask@2x.png b/src/plugins/projectexplorer/images/debugger_beetle_mask@2x.png index c240532d29e6cb690ae3969a35ed021b9b313b1f..cb870c0b6c9e710264abcc3cce1b4b5aad45ef48 100644 GIT binary patch delta 234 zcmey))XFqLxt`&Sr;B4q#NoGBY`K^W1&)5Kf4L~mIXvK^Tg(jSuBfbsjDIX9XRm!{ zwn@RJdy3g4jwYW~)1R?_KEzV{@Ii-ipT#2(@rn6J*YYnqI-DnOdRl){NpW6%_uP$T z3eOc8dQMk7F-$60^*Z_7l1?`{fB-kEIH#1z)=y;ezSx4m;dy3Jbf2^vB>1nB% zGrF32RMz<2a{b4oJee=U;rkR0OE!iFDsuHk{nP5i7&iUQKRaKk zZlmOc?WXVla#+l%FrCgb%Qe2mq+!+bB@^V^_QqM9QGQwxx$`?^Y!TxwP+r5B}44V-w!tH;LK^@Ec0hox68-&azx-!{>_ z(n?iS^JvG7z=@|NPB^%-g%v%~TdQPk9<(HTK|-|jkxkqNyNptD7T7#}a;Hb&^P{Pk zje0h|QG46vKgsyIT5h@9q`IZLHGVtpywi35+neR0{D;NH?2MIfhQtd71_lOCS3j3^ HP6F&zb%)A-36z>lH7D&H?@zPK&8vTL{XxF){@7DT9?uNA z9q+o!v&rM@nj;|#F3dQS#@}lb(%TwRpx0D?xoCx}r}%TfNnh;htERB={WbVFd5enY z^w$MBC2m!6O1WIzo>IpWUN2qb+UM8trcle%s^!RMGyhe=d=q`uCM}UwVEisMnNx83 zN|l*P4ASydhqnqnW)#>xDbDkTkR-pxJGovJ??tszQB@7%Ti&-cdtCf^^eum)<}Lq1 zyO`f%S#HtG<<2FPZ03n$c58qALSnT=dbfi2Wh=LtT2Ed*epwQ8-tlZi_^SE;qE?pF rUrjn^{dCRiw9|8c+V66!u3^%De0ybjGTTK41_lOCS3j3^P6w#BJ;i?Ah%D9kENh;6XN*EYsrEr&4)n~{v QFfcH9y85}Sb4q9e0JZ;Fu>b%7 diff --git a/src/plugins/projectexplorer/images/mode_project_mask@2x.png b/src/plugins/projectexplorer/images/mode_project_mask@2x.png index 3538453911bbfc440f5a8123076177a11166ff15..79d0e7a5488f53d953102d8dd051dc19d21ef845 100644 GIT binary patch delta 737 zcmeBY{=qsyxt?jir;B4q#NoHsPWuNtiX3=&zb)E;ms6ypF~KR^Ar{_p348#Hrd{c4W2f6;nO**Uw+J$=Z>t;(s#*pl|8Mge9*18 zWtr*vrEPo8sCsVpUDD7Zoy4Ddy*j;VVL`#I;OVm6Caq_cX6rF{&HopawAhb9%lxcj zqWFQ%gC0&53fv2{a=0=X3iM>;W)w4+%yx`pjNws>u3o_OV5_0f8P++gHX0k()SnO+ z737@5_URhWM7IYmyQcNmi!#iq)K@Z^&bdWO(Ob%31P_%_|#bVDJR5bk3(UI_(#T@r|N#KkuXqIk`7CV5`W3| zYU;nw5<#DG7cxkQ39e-QRWfmQL-Rvud_D>za2z$7N2{1l%qOBHbrHS;YW?*?b= zkonr*YrgJH>+*)8*d=Tqj?}f~y|JsS{dn}kjq86kl^dePUoyTD>bd_h_)gpG-1^(? z->*Ho)ir-(B5T?g{sch-EhT1miARj}elO)6UNX!{oVeOuLecs{YQcP+>;nxa-acvj zGHd6QC9EfAiSJikX*iqnj_ID{>p2a|3jeIH%ee`$hrf0Bx2y2f42BgPD&CT-#To9+ z@{IFk=-YXidHx%Q+-H|ER2{NN%YR$`D(NDPG9zr`q@9xzTrW(`?=y{8yOfF7(8A5T-G@yGywqH+esM! delta 373 zcmeyt+Rr>ext=l1)5S3);_%yRiXP35BJ3ab^SL@67ce|AtLb2p!HHE0NrKIV3v@a| zkJ@eFXlhD~aBX2_745E_#=Cn4i({DChuI3kymfic%l-TQ|IXPhuK#C8`TKi!4?nkO zv3VreU&3^0PsH3e$332Du@%{|F&y|aTdMN>!NeUC`&E}eblX;cw@rAZ%AGdh$UkPs z;*+QRu)K5P-g;LdOHThK32W~5n^~k7yNK~5ONjEFY~%RG%Y0pC)2HSV*)6Bh`Ack;D*K^?YPMBx&R%rF2M2$Vr;% zkhIw%109!Smx%`q%C>$!*>e$M+CQdVl6*?<1SvAzELW6GcZ|4W-Bn43>$)_DE<|No96Lr96-{7L`+-@o?R$e{J!k>yYR z|9`&o4UdksMzGTbrKWSLFES4~y1TFl^tdSrF$;QfiAzlMVlWlHrz}1p`br@K0|SGn LtDnm{r-UW|<3&W1 delta 151 zcmdnSxS4T+N_~~5i(`nz>Es{&0tP&8s&?NwwGtn!`S0k#$=v+PugOb7qDD?QpEV;|0Ss4(A< zwb^d{2c4z_K_0f|1OXODfg?!<8lOJsTU0gP6g+*7v2Mfe&7b9)oF=;JBnfu^5t0=D zw0E^;kjkQ%|7mR(c6&ANwsZ>l=3Lye!idXvLf)*IQ3(wX-Yl)3k;ziTVzHwzZI-bm z)0?{z#&eg-Fq-*2IlSfx$A+?qPOE53CY@XHY3l9`mEAL2s;4L)*mBP2lI=-Bn`SLz z$@fZb4Hxu{C(k`0_`pzS@6<>01zR6y#H=|atZg#e>9%%_Lu=pygDE1%79U#>*2y#V wLr_=XVTbTY-H>TAyKSS6NGXZ^6#v9zv!HvmitZvF1_lNOPgg&ebxsLQ0Bc`+KL7v# delta 265 zcmdnZw3umvay`QAkg|yU4=_aDKH?w*g-6zsiSX_XhfrEhUVo> zjFAj%3)nl`lw^5Xxp*9M?iczW5jw{(f69xx-%a8V9i4&cpTeUoF*vU z6FAbL&%*kM&#~FU`GR7fz!r~ej;tlRE%_5-Mbimages/devicestatusindicator@2x.png images/build.png images/build@2x.png - images/build_hammerhandle_mask.png - images/build_hammerhandle_mask@2x.png - images/build_hammerhead_mask.png - images/build_hammerhead_mask@2x.png + images/build_hammer_mask.png + images/build_hammer_mask@2x.png images/targetpanel_bottom.png images/window.png images/buildstepdisable.png diff --git a/src/plugins/projectexplorer/projectexplorericons.cpp b/src/plugins/projectexplorer/projectexplorericons.cpp index 2a61f5bb2f8..0d4440b4aee 100644 --- a/src/plugins/projectexplorer/projectexplorericons.cpp +++ b/src/plugins/projectexplorer/projectexplorericons.cpp @@ -10,14 +10,12 @@ namespace Icons { const Icon BUILD(":/projectexplorer/images/build.png"); const Icon BUILD_FLAT({ - {":/projectexplorer/images/build_hammerhandle_mask.png", Theme::IconsBuildHammerHandleColor}, - {":/projectexplorer/images/build_hammerhead_mask.png", Theme::IconsBuildHammerHeadColor}}); + {":/projectexplorer/images/build_hammer_mask.png", Theme::IconsBaseColor}}); const Icon BUILD_SMALL({ {":/projectexplorer/images/buildhammerhandle.png", Theme::IconsBuildHammerHandleColor}, {":/projectexplorer/images/buildhammerhead.png", Theme::IconsBuildHammerHeadColor}}, Icon::Tint); const Icon CANCELBUILD_FLAT({ - {":/projectexplorer/images/build_hammerhandle_mask.png", Theme::IconsDisabledColor}, - {":/projectexplorer/images/build_hammerhead_mask.png", Theme::IconsDisabledColor}, + {":/projectexplorer/images/build_hammer_mask.png", Theme::IconsBaseColor}, {":/projectexplorer/images/cancelbuild_overlay.png", Theme::IconsStopToolBarColor}}, Icon::Tint | Icon::PunchEdges); const Icon REBUILD({ diff --git a/src/plugins/welcome/images/mode_welcome_mask.png b/src/plugins/welcome/images/mode_welcome_mask.png index 696af0c54990697b21285ad9849efadd7d7c958f..f15a361e45d65a62642145b4ae34493aeddce46d 100644 GIT binary patch delta 174 zcmYe@&p1J%o`Zpbfk9p;M2>-hq0Q69F~s6@@(+Ij1DZ&rgCsN2)cS{uuXQo641o8L1Uw1Xrggb ck+K*AL&}jab=FJrR6tJiboFyt=akR{0DoIMoB#j- delta 83 zcmdnbm^wkimywx)fq|iOW+MXw16zPkh${mF!~g&Pm)@Lzmw|yn%G1R$gd;ln2R{qD mM2F)4j~+K3t7Wd8#396>Q&9Otqhrzwkaka3KbLh*2~7YzfE&30 diff --git a/src/plugins/welcome/images/mode_welcome_mask@2x.png b/src/plugins/welcome/images/mode_welcome_mask@2x.png index 060ada0cf54520c5b24459b6c2e989e760f3a63b..63b8b88ed83ccbe2289861c49d7f6f595f958b99 100644 GIT binary patch delta 269 zcmd0v%QQivo`ZpbfkC$7OdbOR!xK*z$B>A_Z?EnYY&H;Jy&!MAm@RDWgPunkjJF(~ zS}YVyVedX}))8AM$-dfwWs+RH_=7@+M#VOXPy0P`I%e(Qf2qx|<8Haa#!?0bk*^y> zA4r1AEvwh0?aKL;A+swY8L-h{56Vpsp?#6R9&yk3d zNck@Ehx3x<$Bf?f1#>$pp2qa5Us&Byamcc#hhVo4}Mm8 v2{y*p{D;|}G5^_;+PkaOXgd!NH^Zy;KP&p)FE?XgU|{fc^>bP0l+XkK?du+L diff --git a/src/tools/icons/qtcreatoricons.svg b/src/tools/icons/qtcreatoricons.svg index 9c62d2a0ef3..7aa9fe1bed7 100644 --- a/src/tools/icons/qtcreatoricons.svg +++ b/src/tools/icons/qtcreatoricons.svg @@ -4866,35 +4866,22 @@ width="16" height="16" id="rect4959-4" /> - - - - - + + style="fill:#000000;stroke:none" + id="rect50185" + width="5" + height="7" + x="466" + y="576" + ry="2.5" /> + - + + + + + id="path43573" + style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round" + d="m 100,63 h 16 m -16,-4 h 12 m -12,-4 h 16 m -16,-4 h 12 m -12,-4 h 16" /> + id="g49500" + inkscape:transform-center-y="0.70710678" + transform="rotate(-45,157.5,54.5)" + inkscape:transform-center-x="-0.70710678"> + id="path47960" + style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round" + d="M 159,54.5 A 1.5,1.5 0 0 1 157.5,56 1.5,1.5 0 0 1 156,54.5 1.5,1.5 0 0 1 157.5,53 1.5,1.5 0 0 1 159,54.5 Z M 157.5,45 v 8 m -3.5,6 c 7,0 7,0 7,0 m -4.5,-14 h 2 l 4,10 -1.5,4 1.5,3 h -10 l 1.5,-3 -1.5,-4 z" /> + id="g73594" + style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round"> + id="path72820" + d="m 207,58 h 2 m 6,4 v -2 h -2 m -12,2 v -2 h 2 m 12,-4 h -1.5 m 1.5,-4 h -2 m -6,2 h 2 m -8,2 h 1.5 M 201,52 h 2 m 8,-5 -1,2 m -5,-2 1,2" /> + - + + + + + + + + + style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round" + d="m 356.7,52.44 c 0.57,-2 3.6,-2.35 4.33,-0.36 0.72,2 -1.54,2.2 -2.18,4.2" + id="path97127" + sodipodi:nodetypes="czc" /> @@ -8824,11 +8860,10 @@ id="use5913-0-8-1" width="100%" height="100%" /> - + - - - - - + + - + style="fill:#ffffff;stroke:#000000;stroke-width:4;stroke-linejoin:round;paint-order:stroke markers fill" + id="biginterruptbar" + width="2" + height="11" + x="757" + y="52" /> + - + + style="fill:none;stroke:#000000;stroke-width:2;stroke-linejoin:round" + d="m 765,51 6,6 -6,7 z" + id="path34590" /> + id="src/plugins/projectexplorer/images/build_hammer_mask"> - - - - - - - + id="g29289" + transform="rotate(30,861.61602,58.5)"> + + + style="fill:#ffffff;stroke:#000000;stroke-width:4;stroke-linejoin:round;paint-order:markers stroke fill" + id="rect38197" + width="10" + height="10" + x="757" + y="53" /> Date: Wed, 12 Jun 2024 10:44:25 +0200 Subject: [PATCH 09/36] iOS: Fix slow debugging with recent Xcode and iOS < 17 When starting the debugger, we need to pass it the location of the downloaded device symbols, or otherwise debugger startup is very slow. Xcode changes the location where it saves this information once in a while, and it must have again. The location with Xcode 15.2 at least is in the style "iPhone8,1 15.7.3 (19H307)", i.e. it starts with the "product type" now. Retrieve the product type of the device and add another candidate directory for device symbols. Fixes: QTCREATORBUG-31044 Change-Id: I1a65305fc84c1af8cd48c4ebb249167e1dbe6ae1 Reviewed-by: Marcus Tillmanns --- src/plugins/ios/devicectlutils.cpp | 1 + src/plugins/ios/devicectlutils.h | 1 + src/plugins/ios/iosdevice.cpp | 9 ++++++++- src/plugins/ios/iosdevice.h | 1 + src/plugins/ios/iosrunner.cpp | 17 ++++++++++------- src/tools/iostool/iosdevicemanager.cpp | 2 ++ .../ios/devicectlutils/tst_devicectlutils.cpp | 1 + 7 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/plugins/ios/devicectlutils.cpp b/src/plugins/ios/devicectlutils.cpp index 7bbed859b27..667f1bc54a9 100644 --- a/src/plugins/ios/devicectlutils.cpp +++ b/src/plugins/ios/devicectlutils.cpp @@ -73,6 +73,7 @@ expected_str> parseDeviceInfo(const QByteArray &rawOutput info[kOsVersion] = QLatin1String("%1 (%2)") .arg(device["deviceProperties"]["osVersionNumber"].toString(), device["deviceProperties"]["osBuildUpdate"].toString()); + info[kProductType] = device["hardwareProperties"]["productType"].toString(); info[kCpuArchitecture] = device["hardwareProperties"]["cpuType"]["name"].toString(); info[kUniqueDeviceId] = udid; return info; diff --git a/src/plugins/ios/devicectlutils.h b/src/plugins/ios/devicectlutils.h index 106fee78a23..cb470cff29a 100644 --- a/src/plugins/ios/devicectlutils.h +++ b/src/plugins/ios/devicectlutils.h @@ -13,6 +13,7 @@ const char kDeviceName[] = "deviceName"; const char kDeveloperStatus[] = "developerStatus"; const char kDeviceConnected[] = "deviceConnected"; const char kOsVersion[] = "osVersion"; +const char kProductType[] = "productType"; const char kCpuArchitecture[] = "cpuArchitecture"; const char kUniqueDeviceId[] = "uniqueDeviceId"; const char vOff[] = "*off*"; diff --git a/src/plugins/ios/iosdevice.cpp b/src/plugins/ios/iosdevice.cpp index e81c263672b..0dd75896e06 100644 --- a/src/plugins/ios/iosdevice.cpp +++ b/src/plugins/ios/iosdevice.cpp @@ -92,8 +92,9 @@ public: Form { Tr::tr("Device name:"), iosDevice->deviceName(), br, Tr::tr("Identifier:"), iosDevice->uniqueInternalDeviceId(), br, + Tr::tr("Product type:"), iosDevice->productType(), br, + Tr::tr("CPU Architecture:"), iosDevice->cpuArchitecture(), br, Tr::tr("OS Version:"), iosDevice->osVersion(), br, - Tr::tr("CPU Architecture:"), iosDevice->cpuArchitecture(), noMargin }.attachTo(this); // clang-format on @@ -193,6 +194,11 @@ QString IosDevice::osVersion() const return m_extraInfo.value(kOsVersion); } +QString IosDevice::productType() const +{ + return m_extraInfo.value(kProductType); +} + QString IosDevice::cpuArchitecture() const { return m_extraInfo.value(kCpuArchitecture); @@ -227,6 +233,7 @@ IosDeviceManager::TranslationMap IosDeviceManager::translationMap() tMap[QLatin1String("NO")] = Tr::tr("no"); tMap[QLatin1String("*unknown*")] = Tr::tr("unknown"); tMap[kOsVersion] = Tr::tr("OS version"); + tMap[kProductType] = Tr::tr("Product type"); translationMap = &tMap; return tMap; } diff --git a/src/plugins/ios/iosdevice.h b/src/plugins/ios/iosdevice.h index 62a7f2bb93a..b8ec2871347 100644 --- a/src/plugins/ios/iosdevice.h +++ b/src/plugins/ios/iosdevice.h @@ -37,6 +37,7 @@ public: QString uniqueDeviceID() const; QString uniqueInternalDeviceId() const; QString osVersion() const; + QString productType() const; QString cpuArchitecture() const; Utils::Port nextPort() const; Handler handler() const; diff --git a/src/plugins/ios/iosrunner.cpp b/src/plugins/ios/iosrunner.cpp index 863a2867b8a..1d4bd33aa11 100644 --- a/src/plugins/ios/iosrunner.cpp +++ b/src/plugins/ios/iosrunner.cpp @@ -813,14 +813,17 @@ void IosDebugSupport::start() setStartMode(AttachToRemoteProcess); setIosPlatform("remote-ios"); const QString osVersion = dev->osVersion(); + const QString productType = dev->productType(); const QString cpuArchitecture = dev->cpuArchitecture(); - const FilePaths symbolsPathCandidates = { - FilePath::fromString(QDir::homePath() + "/Library/Developer/Xcode/iOS DeviceSupport/" - + osVersion + " " + cpuArchitecture + "/Symbols"), - FilePath::fromString(QDir::homePath() + "/Library/Developer/Xcode/iOS DeviceSupport/" - + osVersion + "/Symbols"), - IosConfigurations::developerPath().pathAppended( - "Platforms/iPhoneOS.platform/DeviceSupport/" + osVersion + "/Symbols")}; + const FilePath home = FilePath::fromString(QDir::homePath()); + const FilePaths symbolsPathCandidates + = {home / "Library/Developer/Xcode/iOS DeviceSupport" / (productType + " " + osVersion) + / "Symbols", + home / "Library/Developer/Xcode/iOS DeviceSupport" + / (osVersion + " " + cpuArchitecture) / "Symbols", + home / "Library/Developer/Xcode/iOS DeviceSupport" / osVersion / "Symbols", + IosConfigurations::developerPath() / "Platforms/iPhoneOS.platform/DeviceSupport" + / osVersion / "Symbols"}; const FilePath deviceSdk = Utils::findOrDefault(symbolsPathCandidates, &FilePath::isDir); if (deviceSdk.isEmpty()) { diff --git a/src/tools/iostool/iosdevicemanager.cpp b/src/tools/iostool/iosdevicemanager.cpp index d492e6f78dc..3f523807857 100644 --- a/src/tools/iostool/iosdevicemanager.cpp +++ b/src/tools/iostool/iosdevicemanager.cpp @@ -1662,6 +1662,7 @@ void DevInfoSession::deviceCallbackReturned() const QString osVersionKey = "osVersion"; const QString cpuArchitectureKey = "cpuArchitecture"; const QString uniqueDeviceId = "uniqueDeviceId"; + const QString productType = "productType"; bool failure = !device; if (!failure) { failure = !connectDevice(); @@ -1669,6 +1670,7 @@ void DevInfoSession::deviceCallbackReturned() res[deviceConnectedKey] = QLatin1String("YES"); res[deviceNameKey] = getStringValue(device, nullptr, CFSTR("DeviceName")); res[uniqueDeviceId] = getStringValue(device, nullptr, CFSTR("UniqueDeviceID")); + res[productType] = getStringValue(device, nullptr, CFSTR("ProductType")); const QString productVersion = getStringValue(device, nullptr, CFSTR("ProductVersion")); res[developerStatusKey] = getStringValue(device, CFSTR("com.apple.xcode.developerdomain"), diff --git a/tests/auto/ios/devicectlutils/tst_devicectlutils.cpp b/tests/auto/ios/devicectlutils/tst_devicectlutils.cpp index f75497f68a3..8924c58a867 100644 --- a/tests/auto/ios/devicectlutils/tst_devicectlutils.cpp +++ b/tests/auto/ios/devicectlutils/tst_devicectlutils.cpp @@ -287,6 +287,7 @@ void tst_Devicectlutils::parseDeviceInfo_data() {"deviceConnected", "YES"}, {"deviceName", "Some iOS device"}, {"osVersion", "17.3 (21D50)"}, + {"productType", "iPad11,2"}, {"uniqueDeviceId", "00000000-0000000000000000"}}); QTest::addRow("unhandled device") << data << QString("000000000000000000000001") From c5564559cc01821e97e10f7253933ac5ca7f24c6 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Thu, 30 May 2024 10:19:10 +0200 Subject: [PATCH 10/36] ProjectExplorer: use multiple threads to scan for files recursively Change-Id: I845d2e2eaffd8d6a4e85d3186435d57846789506 Reviewed-by: Eike Ziller Reviewed-by: Jarek Kobus --- .../projectexplorer/projectnodeshelper.h | 125 ++++++++++++------ 1 file changed, 88 insertions(+), 37 deletions(-) diff --git a/src/plugins/projectexplorer/projectnodeshelper.h b/src/plugins/projectexplorer/projectnodeshelper.h index b9e3cc27aa0..6809622af5b 100644 --- a/src/plugins/projectexplorer/projectnodeshelper.h +++ b/src/plugins/projectexplorer/projectnodeshelper.h @@ -8,67 +8,121 @@ #include #include +#include + #include +#include #include +#include #include namespace ProjectExplorer { namespace Internal { +struct DirectoryScanResult +{ + QList nodes; + Utils::FilePaths subDirectories; +}; + template -QList scanForFilesRecursively( +DirectoryScanResult scanForFiles( QPromise &promise, - double progressStart, - double progressRange, const Utils::FilePath &directory, const QDir::Filters &filter, const std::function factory, - QSet &visited, const QList &versionControls) { - QList result; - - // Do not follow directory loops: - if (!Utils::insert(visited, directory.canonicalPath())) - return result; + DirectoryScanResult result; const Utils::FilePaths entries = directory.dirEntries(filter); - double progress = 0; - const double progressIncrement = progressRange / static_cast(entries.count()); - int lastIntProgress = 0; for (const Utils::FilePath &entry : entries) { if (promise.isCanceled()) return result; - if (!Utils::contains(versionControls, [entry](const Core::IVersionControl *vc) { + if (Utils::anyOf(versionControls, [entry](const Core::IVersionControl *vc) { return vc->isVcsFileOrDirectory(entry); })) { - if (entry.isDir()) { - result.append(scanForFilesRecursively(promise, - progress, - progressIncrement, - entry, - filter, - factory, - visited, - versionControls)); - } else if (FileNode *node = factory(entry)) { - result.append(node); - } - } - progress += progressIncrement; - const int intProgress = std::min(static_cast(progressStart + progress), - promise.future().progressMaximum()); - if (lastIntProgress < intProgress) { - promise.setProgressValue(intProgress); - lastIntProgress = intProgress; + continue; } + + if (entry.isDir()) + result.subDirectories.append(entry); + else if (FileNode *node = factory(entry)) + result.nodes.append(node); } - promise.setProgressValue(std::min(static_cast(progressStart + progressRange), - promise.future().progressMaximum())); + return result; } + +template +QList scanForFilesRecursively( + QPromise &promise, + double progressRange, + const Utils::FilePath &directory, + const QDir::Filters &filter, + const std::function factory, + const QList &versionControls) +{ + QSet visited; + const DirectoryScanResult result + = scanForFiles(promise, directory, filter, factory, versionControls); + QList fileNodes = result.nodes; + const double progressIncrement = progressRange + / static_cast( + fileNodes.count() + result.subDirectories.count()); + promise.setProgressValue(fileNodes.count() * progressIncrement); + QList> subDirectories; + auto addSubDirectories = [&](const Utils::FilePaths &subdirs, int progressIncrement) { + for (const Utils::FilePath &subdir : subdirs) { + if (Utils::insert(visited, subdir.canonicalPath())) + subDirectories.append(qMakePair(subdir, progressIncrement)); + else + promise.setProgressValue(promise.future().progressValue() + progressIncrement); + } + }; + addSubDirectories(result.subDirectories, progressIncrement); + + while (!subDirectories.isEmpty()) { + using namespace Tasking; + LoopList iterator(subDirectories); + subDirectories.clear(); + + auto onSetup = [&, iterator](Utils::Async &task) { + task.setConcurrentCallData( + [&filter, &factory, &promise, &versionControls, subdir = iterator->first]( + QPromise &p) { + p.addResult(scanForFiles(promise, subdir, filter, factory, versionControls)); + }); + }; + + auto onDone = [&, iterator](const Utils::Async &task) { + const int progressRange = iterator->second; + const DirectoryScanResult result = task.result(); + fileNodes.append(result.nodes); + const int subDirCount = result.subDirectories.count(); + if (subDirCount == 0) { + promise.setProgressValue(promise.future().progressValue() + progressRange); + } else { + const int fileCount = result.nodes.count(); + const int increment = progressRange / static_cast(fileCount + subDirCount); + promise.setProgressValue( + promise.future().progressValue() + increment * fileCount); + addSubDirectories(result.subDirectories, increment); + } + }; + + const Group group{ + Utils::HostOsInfo::isLinuxHost() ? parallelLimit(2) : parallelIdealThreadCountLimit, + iterator, + Utils::AsyncTask(onSetup, onDone) + }; + TaskTree::runBlocking(group); + } + return fileNodes; +} + } // namespace Internal template @@ -78,15 +132,12 @@ QList scanForFiles( const QDir::Filters &filter, const std::function factory) { - QSet visited; promise.setProgressRange(0, 1000000); return Internal::scanForFilesRecursively(promise, - 0.0, 1000000.0, directory, filter, factory, - visited, Core::VcsManager::versionControls()); } From 20dda9d5fdf1d5bb6b113557f926f675be495258 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 13 Jun 2024 08:55:47 +0200 Subject: [PATCH 11/36] FakeVim: Avoid possible nullptr access Amends 9f0919c4a3875d8baffc7b6f2b5f7d2e25e198c3. Fixes: QTCREATORBUG-30730 Change-Id: I389412a0b069fd34a625075d97c89f106c5b5f74 Reviewed-by: hjk --- src/plugins/fakevim/fakevimplugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp index a84598aec00..2ceb2ca30fe 100644 --- a/src/plugins/fakevim/fakevimplugin.cpp +++ b/src/plugins/fakevim/fakevimplugin.cpp @@ -1502,7 +1502,7 @@ void FakeVimPlugin::editorOpened(IEditor *editor) handler->modeChanged.set([tew, this, editor](bool insertMode) { HandlerAndData &handlerAndData = m_editorToHandler[editor]; - if (!handlerAndData.handler->inFakeVimMode()) + if (!handlerAndData.handler || !handlerAndData.handler->inFakeVimMode()) return; // We don't want to show suggestions unless we are in insert mode. From 7d5f1bd17de7fe9ee5f270448cd5f8b416e423b0 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 13 Jun 2024 07:47:43 +0200 Subject: [PATCH 12/36] CppEditor: Silence warning Amends f477ede697c67c0716232963298a6e9d218ed8d6. Change-Id: I99b10d2f9ba460ee0a1fa828e1b19465077192ef Reviewed-by: David Schulz --- src/plugins/cppeditor/cppfilesettingspage.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/cppeditor/cppfilesettingspage.cpp b/src/plugins/cppeditor/cppfilesettingspage.cpp index a5c01b400b1..70f17e9afe8 100644 --- a/src/plugins/cppeditor/cppfilesettingspage.cpp +++ b/src/plugins/cppeditor/cppfilesettingspage.cpp @@ -744,6 +744,8 @@ void setupCppFileSettings(ExtensionSystem::IPlugin &plugin) #ifdef WITH_TESTS plugin.addTestCreator([] { return new CppFileSettingsTest; }); +#else + Q_UNUSED(plugin) #endif } From 55836c174ddc70b46c78787fd50af31d44357f08 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 12 Jun 2024 17:29:36 +0200 Subject: [PATCH 13/36] CppEditor: Fix unit test Amends f477ede697c67c0716232963298a6e9d218ed8d6. Change-Id: Ibc6ae49adbe6932c57ca22008cbd354cd3bd26f5 Reviewed-by: David Schulz --- .../testcases/move-class/complex/theclass.h_expected | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/cppeditor/testcases/move-class/complex/theclass.h_expected b/src/plugins/cppeditor/testcases/move-class/complex/theclass.h_expected index c7db776d277..12df0c76295 100644 --- a/src/plugins/cppeditor/testcases/move-class/complex/theclass.h_expected +++ b/src/plugins/cppeditor/testcases/move-class/complex/theclass.h_expected @@ -1,5 +1,5 @@ -#ifndef PROJECT_INTERNAL_THECLASS_H -#define PROJECT_INTERNAL_THECLASS_H +#ifndef THECLASS_H +#define THECLASS_H namespace Project { namespace Internal { @@ -26,4 +26,4 @@ template T TheClass::defaultValue() const { return T(); } } // namespace Internal } // namespace Project -#endif // PROJECT_INTERNAL_THECLASS_H +#endif // THECLASS_H From e331329e4f8bb3de30f99f0905a0d2517d4c227c Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 12 Jun 2024 15:42:07 +0200 Subject: [PATCH 14/36] TaskTree: Detect a misconfigured recipe of a nested task tree Change-Id: I6652336023ac111cde5334e655f5dd972977b07f Reviewed-by: hjk --- src/libs/solutions/tasking/tasktree.cpp | 22 +++++---- tests/auto/solutions/tasking/tst_tasking.cpp | 50 ++++++++++++++++++++ 2 files changed, 64 insertions(+), 8 deletions(-) diff --git a/src/libs/solutions/tasking/tasktree.cpp b/src/libs/solutions/tasking/tasktree.cpp index d923eb31d0e..5c1f65e503f 100644 --- a/src/libs/solutions/tasking/tasktree.cpp +++ b/src/libs/solutions/tasking/tasktree.cpp @@ -1291,6 +1291,12 @@ const void *Loop::valuePtr() const using StoragePtr = void *; +static QString s_activeStorageWarning = + "The referenced storage is not reachable in the running tree. " + "A nullptr will be returned which might lead to a crash in the calling code. " + "It is possible that no storage was added to the tree, " + "or the storage is not reachable from where it is referenced."; + class StorageThreadData { Q_DISABLE_COPY_MOVE(StorageThreadData) @@ -1299,7 +1305,7 @@ public: StorageThreadData() = default; void pushStorage(StoragePtr storagePtr) { - m_activeStorageStack.push_back(storagePtr); + m_activeStorageStack.push_back({storagePtr, activeTaskTree()}); } void popStorage() { @@ -1308,16 +1314,16 @@ public: } StoragePtr activeStorage() const { - QT_ASSERT(m_activeStorageStack.size(), qWarning( - "The referenced storage is not reachable in the running tree. " - "A nullptr will be returned which might lead to a crash in the calling code. " - "It is possible that no storage was added to the tree, " - "or the storage is not reachable from where it is referenced."); return nullptr); - return m_activeStorageStack.last(); + QT_ASSERT(m_activeStorageStack.size(), + qWarning().noquote() << s_activeStorageWarning; return nullptr); + const QPair &top = m_activeStorageStack.last(); + QT_ASSERT(top.second == activeTaskTree(), + qWarning().noquote() << s_activeStorageWarning; return nullptr); + return top.first; } private: - QList m_activeStorageStack; + QList> m_activeStorageStack; }; class StorageData diff --git a/tests/auto/solutions/tasking/tst_tasking.cpp b/tests/auto/solutions/tasking/tst_tasking.cpp index db293d4ebfb..f3d83b4806d 100644 --- a/tests/auto/solutions/tasking/tst_tasking.cpp +++ b/tests/auto/solutions/tasking/tst_tasking.cpp @@ -118,6 +118,7 @@ private slots: void storageOperators(); void storageDestructor(); void storageZeroInitialization(); + void nestedBrokenStorage(); void restart(); void destructorOfTaskEmittingDone(); }; @@ -3452,6 +3453,55 @@ void tst_Tasking::storageZeroInitialization() QCOMPARE(defaultValue, 0); } +// This test ensures that when a missing storage object inside the nested task tree is accessed +// directly from the outer task tree's handler, containing the same storage object, then we +// detect this misconfigured recipe, issue a warning, and return nullptr for the storage +// being accessed (instead of returning parent's task tree's storage instance). +// This test should also trigger a runtime assert that we are accessing the nullptr storage. +void tst_Tasking::nestedBrokenStorage() +{ + int *outerStorage = nullptr; + int *innerStorage1 = nullptr; + int *innerStorage2 = nullptr; + const Storage storage; + + const auto onOuterSync = [storage, &outerStorage, &innerStorage1, &innerStorage2] { + outerStorage = &*storage; + + const auto onInnerSync1 = [storage, &innerStorage1] { + innerStorage1 = &*storage; // Triggers the runtime assert on purpose. + }; + const auto onInnerSync2 = [storage, &innerStorage2] { + innerStorage2 = &*storage; // Storage is accessible in currently running tree - all OK. + }; + + const Group innerRecipe { + Group { + // Broken subrecipe, the storage wasn't placed inside the recipe. + // storage, + Sync(onInnerSync1) + }, + Group { + storage, // Subrecipe OK, another instance for the nested storage will be created. + Sync(onInnerSync2) + } + }; + + TaskTree::runBlocking(innerRecipe); + }; + + const Group outerRecipe { + storage, + Sync(onOuterSync) + }; + + TaskTree::runBlocking(outerRecipe); + QVERIFY(outerStorage != nullptr); + QCOMPARE(innerStorage1, nullptr); + QVERIFY(innerStorage2 != nullptr); + QVERIFY(innerStorage2 != outerStorage); +} + void tst_Tasking::restart() { TaskTree taskTree({TestTask([](TaskObject &taskObject) { taskObject = 1000ms; })}); From 8f715a350b97f6f19ce2b158cb7afb5026af36e9 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Thu, 13 Jun 2024 06:59:00 +0200 Subject: [PATCH 15/36] Lua: Fix comment line endings Change-Id: I00a5ece580b69a65c8fa60eae8458526d1df257e Reviewed-by: Leena Miettinen --- src/plugins/lua/meta/action.lua | 30 ++++++------- src/plugins/lua/meta/async.lua | 4 +- src/plugins/lua/meta/core.lua | 4 +- src/plugins/lua/meta/fetch.lua | 18 ++++---- src/plugins/lua/meta/gui.lua | 50 +++++++++------------ src/plugins/lua/meta/install.lua | 20 ++++----- src/plugins/lua/meta/lsp.lua | 28 ++++++------ src/plugins/lua/meta/messagemanager.lua | 6 +-- src/plugins/lua/meta/process.lua | 8 ++-- src/plugins/lua/meta/settings.lua | 58 ++++++++++++------------ src/plugins/lua/meta/simpletypes.lua | 32 ++++++------- src/plugins/lua/meta/utils.lua | 60 ++++++++++++------------- 12 files changed, 156 insertions(+), 162 deletions(-) diff --git a/src/plugins/lua/meta/action.lua b/src/plugins/lua/meta/action.lua index 713dbcddb3a..48a1f49594b 100644 --- a/src/plugins/lua/meta/action.lua +++ b/src/plugins/lua/meta/action.lua @@ -4,30 +4,30 @@ local action = {} ---@enum CommandAttributes action.CommandAttribute = { - ---Hide the command from the menu + ---Hide the command from the menu. CA_Hide = 1, - ---Update the text of the command + ---Update the text of the command. CA_UpdateText = 2, - ---Update the icon of the command + ---Update the icon of the command. CA_UpdateIcon = 4, - ---The command cannot be configured + ---The command cannot be configured. CA_NonConfigurable = 8, } ---@class ActionOptions ----@field context? string The context in which the action is available ----@field text? string The text to display for the action ----@field iconText? string The icon text to display for the action ----@field toolTip? string The tooltip to display for the action ----@field onTrigger? function The callback to call when the action is triggered ----@field commandAttributes? CommandAttributes The attributes of the action ----@field commandDescription? string The description of the command ----@field defaultKeySequence? string The default key sequence for the action ----@field defaultKeySequences? string[] The default key sequences for the action +---@field context? string The context in which the action is available. +---@field text? string The text to display for the action. +---@field iconText? string The icon text to display for the action. +---@field toolTip? string The tooltip to display for the action. +---@field onTrigger? function The callback to call when the action is triggered. +---@field commandAttributes? CommandAttributes The attributes of the action. +---@field commandDescription? string The description of the command. +---@field defaultKeySequence? string The default key sequence for the action. +---@field defaultKeySequences? string[] The default key sequences for the action. local ActionOptions = {} ----Creates a new Action ----@param id string The id of the action +---Creates a new Action. +---@param id string The id of the action. ---@param options ActionOptions function action.create(id, options) end diff --git a/src/plugins/lua/meta/async.lua b/src/plugins/lua/meta/async.lua index 8f7232a001a..fee1f1a48f7 100644 --- a/src/plugins/lua/meta/async.lua +++ b/src/plugins/lua/meta/async.lua @@ -20,7 +20,7 @@ local async = {} function async.sync(func) end ---@async ----Calls an async function and waits for it to finish. **Must** be called from async.sync() +---Calls an async function and waits for it to finish. **Must** be called from async.sync(). --- --- Example: --- ```lua @@ -39,7 +39,7 @@ function async.sync(func) end function async.wait(func) end ---@async ----Calls multiple async functions and waits for all of them to finish. **Must** be called from async.sync() +---Calls multiple async functions and waits for all of them to finish. **Must** be called from async.sync(). --- --- Example: --- ```lua diff --git a/src/plugins/lua/meta/core.lua b/src/plugins/lua/meta/core.lua index e30e55e73db..3ad61a2d1dd 100644 --- a/src/plugins/lua/meta/core.lua +++ b/src/plugins/lua/meta/core.lua @@ -16,10 +16,10 @@ Core.GeneratedFile.Attribute = { ---@field filePath FilePath ---@field contents string ---@field isBinary boolean ----@field attributes Attribute A combination of Attribute +---@field attributes Attribute A combination of Attribute. Core.GeneratedFile = {} ----Create a new GeneratedFile +---Create a new GeneratedFile. ---@return GeneratedFile function Core.GeneratedFile.new() end diff --git a/src/plugins/lua/meta/fetch.lua b/src/plugins/lua/meta/fetch.lua index 877f6c99f66..ada2b07d4ae 100644 --- a/src/plugins/lua/meta/fetch.lua +++ b/src/plugins/lua/meta/fetch.lua @@ -1,12 +1,12 @@ ---@meta Fetch local Fetch = {} ----A network reply from fetch +---A network reply from fetch. ---@class QNetworkReply ----@field error integer The error code of the reply or 0 if no error +---@field error integer The error code of the reply or 0 if no error. local QNetworkReply = {} ----Returns the data of the reply +---Returns the data of the reply. ---@return string function QNetworkReply:readAll() end @@ -16,15 +16,15 @@ function QNetworkReply:readAll() end function Fetch.fetch(options) end --@param options FetchOptions ---@param callback function The callback to call when the fetch is done +--@param callback function The callback to call when the fetch is done. function Fetch.fetch_cb(options, callback) end ---@class FetchOptions ----@field url string The url to fetch ----@field method? string The method to use (GET, POST, ...), default is GET ----@field headers? table The headers to send ----@field body? string The body to send ----@field convertToTable? boolean If true, the resulting data will expect JSON and converted it to a table +---@field url string The url to fetch. +---@field method? string The method to use (GET, POST, ...), default is GET. +---@field headers? table The headers to send. +---@field body? string The body to send. +---@field convertToTable? boolean If true, the resulting data will expect JSON and converted it to a table. local FetchOptions = {} return Fetch diff --git a/src/plugins/lua/meta/gui.lua b/src/plugins/lua/meta/gui.lua index 6913e5f1eb1..71f9f20cf65 100644 --- a/src/plugins/lua/meta/gui.lua +++ b/src/plugins/lua/meta/gui.lua @@ -2,11 +2,11 @@ local gui = {} ----The base class of all ui related classes +---The base class of all ui related classes. ---@class Object gui.Object = {} ----The base class of all gui layout classes +---The base class of all gui layout classes. ---@class Layout : Object gui.Layout = {} @@ -26,14 +26,14 @@ local column = {} ---@return Column function gui.Column(children) end ----A group box with a title +---A group box with a title. ---@class Group : Widget local group = {} ---@return Group function gui.Group(children) end ----Row layout +---Row layout. ---@class Row : Layout local row = {} @@ -41,7 +41,7 @@ local row = {} ---@return Row function gui.Row(children) end ----Flow layout +---Flow layout. ---@class Flow : Layout local flow = {} @@ -49,7 +49,7 @@ local flow = {} ---@return Flow function gui.Flow(children) end ----Grid layout +---Grid layout. ---@class Grid : Layout local grid = {} @@ -57,7 +57,7 @@ local grid = {} ---@return Grid function gui.Grid(children) end ----Form layout +---Form layout. ---@class Form : Layout local form = {} @@ -66,7 +66,7 @@ local form = {} function gui.Form(children) end ----A stack of multiple widgets +---A stack of multiple widgets. ---@class Stack : Widget local stack = {} @@ -74,7 +74,7 @@ local stack = {} ---@return Stack function gui.Stack(children) end ----A Tab widget +---A Tab widget. ---@class Tab : Widget local tab = {} @@ -82,7 +82,7 @@ local tab = {} ---@return Tab function gui.Tab(children) end ----A Multiline text edit +---A Multiline text edit. ---@class TextEdit : Widget local textEdit = {} @@ -90,7 +90,6 @@ local textEdit = {} ---@return TextEdit function gui.TextEdit(children) end ----A PushButton ---@class PushButton : Widget local pushButton = {} @@ -98,7 +97,6 @@ local pushButton = {} ---@return PushButton function gui.PushButton(children) end ----A Label ---@class Label : LayoutItem local label = {} @@ -106,7 +104,6 @@ local label = {} ---@return Label function gui.Label(children) end ----A SpinBox ---@class SpinBox : Widget local spinBox = {} @@ -114,7 +111,6 @@ local spinBox = {} ---@return SpinBox function gui.SpinBox(children) end ----A Splitter ---@class Splitter : Widget local splitter = {} @@ -122,7 +118,6 @@ local splitter = {} ---@return Splitter function gui.Splitter(children) end ----A Toolbar ---@class ToolBar : Widget local toolBar = {} @@ -130,7 +125,6 @@ local toolBar = {} ---@return ToolBar function gui.ToolBar(children) end ----A TabWidget ---@class TabWidget : Widget local tabWidget = {} @@ -142,40 +136,40 @@ function gui.TabWidget(children) end ---@param child Layout|string|BaseAspect|function ---@return TabWidget function gui.TabWidget(name, child) end ----A "Line break" in the gui +---A "Line break" in the gui. function gui.br() end ----A "Stretch" in the layout +---A "Stretch" in the layout. function gui.st() end ----An empty grid cell in a grid layout +---An empty grid cell in a grid layout. function gui.empty() end ----A horizontal line in the layout +---A horizontal line in the layout. function gui.hr() end ----Clears the margin of the layout +---Clears the margin of the layout. function gui.noMargin() end ----Sets the margin of the layout to the default value +---Sets the margin of the layout to the default value. function gui.normalMargin() end ----Sets the alignment of a Grid layout according to the Form layout rules +---Sets the alignment of a Grid layout according to the Form layout rules. function gui.withFormAlignment() end ----Sets the size of the parent object if possible +---Sets the size of the parent object if possible. function gui.resize(width, height) end ----Sets the spacing of the gui +---Sets the spacing of the gui. function gui.spacing(spacing) end ----Sets the field growth policy of the gui +---Sets the field growth policy of the gui. function gui.fieldGrowthPolicy(policy) end ----Sets the onClicked handler of the parent object if possible +---Sets the onClicked handler of the parent object if possible. function gui.onClicked(f) end ----Sets the onTextChanged handler of the parent object if possible +---Sets the onTextChanged handler of the parent object if possible. function gui.onTextChanged(f) end return gui diff --git a/src/plugins/lua/meta/install.lua b/src/plugins/lua/meta/install.lua index 17752063740..427c0d51765 100644 --- a/src/plugins/lua/meta/install.lua +++ b/src/plugins/lua/meta/install.lua @@ -3,26 +3,26 @@ local Install = {} ---@class PackageInfo ----@field name string The name of the package ----@field version string The version of the package ----@field path FilePath The path to the package +---@field name string The name of the package. +---@field version string The version of the package. +---@field path FilePath The path to the package. local PackageInfo = {} ---@class InstallOptions ----@field name string The name of the package to install ----@field url string The url to fetch the package from ----@field version string The version of the package to install +---@field name string The name of the package to install. +---@field url string The url to fetch the package from. +---@field version string The version of the package to install. local InstallOptions = {} ---Install something ----@param msg string The message to display to the user asking for permission to install ----@param options InstallOptions|[InstallOptions] The options to install ----@return boolean Result Whether the installation was successful +---@param msg string The message to display to the user asking for permission to install. +---@param options InstallOptions|[InstallOptions] The options to install. +---@return boolean Result Whether the installation was successful. ---@return string Error The error message if the installation failed. function Install.install(msg, options) end ---Get the package info ----@param name any The name of the package +---@param name any The name of the package. ---@return PackageInfo function Install.packageInfo(name) end diff --git a/src/plugins/lua/meta/lsp.lua b/src/plugins/lua/meta/lsp.lua index 1c404c167f6..b0a34e7cd7e 100644 --- a/src/plugins/lua/meta/lsp.lua +++ b/src/plugins/lua/meta/lsp.lua @@ -1,38 +1,38 @@ ----@meta LSP +---@meta LSP. local lsp = {} ---@class ClientOptions ---@field name string The name under which to register the language server. ---@field cmd function|string[] The command to start the language server, or a function returning a string[]. ----@field transport? "stdio"|"localsocket" Defaults to stdio ----@field serverName? string The socket path when transport == "localsocket" ----@field languageFilter LanguageFilter The language filter deciding which files to open with the language server +---@field transport? "stdio"|"localsocket" Defaults to stdio. +---@field serverName? string The socket path when transport == "localsocket". +---@field languageFilter LanguageFilter The language filter deciding which files to open with the language server. ---@field startBehavior? "AlwaysOn"|"RequiresFile"|"RequiresProject" ----@field initializationOptions? table|string The initialization options to pass to the language server, either a json string, or a table +---@field initializationOptions? table|string The initialization options to pass to the language server, either a JSON string, or a table. ---@field settings? AspectContainer ---@field onStartFailed? function This callback is called when client failed to start. local ClientOptions = {} ---@class LanguageFilter ----@field patterns? string[] The file patterns supported by the language server ----@field mimeTypes? string[] The mime types supported by the language server +---@field patterns? string[] The file patterns supported by the language server. +---@field mimeTypes? string[] The mime types supported by the language server. local LanguageFilter = {} ---@class Client ----@field on_instance_start function The callback to call when a language client starts +---@field on_instance_start function The callback to call when a language client starts. lsp.Client = {} ----@param msg string The name of the message to handle ----@param callback function The callback to call when the message is received ----Registers a message handler for the message named 'msg' +---@param msg string The name of the message to handle. +---@param callback function The callback to call when the message is received. +---Registers a message handler for the message named 'msg'. function lsp.Client:registerMessage(msg, callback) end ----@param msg table the message to send ----Sends a message to the language server +---@param msg table the message to send. +---Sends a message to the language server. function lsp.Client:sendMessage(msg, callback) end ----Creates a new Language Client +---Creates a new Language Client. ---@param options ClientOptions ---@return Client function lsp.Client.create(options) end diff --git a/src/plugins/lua/meta/messagemanager.lua b/src/plugins/lua/meta/messagemanager.lua index 61419ee4b71..5bd6d92ed5e 100644 --- a/src/plugins/lua/meta/messagemanager.lua +++ b/src/plugins/lua/meta/messagemanager.lua @@ -2,15 +2,15 @@ local messagemanager = {} ----Writes a message to the Output pane +---Writes a message to the Output pane. ---@param ... any function messagemanager.writeSilently(...) end ----Writes a message to the Output pane and flashes the pane if its not open +---Writes a message to the Output pane and flashes the pane if its not open. ---@param ... any function messagemanager.writeFlashing(...) end ----Writes a message to the Output pane and opens the pane if its not open +---Writes a message to the Output pane and opens the pane if its not open. ---@param ... any function messagemanager.writeDisrupting(...) end diff --git a/src/plugins/lua/meta/process.lua b/src/plugins/lua/meta/process.lua index 53b4f35b7d0..e15d71996ae 100644 --- a/src/plugins/lua/meta/process.lua +++ b/src/plugins/lua/meta/process.lua @@ -4,14 +4,14 @@ local process = {} ---@async ---Runs a command in a terminal, has to be called from a coroutine! ----@param cmd string The command to run ----@return number The exit code of the command +---@param cmd string The command to run. +---@return number exitCode The exit code of the command. function process.runInTerminal(cmd) end ---@async ---Runs a command and returns the output! ----@param cmd string The command to run ----@return string The output of the command +---@param cmd string The command to run. +---@return string output The output of the command. function process.commandOutput(cmd) end return process diff --git a/src/plugins/lua/meta/settings.lua b/src/plugins/lua/meta/settings.lua index 09af050d924..6cf32d8ef2b 100644 --- a/src/plugins/lua/meta/settings.lua +++ b/src/plugins/lua/meta/settings.lua @@ -8,48 +8,48 @@ local settings = {} ---@class BaseAspect settings.BaseAspect = {} ----Applies the changes from its volatileValue to its value +---Applies the changes from its volatileValue to its value. function settings.BaseAspect:apply() end ---@class AspectCreate ----@field settingsKey? string The settings key of the aspect ----@field displayName? string The display name of the aspect ----@field labelText? string The label text of the aspect ----@field toolTip? string The tool tip of the aspect ----@field enabler? BoolAspect Enable / Disable this aspect based on the state of the `enabler` ----@field onValueChanged? function () Called when the value of the aspect changes ----@field onVolatileValueChanged? function () Called when the volatile value of the aspect changes +---@field settingsKey? string The settings key of the aspect. +---@field displayName? string The display name of the aspect. +---@field labelText? string The label text of the aspect. +---@field toolTip? string The tool tip of the aspect. +---@field enabler? BoolAspect Enable / Disable this aspect based on the state of the `enabler`. +---@field onValueChanged? function () Called when the value of the aspect changes. +---@field onVolatileValueChanged? function () Called when the volatile value of the aspect changes. local AspectCreate = {} ----The base class of most typed aspects +---The base class of most typed aspects. ---@generic T ---@class TypedAspect : BaseAspect ----@field value `T` The value of the aspect ----@field volatileValue `T` The temporary value of the aspect ----@field defaultValue `T` The default value of the aspect +---@field value `T` The value of the aspect. +---@field volatileValue `T` The temporary value of the aspect. +---@field defaultValue `T` The default value of the aspect. local TypedAspect = {} ---@generic T ---@class TypedAspectCreate : AspectCreate ----@field defaultValue `T` The default value of the aspect +---@field defaultValue `T` The default value of the aspect. local TypedAspectCreate = {} ----A container for aspects +---A container for aspects. ---@class AspectContainer : BaseAspect settings.AspectContainer = {} ----Options for creating an AspectContainer +---Options for creating an AspectContainer. ---@class AspectContainerCreate ----@field autoApply? boolean Whether the aspects should be applied automatically or not +---@field autoApply? boolean Whether the aspects should be applied automatically or not. AspectContainerCreate = {} ----Create a new AspectContainer +---Create a new AspectContainer. ---@param options AspectContainerCreate ---@return AspectContainer function settings.AspectContainer.create(options) end ----A aspect containing a boolean value +---A aspect containing a boolean value. ---@class BoolAspect : TypedAspect settings.BoolAspect = {} @@ -63,7 +63,7 @@ settings.LabelPlacement = { ---@field labelPlacement? LabelPlacement: BoolAspectCreate = {} ----Create a new BoolAspect +---Create a new BoolAspect. ---@param options BoolAspectCreate ---@return BoolAspect function settings.BoolAspect.create(options) end @@ -86,15 +86,15 @@ settings.StringDisplayStyle = { }; ---@class StringAspectCreate : TypedAspectCreate ----@field displayStyle? StringDisplayStyle The display type of the aspect ----@field historyId? string The history id of the aspect +---@field displayStyle? StringDisplayStyle The display type of the aspect. +---@field historyId? string The history id of the aspect. ---@field valueAcceptor? function string (oldvalue: string, newValue: string) ---@field showToolTipOnLabel? boolean ---@field displayFilter? function string (value: string) ---@field placeHolderText? string ---@field acceptRichText? boolean ---@field autoApplyOnEditingFinished? boolean ----@field elideMode? Qt.TextElideMode The elide mode of the aspect +---@field elideMode? Qt.TextElideMode The elide mode of the aspect. StringAspectCreate = {} ---@class StringAspect : TypedAspect @@ -116,9 +116,9 @@ settings.Kind = { }; ---@class FilePathAspectCreate ----@field expectedKind? Kind The kind of path we want to select ----@field historyId? string The history id of the aspect ----@field defaultPath? FilePath The default path of the aspect +---@field expectedKind? Kind The kind of path we want to select. +---@field historyId? string The history id of the aspect. +---@field defaultPath? FilePath The default path of the aspect. ---@field promptDialogFilter? string ---@field promptDialogTitle? string ---@field commandVersionArguments? string[] @@ -136,8 +136,8 @@ settings.Kind = { FilePathAspectCreate = {} ---@class FilePathAspect ----@field expandedValue FilePath The expanded value of the aspect ----@field defaultPath FilePath The default path of the aspect +---@field expandedValue FilePath The expanded value of the aspect. +---@field defaultPath FilePath The default path of the aspect. settings.FilePathAspect = {} ---Create a new FilePathAspect @@ -146,7 +146,7 @@ settings.FilePathAspect = {} function settings.FilePathAspect.create(options) end ---Set the value of the aspect ----@param value string|FilePath The value to set +---@param value string|FilePath The value to set. function settings.FilePathAspect:setValue(value) end settings.IntegerAspect = {} @@ -179,7 +179,7 @@ settings.OptionsPage = {} ---@field aspectContainer AspectContainer OptionsPageCreate = {} ----Creates a new OptionsPage +---Creates a new OptionsPage. ---@param options OptionsPageCreate ---@return OptionsPage function settings.OptionsPage.create(options) end diff --git a/src/plugins/lua/meta/simpletypes.lua b/src/plugins/lua/meta/simpletypes.lua index fdb65cf0984..5071efa9119 100644 --- a/src/plugins/lua/meta/simpletypes.lua +++ b/src/plugins/lua/meta/simpletypes.lua @@ -1,36 +1,36 @@ ---@meta ---@class QRect ----@field x integer The x position of the rectangle ----@field y integer The y position of the rectangle ----@field width integer The width of the rectangle ----@field height integer The height of the rectangle +---@field x integer The x position of the rectangle. +---@field y integer The y position of the rectangle. +---@field width integer The width of the rectangle. +---@field height integer The height of the rectangle. QRect = {} ---@class QSize ----@field width integer The width of the size ----@field height integer The height of the size +---@field width integer The width of the size. +---@field height integer The height of the size. QSize = {} ---@class QPoint ----@field x integer The x position of the point ----@field y integer The y position of the point +---@field x integer The x position of the point. +---@field y integer The y position of the point. QPoint = {} ---@class QPointF ----@field x number The x position of the floating point ----@field y number The y position of the floating point +---@field x number The x position of the floating point. +---@field y number The y position of the floating point. QPointF = {} ---@class QSizeF ----@field width number The width of the floating point size ----@field height number The height of the floating point size +---@field width number The width of the floating point size. +---@field height number The height of the floating point size. QSizeF = {} ---@class QRectF ----@field x number The x position of the floating point rectangle ----@field y number The y position of the floating point rectangle ----@field width number The width of the floating point rectangle ----@field height number The height of the floating point rectangle +---@field x number The x position of the floating point rectangle. +---@field y number The y position of the floating point rectangle. +---@field width number The width of the floating point rectangle. +---@field height number The height of the floating point rectangle. QRectF = {} diff --git a/src/plugins/lua/meta/utils.lua b/src/plugins/lua/meta/utils.lua index 409946b711c..51e74ea1033 100644 --- a/src/plugins/lua/meta/utils.lua +++ b/src/plugins/lua/meta/utils.lua @@ -3,99 +3,99 @@ local utils = {} ---Suspends the current coroutine for the given amount of milliseconds. Call `a.wait` on the returned value to get the result. ----@param ms number The amount of milliseconds to wait +---@param ms number The amount of milliseconds to wait. function utils.waitms(ms) end ----Calls the callback after the given amount of milliseconds ----@param ms number The amount of milliseconds to wait ----@param callback function The callback to call +---Calls the callback after the given amount of milliseconds. +---@param ms number The amount of milliseconds to wait. +---@param callback function The callback to call. function utils.waitms_cb(ms, callback) end ---@class FilePath utils.FilePath = {} ----@param path string The path to convert ----@return FilePath The converted path ----Convert and clean a path, returning a FilePath object +---@param path string The path to convert. +---@return FilePath The converted path. +---Convert and clean a path, returning a FilePath object. function utils.FilePath.fromUserInput(path) end ----@return FilePath The new absolute path +---@return FilePath The new absolute path. ---Searches for the path inside the PATH environment variable. Call `a.wait` on the returned value to get the result. function utils.FilePath:searchInPath() end ---@class (exact) DirEntriesOptions ----@field nameFilters? string[] The name filters to use (e.g. "*.lua"), defaults to all files ----@field fileFilters? integer The filters to use (combination of QDir.Filters.*), defaults to QDir.Filters.NoFilter ----@field flags? integer The iterator flags (combination of QDirIterator.Flags.*), defaults to QDirIterator.Flags.NoIteratorFlags +---@field nameFilters? string[] The name filters to use (e.g. "*.lua"), defaults to all files. +---@field fileFilters? integer The filters to use (combination of QDir.Filters.*), defaults to QDir.Filters.NoFilter. +---@field flags? integer The iterator flags (combination of QDirIterator.Flags.*), defaults to QDirIterator.Flags.NoIteratorFlags. ---Returns all entries in the directory. Call `a.wait` on the returned value to get the result. ---@param options DirEntriesOptions ---@return FilePath[] function utils.FilePath:dirEntries(options) end ----Returns the FilePath as it should be displayed to the user +---Returns the FilePath as it should be displayed to the user. ---@return string function utils.FilePath:toUserOutput() end ----Returns whether the target exists +---Returns whether the target exists. ---@return boolean function utils.FilePath:exists() end ----Returns whether the target is a file and executable +---Returns whether the target is a file and executable. ---@return boolean function utils.FilePath:isExecutableFile() end ----Returns the path portion of FilePath as a string in the hosts native format +---Returns the path portion of FilePath as a string in the hosts native format. ---@return string function utils.FilePath:nativePath() end ----Returns the last part of the path +---Returns the last part of the path. ---@return string function utils.FilePath:fileName() end ----Returns the current working path of Qt Creator +---Returns the current working path of Qt Creator. ---@return FilePath function utils.FilePath.currentWorkingPath() end ----Returns a new FilePath with the given tail appended ----@param tail string|FilePath The tail to append +---Returns a new FilePath with the given tail appended. +---@param tail string|FilePath The tail to append. ---@return FilePath function utils.FilePath:resolvePath(tail) end ----Returns the parent directory of the path +---Returns the parent directory of the path. ---@return FilePath function utils.FilePath:parentDir() end ----If the path targets a symlink, this function returns the target of the symlink ----@return FilePath The resolved path +---If the path targets a symlink, this function returns the target of the symlink. +---@return FilePath resolvedPath The resolved path. function utils.FilePath:resolveSymlinks() end ----Returns the suffix of the path (e.g. "test.ui.qml" -> ".qml") +---Returns the suffix of the paths (e.g. "test.ui.qml" -> ".qml"). ---@return string function utils.FilePath:suffix() end ----Returns the complete suffix of the path (e.g. "test.ui.qml" -> "ui.qml") +---Returns the complete suffix of the paths (e.g. "test.ui.qml" -> "ui.qml"). ---@return string function utils.FilePath:completeSuffix() end ----Returns whether the path is absolute +---Returns whether the path is absolute. ---@return boolean function utils.FilePath:isAbsolutePath() end ---@class HostOsInfo ----@field os "mac"|"windows"|"linux" The current host operating system ----@field architecture "unknown"|"x86"|"x86_64"|"itanium"|"arm"|"arm64" The current host architecture +---@field os "mac"|"windows"|"linux" The current host operating system. +---@field architecture "unknown"|"x86"|"x86_64"|"itanium"|"arm"|"arm64" The current host architecture. utils.HostOsInfo = {} ----Returns whether the host operating system is windows +---Returns whether the host operating system is windows. ---@return boolean function utils.HostOsInfo.isWindowsHost() end ----Returns whether the host operating system is mac +---Returns whether the host operating system is mac. ---@return boolean function utils.HostOsInfo.isMacHost() end ----Returns whether the host operating system is linux +---Returns whether the host operating system is linux. ---@return boolean function utils.HostOsInfo.isLinuxHost() end From 03626ad26a22e59c939423edd3fa63a97acfdec6 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 13 Jun 2024 09:46:26 +0200 Subject: [PATCH 16/36] Add information about Lua to change log Change-Id: Iaeb1e1c0883c3638e75c36c16d340fafc8fd1d39 Reviewed-by: Leena Miettinen --- dist/changelog/changes-14.0.0.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dist/changelog/changes-14.0.0.md b/dist/changelog/changes-14.0.0.md index 00ba593c720..907d04ca5e3 100644 --- a/dist/changelog/changes-14.0.0.md +++ b/dist/changelog/changes-14.0.0.md @@ -13,6 +13,8 @@ the public Git repository. For example: General ------- +* Started work on supporting Lua based plugins (registering language servers, + actions, preferences, and wizards) * Added `Clear` and `Save Contents` to context menus of all output views * Locator * Added the option to show results relative to project root From c9ce9f819bec006126a3dcf965ca3ee39b050bb5 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 10 Jun 2024 14:21:28 +0200 Subject: [PATCH 17/36] SubDirFileContainer: Fix manual tests TaskTree::runBlocking() returns DoneWith enum these days. Change-Id: Ib6fb1ce3e849586e236c9985461c29695ff9d880 Reviewed-by: Eike Ziller --- tests/manual/subdirfilecontainer/tst_subdirfilecontainer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/manual/subdirfilecontainer/tst_subdirfilecontainer.cpp b/tests/manual/subdirfilecontainer/tst_subdirfilecontainer.cpp index ca4925a9439..31abdca256d 100644 --- a/tests/manual/subdirfilecontainer/tst_subdirfilecontainer.cpp +++ b/tests/manual/subdirfilecontainer/tst_subdirfilecontainer.cpp @@ -155,7 +155,7 @@ private slots: tasks.append(AsyncTask(onCopySetup(parentDir.filePath(sourceDirName), parentDir.filePath(destDirName)))); } - QVERIFY(TaskTree::runBlocking(tasks)); + QCOMPARE(TaskTree::runBlocking(tasks), DoneWith::Success); } void cleanupTestCase() @@ -177,7 +177,7 @@ private slots: for (int i = 0; i < s_topLevelSubDirsCount; ++i) tasks.append(AsyncTask(onSetup(parentDir.filePath(dirName(i))))); - QVERIFY(TaskTree::runBlocking(tasks)); + QCOMPARE(TaskTree::runBlocking(tasks), DoneWith::Success); m_tempDir.reset(); Singleton::deleteAll(); From f7991a80f5837dde0a5013d2398c59c975a874c1 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Wed, 12 Jun 2024 13:11:48 +0200 Subject: [PATCH 18/36] GitHub/Coin: Update LLVM/Clang to 18.1.7 Fixes: QTCREATORBUG-31045 Change-Id: Id70b3ac32a944c89763d095f5dcf6cd20849610d Reviewed-by: Eike Ziller --- .github/workflows/build_cmake.yml | 2 +- coin/instructions/common_environment.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_cmake.yml b/.github/workflows/build_cmake.yml index d0c9124fb00..6f0223b578b 100644 --- a/.github/workflows/build_cmake.yml +++ b/.github/workflows/build_cmake.yml @@ -9,7 +9,7 @@ on: env: QT_VERSION: 6.7.1 MACOS_DEPLOYMENT_TARGET: 11.0 - CLANG_VERSION: 18.1.5 + CLANG_VERSION: 18.1.7 ELFUTILS_VERSION: 0.175 CMAKE_VERSION: 3.21.1 NINJA_VERSION: 1.10.2 diff --git a/coin/instructions/common_environment.yaml b/coin/instructions/common_environment.yaml index 1410fa79e7e..bed851d11ed 100644 --- a/coin/instructions/common_environment.yaml +++ b/coin/instructions/common_environment.yaml @@ -7,7 +7,7 @@ instructions: variableValue: "RelWithDebInfo" - type: EnvironmentVariable variableName: LLVM_BASE_URL - variableValue: https://ci-files02-hki.ci.qt.io/packages/jenkins/qtcreator_libclang/libclang-release_18.1.5-based + variableValue: https://ci-files02-hki.ci.qt.io/packages/jenkins/qtcreator_libclang/libclang-release_18.1.7-based - type: EnvironmentVariable variableName: QTC_QT_BASE_URL variableValue: "https://ci-files02-hki.ci.qt.io/packages/jenkins/archive/qt/6.7/6.7.1-released/Qt" From ddd137f3b1f77fdf5fa63a0c4348cdb8fc412a9d Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Thu, 13 Jun 2024 10:52:43 +0200 Subject: [PATCH 19/36] Lua: Move lua plugins into normal plugin folder Change-Id: I14ab0bb755a4279bc255673596fe084cd556433c Reviewed-by: Eike Ziller --- cmake/QtCreatorAPI.cmake | 4 ++-- qbs/imports/QtcLuaPlugin.qbs | 2 +- src/plugins/lua/README.md | 8 ++++---- src/plugins/lua/luaplugin.cpp | 5 +---- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/cmake/QtCreatorAPI.cmake b/cmake/QtCreatorAPI.cmake index 786e2d85533..c0f61301111 100644 --- a/cmake/QtCreatorAPI.cmake +++ b/cmake/QtCreatorAPI.cmake @@ -1129,7 +1129,7 @@ function (add_qtc_lua_plugin name) qtc_copy_to_builddir(${name} FILES ${_arg_SOURCES} - DESTINATION ${IDE_PLUGIN_PATH}/lua-plugins + DESTINATION ${IDE_PLUGIN_PATH} ) if (NOT _arg_EXCLUDE_FROM_INSTALL) @@ -1138,7 +1138,7 @@ function (add_qtc_lua_plugin name) install( FILES ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE} - DESTINATION ${IDE_PLUGIN_PATH}/lua-plugins/${SOURCE_DIR} + DESTINATION ${IDE_PLUGIN_PATH}/${SOURCE_DIR} ) endforeach() endif() diff --git a/qbs/imports/QtcLuaPlugin.qbs b/qbs/imports/QtcLuaPlugin.qbs index e7976501c34..1684590480c 100644 --- a/qbs/imports/QtcLuaPlugin.qbs +++ b/qbs/imports/QtcLuaPlugin.qbs @@ -7,6 +7,6 @@ Product { prefix: sourceDirectory + '/' + product.name + '/' files: luafiles qbs.install: true - qbs.installDir: qtc.ide_plugin_path + '/lua-plugins/' + product.name + qbs.installDir: qtc.ide_plugin_path + '/' + product.name } } diff --git a/src/plugins/lua/README.md b/src/plugins/lua/README.md index 108420735ed..ba5fbba8d94 100644 --- a/src/plugins/lua/README.md +++ b/src/plugins/lua/README.md @@ -6,7 +6,7 @@ The Lua plugin provides support for writing plugins using the Lua scripting lang ## Usage -The plugin scans the folder `lua-plugins` folder inside the normal plugin folder of Qt Creator +The plugin scans the normal plugin folders of Qt Creator `ExtensionSystem::PluginManager::pluginPaths()`. It loads scripts from any folder that contains a .lua script named the same as the folder. Whether or not the script is enabled is determined by the `disabledByDefault` field in the plugin @@ -17,7 +17,7 @@ table and the settings configured via the "About Plugins" dialog in Qt Creator. A Lua script needs to provide the following table to be considered a plugin: ```lua --- lua-plugins/myluaplugin/myluaplugin.lua +-- myluaplugin/myluaplugin.lua return { name = "MyLuaPlugin", version = "1.0.0", @@ -50,13 +50,13 @@ It must only return the plugin specification table and not execute or require an Use `require` to load other files from within the setup function. ```lua --- lua-plugins/myluaplugin/myluaplugin.lua +-- myluaplugin/myluaplugin.lua return { -- ... required fields omitted .. setup = function() require 'init'.setup() end, } --[[@as QtcPlugin]] --- lua-plugins/myluaplugin/init.lua +-- myluaplugin/init.lua local function setup() print("Hello from Lua!") end diff --git a/src/plugins/lua/luaplugin.cpp b/src/plugins/lua/luaplugin.cpp index 60505ade850..ec3007294f2 100644 --- a/src/plugins/lua/luaplugin.cpp +++ b/src/plugins/lua/luaplugin.cpp @@ -106,10 +106,7 @@ public: bool delayedInitialize() final { - scanForPlugins(transform(PluginManager::pluginPaths(), [](const FilePath &path) { - return path / "lua-plugins"; - })); - + scanForPlugins(PluginManager::pluginPaths()); return true; } From ca90dcdc13d735cfc9b92a1a8f6ab3909128b103 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 13 Jun 2024 10:39:58 +0200 Subject: [PATCH 20/36] Doc: Change the title of a tutorial to move it down the list This is a temporary fix until the real fix ends up in Qt 6.9 and we start using QDoc from there to build the docs. Then, we can rethink the title. Change-Id: I95332b18f7b53fd9b01d0b986275c958add0f00e Reviewed-by: hjk --- .../src/projects/creator-only/creator-projects-libraries.qdoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-libraries.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-libraries.qdoc index c4f8d905a33..fc66a62e8a7 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-libraries.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-libraries.qdoc @@ -91,7 +91,7 @@ For more information about the project file settings, see \l{Declaring Other Libraries}{qmake Manual: Declaring Other Libraries}. - \sa {Adding an Internal Library to a qmake Project}{Tutorial: Adding an Internal Library to a qmake Project}, + \sa {Using an Internal Library in a qmake Project}{Tutorial: Using an Internal Library in a qmake Project}, {Add subprojects to projects}, {Add libraries to CMake projects}, {Use project wizards}, {Creating Projects} */ @@ -103,7 +103,7 @@ \ingroup creator-tutorials - \title Adding an Internal Library to a qmake Project + \title Using an Internal Library in a qmake Project \brief How to create your own library and link your application against it when using qmake as the build system. From 0c0ad6e7d85aa2bfc30dd3bdff3d4ba277e21790 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Thu, 13 Jun 2024 11:23:22 +0200 Subject: [PATCH 21/36] Lua: Replace -loadluaplugin with -pluginpath Change-Id: Ic398e09dedd6ba11a73e616788b92a001e0a96bd Reviewed-by: Eike Ziller --- src/plugins/lua/luaplugin.cpp | 49 +++------------------ src/plugins/lua/wizards/plugin/project.json | 2 +- src/plugins/lua/wizards/plugin/wizard.json | 8 +--- 3 files changed, 9 insertions(+), 50 deletions(-) diff --git a/src/plugins/lua/luaplugin.cpp b/src/plugins/lua/luaplugin.cpp index ec3007294f2..0290df988c3 100644 --- a/src/plugins/lua/luaplugin.cpp +++ b/src/plugins/lua/luaplugin.cpp @@ -49,24 +49,6 @@ public: } }; -struct Arguments -{ - std::optional loadPlugin; -}; - -Arguments parseArguments(const QStringList &arguments) -{ - Arguments args; - for (int i = 0; i < arguments.size() - 1; ++i) { - if (arguments.at(i) == QLatin1String("-loadluaplugin")) { - const QString path(arguments.at(i + 1)); - args.loadPlugin = FilePath::fromUserInput(path); - i++; // skip the argument - } - } - return args; -} - class LuaPlugin : public IPlugin { Q_OBJECT @@ -74,18 +56,15 @@ class LuaPlugin : public IPlugin private: std::unique_ptr m_luaEngine; - Arguments m_arguments; public: LuaPlugin() {} ~LuaPlugin() override = default; - bool initialize(const QStringList &arguments, QString *) final + void initialize() final { m_luaEngine.reset(new LuaEngine()); - m_arguments = parseArguments(arguments); - addAsyncModule(); addFetchModule(); addActionModule(); @@ -100,8 +79,6 @@ public: addInstallModule(); Core::JsExpander::registerGlobalObject("Lua", [] { return new LuaJsExtension(); }); - - return true; } bool delayedInitialize() final @@ -110,14 +87,17 @@ public: return true; } - void scanForPlugins(const FilePaths &paths) + void scanForPlugins(const FilePaths &pluginPaths) { QSet plugins; - for (const FilePath &path : paths) { + for (const FilePath &path : pluginPaths) { FilePaths folders = path.dirEntries(FileFilter({}, QDir::Dirs | QDir::NoDotAndDotDot)); for (const FilePath &folder : folders) { const FilePath script = folder / (folder.baseName() + ".lua"); + if (!script.exists()) + continue; + const expected_str result = m_luaEngine->loadPlugin(script); if (!result) { @@ -132,23 +112,6 @@ public: } } - if (m_arguments.loadPlugin) { - const FilePath folder = *m_arguments.loadPlugin; - const FilePath script = folder / (folder.baseName() + ".lua"); - const expected_str result = m_luaEngine->loadPlugin(script); - - if (!result) { - qWarning() << "Failed to load plugin" << script << ":" << result.error(); - MessageManager::writeFlashing(tr("Failed to load plugin %1: %2") - .arg(script.toUserOutput()) - .arg(result.error())); - - } else { - (*result)->setEnabledBySettings(true); - plugins.insert(*result); - } - } - PluginManager::addPlugins({plugins.begin(), plugins.end()}); PluginManager::loadPluginsAtRuntime(plugins); } diff --git a/src/plugins/lua/wizards/plugin/project.json b/src/plugins/lua/wizards/plugin/project.json index b7879f50d77..b13f0e967ff 100644 --- a/src/plugins/lua/wizards/plugin/project.json +++ b/src/plugins/lua/wizards/plugin/project.json @@ -9,7 +9,7 @@ "-tcs", "-load", "Lua", - "-loadluaplugin", + "-pluginpath", "%\{ActiveProject:ProjectDirectory\}" ] } diff --git a/src/plugins/lua/wizards/plugin/wizard.json b/src/plugins/lua/wizards/plugin/wizard.json index f854a49a3c1..b897f1eb141 100644 --- a/src/plugins/lua/wizards/plugin/wizard.json +++ b/src/plugins/lua/wizards/plugin/wizard.json @@ -19,10 +19,6 @@ "key": "ProjectFile", "value": "%{ProjectDirectory}/.qtcreator/project.json" }, - { - "key": "PluginNameLower", - "value": "%{JS: value('PluginName').toLowerCase()}" - }, { "key": "PluginSpecFile", "value": "%{JS: Util.fileName(value('PluginName').toLowerCase(), Util.preferredSuffix('text/x-lua'))}" @@ -147,14 +143,14 @@ }, { "source": "init.lua.tpl", - "target": "%{SrcFileName}" + "target": "%{PluginName}/%{SrcFileName}" }, { "source": ".luarc.json" }, { "source": "plugin.lua.tpl", - "target": "%{PluginSpecFile}", + "target": "%{PluginName}/%{PluginSpecFile}", "openInEditor": true } ] From 52a8aa7d09a7e4cca483e4842ba9531cae89b705 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 13 Jun 2024 11:04:10 +0200 Subject: [PATCH 22/36] FakeVim: Handle highlights for more split actions This fixes the issue at least for all usual FakeVim commands. It still breaks if the user directly uses the respective buttons on the editor toolbar, but that is a different story. Amends 5ad790d5c8f70b46c8603724e919fc3e30d10c60. Task-number: QTCREATORBUG-28914 Change-Id: I0a69d1f50eb6788099ac93bb529f72502cbd6ed0 Reviewed-by: hjk --- src/plugins/fakevim/fakevimplugin.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp index 2ceb2ca30fe..6909c4d35a7 100644 --- a/src/plugins/fakevim/fakevimplugin.cpp +++ b/src/plugins/fakevim/fakevimplugin.cpp @@ -1651,11 +1651,13 @@ void FakeVimPlugin::editorOpened(IEditor *editor) keepOnlyWindow(); else if (key == "P" || key == "") triggerAction(Core::Constants::GOTO_PREV_SPLIT); - else if (key == "S" || key == "") + else if (key == "S" || key == "") { triggerAction(Core::Constants::SPLIT); - else if (key == "V" || key == "") + updateAllHightLights(); + } else if (key == "V" || key == "") { triggerAction(Core::Constants::SPLIT_SIDE_BY_SIDE); - else if (key == "W" || key == "") + updateAllHightLights(); + } else if (key == "W" || key == "") triggerAction(Core::Constants::GOTO_NEXT_SPLIT); else if (key.contains("RIGHT") || key == "L" || key == "" || key == "") moveSomewhere(handler, &moveRightWeight, key == "" ? -1 : count); From bb4c6d2bff02e14a1b13498243e94f5c63679899 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Thu, 13 Jun 2024 09:30:32 +0200 Subject: [PATCH 23/36] Dumper: optimize cdb Qt version detection ... by not overwriting DumperBase.qtVersion. This function already checks whether the Qt version was passed via the fetch variables command. amends 3aee50f5fd9ebd46c70bed9b0e7343f90afb6603 Fixes: QTCREATORBUG-31049 Change-Id: Ifa67be5701fc7e5492e4c1fcb8943111b299c78d Reviewed-by: hjk --- share/qtcreator/debugger/cdbbridge.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/share/qtcreator/debugger/cdbbridge.py b/share/qtcreator/debugger/cdbbridge.py index ce88c903a77..7674a37b710 100644 --- a/share/qtcreator/debugger/cdbbridge.py +++ b/share/qtcreator/debugger/cdbbridge.py @@ -331,8 +331,7 @@ class Dumper(DumperBase): self.qtNamespace = lambda: namespace return namespace - def qtVersion(self): - qtVersion = None + def extractQtVersion(self): try: qtVersion = self.parseAndEvaluate( '((void**)&%s)[2]' % self.qtHookDataSymbolName()).integer() @@ -344,10 +343,7 @@ class Dumper(DumperBase): (major, minor, patch) = version.decode('latin1').split('.') qtVersion = 0x10000 * int(major) + 0x100 * int(minor) + int(patch) except: - pass - if qtVersion is None: - qtVersion = self.fallbackQtVersion - self.qtVersion = lambda: qtVersion + return None return qtVersion def putVtableItem(self, address): From 20a6a5cd786229fbe95901db4e510516f27bc035 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Thu, 13 Jun 2024 07:38:40 +0200 Subject: [PATCH 24/36] Extensionsystem: Allow pluginspecs to customize how they want to check dependencies Change-Id: I84f3a56160588e4842301f4577f7bfdad96463ca Reviewed-by: Eike Ziller --- src/libs/extensionsystem/pluginspec.cpp | 17 +++++---- src/libs/extensionsystem/pluginspec.h | 13 +++---- .../coreplugin/plugininstallwizard.cpp | 2 +- .../pluginspec/tst_pluginspec.cpp | 36 +++++++++---------- 4 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/libs/extensionsystem/pluginspec.cpp b/src/libs/extensionsystem/pluginspec.cpp index f7d72b80420..d2515760493 100644 --- a/src/libs/extensionsystem/pluginspec.cpp +++ b/src/libs/extensionsystem/pluginspec.cpp @@ -559,18 +559,17 @@ QString PluginSpec::errorString() const } /*! - Returns whether this plugin can be used to fill in a dependency of the given - \a pluginName and \a pluginVersion. + Returns whether the plugin \a spec can be used to fill the \a dependency of this plugin. - \sa PluginSpec::dependencies() + \sa PluginSpec::dependencies() */ -bool PluginSpec::provides(const QString &pluginName, const QString &pluginVersion) const +bool PluginSpec::provides(PluginSpec *spec, const PluginDependency &dependency) const { - if (QString::compare(pluginName, name(), Qt::CaseInsensitive) != 0) + if (QString::compare(dependency.name, spec->name(), Qt::CaseInsensitive) != 0) return false; - return (versionCompare(version(), pluginVersion) >= 0) - && (versionCompare(compatVersion(), pluginVersion) <= 0); + return (versionCompare(spec->version(), dependency.version) >= 0) + && (versionCompare(spec->compatVersion(), dependency.version) <= 0); } /*! @@ -1075,8 +1074,8 @@ bool PluginSpec::resolveDependencies(const PluginSpecs &specs) QHash resolvedDependencies; for (const PluginDependency &dependency : d->dependencies) { - PluginSpec *const found = findOrDefault(specs, [&dependency](PluginSpec *spec) { - return spec->provides(dependency.name, dependency.version); + PluginSpec *const found = findOrDefault(specs, [this, &dependency](PluginSpec *spec) { + return provides(spec, dependency); }); if (!found) { if (dependency.type == PluginDependency::Required) { diff --git a/src/libs/extensionsystem/pluginspec.h b/src/libs/extensionsystem/pluginspec.h index 49a972d9149..e9a771d4a99 100644 --- a/src/libs/extensionsystem/pluginspec.h +++ b/src/libs/extensionsystem/pluginspec.h @@ -36,13 +36,14 @@ class PluginView; struct EXTENSIONSYSTEM_EXPORT PluginDependency { - enum Type { - Required, - Optional, - Test - }; + enum Type { Required, Optional, Test }; PluginDependency() : type(Required) {} + PluginDependency(const QString &name, const QString &version, Type type = Required) + : name(name) + , version(version) + , type(type) + {} QString name; QString version; @@ -130,7 +131,7 @@ public: virtual void addArgument(const QString &argument); virtual QHash dependencySpecs() const; - virtual bool provides(const QString &pluginName, const QString &pluginVersion) const; + virtual bool provides(PluginSpec *spec, const PluginDependency &dependency) const; virtual bool requiresAny(const QSet &plugins) const; virtual PluginSpecs enableDependenciesIndirectly(bool enableTestDependencies); virtual bool resolveDependencies(const PluginSpecs &pluginSpecs); diff --git a/src/plugins/coreplugin/plugininstallwizard.cpp b/src/plugins/coreplugin/plugininstallwizard.cpp index 250ed0a31a5..e9f91ffbb8e 100644 --- a/src/plugins/coreplugin/plugininstallwizard.cpp +++ b/src/plugins/coreplugin/plugininstallwizard.cpp @@ -162,7 +162,7 @@ void checkContents(QPromise &promise, const FilePath &tempDir) [coreplugin](const PluginDependency &d) { return d.name == coreplugin->name(); }); if (found == dependencies.constEnd()) return; - if (coreplugin->provides(found->name, found->version)) + if ((*spec)->provides(coreplugin, *found)) return; promise.addResult( ArchiveIssue{Tr::tr("Plugin requires an incompatible version of %1 (%2).") diff --git a/tests/auto/extensionsystem/pluginspec/tst_pluginspec.cpp b/tests/auto/extensionsystem/pluginspec/tst_pluginspec.cpp index 66828f8e63b..ed8476a0b09 100644 --- a/tests/auto/extensionsystem/pluginspec/tst_pluginspec.cpp +++ b/tests/auto/extensionsystem/pluginspec/tst_pluginspec.cpp @@ -190,25 +190,25 @@ void tst_PluginSpec::provides() CppPluginSpec spec; QVERIFY(spec.readMetaData(metaData("testspecs/simplespec.json"))); - QVERIFY(!spec.provides("SomeOtherPlugin", "2.2.3_9")); - QVERIFY(!spec.provides("MyPlugin", "2.2.3_10")); - QVERIFY(!spec.provides("MyPlugin", "2.2.4")); - QVERIFY(!spec.provides("MyPlugin", "2.3.11_1")); - QVERIFY(!spec.provides("MyPlugin", "2.3")); - QVERIFY(!spec.provides("MyPlugin", "3.0")); - QVERIFY(!spec.provides("MyPlugin", "1.9.9_99")); - QVERIFY(!spec.provides("MyPlugin", "1.9")); - QVERIFY(!spec.provides("MyPlugin", "0.9")); - QVERIFY(!spec.provides("MyPlugin", "1")); + QVERIFY(!spec.provides(&spec, {"SomeOtherPlugin", "2.2.3_9"})); + QVERIFY(!spec.provides(&spec, {"MyPlugin", "2.2.3_10"})); + QVERIFY(!spec.provides(&spec, {"MyPlugin", "2.2.4"})); + QVERIFY(!spec.provides(&spec, {"MyPlugin", "2.3.11_1"})); + QVERIFY(!spec.provides(&spec, {"MyPlugin", "2.3"})); + QVERIFY(!spec.provides(&spec, {"MyPlugin", "3.0"})); + QVERIFY(!spec.provides(&spec, {"MyPlugin", "1.9.9_99"})); + QVERIFY(!spec.provides(&spec, {"MyPlugin", "1.9"})); + QVERIFY(!spec.provides(&spec, {"MyPlugin", "0.9"})); + QVERIFY(!spec.provides(&spec, {"MyPlugin", "1"})); - QVERIFY(spec.provides("myplugin", "2.2.3_9")); - QVERIFY(spec.provides("MyPlugin", "2.2.3_9")); - QVERIFY(spec.provides("MyPlugin", "2.2.3_8")); - QVERIFY(spec.provides("MyPlugin", "2.2.3")); - QVERIFY(spec.provides("MyPlugin", "2.2.2")); - QVERIFY(spec.provides("MyPlugin", "2.1.2_10")); - QVERIFY(spec.provides("MyPlugin", "2.0_10")); - QVERIFY(spec.provides("MyPlugin", "2")); + QVERIFY(spec.provides(&spec, {"myplugin", "2.2.3_9"})); + QVERIFY(spec.provides(&spec, {"MyPlugin", "2.2.3_9"})); + QVERIFY(spec.provides(&spec, {"MyPlugin", "2.2.3_8"})); + QVERIFY(spec.provides(&spec, {"MyPlugin", "2.2.3"})); + QVERIFY(spec.provides(&spec, {"MyPlugin", "2.2.2"})); + QVERIFY(spec.provides(&spec, {"MyPlugin", "2.1.2_10"})); + QVERIFY(spec.provides(&spec, {"MyPlugin", "2.0_10"})); + QVERIFY(spec.provides(&spec, {"MyPlugin", "2"})); } void tst_PluginSpec::experimental() From 39c1d82f4652312c918dc6ff4c6bd9550348758e Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Thu, 13 Jun 2024 07:39:17 +0200 Subject: [PATCH 25/36] Lua: Implement lua pluginspec specific version check Change-Id: I52c496c177c949056ff5e7a4ff7b903a028620b1 Reviewed-by: Eike Ziller --- src/plugins/lua/README.md | 2 +- src/plugins/lua/luapluginspec.cpp | 14 ++++++++++++++ src/plugins/lua/luapluginspec.h | 3 +++ src/plugins/lua/meta/qtc.lua | 2 +- src/plugins/lua/wizards/plugin/plugin.lua.tpl | 3 +-- src/plugins/luals/luals/luals.lua | 5 ++--- src/plugins/luatests/luatests/luatests.lua | 3 +-- src/plugins/rustls/rustls/rustls.lua | 5 ++--- src/plugins/tellajoke/tellajoke/tellajoke.lua | 2 +- 9 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/plugins/lua/README.md b/src/plugins/lua/README.md index ba5fbba8d94..2607d47f182 100644 --- a/src/plugins/lua/README.md +++ b/src/plugins/lua/README.md @@ -40,7 +40,7 @@ Can contain newlines. disabledByDefault = false, dependencies = { - { name="Core", version = "12.0.0" } + { name="Core", version = "14.0.0" } }, } --[[@as QtcPlugin]] ``` diff --git a/src/plugins/lua/luapluginspec.cpp b/src/plugins/lua/luapluginspec.cpp index c3fcd558a55..4d0e9d76708 100644 --- a/src/plugins/lua/luapluginspec.cpp +++ b/src/plugins/lua/luapluginspec.cpp @@ -9,6 +9,7 @@ #include #include +#include #include #include @@ -76,6 +77,19 @@ ExtensionSystem::IPlugin *LuaPluginSpec::plugin() const return nullptr; } +bool LuaPluginSpec::provides(PluginSpec *spec, const PluginDependency &dependency) const +{ + if (QString::compare(dependency.name, spec->name(), Qt::CaseInsensitive) != 0) + return false; + + // Since we first released the lua support with Qt Creator 14.0.0, but the internal version + // number was still 13.0.82, we needed to special case this version. + if (versionCompare(dependency.version, "14.0.0") <= 0) + return true; + + return (versionCompare(spec->version(), dependency.version) >= 0); +} + // LuaPluginSpec::For internal use {} bool LuaPluginSpec::loadLibrary() { diff --git a/src/plugins/lua/luapluginspec.h b/src/plugins/lua/luapluginspec.h index 7c2ab3318bd..ff042416669 100644 --- a/src/plugins/lua/luapluginspec.h +++ b/src/plugins/lua/luapluginspec.h @@ -44,6 +44,9 @@ public: ExtensionSystem::IPlugin *plugin() const override; + bool provides( + PluginSpec *spec, const ExtensionSystem::PluginDependency &dependency) const override; + // For internal use only bool loadLibrary() override; bool initializePlugin() override; diff --git a/src/plugins/lua/meta/qtc.lua b/src/plugins/lua/meta/qtc.lua index cc7de85f057..c4b1a10bea0 100644 --- a/src/plugins/lua/meta/qtc.lua +++ b/src/plugins/lua/meta/qtc.lua @@ -29,7 +29,7 @@ QtcPlugin = {} ---@class QtcPluginDependency ---@field Name string The name of the dependency. ---@field Version string The version of the dependency. (`major.minor.patch`) ----@field Required boolean Whether the dependency is required or not. +---@field Required? "required"|"optional"|"test" Whether the dependency is required or not. (Default: "required") QtcPluginDependency = {} diff --git a/src/plugins/lua/wizards/plugin/plugin.lua.tpl b/src/plugins/lua/wizards/plugin/plugin.lua.tpl index 9675a2a0051..67d6e2966dd 100644 --- a/src/plugins/lua/wizards/plugin/plugin.lua.tpl +++ b/src/plugins/lua/wizards/plugin/plugin.lua.tpl @@ -15,8 +15,7 @@ This plugin provides some functionality. You can describe it more here. ]], Dependencies = { - { Name = "Core", Version = "%{JS: Util.qtCreatorIdeVersion()}", Required = true }, - { Name = "Lua", Version = "%{JS: Util.qtCreatorIdeVersion()}", Required = true }, + { Name = "Lua", Version = "%{JS: Util.qtCreatorIdeVersion()}" }, }, setup = function() require 'init'.setup() diff --git a/src/plugins/luals/luals/luals.lua b/src/plugins/luals/luals/luals.lua index 843d18189e4..5a68388dd06 100644 --- a/src/plugins/luals/luals/luals.lua +++ b/src/plugins/luals/luals/luals.lua @@ -14,9 +14,8 @@ This plugin provides the Lua Language Server. It will try to install it if it is not found. ]], Dependencies = { - { Name = "Core", Version = "13.0.82", Required = true }, - { Name = "Lua", Version = "13.0.82", Required = true }, - { Name = "LuaLanguageClient", Version = "13.0.82", Required = true } + { Name = "Lua", Version = "14.0.0" }, + { Name = "LuaLanguageClient", Version = "14.0.0" } }, setup = function() require 'init'.setup() diff --git a/src/plugins/luatests/luatests/luatests.lua b/src/plugins/luatests/luatests/luatests.lua index 4d22738f3bc..e85f0d95278 100644 --- a/src/plugins/luatests/luatests/luatests.lua +++ b/src/plugins/luatests/luatests/luatests.lua @@ -13,8 +13,7 @@ return { It has tests for (almost) all functionality exposed by the API. ]], Dependencies = { - { Name = "Core", Version = "13.0.82", Required = true }, - { Name = "Lua", Version = "13.0.82", Required = true } + { Name = "Lua", Version = "14.0.0" } }, setup = function() require 'tests'.setup() end, printToOutputPane = true, diff --git a/src/plugins/rustls/rustls/rustls.lua b/src/plugins/rustls/rustls/rustls.lua index ae2a5c6eb48..7e0056de25f 100644 --- a/src/plugins/rustls/rustls/rustls.lua +++ b/src/plugins/rustls/rustls/rustls.lua @@ -14,9 +14,8 @@ This plugin provides the Rust Language Server. It will try to install it if it is not found. ]], Dependencies = { - { Name = "Core", Version = "13.0.82", Required = true }, - { Name = "Lua", Version = "13.0.82", Required = true }, - { Name = "LuaLanguageClient", Version = "13.0.82", Required = true } + { Name = "Lua", Version = "14.0.0" }, + { Name = "LuaLanguageClient", Version = "14.0.0" } }, setup = function() require 'init'.setup() diff --git a/src/plugins/tellajoke/tellajoke/tellajoke.lua b/src/plugins/tellajoke/tellajoke/tellajoke.lua index 680e0420d2f..58d07e0b178 100644 --- a/src/plugins/tellajoke/tellajoke/tellajoke.lua +++ b/src/plugins/tellajoke/tellajoke/tellajoke.lua @@ -50,7 +50,7 @@ return { Category = "Fun", Description = "This plugin adds an action that tells a joke.", Dependencies = { - { Name = "Lua", Version = "13.0.82", Required = true }, + { Name = "Lua", Version = "14.0.0" }, }, setup = setup, } --[[@as QtcPlugin]] From a76d9bf085ba3cec5d7434005f8b2176cdad037f Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Thu, 6 Jun 2024 14:56:00 +0200 Subject: [PATCH 26/36] Lua: Add documentation Change-Id: I96b4525b68919247440d6aad544e0386d921384f Reviewed-by: Leena Miettinen --- doc/qtcreatordev/src/lua-extensions.qdoc | 275 +++++++++++++++++++++++ doc/qtcreatordev/src/qtcreator-dev.qdoc | 11 +- 2 files changed, 285 insertions(+), 1 deletion(-) create mode 100644 doc/qtcreatordev/src/lua-extensions.qdoc diff --git a/doc/qtcreatordev/src/lua-extensions.qdoc b/doc/qtcreatordev/src/lua-extensions.qdoc new file mode 100644 index 00000000000..581db2e3922 --- /dev/null +++ b/doc/qtcreatordev/src/lua-extensions.qdoc @@ -0,0 +1,275 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +/*! + \page lua-extensions.html + \title Extending \QC with Lua + + \QC can be extended with Lua scripts. The included Lua engine is based on Lua 5.4.6. + + \section1 Writing Lua Extensions + + To create a new Lua extension, choose \uicontrol {File} > \uicontrol {New Project} > + \uicontrol {Library} > \uicontrol {\QC Lua Plugin}. + + To test your new extension, start your project. Your \uicontrol {Application Output} + should show \e {Hello from Lua!}. + + \section1 Lua Extension Specification + + A Lua extension consists of a Lua script with the same name as the folder it is in. + This is necessary for the extension to be loaded. + + This script defines the specification of the extension, such as its display name, vendor, copyright. + + \code + --- MyExtension.lua + return { + Name = "MyExtension", + Version = "1.0.0", + CompatVersion = "1.0.0", + Vendor = "My Company", + Category = "Tests", + Description = "Describe what your extension does in a sentence.", + LongDescription = [[ + Tell users more about your extension. + ]], + Dependencies = { + { Name = "Core", Version = "13.0.82", Required = true }, + { Name = "Lua", Version = "13.0.82", Required = true } + }, + setup = function() print("Hello from Lua!") end, + printToOutputPane = true, + } --[[@as QtcPlugin]] + \endcode + + \section1 The Setup Function + + The setup function is called when the extension is loaded. This is where you can set up the + functionality of your extension. Since the specification file is parsed with very limited + permissions, you need to require a module where you implement the actual functionality. + + \code + --- MyExtension.lua + return { + Name = "MyExtension", + Version = "1.0.0", + ..., + --- This is the setup function that is called when the extension is loaded. + --- It requires the 'init' module and calls the setup function from the returned table. + setup = function() require 'init'.setup() end, + } + \endcode + + \code + --- init.lua + function setup() + print("Hello from Lua!") + end + + -- Returns a table with a single field 'setup' that points to the setup function. + return { + setup = setup + } + \endcode + + + \section1 Asynchronous Operations + + Some of the built-in operations work asynchronously. To handle this, use the Async module. + + \code + local a = require 'async' + local u = require 'Utils' + + a.sync(function() + print("Lets wait for 5 seconds ...") + a.wait(u.waitms(5000)) + print("... done!") + end) + \endcode + + \section1 Interactive Help + + When you open a .lua file in the editor the first time, you are asked to download the Lua + Language Server. This is extremely useful as it gives you context sensitive help and + auto-completion. + + \section1 \QC API + + The \QC API is available to Lua extensions via a number of modules that you can import + using the \c {require} function. C++ extensions may provide additional modules. One example of that + is the LanguageServer Extension that provides a module for creating Language Server clients. + + You can find the API documentation files for the Lua modules in your \QC installation. + On \macos you can find them in \c{Qt Creator.app/Contents/Resources/lua/meta}. + + \annotatedlist lua-modules + + \section1 Extending the Lua API with C++ + + To add functionality to the Lua Interface, you need to register a new module with the Lua Engine. + + \code + #include + + class MyCppExtension final : public ExtensionSystem::IPlugin + { + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "MyCppExtension.json") + + public: + MyCppExtension() {} + + private: + void initialize() final { + // The registered function will be called when the Lua module 'MyCppExtension' is required. + // The returned table will be returned from the require call in Lua. + ::Lua::LuaEngine::registerProvider("MyCppExtension", [](sol::state_view lua) -> sol::object { + sol::table result = lua.create_table(); + result["myFunction"] = [](int a, int b) { return a + b; }; + return result; + }); + } + }; + \endcode + + You can then access \c{MyCppExtension.myFunction} from your Lua scripts like this: + + \code + local MyCppExtension = require 'MyCppExtension' + --- MyCppExtension is now a table with a single field 'myFunction', as it is returned from the + --- C++ function registered via 'LuaEngine::registerProvider(...)'. + print(MyCppExtension.myFunction(1, 2)) + \endcode + + For more information on how to register C++ functionality, see + \l {https://sol2.readthedocs.io/en/latest/index.html} {sol2}. + + \section1 Examples + + \section2 Language Server + + The \QC LuaLanguageClient Plugin provides support for registering your own Language Server + clients. You can find an example of how to use this in the \QC Extension "Lua Language Server" + and "Rust Language Server". +*/ + +/*! + \page lua-extension-meta-core + \ingroup lua-modules + \title Core.lua + \brief Access and interact with the core functionality of \QC. + + \quotefile ../../../src/plugins/lua/meta/core.lua +*/ + +/*! + \page lua-extension-meta-action + \ingroup lua-modules + \title action.lua + \brief Create user interface actions in \QC. + + \quotefile ../../../src/plugins/lua/meta/action.lua +*/ + +/*! + \page lua-extension-meta-async + \ingroup lua-modules + \title async.lua + \brief Handle asynchronouse operations with the async/await Lua API. + + \quotefile ../../../src/plugins/lua/meta/async.lua +*/ + +/*! + \page lua-extension-meta-fetch + \ingroup lua-modules + \title fetch.lua + \brief Fetch data from the internet. + + \quotefile ../../../src/plugins/lua/meta/fetch.lua +*/ + +/*! + \page lua-extension-meta-gui + \ingroup lua-modules + \title gui.lua + \brief Create user interfaces. + + \quotefile ../../../src/plugins/lua/meta/gui.lua +*/ + +/*! + \page lua-extension-meta-lsp + \ingroup lua-modules + \title lsp.lua + \brief Register Language Server clients. + + \quotefile ../../../src/plugins/lua/meta/lsp.lua +*/ + +/*! + \page lua-extension-meta-messagemanager + \ingroup lua-modules + \title messagemanager.lua + \brief Display messages to the user. + + \quotefile ../../../src/plugins/lua/meta/messagemanager.lua +*/ + +/*! + \page lua-extension-meta-process + \ingroup lua-modules + \title process.lua + \brief Run external processes. + + \quotefile ../../../src/plugins/lua/meta/process.lua +*/ + +/*! + \page lua-extension-meta-qt + \ingroup lua-modules + \title qt.lua + \brief Access Qt functionality. + + \quotefile ../../../src/plugins/lua/meta/qt.lua +*/ + +/*! + \page lua-extension-meta-qtc + \ingroup lua-modules + \title qtc.lua + \brief Access and extend \QC. + + \quotefile ../../../src/plugins/lua/meta/qtc.lua +*/ + +/*! + \page lua-extension-meta-settings + \ingroup lua-modules + \title settings.lua + \brief Read and write settings. + + \quotefile ../../../src/plugins/lua/meta/settings.lua +*/ + +/*! + \page lua-extension-meta-simpletypes + \ingroup lua-modules + \title simpletypes.lua + \brief Access simple types. + + \quotefile ../../../src/plugins/lua/meta/simpletypes.lua +*/ + +/*! + \page lua-extension-meta-utils + \ingroup lua-modules + \title utils.lua + \brief Common utility functions and classes. + + \quotefile ../../../src/plugins/lua/meta/utils.lua +*/ + + diff --git a/doc/qtcreatordev/src/qtcreator-dev.qdoc b/doc/qtcreatordev/src/qtcreator-dev.qdoc index ae68f3f4076..998f040ebf7 100644 --- a/doc/qtcreatordev/src/qtcreator-dev.qdoc +++ b/doc/qtcreatordev/src/qtcreator-dev.qdoc @@ -214,7 +214,16 @@ \li \l{Options Pages} \li \l{Editors} \endomit - \endlist + \endlist + + \section1 Lua Extensions + + If you have more specific needs that are not covered by the above methods but don't need + a full-blown plugin, you can extend \QC with Lua Extensions. + + \list + \li \l{Extending \QC with Lua} + \endlist \section1 All Topics From a8ca4fa0a4b5c7b9dabd84d449048ea34e64fc52 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 7 Jun 2024 10:58:56 +0200 Subject: [PATCH 27/36] Fix more deprecation warnings Change-Id: If4be230541b2737aaea2be2b3907472d5c1131a5 Reviewed-by: Christian Stenger --- src/plugins/qtsupport/qtkitaspect.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qtsupport/qtkitaspect.cpp b/src/plugins/qtsupport/qtkitaspect.cpp index 18a18b6ae45..1608b31b845 100644 --- a/src/plugins/qtsupport/qtkitaspect.cpp +++ b/src/plugins/qtsupport/qtkitaspect.cpp @@ -364,7 +364,7 @@ int QtKitAspect::qtVersionId(const Kit *k) int id = -1; QVariant data = k->value(QtKitAspect::id(), -1); - if (data.typeId() == QVariant::Int) { + if (data.typeId() == QMetaType::Int) { bool ok; id = data.toInt(&ok); if (!ok) From 5665c349d145999e179400e405436c58eca697d9 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 13 Jun 2024 14:09:56 +0200 Subject: [PATCH 28/36] Doc: Describe new C++ quick fixes Task-number: QTCREATORBUG-30604 Change-Id: I08ee0478660b9166b1a6f2d1451ceab0d0c79789 Reviewed-by: Christian Kandeler --- .../qtcreator-move-class-to-separate-files.webp | Bin 0 -> 4410 bytes .../creator-only/creator-cpp-quick-fixes.qdoc | 14 +++++++++++++- .../src/editors/creator-quick-fixes.qdoc | 13 ++++++++++++- 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 doc/qtcreator/images/qtcreator-move-class-to-separate-files.webp diff --git a/doc/qtcreator/images/qtcreator-move-class-to-separate-files.webp b/doc/qtcreator/images/qtcreator-move-class-to-separate-files.webp new file mode 100644 index 0000000000000000000000000000000000000000..5a9540c25e99ad6b9678b0b1074afd945392c02a GIT binary patch literal 4410 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 PdCW`qH&}cBXD|f-5Otk# literal 0 HcmV?d00001 diff --git a/doc/qtcreator/src/editors/creator-only/creator-cpp-quick-fixes.qdoc b/doc/qtcreator/src/editors/creator-only/creator-cpp-quick-fixes.qdoc index 54ed36c23ba..1a38c359292 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-cpp-quick-fixes.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-cpp-quick-fixes.qdoc @@ -227,6 +227,14 @@ // do stuff here } \endcode + \row + \li Move Class to a Dedicated Set of Source Files + \li Moves a class to separate header and source files. For more + information, see \l{Move classes to separate files}. + \row + \li Re-order Member Function Definitions According to Declaration Order + \li Re-orders method definitions in a .cpp file to follow the order of + method declarations in the corresponding .h file. \endtable \section1 Class Member @@ -333,7 +341,7 @@ \li Quick Fix \li Description \row - \li Add Definition in ... + \li Add Definition ... \li Inserts a definition stub for a function declaration either in the header file (inside or outside the class) or in the implementation file. For free functions, inserts the definition @@ -401,6 +409,10 @@ When this fix is available, a light bulb icon appears: \inlineimage icons/refactormarker.png + \row + \li Convert Function Call to Qt Meta-Method Invocation + \li Converts a normal function call into a meta method invocation, if + the function is marked as invokable. \row \li Move Definition Here \li Moves an existing function definition to its declaration. diff --git a/doc/qtcreator/src/editors/creator-quick-fixes.qdoc b/doc/qtcreator/src/editors/creator-quick-fixes.qdoc index 7e02f60c650..6ef8f778737 100644 --- a/doc/qtcreator/src/editors/creator-quick-fixes.qdoc +++ b/doc/qtcreator/src/editors/creator-quick-fixes.qdoc @@ -38,7 +38,7 @@ By default, the refactored files are saved automatically. To turn off this feature, go to \preferences > \uicontrol Environment > - \uicontrol System and select \uicontrol {Auto-save files after refactoring}. + \uicontrol System and clear \uicontrol {Auto-save files after refactoring}. \if defined(qtcreator) \section1 Create functions @@ -94,6 +94,17 @@ {C++ Quick Fixes} \endif + \section1 Move classes to separate files + + Apply the \uicontrol {Move Class to a Dedicated Set of Source Files} quick + fix to move a class to a separate set of header and implementation files. + + \image qtcreator-move-class-to-separate-files.webp {Give names to header and implementation files} + + Specify paths and file names for the header and implementation file. + + To omit the implementation file, select \uicontrol {Header file only}. + \sa {Rename symbols}, {QML Quick Fixes} */ From 9fe4f23272774ab9132c6878c011507f1c1ca2bd Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 13 Jun 2024 15:00:24 +0200 Subject: [PATCH 29/36] QmlJS: Fix severity of some (non-)error "Calls of functions that start with an uppercase letter should use 'new'." is a warning, not an error. Fixes: QTCREATORBUG-27522 Change-Id: If1f82665819053b72e412a51cf4cf3c9b3e91ae2 Reviewed-by: Fabian Kosmale Reviewed-by: Ulf Hermann --- src/libs/qmljs/qmljsstaticanalysismessage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/qmljs/qmljsstaticanalysismessage.cpp b/src/libs/qmljs/qmljsstaticanalysismessage.cpp index 432b97aba72..a58bf43765b 100644 --- a/src/libs/qmljs/qmljsstaticanalysismessage.cpp +++ b/src/libs/qmljs/qmljsstaticanalysismessage.cpp @@ -153,7 +153,7 @@ StaticAnalysisMessages::StaticAnalysisMessages() Tr::tr("Invalid property type \"%1\"."), 1); newMsg(WarnEqualityTypeCoercion, Error, Tr::tr("== and != perform type coercion, use === or !== to avoid it.")); - newMsg(WarnExpectedNewWithUppercaseFunction, Error, + newMsg(WarnExpectedNewWithUppercaseFunction, Warning, Tr::tr("Calls of functions that start with an uppercase letter should use 'new'.")); newMsg(WarnNewWithLowercaseFunction, Error, Tr::tr("Use 'new' only with functions that start with an uppercase letter.")); From 45f262f92c2accb16f0fb515cb7a70096fc2bd4a Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 13 Jun 2024 15:33:31 +0200 Subject: [PATCH 30/36] Doc: Describe new Clangd preferences - Updated screenshots - Added option names and location to the change log Task-number: QTCREATORBUG-30604 Change-Id: I1554d6b7dbd588619eb992ef906d1bcef056f8c5 Reviewed-by: Christian Kandeler --- dist/changelog/changes-14.0.0.md | 7 +++++-- .../images/qtcreator-preferences-clangd.webp | Bin 11832 -> 12130 bytes .../qtcreator-projects-settings-clangd.webp | Bin 9012 -> 10188 bytes .../creator-only/creator-clang-codemodel.qdoc | 14 +++++++++++++- 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/dist/changelog/changes-14.0.0.md b/dist/changelog/changes-14.0.0.md index 907d04ca5e3..8cf6fcb5eb6 100644 --- a/dist/changelog/changes-14.0.0.md +++ b/dist/changelog/changes-14.0.0.md @@ -56,9 +56,12 @@ Editing ([QTCREATORBUG-10279](https://bugreports.qt.io/browse/QTCREATORBUG-10279)) * Clangd * Increased the minimum version to LLVM 17 - * Added an option for the index location + * Added the `Per-project index location` and `Per-session index location` + options in `Preferences` > `C++` > `Clangd` for setting the index location + for a project or session ([QTCREATORBUG-27346](https://bugreports.qt.io/browse/QTCREATORBUG-27346)) - * Made reparsing source files while editing header files optional + * Added the `Update dependent sources` option to make re-parsing source files + while editing header files optional ([QTCREATORBUG-29943](https://bugreports.qt.io/browse/QTCREATORBUG-29943)) * Fixed the handling of system headers ([QTCREATORBUG-30474](https://bugreports.qt.io/browse/QTCREATORBUG-30474)) diff --git a/doc/qtcreator/images/qtcreator-preferences-clangd.webp b/doc/qtcreator/images/qtcreator-preferences-clangd.webp index 6d363c02f930dba521b073ff07e696cbf99c206b..26a205ae5055a3279d59499c0af6512a7b134622 100644 GIT binary patch literal 12130 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 q6^Q<6_!GC`boPttBZcXOZTI*O2*+<#f6 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 F7yuj1^Opbs diff --git a/doc/qtcreator/images/qtcreator-projects-settings-clangd.webp b/doc/qtcreator/images/qtcreator-projects-settings-clangd.webp index d49b9403e01f4a8302473759adfe4cfd2a2783e7..2590e9c4e9d528f7c586d56723525a941c5e3c47 100644 GIT binary patch literal 10188 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 diff --git a/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc b/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc index d8bba6edf62..617aeaecf11 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc @@ -243,9 +243,14 @@ version 14, or later. \li In the \uicontrol {Background indexing} field, select \uicontrol Off to use a faster, but less accurate built-in indexer than the one used - by default. You can set the indexing priority depending on whether + by default. Set the indexing priority depending on whether the accuracy of results or speed is more important to you during global symbol searches. + \li In \uicontrol {Per-project index location}, select the folder to + store the index files for each project. The \c {compile-commands.json} + file is also stored in this folder. + \li In \uicontrol {Per-session index location}, select the folder to + store the index files for each session. \li In \uicontrol {Header/source switch mode}, select the C/C++ backend for switching between header and source files. While the clangd implementation has more capabilities than the built-in @@ -254,6 +259,13 @@ \li By default, clangd attempts to use all unused cores. You can set a fixed number of cores to use in \uicontrol {Worker thread count}. Background indexing also uses this many worker threads. + \li Select \uicontrol {Insert header files on completion} to insert + header files when completing symbols. + \li Select \uicontrol {Update dependent sources} to re-parse all source + files that include a header file when editing the header file. This + can cause a heavy CPU load if the header file is included in many + source files. Clear this option to only re-parse the source files + when saving the header file. \li Set the number of \uicontrol {Completion results} if you regularly miss important results during code completion. Set it to 0 to remove the limit on the number of completion results. Setting this to 0 or a From dcaa55200b2f06a7367b15e1d4e77a2984a81605 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Thu, 13 Jun 2024 16:19:45 +0200 Subject: [PATCH 31/36] Debugger: Add "LLDB Dap" preset lldb has a dap interface since a while now. The "GDB Dap" preset is not compatible, since gdb uses the same executable and lldb has a "lldb-dap" (previously "lldb-vscode") executable. Change-Id: I4105223659de093f0ee44129527c4830d21a3090 Reviewed-by: Artem Sokolovskii --- src/plugins/debugger/CMakeLists.txt | 1 + src/plugins/debugger/dap/dapengine.cpp | 3 + src/plugins/debugger/dap/lldbdapengine.cpp | 176 ++++++++++++++++++ src/plugins/debugger/dap/lldbdapengine.h | 26 +++ src/plugins/debugger/debugger.qbs | 1 + src/plugins/debugger/debuggerplugin.cpp | 1 + src/plugins/debugger/debuggerruncontrol.cpp | 1 + .../projectexplorerconstants.h | 1 + 8 files changed, 210 insertions(+) create mode 100644 src/plugins/debugger/dap/lldbdapengine.cpp create mode 100644 src/plugins/debugger/dap/lldbdapengine.h diff --git a/src/plugins/debugger/CMakeLists.txt b/src/plugins/debugger/CMakeLists.txt index 8f338dd9819..fc405a7fe3a 100644 --- a/src/plugins/debugger/CMakeLists.txt +++ b/src/plugins/debugger/CMakeLists.txt @@ -33,6 +33,7 @@ add_qtc_plugin(Debugger dap/dapclient.cpp dap/dapclient.h dap/dapengine.cpp dap/dapengine.h dap/gdbdapengine.cpp dap/gdbdapengine.h + dap/lldbdapengine.cpp dap/lldbdapengine.h dap/pydapengine.cpp dap/pydapengine.h debugger.qrc debugger_global.h diff --git a/src/plugins/debugger/dap/dapengine.cpp b/src/plugins/debugger/dap/dapengine.cpp index d2f94b9feeb..e311bb36822 100644 --- a/src/plugins/debugger/dap/dapengine.cpp +++ b/src/plugins/debugger/dap/dapengine.cpp @@ -6,6 +6,7 @@ #include "cmakedapengine.h" #include "dapclient.h" #include "gdbdapengine.h" +#include "lldbdapengine.h" #include "pydapengine.h" #include @@ -1058,6 +1059,8 @@ DebuggerEngine *createDapEngine(Utils::Id runMode) return new CMakeDapEngine; if (runMode == ProjectExplorer::Constants::DAP_GDB_DEBUG_RUN_MODE) return new GdbDapEngine; + if (runMode == ProjectExplorer::Constants::DAP_LLDB_DEBUG_RUN_MODE) + return new LldbDapEngine; if (runMode == ProjectExplorer::Constants::DAP_PY_DEBUG_RUN_MODE) return new PyDapEngine; diff --git a/src/plugins/debugger/dap/lldbdapengine.cpp b/src/plugins/debugger/dap/lldbdapengine.cpp new file mode 100644 index 00000000000..32a85c89d41 --- /dev/null +++ b/src/plugins/debugger/dap/lldbdapengine.cpp @@ -0,0 +1,176 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 + +#include "lldbdapengine.h" + +#include "dapclient.h" + +#include + +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +using namespace Core; +using namespace Utils; + +namespace Debugger::Internal { + +// TODO: Same class as in gdbdapengine.cpp. Refactor into one place. +class ProcessDataProvider : public IDataProvider +{ +public: + ProcessDataProvider(const DebuggerRunParameters &rp, + const CommandLine &cmd, + QObject *parent = nullptr) + : IDataProvider(parent) + , m_runParameters(rp) + , m_cmd(cmd) + { + connect(&m_proc, &Process::started, this, &IDataProvider::started); + connect(&m_proc, &Process::done, this, &IDataProvider::done); + connect(&m_proc, + &Process::readyReadStandardOutput, + this, + &IDataProvider::readyReadStandardOutput); + connect(&m_proc, + &Process::readyReadStandardError, + this, + &IDataProvider::readyReadStandardError); + } + + ~ProcessDataProvider() + { + m_proc.kill(); + m_proc.waitForFinished(); + } + + void start() override + { + m_proc.setProcessMode(ProcessMode::Writer); + if (m_runParameters.debugger.workingDirectory.isDir()) + m_proc.setWorkingDirectory(m_runParameters.debugger.workingDirectory); + m_proc.setEnvironment(m_runParameters.debugger.environment); + m_proc.setCommand(m_cmd); + m_proc.start(); + } + + bool isRunning() const override { return m_proc.isRunning(); } + void writeRaw(const QByteArray &data) override + { + if (m_proc.state() == QProcess::Running) + m_proc.writeRaw(data); + } + void kill() override { m_proc.kill(); } + QByteArray readAllStandardOutput() override { return m_proc.readAllStandardOutput().toUtf8(); } + QString readAllStandardError() override { return m_proc.readAllStandardError(); } + int exitCode() const override { return m_proc.exitCode(); } + QString executable() const override { return m_proc.commandLine().executable().toUserOutput(); } + + QProcess::ExitStatus exitStatus() const override { return m_proc.exitStatus(); } + QProcess::ProcessError error() const override { return m_proc.error(); } + Utils::ProcessResult result() const override { return m_proc.result(); } + QString exitMessage() const override { return m_proc.exitMessage(); }; + +private: + Utils::Process m_proc; + const DebuggerRunParameters m_runParameters; + const CommandLine m_cmd; +}; + +class LldbDapClient : public DapClient +{ +public: + LldbDapClient(IDataProvider *provider, QObject *parent = nullptr) + : DapClient(provider, parent) + {} + +private: + const QLoggingCategory &logCategory() override + { + static const QLoggingCategory logCategory = QLoggingCategory("qtc.dbg.dapengine.lldb", + QtWarningMsg); + return logCategory; + } +}; + +LldbDapEngine::LldbDapEngine() + : DapEngine() +{ + setObjectName("LldbDapEngine"); + setDebuggerName("LLDB"); + setDebuggerType("DAP"); +} + +void LldbDapEngine::handleDapInitialize() +{ + if (!isLocalAttachEngine()) { + DapEngine::handleDapInitialize(); + return; + } + + QTC_ASSERT(state() == EngineRunRequested, qCDebug(logCategory()) << state()); + m_dapClient->postRequest("attach", QJsonObject{{"__restart", ""}}); + qCDebug(logCategory()) << "handleDapAttach"; +} + +bool LldbDapEngine::isLocalAttachEngine() const +{ + return runParameters().startMode == AttachToLocalProcess; +} + +void LldbDapEngine::handleDapConfigurationDone() +{ + if (!isLocalAttachEngine()) { + DapEngine::handleDapConfigurationDone(); + return; + } + + notifyEngineRunAndInferiorStopOk(); +} + +void LldbDapEngine::setupEngine() +{ + QTC_ASSERT(state() == EngineSetupRequested, qCDebug(logCategory()) << state()); + + const DebuggerRunParameters &rp = runParameters(); + CommandLine cmd{rp.debugger.command.executable()}; + + if (isLocalAttachEngine()) + cmd.addArgs({"--debugger-pid", QString::number(rp.attachPID.pid())}); + + IDataProvider *dataProvider = new ProcessDataProvider(rp, cmd, this); + m_dapClient = new LldbDapClient(dataProvider, this); + + connectDataGeneratorSignals(); + m_dapClient->dataProvider()->start(); +} + +bool LldbDapEngine::acceptsBreakpoint(const BreakpointParameters &bp) const +{ + const auto mimeType = Utils::mimeTypeForFile(bp.fileName); + return mimeType.matchesName(Utils::Constants::C_HEADER_MIMETYPE) + || mimeType.matchesName(Utils::Constants::C_SOURCE_MIMETYPE) + || mimeType.matchesName(Utils::Constants::CPP_HEADER_MIMETYPE) + || mimeType.matchesName(Utils::Constants::CPP_SOURCE_MIMETYPE) + || bp.type == BreakpointByFunction; +} + +const QLoggingCategory &LldbDapEngine::logCategory() +{ + static const QLoggingCategory logCategory = QLoggingCategory("qtc.dbg.dapengine.lldb", + QtWarningMsg); + return logCategory; +} + +} // namespace Debugger::Internal diff --git a/src/plugins/debugger/dap/lldbdapengine.h b/src/plugins/debugger/dap/lldbdapengine.h new file mode 100644 index 00000000000..276714dccd5 --- /dev/null +++ b/src/plugins/debugger/dap/lldbdapengine.h @@ -0,0 +1,26 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 + +#pragma once + +#include "dapengine.h" + +namespace Debugger::Internal { + +class LldbDapEngine : public DapEngine +{ +public: + LldbDapEngine(); + +private: + void setupEngine() override; + + void handleDapInitialize() override; + void handleDapConfigurationDone() override; + + bool isLocalAttachEngine() const; + bool acceptsBreakpoint(const BreakpointParameters &bp) const override; + const QLoggingCategory &logCategory() override; +}; + +} // Debugger::Internal diff --git a/src/plugins/debugger/debugger.qbs b/src/plugins/debugger/debugger.qbs index 3c5825eb627..ed54252ef72 100644 --- a/src/plugins/debugger/debugger.qbs +++ b/src/plugins/debugger/debugger.qbs @@ -123,6 +123,7 @@ QtcPlugin { "dapclient.cpp", "dapclient.h", "dapengine.cpp", "dapengine.h", "gdbdapengine.cpp", "gdbdapengine.h", + "lldbdapengine.cpp", "lldbdapengine.h", "pydapengine.cpp", "pydapengine.h", ] } diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index cc3c847b636..527c6649209 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -1224,6 +1224,7 @@ void DebuggerPluginPrivate::createDapDebuggerPerspective(QWidget *globalLogWindo ProjectExplorer::Constants::DAP_CMAKE_DEBUG_RUN_MODE, /*forceSkipDeploy=*/true}, DapPerspective{Tr::tr("GDB Preset"), ProjectExplorer::Constants::DAP_GDB_DEBUG_RUN_MODE}, + DapPerspective{Tr::tr("LLDB Preset"), ProjectExplorer::Constants::DAP_LLDB_DEBUG_RUN_MODE}, DapPerspective{Tr::tr("Python Preset"), ProjectExplorer::Constants::DAP_PY_DEBUG_RUN_MODE}, }; diff --git a/src/plugins/debugger/debuggerruncontrol.cpp b/src/plugins/debugger/debuggerruncontrol.cpp index 2f980f7fdc4..b14e9ee30b0 100644 --- a/src/plugins/debugger/debuggerruncontrol.cpp +++ b/src/plugins/debugger/debuggerruncontrol.cpp @@ -1096,6 +1096,7 @@ DebuggerRunWorkerFactory::DebuggerRunWorkerFactory() addSupportedRunMode(ProjectExplorer::Constants::DEBUG_RUN_MODE); addSupportedRunMode(ProjectExplorer::Constants::DAP_CMAKE_DEBUG_RUN_MODE); addSupportedRunMode(ProjectExplorer::Constants::DAP_GDB_DEBUG_RUN_MODE); + addSupportedRunMode(ProjectExplorer::Constants::DAP_LLDB_DEBUG_RUN_MODE); addSupportedDeviceType(ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE); addSupportedDeviceType("DockerDeviceType"); diff --git a/src/plugins/projectexplorer/projectexplorerconstants.h b/src/plugins/projectexplorer/projectexplorerconstants.h index 7638d323c96..8a053c243d8 100644 --- a/src/plugins/projectexplorer/projectexplorerconstants.h +++ b/src/plugins/projectexplorer/projectexplorerconstants.h @@ -171,6 +171,7 @@ const char NORMAL_RUN_MODE[]="RunConfiguration.NormalRunMode"; const char DEBUG_RUN_MODE[]="RunConfiguration.DebugRunMode"; const char DAP_CMAKE_DEBUG_RUN_MODE[]="RunConfiguration.CmakeDebugRunMode"; const char DAP_GDB_DEBUG_RUN_MODE[]="RunConfiguration.DapGdbDebugRunMode"; +const char DAP_LLDB_DEBUG_RUN_MODE[]="RunConfiguration.DapLldbDebugRunMode"; const char DAP_PY_DEBUG_RUN_MODE[]="RunConfiguration.DapPyDebugRunMode"; const char QML_PROFILER_RUN_MODE[]="RunConfiguration.QmlProfilerRunMode"; const char QML_PROFILER_RUNNER[]="RunConfiguration.QmlProfilerRunner"; From ad2b6eeeb39c970360f4f078f16850ee4bbe114d Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 13 Jun 2024 16:33:36 +0200 Subject: [PATCH 32/36] Doc: Describe Preferences > C++ > Code Model > Enable indexing Task-number: QTCREATORBUG-30604 Change-Id: I93e2e251f58e335c6f4491fd9e7e84e69528611e Reviewed-by: Christian Kandeler --- dist/changelog/changes-14.0.0.md | 3 ++- .../qtcreator-preferences-code-model.webp | Bin 3942 -> 4234 bytes .../creator-only/creator-clang-codemodel.qdoc | 6 +++++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/dist/changelog/changes-14.0.0.md b/dist/changelog/changes-14.0.0.md index 8cf6fcb5eb6..560677da261 100644 --- a/dist/changelog/changes-14.0.0.md +++ b/dist/changelog/changes-14.0.0.md @@ -66,7 +66,8 @@ Editing * Fixed the handling of system headers ([QTCREATORBUG-30474](https://bugreports.qt.io/browse/QTCREATORBUG-30474)) * Built-in - * Added the option to disable the built-in indexer + * Added the `Enable indexing` option in `Preferences` > `C++` > `Code Model` + to turn off the built-in indexer ([QTCREATORBUG-29147](https://bugreports.qt.io/browse/QTCREATORBUG-29147)) * Added an option for "statement macros" that are interpreted by the indenter as complete statements that don't require a semicolon at the end diff --git a/doc/qtcreator/images/qtcreator-preferences-code-model.webp b/doc/qtcreator/images/qtcreator-preferences-code-model.webp index 9cd9458fe578109c464a77c6c208d379061e61cb..2fa62d4fb6d3692415b7b295179d339e24957965 100644 GIT binary patch literal 4234 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 literal 3942 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 diff --git a/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc b/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc index 617aeaecf11..ae81bdc3abd 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-clang-codemodel.qdoc @@ -162,7 +162,7 @@ \title Code Model - \brief Sets global preferences for the code model. + \brief Sets global preferences for the C++ code model. The code model offers services such as code completion, syntactic and semantic highlighting, and diagnostics. @@ -189,6 +189,10 @@ \li \uicontrol {Use built-in preprocessor to show pre-processed files} \li Uses the built-in preprocessor to show the pre-processed source file in the editor. + \row + \li \uicontrol {Enable indexing} + \li Turns on the built-in indexer. Clearing this checkbox severely limits + the capabilities of the code model. \row \li \uicontrol {Do not index files greater than} \li To avoid out-of-memory crashes caused by indexing huge source files From 9aeb396836267f8a96c7e3c63372e695b789192d Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 13 Jun 2024 17:01:03 +0200 Subject: [PATCH 33/36] Doc: Describe Preferences > C++ > Code Style > Statement Macros Task-number: QTCREATORBUG-30604 Change-Id: I8ce44b3ed677076801d3ec96cdf33704a97f4efe Reviewed-by: Christian Kandeler --- dist/changelog/changes-14.0.0.md | 5 +++-- ...tcreator-code-style-built-in-indenter.webp | Bin 13192 -> 13470 bytes .../creator-preferences-cpp-code-style.qdoc | 2 ++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/dist/changelog/changes-14.0.0.md b/dist/changelog/changes-14.0.0.md index 560677da261..03ca70c6284 100644 --- a/dist/changelog/changes-14.0.0.md +++ b/dist/changelog/changes-14.0.0.md @@ -69,8 +69,9 @@ Editing * Added the `Enable indexing` option in `Preferences` > `C++` > `Code Model` to turn off the built-in indexer ([QTCREATORBUG-29147](https://bugreports.qt.io/browse/QTCREATORBUG-29147)) - * Added an option for "statement macros" that are interpreted by the indenter - as complete statements that don't require a semicolon at the end + * Added the `Statement Macros` field in `Preferences` > `C++` > `Code Style` + for macros that the indenter interprets as complete statements that don't + require a semicolon at the end ([QTCREATORBUG-13640](https://bugreports.qt.io/browse/QTCREATORBUG-13640), [QTCREATORBUG-15069](https://bugreports.qt.io/browse/QTCREATORBUG-15069), [QTCREATORBUG-18789](https://bugreports.qt.io/browse/QTCREATORBUG-18789)) diff --git a/doc/qtcreator/images/qtcreator-code-style-built-in-indenter.webp b/doc/qtcreator/images/qtcreator-code-style-built-in-indenter.webp index f8eaa1dac52359273631db3e843815ccf46b21d5..eb85b20033f24e211558d4f505ba8cd8f96811a5 100644 GIT binary patch literal 13470 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 literal 13192 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 Date: Thu, 13 Jun 2024 17:42:40 +0200 Subject: [PATCH 34/36] QbsProjectManager: Consider common compiler flags ... also for non-GCC and non-MSVC toolchains. Task-number: QTCREATORBUG-24040 Change-Id: I4133c4dac8183012e1bc6fd8a037f75a50d3a166 Reviewed-by: Christian Stenger --- src/plugins/qbsprojectmanager/qbsproject.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 74b64e2a5cc..2d2c27a2a83 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -798,6 +798,8 @@ static void getExpandedCompilerFlags(QStringList &cFlags, QStringList &cxxFlags, cxxFlags << "/std:c++20"; else if (cxxLanguageVersion.contains("c++17")) cxxFlags << "/std:c++17"; + } else { + cFlags = cxxFlags = commonFlags; } } From c41c3619b183b382a8b957b85560d612b5f9049b Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 13 Jun 2024 16:32:23 +0200 Subject: [PATCH 35/36] BareMetal: Add missing pre-defined macro Task-number: QTCREATORBUG-24040 Change-Id: I8d3a8f263cdee1d7971d339a56e30a6742b45bc5 Reviewed-by: Christian Stenger --- src/plugins/baremetal/iarewtoolchain.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/baremetal/iarewtoolchain.cpp b/src/plugins/baremetal/iarewtoolchain.cpp index ef804b0a8a2..85528afb5c2 100644 --- a/src/plugins/baremetal/iarewtoolchain.cpp +++ b/src/plugins/baremetal/iarewtoolchain.cpp @@ -334,6 +334,7 @@ Toolchain::MacroInspectionRunner IarToolchain::createMacroInspectionRunner() con macros.append({"__intrinsic", "", MacroType::Define}); macros.append({"__nounwind", "", MacroType::Define}); macros.append({"__noreturn", "", MacroType::Define}); + macros.append({"__no_init", "", MacroType::Define}); macros.append({"__packed", "", MacroType::Define}); macros.append({"__spec_string", "", MacroType::Define}); macros.append({"__constrange(__a,__b)", "", MacroType::Define}); From 44927d7cdc9f345bc744669100724cacb913267a Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 13 Jun 2024 17:43:30 +0200 Subject: [PATCH 36/36] BareMetal: Do not ignore compiler flags ... when querying pre-defined macros. Task-number: QTCREATORBUG-24040 Change-Id: Icd3625aaedb374048673c9eb239819b245dfdaa7 Reviewed-by: Christian Stenger --- src/plugins/baremetal/iarewtoolchain.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/plugins/baremetal/iarewtoolchain.cpp b/src/plugins/baremetal/iarewtoolchain.cpp index 85528afb5c2..d5029c78788 100644 --- a/src/plugins/baremetal/iarewtoolchain.cpp +++ b/src/plugins/baremetal/iarewtoolchain.cpp @@ -328,9 +328,7 @@ Toolchain::MacroInspectionRunner IarToolchain::createMacroInspectionRunner() con return [env, compiler, extraArgs, macrosCache, languageId] (const QStringList &flags) { - Q_UNUSED(flags) - - Macros macros = dumpPredefinedMacros(compiler, extraArgs, languageId, env); + Macros macros = dumpPredefinedMacros(compiler, extraArgs + flags, languageId, env); macros.append({"__intrinsic", "", MacroType::Define}); macros.append({"__nounwind", "", MacroType::Define}); macros.append({"__noreturn", "", MacroType::Define});