From b9671bcffc295a16e1d948dabe534d9b5eaeb3be Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 14 Feb 2024 10:43:24 +0100 Subject: [PATCH 01/35] Axivion: Fix disabling filters Enabling and disabling a layout does not do so for its child components which had been assumed. Explicitly disable or enable filters to avoid crashes when accessing them without a project info. Fixes: QTCREATORBUG-30371 Change-Id: I56633dad4b3ffbb1c0c7c7d154c2af5d3c3cde6b Reviewed-by: Jarek Kobus --- src/plugins/axivion/axivionoutputpane.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/plugins/axivion/axivionoutputpane.cpp b/src/plugins/axivion/axivionoutputpane.cpp index a9fb3a4e3f4..6cdf6121089 100644 --- a/src/plugins/axivion/axivionoutputpane.cpp +++ b/src/plugins/axivion/axivionoutputpane.cpp @@ -227,6 +227,7 @@ private: void onSearchParameterChanged(); void updateBasicProjectInfo(std::optional info); void updateTableView(); + void setFiltersEnabled(bool enabled); IssueListSearch searchFromUi() const; void fetchIssues(const IssueListSearch &search); void fetchMoreIssues(); @@ -337,7 +338,7 @@ IssuesWidget::IssuesWidget(QWidget *parent) void IssuesWidget::updateUi() { - m_filtersLayout->setEnabled(false); + setFiltersEnabled(false); std::optional projectInfo = Internal::projectInfo(); updateBasicProjectInfo(projectInfo); @@ -347,7 +348,7 @@ void IssuesWidget::updateUi() if (info.versions.empty()) // add some warning/information? return; - m_filtersLayout->setEnabled(true); + setFiltersEnabled(true); // avoid refetching existing data if (!m_currentPrefix.isEmpty() || m_issuesModel->rowCount()) return; @@ -555,6 +556,16 @@ void IssuesWidget::updateTableView() m_taskTreeRunner.start(tableInfoRecipe(m_currentPrefix, tableHandler), setupHandler, doneHandler); } +void IssuesWidget::setFiltersEnabled(bool enabled) +{ + m_addedFilter->setEnabled(enabled); + m_removedFilter->setEnabled(enabled); + m_ownerFilter->setEnabled(enabled); + m_versionStart->setEnabled(enabled); + m_versionEnd->setEnabled(enabled); + m_pathGlobFilter->setEnabled(enabled); +} + IssueListSearch IssuesWidget::searchFromUi() const { IssueListSearch search; From 6849c173c1321a8006089d8804a7db545ac05c7a Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 15 Feb 2024 13:12:46 +0100 Subject: [PATCH 02/35] QtKeychain: Fix export for includes Fixes the qbs build. Change-Id: I8dc3427b35468685d03adfbf6bfffef9936015c6 Reviewed-by: Christian Kandeler --- src/libs/3rdparty/qtkeychain/qtkeychain.qbs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/libs/3rdparty/qtkeychain/qtkeychain.qbs b/src/libs/3rdparty/qtkeychain/qtkeychain.qbs index 4a532363f0b..6a1073a953e 100644 --- a/src/libs/3rdparty/qtkeychain/qtkeychain.qbs +++ b/src/libs/3rdparty/qtkeychain/qtkeychain.qbs @@ -83,4 +83,9 @@ QtcLibrary { ] } } + + Export { + Depends { name: "cpp" } + cpp.includePaths: project.ide_source_tree + "/src/libs/3rdparty/" + } } From 4329b67c7476f21b3b7f46f139a384dc4712039f Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Thu, 15 Feb 2024 12:49:39 +0100 Subject: [PATCH 03/35] Clangd: Fix version check to use (remote) executable Fixes: QTCREATORBUG-30374 Change-Id: I4a98a82ea24bb55a2ab3eed72f13d3d6f648df8a Reviewed-by: Christian Kandeler --- src/plugins/clangcodemodel/clangdclient.cpp | 4 ++-- src/plugins/cppeditor/cppcodemodelsettings.cpp | 2 +- src/plugins/cppeditor/cppcodemodelsettings.h | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index e5e5142370d..46aa5848f7c 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -207,11 +207,11 @@ static BaseClientInterface *clientInterface(Project *project, const Utils::FileP "--clang-tidy=0"}}; if (settings.workerThreadLimit() != 0) cmd.addArg("-j=" + QString::number(settings.workerThreadLimit())); - if (indexingEnabled && settings.clangdVersion() >= QVersionNumber(15)) { + if (indexingEnabled && Utils::clangdVersion(clangdExePath) >= QVersionNumber(15)) { cmd.addArg("--background-index-priority=" + ClangdSettings::priorityToString(indexingPriority)); } - if (settings.clangdVersion() >= QVersionNumber(16)) + if (Utils::clangdVersion(clangdExePath) >= QVersionNumber(16)) cmd.addArg("--rename-file-limit=0"); if (!jsonDbDir.isEmpty()) cmd.addArg("--compile-commands-dir=" + clangdExePath.withNewMappedPath(jsonDbDir).path()); diff --git a/src/plugins/cppeditor/cppcodemodelsettings.cpp b/src/plugins/cppeditor/cppcodemodelsettings.cpp index db6231cfe99..bac28694f52 100644 --- a/src/plugins/cppeditor/cppcodemodelsettings.cpp +++ b/src/plugins/cppeditor/cppcodemodelsettings.cpp @@ -273,7 +273,7 @@ ClangdSettings::ClangdSettings() bool ClangdSettings::useClangd() const { - return m_data.useClangd && clangdVersion() >= QVersionNumber(14); + return m_data.useClangd && Utils::clangdVersion(clangdFilePath()) >= QVersionNumber(14); } void ClangdSettings::setUseClangd(bool use) { instance().m_data.useClangd = use; } diff --git a/src/plugins/cppeditor/cppcodemodelsettings.h b/src/plugins/cppeditor/cppcodemodelsettings.h index b4f8ac7269d..6b491855107 100644 --- a/src/plugins/cppeditor/cppcodemodelsettings.h +++ b/src/plugins/cppeditor/cppcodemodelsettings.h @@ -182,7 +182,6 @@ public: void setData(const Data &data); Data data() const { return m_data; } - QVersionNumber clangdVersion() const { return Utils::clangdVersion(clangdFilePath()); } Utils::FilePath clangdIncludePath() const; static Utils::FilePath clangdUserConfigFilePath(); From 9d3b154ca8197d3c738aadfbc95e79f4aa56deb3 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 2 Feb 2024 17:44:36 +0100 Subject: [PATCH 04/35] Doc: Describe new search options - Restructure the "Finding and Replacing" topic. Task-number: QTCREATORBUG-30209 Task-number: QTCREATORBUG-29361 Change-Id: I107f366d99877a80a0ed8973c9156e46ee0ab312 Reviewed-by: Eike Ziller --- .../qtcreator-find-from-current-file.webp | Bin 0 -> 12472 bytes .../images/qtcreator-find-incremental.png | Bin 2618 -> 0 bytes .../images/qtcreator-search-all-projects.webp | Bin 0 -> 5606 bytes .../images/qtcreator-search-allprojects.png | Bin 8271 -> 0 bytes .../images/qtcreator-search-file-system.webp | Bin 0 -> 7504 bytes .../images/qtcreator-search-filesystem.png | Bin 11041 -> 0 bytes .../images/qtcreator-search-reg-exp.webp | Bin 0 -> 5794 bytes .../qtcreator-search-results-matches.webp | Bin 6534 -> 10992 bytes .../qtcreator-search-results-reg-exp.webp | Bin 0 -> 11060 bytes .../images/qtcreator-search-results.webp | Bin 7250 -> 0 bytes .../creator-projects-cmake-building.qdoc | 4 +- .../src/editors/creator-code-refactoring.qdoc | 2 +- doc/qtcreator/src/editors/creator-coding.qdoc | 5 +- .../src/editors/creator-diff-editor.qdoc | 2 +- .../src/editors/creator-finding.qdoc | 51 --- .../src/editors/creator-locator.qdoc | 6 +- .../editors/creator-only/creator-scxml.qdoc | 2 +- doc/qtcreator/src/editors/creator-search.qdoc | 302 ++++++++---------- .../creator-how-to-silver-searcher.qdoc | 53 +++ .../howto/creator-only/creator-how-tos.qdoc | 47 ++- .../creator-projects-creating.qdoc | 4 +- doc/qtcreator/src/qtcreator-toc.qdoc | 7 +- doc/qtcreator/src/qtcreator.qdoc | 1 - .../creator-file-system-view.qdoc | 2 +- .../creator-how-to-view-output.qdoc | 4 +- .../creator-reference-terminal-view.qdoc | 3 +- .../user-interface/creator-projects-view.qdoc | 2 +- .../creator-reference-output-views.qdoc | 86 ++++- .../src/overviews/studio-finding.qdoc | 39 +++ .../src/qtdesignstudio-toc.qdoc | 3 +- 30 files changed, 360 insertions(+), 265 deletions(-) create mode 100644 doc/qtcreator/images/qtcreator-find-from-current-file.webp delete mode 100644 doc/qtcreator/images/qtcreator-find-incremental.png create mode 100644 doc/qtcreator/images/qtcreator-search-all-projects.webp delete mode 100644 doc/qtcreator/images/qtcreator-search-allprojects.png create mode 100644 doc/qtcreator/images/qtcreator-search-file-system.webp delete mode 100644 doc/qtcreator/images/qtcreator-search-filesystem.png create mode 100644 doc/qtcreator/images/qtcreator-search-reg-exp.webp create mode 100644 doc/qtcreator/images/qtcreator-search-results-reg-exp.webp delete mode 100644 doc/qtcreator/images/qtcreator-search-results.webp delete mode 100644 doc/qtcreator/src/editors/creator-finding.qdoc create mode 100644 doc/qtcreator/src/howto/creator-only/creator-how-to-silver-searcher.qdoc create mode 100644 doc/qtdesignstudio/src/overviews/studio-finding.qdoc diff --git a/doc/qtcreator/images/qtcreator-find-from-current-file.webp b/doc/qtcreator/images/qtcreator-find-from-current-file.webp new file mode 100644 index 0000000000000000000000000000000000000000..d9296f04ac0c280b30452d3e9addf7c230222726 GIT binary patch literal 12472 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 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-find-incremental.png b/doc/qtcreator/images/qtcreator-find-incremental.png deleted file mode 100644 index 3bb17a1a41fb0130c1422be985421a83c189b875..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2618 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 NP;|3?-b5C81^_oh(-Qyy literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-search-allprojects.png b/doc/qtcreator/images/qtcreator-search-allprojects.png deleted file mode 100644 index c442572f99653a82df593e017f8bdf430baeba92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8271 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 F2>?jm6Dj}z diff --git a/doc/qtcreator/images/qtcreator-search-file-system.webp b/doc/qtcreator/images/qtcreator-search-file-system.webp new file mode 100644 index 0000000000000000000000000000000000000000..31494d1a17f6a4de8bc43a449765fe34a809cfeb GIT binary patch literal 7504 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 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-search-filesystem.png b/doc/qtcreator/images/qtcreator-search-filesystem.png deleted file mode 100644 index df344a79e33f74b67b7f15189ef9b1c0c10cf55c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11041 zcmeAS@N?(olHy`uVBq!ia0y~yU|P$-z$n4N#K6Gt^J2tu1_rGco-U3d6}R5b&7Lgd zzH`C(_z1CxmIK9%$M~2o+}$*DqI>b3tjs*yO*MkkRO731CYV?Y+TB>tTsY^2qQptF zZ7H)qu*p0T>N)gdhApGaZ|RG2Z|>S3c>YiHxA3>M)nRF2rKP2%=S$9hKJvP-G%WPm z(%r9WwTyRv^who=~1`-zsY~{c^DWNzR6WEFfcI4frtu*H${5!`_6bWFfiCK z@V_{8-PR(xVQtYRh7S$4<(mbVD}KM-o_}vo->d)s_vq21huis2$Iq<$eAfK?CawvWF8z2i+2115z)G&*WtsYeZ%d1|sha+K zd-Z0|PQ$;sM%B*MkN9@y-?zKZoU&-jTdy`@&WOm!m&+$TeVQ8B$aI!d_0!+?_5Xi9 zpKs3lpjA9>#>|t5&$xcir>;G3iWlGieeb)9uidvB z$&VjD{(HsP(D37n#ry{-QxQ{&wVel;*|f-OKb|lSr0E= zy7cz;_N#~HerZ@Jz4;;IC(jV$vU<<&N4D@2StPDJm-3^#AX4 zuXFS5^+mn5vi8|p{jrPwdelRu@^`kUw(CRZ$!QFd!Ub<`Y<#h3YOwCh|FiG^c{cz5 zpXWvF={;N6V|Ew3eQa_5+w>ClNt@VTGtR$pfcZcbbN!Qv?*D#W-+$^p)AzS4+%1?t z@0)T>|AF14*X11BCn{Xb$uE)Jv3=_8?f=F0T?_k=XEnXa=<&D7Is6@IucfzMwaoVY z@8#aSd&S1@SHCvs*S_?Q|8YqC-|Tju6Q^x_ox|Sk{eCZfer=fCbk&VhOF4q3hG<;% zdTL!~^n1_GQ=+PG8GGFhe`m1V_*&jhK{4s$?)!i9u2(piER18l#k%NR&$@{(y8bh@#F{1~_QVFr`RHqA5izTO!9u=;(i%)V=3 z9H~dOHSco#Yv;9LxTNynxc$FEL(vbm4)6Z_zuPwD`xC~Gv5tF{T`H|Af3Ds>J411^ z|E1mUk8o$bys<+&(p-zR^Q)1~fr9Rd=l<`^7vs14u^_F!{QW&sRm11Ux%p4H$^BiL z`}q6*|9{Q*edPVG^u^ZUmh`;3UoRJa=boXW-=a6&-@{G0Pi_AE z&!0aV)xNv4b6&`S{a1g_y!Xdwvz7UB_9I3UYUYFmmDW5r{It&Mkb-u)bn#?o;V->a zs;6e{v~`HzI7?39{rA)Q``0Y}6aVLt_@@sSw`OYedVS-b@|1DXzx%b{V7e0Xrs zFu!8id&b{3WoLgde0}7#vu2Wb&WtZxUu*Aqvpd#9Q%=D4eY@&M@?4nb8uq)tSaqTU!`3Wg_n7wg#p3=gQ}pMvNgnxk zRKLz}ccun&{hSAn`|aa;3!B3DXUv}6UGwN+yZpJE8$O=1et+WRpLgZ^UoWpWZu>F0 zuksh`CH?vDnCbuy-_H%6 zhLy8DzgW)NE}gyKL66_#WyXb2hkV

1UONj4erC(M2uuD6VK3tU|GK`6-NSs( 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 diff --git a/doc/qtcreator/images/qtcreator-search-reg-exp.webp b/doc/qtcreator/images/qtcreator-search-reg-exp.webp new file mode 100644 index 0000000000000000000000000000000000000000..a56f9b18d421feb04cd823526a1e917b8e1f6dec GIT binary patch literal 5794 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 VosnyGu-@;(eBnROXM}Vy000VNA?*MF literal 6534 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 diff --git a/doc/qtcreator/images/qtcreator-search-results-reg-exp.webp b/doc/qtcreator/images/qtcreator-search-results-reg-exp.webp new file mode 100644 index 0000000000000000000000000000000000000000..7b2c9aab7a4de0a365e98669eb52f7cd72a7bbaf GIT binary patch literal 11060 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 H{TUemk$f~( literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-search-results.webp b/doc/qtcreator/images/qtcreator-search-results.webp deleted file mode 100644 index d36ec5e2851f7b72dce81254c1b953c1c7c53e56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7250 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 F0{}CnBxnEt diff --git a/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc b/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc index 90ffd7cd809..a51d6623f88 100644 --- a/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc +++ b/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc @@ -180,7 +180,7 @@ case-sensitivity. Select \uicontrol {Show Non-matching Lines} to hide the lines that match the filter. - Press \key {Ctrl+F} to \l{Finding and Replacing}{search} for a string from + Press \key {Ctrl+F} to \l{Search in current file}{search} for a string in the output. To increase or decrease the output text size, select \inlineimage icons/plus.png @@ -188,7 +188,7 @@ (\uicontrol {Zoom Out}), or press \key Ctrl++ or \key Ctrl+-. To hide the output, select the \inlineimage icons/rightsidebaricon.png - (\uicontrol {Hide/Show Right Sidebar}) button or press \key {Alt+Shift+0}. + (\uicontrol {Hide Right Sidebar}) button or press \key {Alt+Shift+0}. \section1 CLICOLOR_FORCE Environment Variable diff --git a/doc/qtcreator/src/editors/creator-code-refactoring.qdoc b/doc/qtcreator/src/editors/creator-code-refactoring.qdoc index f286d18f85c..285c36166bd 100644 --- a/doc/qtcreator/src/editors/creator-code-refactoring.qdoc +++ b/doc/qtcreator/src/editors/creator-code-refactoring.qdoc @@ -64,7 +64,7 @@ \endif \endlist - \l{Search Results} shows the location and number of search hits in the + \l{Search Results View} shows the location and number of search hits in the current project. \if defined(qtcreator) diff --git a/doc/qtcreator/src/editors/creator-coding.qdoc b/doc/qtcreator/src/editors/creator-coding.qdoc index 67f8b6ac44d..38c6f3f5963 100644 --- a/doc/qtcreator/src/editors/creator-coding.qdoc +++ b/doc/qtcreator/src/editors/creator-coding.qdoc @@ -36,12 +36,15 @@ key components of \QC. You can use the code editor in the \uicontrol Edit mode. \endif + + \if defined(qtdesignstudio) \li \l{Finding} - Use the incremental and advanced search to search from currently + Use the incremental and advanced search to search in currently open projects or files on the file system or use the locator to browse through projects, files, classes, functions, documentation and file systems. + \endif \li \l{Refactoring} diff --git a/doc/qtcreator/src/editors/creator-diff-editor.qdoc b/doc/qtcreator/src/editors/creator-diff-editor.qdoc index dfeb7f5b4ac..8557cd8bffb 100644 --- a/doc/qtcreator/src/editors/creator-diff-editor.qdoc +++ b/doc/qtcreator/src/editors/creator-diff-editor.qdoc @@ -11,7 +11,7 @@ \page creator-diff-editor.html \if defined(qtdesignstudio) \previouspage qt-quick-toolbars.html - \nextpage creator-finding-overview.html + \nextpage studio-finding.html \else \previouspage creator-macros.html \nextpage creator-clang-codemodel.html diff --git a/doc/qtcreator/src/editors/creator-finding.qdoc b/doc/qtcreator/src/editors/creator-finding.qdoc deleted file mode 100644 index 2ebf1ad0a94..00000000000 --- a/doc/qtcreator/src/editors/creator-finding.qdoc +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (C) 2018 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -// ********************************************************************** -// NOTE: the sections are not ordered by their logical order to avoid -// reshuffling the file each time the index order changes (i.e., often). -// Run the fixnavi.pl script to adjust the links to the index order. -// ********************************************************************** - -/*! - \page creator-finding-overview.html - \if defined(qtdesignstudio) - \previouspage creator-diff-editor.html - \else - \previouspage creator-clang-codemodel.html - \endif - - \nextpage creator-editor-finding.html - - \title Finding - - \list - - \li \l{Finding and Replacing} - - The incremental search highlights the matching strings in the - window while typing and the advanced search enables you to - search from currently open projects or files on the file system. - You can conduct incremental and advanced searches in parallel. - - In addition, you can search for symbols when you want to - refactor code. - - \li \l{Searching with the Locator} - - Use the locator to browse - through projects, files, classes, functions, documentation and - file systems. - - \if defined(qtdesignstudio) - \li \l{Jump to the Code} - - Jump to the code for a specific component directly from - the \uicontrol {2D} view or \uicontrol {Navigator} view. - You can also jump to the code of a particular - \uicontrol {State} or \uicontrol {Connection} from their - corresponding views. - \endif - \endlist - -*/ diff --git a/doc/qtcreator/src/editors/creator-locator.qdoc b/doc/qtcreator/src/editors/creator-locator.qdoc index bcdc5278757..292b35ff30c 100644 --- a/doc/qtcreator/src/editors/creator-locator.qdoc +++ b/doc/qtcreator/src/editors/creator-locator.qdoc @@ -2,9 +2,13 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only /*! - \previouspage creator-editor-finding.html \page creator-editor-locator.html + \previouspage creator-how-to-advanced-search.html + \if defined(qtdesignstudio) \nextpage creator-jump-to-the-code.html + \else + \nextpage creator-how-tos.html + \endif \title Searching with the Locator diff --git a/doc/qtcreator/src/editors/creator-only/creator-scxml.qdoc b/doc/qtcreator/src/editors/creator-only/creator-scxml.qdoc index 5c1c32810e1..eac59c47407 100644 --- a/doc/qtcreator/src/editors/creator-only/creator-scxml.qdoc +++ b/doc/qtcreator/src/editors/creator-only/creator-scxml.qdoc @@ -98,7 +98,7 @@ state chart. \endtable - To search from the state chart, select \uicontrol {Search} and start typing + To search in the state chart, select \uicontrol {Search} and start typing in the \uicontrol Filter field. The search checks the whole SCXML tree for attributes that match the search criteria. diff --git a/doc/qtcreator/src/editors/creator-search.qdoc b/doc/qtcreator/src/editors/creator-search.qdoc index a5fd8c9e15a..42ca482a5f3 100644 --- a/doc/qtcreator/src/editors/creator-search.qdoc +++ b/doc/qtcreator/src/editors/creator-search.qdoc @@ -1,29 +1,40 @@ -// Copyright (C) 2022 The Qt Company Ltd. +// Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only /*! - \previouspage creator-finding-overview.html \page creator-editor-finding.html - \nextpage creator-editor-locator.html + \if defined(qtdesignstudio) + \previouspage studio-finding.html + \nextpage creator-how-to-advanced-search.html + \else + \previouspage creator-how-tos.html + \endif - \title Finding and Replacing + \ingroup creator-how-to-search + + \title Search in current file + + The incremental search highlights the matching strings in the editor while + you type. To search through the currently open file: \list 1 - \li Press \key {Ctrl+F} or select \uicontrol Edit > + \li Press \key {Ctrl+F} or go to \uicontrol Edit > \uicontrol {Find/Replace} > \uicontrol {Find/Replace}. \li In \uicontrol Find, enter the text you are looking for. - \image qtcreator-find-incremental.png + \image qtcreator-find-from-current-file.webp {Search hits highlighted in editor} - If the text is found, all occurrences are highlighted as you type. + All occurrences of the text are highlighted in the editor as you + type. - \li To go to the next occurrence, click \inlineimage icons/next.png - (\uicontrol {Find Next}), or press \key F3. To go to the previous - occurrence click \inlineimage icons/prev.png + \li To go to the next occurrence, select \inlineimage icons/next.png + (\uicontrol {Find Next}), or press \key F3. + + \li To go to the previous occurrence, select \inlineimage icons/prev.png (\uicontrol {Find Previous}), or press \key {Shift+F3}. \li To select all found occurrences in a file, select @@ -31,9 +42,13 @@ \endlist - You can restrict the search in the \uicontrol Find field by selecting - \inlineimage icons/qtcreator-new-search-icon.png - . Select one or several search criteria: + \note Select text before selecting \uicontrol {Find/Replace} to search only + from the selection. + + \section1 Set search criteria + + To restrict the search in the \uicontrol Find box, select + \inlineimage icons/qtcreator-new-search-icon.png and set search criteria: \list @@ -42,38 +57,33 @@ \li To search only whole words, select \uicontrol {Whole Words Only}. - \li To search using regular expressions, select + \li To search using \l{QRegularExpression}{regular expressions}, select \uicontrol {Use Regular Expressions}. Regular expressions used in \QC - are modeled on Perl regular expressions. For more information on - using regular expressions, see the documentation for the - QRegularExpression Class. + are modeled on Perl regular expressions \endlist - \note If you have selected text before selecting \uicontrol {Find/Replace}, the - search is conducted within the selection. + \section1 Replace text - To replace occurrences of the existing text, enter the new text in the - \uicontrol {Replace with} field. + To replace occurrences of the existing text, enter the new text in + \uicontrol {Replace with}. \list - + \li To replace the selected occurrence, select \uicontrol {Replace}. \li To replace the selected occurrence and move to the next one, - click \uicontrol {Find Next} or press \key {Ctrl+=}. - - \li To replace the selected occurrence and move to the previous one, - click \uicontrol {Find Previous}. - - \li To replace all occurrences in the file, click + select \uicontrol {Replace & Find}. + \li To replace all occurrences in the file, select \uicontrol {Replace All}. - \endlist - The \uicontrol {Preserve Case when Replacing} option can be selected to - preserve the case of the original text when replacing. This option is not - compatible with the \uicontrol {Use Regular Expressions} search option, and will - thus be disabled when regular expressions are used. When the option is used, - the case of the occurrence will be conserved, according to the following + \section1 Preserve case when replacing + + To preserve the case of the original text when replacing, select + \inlineimage icons/qtcreator-new-search-icon.png and then select + \uicontrol {Preserve Case when Replacing}. You cannot use this option + together with \uicontrol {Use Regular Expressions}. + + The case of the of the occurrence is preserved according to the following rules: \list @@ -88,163 +98,127 @@ \li Other occurrences are replaced with the new text as entered. \li If an occurrence and the new text have the same prefix or suffix, - then the case of the prefix and/or suffix are preserved, and the - other rules are applied on the rest of the occurrence only. + the case of the prefix and suffix are preserved, and the + other rules are applied to the rest of the occurrence. \endlist + \section1 Highlight search hits + The locations of search hits, breakpoints, and bookmarks in your document are highlighted on the editor scroll bar. To turn highlighting off, select \preferences > \uicontrol {Text Editor} > \uicontrol Display > \uicontrol {Highlight search results on the scrollbar}. - To search using more advanced options, select \uicontrol Advanced. + \image qtcreator-options-text-editor-display.png {Text Editor Display preferences} - \section1 Advanced Search + \section1 Search globally - To search through projects, files on a file system, files in all project - directories, or currently open files: + Select \uicontrol Advanced to open the \uicontrol {Search Results} view where + you can search in currently open projects or files on the file system. Or, + search for symbols to refactor code. + + \if defined(qtcreator) + \sa {Search}{How To: Search} + \else + \sa {Search in projects or file systems} + \endif + + \sa {Search Results View} +*/ + +/*! + \page creator-how-to-advanced-search.html + \if defined(qtdesignstudio) + \previouspage creator-editor-finding.html + \nextpage creator-editor-locator.html + \else + \previouspage creator-how-tos.html + \endif + + \ingroup creator-how-to-search + + \title Search in projects or file systems + + The search scope and search criteria determine where \QC looks for the search + string, how it matches the string with text, and which results it shows. + + \section1 Search in all projects \list 1 - - \li Press \key {Ctrl+Shift+F} or select \uicontrol Edit > + \li Press \key {Ctrl+Shift+F} or go to \uicontrol Edit > \uicontrol {Find/Replace} > \uicontrol {Advanced Find} > \uicontrol {Open Advanced Find}. - - \li Select the scope of your search: - - \list - - \li \uicontrol {All Projects} searches from all currently open - projects. - - \image qtcreator-search-allprojects.png - - \if defined(qtcreator) - If you cannot find some files, see - \l{Specify project contents} for how - to declare them as a part of the project. - \endif - - \li \uicontrol {Current Project} searches from the project you - are currently editing. - - \li \uicontrol {Files in All Project Directories} searches from - all project directories. - - \li \uicontrol {Files in File System} recursively searches from - the selected directory. - - \image qtcreator-search-filesystem.png - - In the \uicontrol {Search engine} field, select the search - engine to use: - - \list - \li Select \uicontrol Internal to use the \QC search - engine. - - \li Select \uicontrol {Git Grep} to use Git to only - search tracked files in the Git work tree. To - restrict the search to the HEAD, a tag, a local or - remote branch, or a commit hash, enter a reference. - Leave the field empty to search through the file - system. - - \if defined(qtcreator) - \li Select \uicontrol {Silver Searcher} to use the - experimental Silver Searcher plugin. For more - information, see \l{Enabling Silver Searcher}. - \endif - - \endlist - - \li \uicontrol {Current File} searches only from the current - file. - - \li \uicontrol {Open Documents} searches from all open files. - - \endlist - - \li In the \uicontrol {File pattern} field, specify file patterns to + \li In \uicontrol Scope, select \uicontrol {All Projects}. + \image qtcreator-search-all-projects.webp {Search Results view} + \li In \uicontrol {Search for}, enter the string you are looking for. + \li Select options to make the search case sensitive, search only whole + words, or use regular expressions. + \li In \uicontrol {File pattern}, specify file patterns to restrict the search to files that match the pattern. For example, to search for a string only in \c {.cpp} and \c {.h} files, enter \c {*.cpp,*.h}. - - \li In the \uicontrol {Exclusion pattern} field, specify file patterns + \li In \uicontrol {Exclusion pattern}, specify file patterns to omit files from the search. - - \li Enter the text you are looking for and click \uicontrol Search. - - \image qtcreator-search-results-matches.webp {Found matches in Search Results} - - \l {Search Results} shows a list of files that have the searched text. - - \list - - \li To see all occurrences in a file, double-click the file name - in the list. - - \li To go to an occurrence, double-click it. - - \li To repeat the search after you have made changes to the - listed files, for example, select - \uicontrol {Search Again}. - - \endlist - + \li Select \uicontrol Search. \endlist - The search results are stored in the search history from which you can - select earlier searches. - - To clear the search results, select the \inlineimage icons/clean_pane_small.png - (\uicontrol Clear) button. - - To expand and collapse the search results, select the - \uicontrol {Expand All} button. - - To start a new search, select the \inlineimage icons/qtcreator-new-search-icon.png - (\uicontrol {New Search}) button. - - \note You can use \uicontrol {Advanced Find} also to search for symbols. For - more information, see \if defined(qtcreator) - \l{Finding Symbols}. - \else - \l{Finding QML Types}. + If you cannot find some files, see \l{Specify project contents} for + how to declare them as a part of the project. \endif - \if defined(qtcreator) - \section1 Enabling Silver Searcher + \section1 Search in the file system - You can use Silver Searcher as a search engine in \QC if you install - Silver Searcher on the development PC. - - \note Enable the SilverSearcher plugin to use it. - - To use Silver Searcher: + In addition to the options available for searching from all projects, you can + select the search engine to use and the directory to search in. \list 1 - - \li Download and install Silver Searcher from - \l {https://geoff.greer.fm/ag/}{The Silver Searcher} or - \l {https://github.com/ggreer/the_silver_searcher}{GitHub}. - - You might have to build Silver Searcher from sources for some - platforms. - - \li When searching, select \uicontrol {Silver Searcher} in the - \uicontrol {Search engine} field. - - \li If Silver Searcher is not found, you might have installed it in a - location that is not found via the \c{PATH} environment variable. - Select \preferences > \uicontrol Environment > \uicontrol System, - then select \uicontrol Change in the \uicontrol Environment field, - and add the entry \c{PATH=/path/to/bin:${PATH}}. - + \li In \uicontrol Scope, select \uicontrol {Files in File System}. + \image qtcreator-search-file-system.webp {Search Results view} + \li In \uicontrol {Search for}, enter the string you are looking for. + \li In \uicontrol {Search engine}, select the search engine to use: + \list + \li Select \uicontrol Internal to use the \QC search + engine. + \li Select \uicontrol {Git Grep} to use Git to only + search tracked files in the Git work tree. To + restrict the search to the HEAD, a tag, a local or + remote branch, or a commit hash, enter a reference. + Leave the field empty to search through the file + system. + \if defined(qtcreator) + \li Select \uicontrol {Silver Searcher} to use the + experimental Silver Searcher plugin. + \endif + \endlist + \li In \uicontrol Directory, select the directory to search in. + Select \uicontrol Browse to locate the directory or + \uicontrol Current to search in the directory where the currently + active file is. + \li Select \uicontrol Search. \endlist - \sa {Enable and disable plugins} + \section1 Search and replace + + To replace occurrences of the existing text: + + \list 1 + \li Select \uicontrol {Search & Replace}. + \image qtcreator-search-results-reg-exp.webp {Search results when searching and replacing} + \li Enter the new text in \uicontrol {Replace with}. + \li Select \uicontrol Replace. + \endlist + + To preserve the case of the original text when replacing, + select \uicontrol {Preserve case}. The rules listed in + \l {Preserve case when replacing} apply here as well. + + \if defined(qtcreator) + \sa {Search}{How To: Search}, {Finding Symbols}, {Turn on Silver Searcher} + \else + \sa {Search in current file} \endif + + \sa {Search Results View} */ diff --git a/doc/qtcreator/src/howto/creator-only/creator-how-to-silver-searcher.qdoc b/doc/qtcreator/src/howto/creator-only/creator-how-to-silver-searcher.qdoc new file mode 100644 index 00000000000..b632145832d --- /dev/null +++ b/doc/qtcreator/src/howto/creator-only/creator-how-to-silver-searcher.qdoc @@ -0,0 +1,53 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! + \page creator-how-to-silver-searcher.html + \previouspage creator-how-tos.html + + \ingroup creator-how-to-search + + \title Turn on Silver Searcher + + You can use Silver Searcher as a search engine in \QC if you install + Silver Searcher on the computer. + + \image qtcreator-search-file-system.webp {Files in File System scope in Search Results view} + + \note Enable the SilverSearcher plugin to use it. + + To use Silver Searcher: + + \list 1 + \li Download and install Silver Searcher from + \l {https://geoff.greer.fm/ag/}{The Silver Searcher} or + \l {https://github.com/ggreer/the_silver_searcher}{GitHub}. + + You might have to build Silver Searcher from sources for some + platforms. + \li When searching, select \uicontrol {Silver Searcher} in + \uicontrol {Search engine}. + \endlist + + If \QC cannot find Silver Searcher, you might have installed it in a + location that is not set in the \c{PATH} environment variable. + + \section1 Set location of Silver Searcher + + To tell \QC where Silver Searcher is: + + \list 1 + \li Go to \preferences > \uicontrol Environment > \uicontrol System. + \image qtcreator-preferences-environment-system.webp {System preferences} + \li In \uicontrol Environment, select \uicontrol Change. + \li In \uicontrol {Edit Environment}, add the path to the Silver Searcher + executable: + \badcode + PATH=:${PATH} + \endcode + \image qtcreator-edit-environment.webp {Edit Environment dialog} + \endlist + + \sa {Enable and disable plugins}, {Search}{How To: Search}, + {Batch edit environment settings} +*/ diff --git a/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc b/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc index c82cdcfa91c..3696b292635 100644 --- a/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc +++ b/doc/qtcreator/src/howto/creator-only/creator-how-tos.qdoc @@ -65,6 +65,10 @@ \generatelist creator-how-to-lsp + \section2 Search + + \generatelist creator-how-to-search + \section1 Manage Kits \generatelist creator-how-to-manage-kits @@ -404,34 +408,43 @@ /*! \page creator-how-to-search-and-replace-using-regexp.html - \previouspage creator-how-to-move-between-open-files.html + \previouspage creator-how-tos.html - \ingroup creator-how-to-edit + \ingroup creator-how-to-search - \title Search and replace across files using a regular expression + \title Search and replace using a regular expression - As an example, say you want to replace equality checks (\c {foo == bar}) - with a function (\c {foo.equals(bar)}): + Search and replace across files using regular expressions in the + \uicontrol {Search Results} view. + + Regular expressions used in \QC are modeled on Perl regular expressions. + For more information about using regular expressions, see + \l QRegularExpression. + + For example, to replace equality checks (\c {foo == bar}) with a function + (\c {foo.equals(bar)}): \list 1 - \li Ensure that any work you have done is committed to version control, - as the changes cannot be undone. - \li Press \key {Ctrl+Shift+F} to bring up the \uicontrol {Advanced Find} - form. - \li Change the scope to whatever is appropriate for your search. - \li Under the \uicontrol {Search for} text field, select - the \uicontrol {Use regular expressions} check box. - \li Enter the following text in the \uicontrol {Search for} text field: + \li Commit your changes to version control, as you cannot undo the + replace action. + \li Press \key {Ctrl+Shift+F} or go to \uicontrol Edit > + \uicontrol {Find/Replace} > \uicontrol {Advanced Find} > + \uicontrol {Open Advanced Find} to open \uicontrol {Search Results}. + \image qtcreator-search-reg-exp.webp {Regular expression in Search Results view} + \li In \uicontrol Scope, select whatever is appropriate for your search. + \li Select \uicontrol {Use regular expressions}. + \li Enter the following text in \uicontrol {Search for}: \badcode if \((.*) == (.*)\) \endcode - \li Press \uicontrol {Search & Replace} to see a list of search results. - \li In the \uicontrol {Replace with} text field, enter the following text: + \li Select \uicontrol {Search & Replace} to see a list of search results. + \image qtcreator-search-results-reg-exp.webp {Search results for the regular expression} + \li In \uicontrol {Replace with}, enter the following text: \badcode if (\1.strictlyEquals(\2)) \endcode - \li Press \uicontrol Replace to replace all instances of the text. + \li Select \uicontrol Replace to replace all instances of the text. \endlist - \sa {Advanced Search}, {Edit Code}{How To: Edit Code}, {Edit Mode} + \sa {Edit Code}{How To: Edit Code}, {Search}{How To: Search}, {Edit Mode} */ diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc index 569342b26e3..60fb9686fd6 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc @@ -198,8 +198,8 @@ directory in the \l {File System} view. Declaring files as a part of the project also makes them visible to the - \l{Searching with the Locator}{locator} and \l{Advanced Search} - {project-wide search}. + \l{Searching with the Locator}{locator} and + \l{Search in projects or file systems}{project-wide search}. \section1 CMake Projects diff --git a/doc/qtcreator/src/qtcreator-toc.qdoc b/doc/qtcreator/src/qtcreator-toc.qdoc index ec8408795fc..60f8248b38c 100644 --- a/doc/qtcreator/src/qtcreator-toc.qdoc +++ b/doc/qtcreator/src/qtcreator-toc.qdoc @@ -36,11 +36,6 @@ \li \l{Using Text Editing Macros} \li \l{Comparing Files} \endlist - \li \l{Finding} - \list - \li \l{Finding and Replacing} - \li \l{Searching with the Locator} - \endlist \li \l{Refactoring} \li \l{Configuring the Editor} \li \l{Using GitHub Copilot} @@ -149,6 +144,8 @@ \generatelist creator-how-to-configure-editors \li Manage Language Servers \generatelist creator-how-to-lsp + \li Search + \generatelist creator-how-to-search \endlist \li Manage Kits \generatelist creator-how-to-manage-kits diff --git a/doc/qtcreator/src/qtcreator.qdoc b/doc/qtcreator/src/qtcreator.qdoc index 7c2d8ce775e..aefa86c3946 100644 --- a/doc/qtcreator/src/qtcreator.qdoc +++ b/doc/qtcreator/src/qtcreator.qdoc @@ -50,7 +50,6 @@ \li \b {\l{Coding}} \list \li \l{Writing Code} - \li \l{Finding} \li \l{Refactoring} \li \l{Configuring the Editor} \endlist diff --git a/doc/qtcreator/src/user-interface/creator-file-system-view.qdoc b/doc/qtcreator/src/user-interface/creator-file-system-view.qdoc index 2b4ddbdb942..3b8a7d59cf7 100644 --- a/doc/qtcreator/src/user-interface/creator-file-system-view.qdoc +++ b/doc/qtcreator/src/user-interface/creator-file-system-view.qdoc @@ -68,7 +68,7 @@ To use an \l{Terminal} {internal terminal}, select \preferences > \uicontrol Terminal > \uicontrol {Use internal terminal}. \endif - \li Search from the selected directory. + \li Search in the selected directory. \li View file properties, such as name, path, MIME type, default editor, line endings, indentation, owner, size, last read and modified dates, and permissions. diff --git a/doc/qtcreator/src/user-interface/creator-how-to-view-output.qdoc b/doc/qtcreator/src/user-interface/creator-how-to-view-output.qdoc index b83a54dbe39..95de069becb 100644 --- a/doc/qtcreator/src/user-interface/creator-how-to-view-output.qdoc +++ b/doc/qtcreator/src/user-interface/creator-how-to-view-output.qdoc @@ -60,9 +60,9 @@ \section1 Find and filter output - To search from output, press \key {Ctrl+F} when the view is active. Enter + To search in output, press \key {Ctrl+F} when the view is active. Enter search criteria in the \uicontrol Find field. For more information, see - \l{Finding and Replacing}. + \l{Search in current file}. To filter output, enter a string in the \uicontrol Filter field. diff --git a/doc/qtcreator/src/user-interface/creator-only/creator-reference-terminal-view.qdoc b/doc/qtcreator/src/user-interface/creator-only/creator-reference-terminal-view.qdoc index 2be2fd8a2c3..0f09a773d47 100644 --- a/doc/qtcreator/src/user-interface/creator-only/creator-reference-terminal-view.qdoc +++ b/doc/qtcreator/src/user-interface/creator-only/creator-reference-terminal-view.qdoc @@ -44,7 +44,8 @@ \li To open links in a browser, files in the editor, or folders in the \l Projects view, hover the mouse over them, and press \key Ctrl. - \li To \l{Finding and Replacing}{search} through the output, press \key {Ctrl+F}. + \li To \l{Search in current file}{search} through the output, press + \key {Ctrl+F}. \li To make the font larger or smaller, select the \inlineimage icons/plus.png and \inlineimage icons/minus.png diff --git a/doc/qtcreator/src/user-interface/creator-projects-view.qdoc b/doc/qtcreator/src/user-interface/creator-projects-view.qdoc index b0a66c421cc..99e3b469cc1 100644 --- a/doc/qtcreator/src/user-interface/creator-projects-view.qdoc +++ b/doc/qtcreator/src/user-interface/creator-projects-view.qdoc @@ -89,7 +89,7 @@ \li Add and remove subprojects. \li Find unused functions. \endif - \li Search from the selected directory. + \li Search in the selected directory. \li Open a terminal window in the project directory. To specify the terminal to use on Linux and \macos, select \preferences > diff --git a/doc/qtcreator/src/user-interface/creator-reference-output-views.qdoc b/doc/qtcreator/src/user-interface/creator-reference-output-views.qdoc index 06ee12f0c33..60b8b72d5af 100644 --- a/doc/qtcreator/src/user-interface/creator-reference-output-views.qdoc +++ b/doc/qtcreator/src/user-interface/creator-reference-output-views.qdoc @@ -1,4 +1,4 @@ -// Copyright (C) 2023 The Qt Company Ltd. +// Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only // ********************************************************************** @@ -78,25 +78,87 @@ \ingroup creator-reference-output-views \ingroup studio-reference-output-views - \title Search Results + \title Search Results View - \brief Lets you search through projects, files on a file system or the - currently open files. + \brief Search through projects, files on a file system or the + currently open files and view search results. - The search history (1) stores the search results. You can select earlier - searches from the history. + The search scope determines where \QC searches for the search string: - \image qtcreator-search-results.webp {Search Results - criteria} + \list + \li \uicontrol {All Projects} searches in all projects. + \li \uicontrol {Current Project} searches in the currently active + project. + \li \uicontrol {Files in All Project Directories} recursively searches + in all project directories. + \li \uicontrol {Files in File System} recursively searches in + the selected directory. + \li \uicontrol {Current File} searches only from the current + file. + \li \uicontrol {Open Documents} searches in all open files. + \endlist - The figure below shows an example search result for all - occurrences of the search string in the specified directory. + In \uicontrol {File pattern} and \uicontrol {Exclusion pattern}, specify + file patterns to further restrict the search scope. - \image qtcreator-search-results-matches.webp {Search Results - matches found} + The search criteria determine how \QC matches the search + string with text and which results it shows: - For more information about the different search options, see - \l {Finding and Replacing}. + \list + + \li To consider case, select \uicontrol {Case sensitive}. + \li To search only whole words, select \uicontrol {Whole words only}. + \li To search using \l{QRegularExpression}{regular expressions}, select + \uicontrol {Use regular expressions}. + \endlist + + \image qtcreator-search-file-system.webp {Search Results view with search options} + + \section1 Viewing Search Results + + After you select \uicontrol Search or \uicontrol {Search & Replace}, the view + shows a list of files that have search hits. + + \image qtcreator-search-results-matches.webp {Found matches in Search Results} + + To show search hits in the editor: + + \list + + \li To see all occurrences in a file, double-click the file name + in the list. + + \li To go to an occurrence, double-click it. + \endlist + + To repeat the search after you have made changes to the listed files, + for example, select \uicontrol {Search Again}. + + \section1 Search Results View Toolbar + + The toolbar contains options for searching again and navigating search + results: + + \list + \li To clear the search results, select + \inlineimage icons/clean_pane_small.png (\uicontrol Clear). + \li To expand and collapse the search results, select + \inlineimage icons/qtcreator-expand.png (\uicontrol {Expand All}). + \li To start a new search, select + \inlineimage icons/qtcreator-new-search-icon.png + (\uicontrol {New Search}). + \li If the active project has long paths, select \uicontrol {../} + (\uicontrol {Show Paths in Relation to Active Project}) to show + relative paths. + \li To show the results of earlier searches, select them in + \uicontrol History. + \endlist \sa {View output} + + \if defined(qtcreator) + \sa {Search}{How To: Search} + \endif */ /*! diff --git a/doc/qtdesignstudio/src/overviews/studio-finding.qdoc b/doc/qtdesignstudio/src/overviews/studio-finding.qdoc new file mode 100644 index 00000000000..bd1e24a5053 --- /dev/null +++ b/doc/qtdesignstudio/src/overviews/studio-finding.qdoc @@ -0,0 +1,39 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! + \page studio-finding.html + \previouspage creator-diff-editor.html + \nextpage creator-editor-finding.html + + \title Finding + + \list + + \li \l{Search in current file} + + The incremental search highlights the matching strings in the + editor while you type. + + \li \l{Search in projects or file systems} + + With advanced search, you can search in currently open projects or + files on the file system. + + \li \l{Searching with the Locator} + + Use the locator to browse + through projects, files, classes, functions, documentation and + file systems. + + \li \l{Jump to the Code} + + Jump to the code for a specific component directly from + the \uicontrol {2D} view or \uicontrol {Navigator} view. + You can also jump to the code of a particular + \uicontrol {State} or \uicontrol {Connection} from their + corresponding views. + + \endlist + +*/ diff --git a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc index 29ef0a9b240..f18a71fb65a 100644 --- a/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc +++ b/doc/qtdesignstudio/src/qtdesignstudio-toc.qdoc @@ -211,7 +211,8 @@ \endlist \li \l{Finding} \list - \li \l{Finding and Replacing} + \li \l{Search in current file} + \li \l{Search in projects or file systems} \li \l{Searching with the Locator} \li \l{Jump to the Code} \endlist From 75fa962eb4f9965a71fe885f6b4ad72bf541bde4 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 8 Feb 2024 15:30:10 +0100 Subject: [PATCH 05/35] Doc: Update info about QML live preview Task-number: QTCREATORBUG-30209 Change-Id: I0c4717a192e7fd94924fa573994bc27d7687d1d3 Reviewed-by: Reviewed-by: Mats Honkamaa --- doc/qtcreator/images/icons/live-preview.png | Bin 0 -> 239 bytes .../images/qtcreator-editor-toolbar-qml.webp | Bin 0 -> 8078 bytes .../images/qtcreator-live-preview.png | Bin 46355 -> 0 bytes .../images/qtcreator-live-preview.webp | Bin 0 -> 28496 bytes .../creator-coding-edit-mode.qdoc | 10 +++- .../qtquick/qtquick-live-preview-desktop.qdoc | 44 +++++++++--------- .../src/qtquick/qtquick-live-preview.qdoc | 44 ++++++++---------- .../images/studio-run-settings.png | Bin 18057 -> 0 bytes .../images/studio-run-settings.webp | Bin 0 -> 8376 bytes 9 files changed, 51 insertions(+), 47 deletions(-) create mode 100644 doc/qtcreator/images/icons/live-preview.png create mode 100644 doc/qtcreator/images/qtcreator-editor-toolbar-qml.webp delete mode 100644 doc/qtcreator/images/qtcreator-live-preview.png create mode 100644 doc/qtcreator/images/qtcreator-live-preview.webp delete mode 100644 doc/qtdesignstudio/images/studio-run-settings.png create mode 100644 doc/qtdesignstudio/images/studio-run-settings.webp diff --git a/doc/qtcreator/images/icons/live-preview.png b/doc/qtcreator/images/icons/live-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..62feef8122cd3b035fe87904c64c3a3002028e48 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4i*LmhONKMUokK+Z1Z$+4AD5>dw!u83!@0@ z1!Fz#?hV3hh87RxJA4DWFWPUo`G@ne@4wdig!09?2UE6iSf5gRta5$o)|`M6xA=;u zvhSXLoPW|gZ&#l5>)IK|=ae%`>^`-GKj6mc;7hy-Pn0g(G3=iCbQixt$*gv}3!xLO zwuVpDoqBLR=ggbi48AP$`fU90T3T6;=&37iGi%tjkBeojF{vp3BDzH{IBJ>c_WXI* uj8s{l+%!plJGGs~AhSZ#E9>RgTR)2}tF7RN>x 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

&z5TD}~`u;T-K_j68>B+!e)NFD~C>HvQkpgYka+ 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

SEn5;V!bpJ>%K6%^$h8 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 \uicontrol {QML Preview}. - - \image qtcreator-live-preview.png - \else To preview the currently active QML file on the desktop: \list + \if defined(qtcreator) + \li Select \inlineimage icons/live-preview.png (\uicontrol {Live Preview}) + on the \l{Edit Mode}{editor} toolbar. + \image qtcreator-live-preview.webp {Application running on top of the editor view} + \li Select \uicontrol Build > \uicontrol {QML Preview}. + \endlist + \else \li Select the \uicontrol {Live Preview} button on the top toolbar. \li Press \key {Alt+P}. + \image studio-live-preview.webp \endlist - \image studio-live-preview.webp - \endif + To preview any QML file in the project: - To preview any QML file that belongs to the project, \list \li Select the \uicontrol {Live Preview} button on the top toolbar. - \li Right-click the - filename in the \l Projects view, and select \uicontrol {Preview File}. + \li Right-click the filename in the \l Projects view, and select + \uicontrol {Preview File}. \endlist - \if defined(qtdesignstudio) To preview the whole UI, select \uicontrol {Live Preview} when viewing the main QML file of the project. - To view the UI in different sizes, select the zooming level on the toolbar. + \section1 Overriding the Preview Tool - \section1 Selecting the Preview Tool + By default, the QML runtime is used for previewing. - By default, the QML runtime is used for previewing. To use some - other tool, specify it in the \uicontrol {QML viewer} field in the run - settings of the project in the Projects mode. + To use some other tool: - \note Click \inlineimage icons/settings.png - to access the setting options. - - \image studio-run-settings.png "Run settings" + \list 1 + \li Select \inlineimage icons/settings.png to go to + \uicontrol {Run Settings}. + \image studio-run-settings.webp {Run Settings} + \li In \uicontrol {Override device QML viewer}, select the folder where + the preview tool executable is located. + \endlist \endif */ diff --git a/doc/qtcreator/src/qtquick/qtquick-live-preview.qdoc b/doc/qtcreator/src/qtquick/qtquick-live-preview.qdoc index b292540c3f2..95aac0fc527 100644 --- a/doc/qtcreator/src/qtquick/qtquick-live-preview.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-live-preview.qdoc @@ -1,4 +1,4 @@ -// Copyright (C) 2021 The Qt Company Ltd. +// Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only /*! @@ -12,38 +12,35 @@ \title Validating with Target Hardware - You can use the live preview feature to preview a UI file or the entire - UI on the desktop, as well as on embedded Linux - devices. The changes you make to the UI are instantly visible - to you in the preview. While the preview is available on Android devices, - it does not instantly reflect the changes made to the UI in the editor. It - shows the snapshot of your project from the moment you start the preview on - the device. + Preview a UI file or the entire UI on the desktop, as well as on embedded + Linux devices to instantly view the changes you make to the UI. On Android + devices, the preview shows the snapshot of your project from the moment + you start the preview on the device, not your changes. - In addition, you can use \QDV to run + \if defined(qtcreator) + \image qtcreator-live-preview.webp {Application running on top of the editor} + \else + \image studio-live-preview.webp + \endif + + Or, use \QDV to run \if defined(qtcreator) \l{Create Qt Quick UI Prototypes}{Qt Quick UI projects} \else applications \endif - in most widely-used web browsers on the desktop and in mobile devices This - enables you to easily share your designs with reviewers who don't have \QC. - - \if defined(qtcreator) - \image qtcreator-live-preview.png - \else - \image studio-live-preview.webp - \endif + in most widely-used web browsers on the desktop and in mobile devices and + share your designs with reviewers who don't have \QC. \list \li \l{Previewing on Desktop} - You can preview individual QML files or the whole UI. + Preview individual QML files or the whole UI. \li \l{Previewing on Devices} \if defined(qtcreator) - You can preview Qt Quick applications on devices that you have - connected to the development PC. For more information, see + Preview Qt Quick applications on devices that you + connect to the development PC. For more information, see \l {Connecting Devices}. \else When you install \QDS, everything you need for previewing on @@ -54,17 +51,16 @@ \if defined(qtdesignstudio) \li \l{Previewing Android applications} - You can preview Android applications live using an Android - emulator. + Preview Android applications live using an Android emulator. \li \l{Sharing Applications Online} - You can share applications online and view them in a web browser. + Share applications online and view them in a web browser. \else \li \l{Previewing in Browsers} - You can open \l{https://designviewer.qt.io/}{\QDV} + Open \l{https://designviewer.qt.io/}{\QDV} in a browser and load applications to it. \endif \endlist diff --git a/doc/qtdesignstudio/images/studio-run-settings.png b/doc/qtdesignstudio/images/studio-run-settings.png deleted file mode 100644 index 0a8fa23612dff554d97188d1b42ad344a05de208..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18057 zcmeAS@N?(olHy`uVBq!ia0y~yU}|SzVAAAZVqjp1Phiz%U~miYba4!+xb=4K-|Co~ zu{T7$=FJk(5V^7Ejav5UZE&DpV9*9B2xDVlcp;;`|Lqm!{F+y8Hzo## zjM-D`U;V%LYvX?Zyi?@Nx5D%Py_l}fU0?b0r@eH=|M;c%zAx3j+5biM zluSj*k7#~*YnN;$28J!CPDRJ>{eLMue{FrLSH$m4XXAZqALuWatI2$Hx4x|K;pe@r z_WOSwp8x;c%=vbIB7S}C=leTZx!K)n@5xImKbEZKk`HfPZlTY}u%YO}soC-S{y&c6$7xH6L(pUXuVgGAZeK>lBzqanj&huZzR=q6$`*7*Wug&@Uetqrdt-XD*ao@DC zs&x@x+lzL_#LSe=U)b}!>*)hC?#G_4as`zJMzIFl1I`r3F)<{h?w=a}bMm+ znj0u~th~6p(`@>tl-HgzVx3b#F5WWL{?pRm+3~wXvyvXV|GV<2cK-aT_s`e=pM5?y z@<+V-{Gadp_rKC4fcVzw`7YTUGUJFXrV zP1)_~Hd{D)reF>O!y1{~r@i}k{BN}1FPi#Dbh7vv`i?zC=!Y2RN z4KbhdqGwoshSV*Mm~t^A*|MbjC-3bah5ao{4;0(0MJ0cP40{M+5KLcOjB zI#=&MGv!$M6jAk=69eOCKkH#yE=37)e(p|e{ zlfF^>m(sa!|E{;0Hn$Dg*9}DH9r6-3 zd-X2Ukb&Vwc-X&3f7|P;v@?>9%KQFZZC~;G?*FokMW6Ufgya97ou@tjmE>=KTmRZi z4}@*+M_cat5U-!U-S6w&f6vV4{ygTaE|=XqHJ3N~(yGI!((<>)^i_tu5l)GG&zqfn zR`6@@rfn~G{W=vG*0*Be=F`$yF?a8+oAp&~_Jw_(5w)p{<@={HGJIP-wf>#|`~Ckv zZ|9m{?E6Qq`FZ{SmACi*eo^tWw6F8{9<_acq;03y?|pu0{nwa3SLb!_zhwMNzWUzB zm%`_3pMCmrUe5l{-TyCi4}UtW+;9GLXVFc$dAifT`lZ{3l?h#uSmr0*RJ`Hro_~|( z>aAINz%9M{>Z-(q-C>(&-1nZ;vx}MGK;5QK;_v>Sc%IkU7XM@M%JTmYuk8Mx@T$G; zf7ZKlIZ@&Gi@tw4=e_4K{@C#$>U?YbyPY4rZJ*a~e17M6^}9dUF7Vg<`gElGZ~y%t zZOYAi&(3dt+xPBTeyX+O&I#+jezY{ScbwZ6*^oamL^HP!Z7xpCC`%$rMoM`fp)GVXryH*#{) zf=|b!W3+E|C(rr9!0`L>DfwTEpMTz8{p*!_oW4|++ssBk+%jF_HQtpOrTP0|ff9Ln@L`^wkW`;NA+WH~K*8Mxic=yP)3nfg#^Q&A9 ze`hbB|MSVyFWt@gyMOZb^VNI5-}vm$`=EoCH~Q3=gV+68sHpwCdt>sIhv#=PtG1uJ zdPzxo>!z=FZq%$=TlZY$QL3)n21bT&o2P!>Z~E!Vdbt(3kHT%$?0!z1CoFAiyk2(y z@6OZL?SHtuFRyx^-5c5yJtyZJ+Kechmd(iE)3YccR+805!Y7HG|9+iVEN?52|0wzYzVr{ztMu}0KYdvr z_wQZ!Je!Yy`}cgjV_y@!x&DXLp*F@lhOahBGU>ZBGB`Ys_$j;JsOa5Q=4G8z+v@LK z*zlqF)RAWU+r}Rr&MTI_|Le>8n0=vE^}p`T-v9X0>wDK`{a4{qnzz2)CQMKK=T-rR z2EQ$zzV9HIbCv!|!qn-!&f-1vUSnt#qu7ytch^5WfOsqObC z$Sv>YVYsj}?BDYJ7Dd0F^S@Ag_xt6%ee+*Q{+PLbzpmXs{>9?=NYL^F+kAU)<96Pjhq~!c{wLbpI3`u!>YyON(c;Hh8u4@YcDH-~ zCN|!T-!Ui3zVOBFeJ{^`5{^B7|CG2S14Dz^m#O<-Po3B~U&hMlw{E`G@3!N&e+$Pl zFfiQBNj2SU^?hx=O?kt77Dfh!jLlP1i@r{rxLwAs?8S)#fzUSDG|g+`c{291yXr>nD{^R+WHF}qP7b*JV>hW&mqCI*HLzr*C-*#7?Z zc=>Vu`Ceb=$=ZK=@U&G13uwiwWT}|4XA1k%p{o*Whik`jN zXdK=*e}_TAmzEtrHTGBWGB9k&-n_SuC)TR$(Wi;R)A{G`cw$uYbH)+*`c3~|Y&@K$ zbc3N6)OyO&=9jTFEqc>=aq)5YJ{C*UDxYg|(n99)5BD!)U|`5tJ2myv*OQ-*_sxHA zUH5Or{9?A}zf}%)79VHx|LUEj*2Kubuw~u)nlGKk&BxDu;hkqG)vPih<#;>$Z~rgS z%(rZE*cccxs^Tjby#I0G!GnVP4<<~%9M|I^d1~5`<9__#>@Vs|&g5WYV7TC;{r&5A z-gz<-7B|Jc>Lr-ff3y4Z@y(HVA^m2$pK%_@m`PLFf3f>_B>iTe_u;bq=>x*dT8|5# zrX2x=YmeZYfB*g^GygsQ%lYN%)`{Uq*1b7*JD7oi!CK~^*mAzEux#T6x<4ega5F1RnkDWRxe)?%q zq3Y3_Af-D4KOJ3VKZW}x+iA`1cTc@^ihQ-v@VF-@L&MbXYp0q&J9b%9aev_2Uu%~= zI{eA2X3x~cM&DYei-i`&UIp28fidh`#M&4GnVDKSQ|9t*v9z+?mvm&xX}|qdHb+iX z9m|RowF|!@G`m&g^TA7}QgfRtZ|~+@m8drFvh}~zw#$qR8$SKpwn^1Y)$(%9(_SaL zc#T`ix3}^2KEIIaTQ_U!TNAfqn<8W8U*z6??AY9=37H2cyQ9YI_2tJzv^EX{QgJ0H?Q`(TzxxgZC1GR`4b#w3=AcY zIJRkq`>!~D>f4Xa!TTmgs9q>i-B8q&^7&B6nbu3SgXi59`&9f>w6f`SpXKZGJ&)&WPru8gyMLN#y1L}S zzLjoErmj9#{M6*RDg#5Ffb%M{T3ZrpAGAL;YtDEgo4&b14SM~!_?g~?%liB%+7D;l~F!nalwl1+h_9! z*KqUj^Ut>~f9K@Re)HhMhl%GH^G-+XTs`&9_3P8UmKx1GW3sT;@m73alT7!$dx!5< z&Uh5yb=?9-Yc~a@LyIF?SQmn{j*EfTsTN+A~ zb}wg5Nw;L*VVV3?&$X@R$!|@!JIaoItuhny?0f=s6>Lwu%VfM6d5$sfT*S`RYis&8 zm^sh%as zltr)RiFIr$nm(Tyq>fQLIdx6X)Qv_7scX*2N@^GLIUJ9ww3#dQ-IXob$@m#}YmL^& zwxFL=o$U6$UsLn>+1briGYSvi{B`Ket5;5YE8nc)PFs;bn|pQi?c2AbR~u{9H%G4v zT^lAME%_wECGuwdjIwRe85t+|i|~*EeZyl?scy>lJtC%&TpC_ol5%PAkpMUa0GKOIQ1};k}^y=}xnvvM-;Q z@i*=1YUA?!=V|-0k13RY|F*UJZo<>KF()DFfN?Co8m>SKSW@6?Q((^0=( zx*WY0yH4`hv19YNxrN?)YaUlRb?V;XEt3<>Do*72Nn5X%Kb+um_~Fat^RIo6wQE!B z&SDe{U977RHgD&nnq5ls*ICVXOD^tH>#)2WFl&awZpqZARZ$A>oaU{2-{n!F=rcbv zs>6zX!QwSG)9(xDTHD@Ax)=IBW@C(=c5XN?k z-6Xg0rdyu<(=;ni<;G5#^@ zn6O}d%Y$bjOq{EN_?O3)u27wNK5F;Q1=I7x0#t9-tPonU^;=%#@26tf&w6hx-f*{{ z`_aPbdmWP|-S3~3nY!DthBtU?^jXVk`)0_p{p9*|$yA8E}ioDYKefo}d*f##M zx2r7*Tq`cEF#WgrUc6e^u~VIEbn10GXW4CAyXM!~U27NrKJ}>7aNV?fy&Eq_)IPO3 zzW4jKsm^&1uPwUQzNsW9+ET;mXZBGR6`5P1eBmqei|<+8G%EDsURKn-Dv#}*yx*=3 zNy1l`^BJ~lRhF-L6L!Z^OR#%-Cfpvx8GEW=%qr7FU{!Q zc{?l6TmM~X_FcQ}OAJr(Pum&3#%Ar2Ou1{f!V7O~l`k^7(S6WpqfwY&T59yJX<@lv zSJ{0z6=S!4!?F3wYh$MNEbF{GvB1B_xM}bHU#G6GkC!hyY`b&Ddsh2 zo}6Zp{4bd$GHj*FM8V|$uOm~ZEq=~*cY*9neaG_|sT;fGu637sZ(h75By8h7s}!S6 z?z69j|2vXS#uu(i$aH=7rw{FI*R(C0d3>fZL148Pk6uP>cJUmt;>4^CM&FB zbqVR+c3|pD>+<(0#W!=_otwM+W~a8Ykh$61x$|VCcQ2Z8B30e3&0THt&69%0?Q7;1 zh!tlAb_Z%MUoUaguYace*`9+&(p;Nn2ZpU%&iZ7DNqfze8|S|ruAVt7d}DF%uXP<8 zf{(@WOxyWbpp?&HdF0J0EA~6DiH?+z&*+-^{d)0J3+>lYMeA%i_hoP0Hg#+Ejq4yKb%qFw0?|2escKXPv2+NgIr{?u8 zKl*EmUaiZmxo=Z#o%l8u6|mgy`5s|uyS@Hif7kX+?qzl#Gp?`Nn-RasQSeq~Q;^v< ziHd%|-*#M7+$O}+K6R)28X2oRk+M>cz6qP{@0~hm)NZ_OPBV9eq;~b1oG9b>b2H|a zJ(xhfKT7H_iWtK7EpZQfx zRc`)P`}C?6qAFA4rbK1><=!;=uKf7OO8%;irmruzC_qZ8D+w27`TSpF9(eV}+JrND ztt-R?0!?o*B};DH^!MQ*m#`2k6BDCpC-0p+RsX_z?%6csc?gLBBx0_AhXnmV|?4b6c*=idkV$%u|)1NbxT+Odu$}F_@ z;?1?@fB$VP>fK$HcA|V?dXnBYp9}j6zj0}<%9GA0=Y79dVcim+Lp#`BZ9cw6roN!O zw!HlKDZ|7kPID#owk$YvEuwP8I_})#>~@ng|5`Hqd6c&O&!c63%pWh8<_PAu`}>kT zxb#^?>c5ig!+*3x)1|*&-|*HElp~~Ve17Y?Y;EXRRUM^p>QrnUA4Ax&Qy=^0)_+K- zTXl~|cmJa0&*Fb>5sh29zAi!%QcEV@k3v+gv+|yHc6J80>=gu6bUVHIf(XZ2I=eAHFgt$98S(pY%ss#o?i?U%;F zyN-QMXU?vW<_oUjo?~aLGWP_xtZWLq^VBnz*c&>G3=H5FF}RI{Wy~7d9>SpvtQA+A z`-Pr%|MK9+^ZHM2iny|KXUW0|{-#0aOSI*?Ci62eSe-s4UHr3m(_*XjQ-cE| z=k)*V%`#lC?r}BwsY_eg>gR9ErvDA|3y7LES(Jf6`+csqcI2$K;FIh=;WsSH zec8K%xqp^u-3a&F@N&v6L#tDuwyAx@&1*AqQ|}(x<(T~Il-FwQXDw?igBy2At#!)L zZlCggwWmjJYSGL~#R2y`&E}fR`K?aLgy_tVzA3??*K<8T^?3a*sn(B;R%>&@6kcf- z6}%P<>$|h%W$DFjX9ALENq`#Ex5LcdYz=zPvCZ1(&GhZ=y=9wT2Hayd2MwBT|+`Lz3 z>MF??#?(^}if@{ip1!nJ%Q4k|!^=IE=d+z%e~9pbd=?+@UpeCK%C&#jSWVqiQ+_V| z(%GxqUlyv>Fft@OeWy}&FKo$@+V?JRA1z~KV9+k#HuZDqzkO*{>oyo&pXbZWzW&Fk4x2r!qIOxu~wQ0+xh4YOK=wupwYF@WdQ&w$`<~CRv-V$je_lD=02@E7y$3ySJi1evhcUANliGuXOsI z4I3iw##k8tEr|YCb?A$v=~&msSTKD%+Z+WgsE^F!B51l$-a=ie^ZrFkf12))clX zbXx4bU%MZy?YY1GnAkGrW$U~GQde)`G^k;C^M^=Bao0tzU6w z%lvDy+r*j;Cx-D&+_QDX^DQMg(Ko;MIy{g}ln=_~^?dx<@6OG*ylzJFlpc_K zicYVs`TOf@qISxZ^+wM=?e#6b`0skGY)|1~+l`<0K5##|>F0-el4o?P{363vI&FKg z&ge8}&UwyHzvU*Kzqey*uEon`Yd=g8Y+Kw6jh)@esT1ehZp-d_msXaRn!a_N8|Tc2 zR%>&Pzg+FqwD~KCwtJpcCL}z!uaQ|5qHAQNcIec*TMPbdne%PY+8Eo7V(Q$cOWxd^ z7gqJwH#rrQ)y>z`yuGzmQ8`5}C;uG(&V#>n{#)3-c=fH>C!$CAnfdCd^6JZx(`S~e zb>zNYy6Svr_U1`PK=tppS>;-b(+VoJGE{08l)ti&E@t{=BYW4~eLqyTLXZO>@W?!sNn3<*!C6+o(*iN02I=P9_bXUb=)X0CQ_ z=YvRxDaK9vcYkq9lw%a9Dl=qS6BL#Vpp*@%Hp1ATQ=JV2$6N69wsF)h@QG8frC=Mt z6%HsXVlxda237{1a|J5{YX!S^*Qrx4oeCFc1fO{R{Fvn&(1^lq=Y61gJH@kttf0a` zPdooi@A6=$y2V*_KGR}16}$nJS?0G-oogt&`9k-!#kU__Q994=raYY*vR^h{clz6P zrH1E0qYM!{e}-MNyS8c5M~z!CCXYb=DJq_)Jw0?o)&6CjkJskRjOb=(U^sBh~L?A;kHz|TQg%(lta}7XlrN-L)g14?fJ@YdIjq3Up*5uSbIlRS0Fic zT~l5jnSoOk*+7==C4I&f;k?yz~YW>rnvVBRFtz2bM^beUzKrfaD`w@c*C)8`qZ z7_^g9nZ7Hp>6yBdYXf+s<1dFc$fdH`Pd}ENO8ag$D_(Qj>8FppR@vK5&p%o=J9v%E z@7d=0^S-vuoXM(urb0PAjp^kd!^Fg6yy?SbDYm z1GC}oJ4{NejzvFMB>nBEr9kS_Ur`G*T3dGgd0g6gfP(@M}@C z;qT+8!qeZ~J9oC`dXM9~cW<-BzyGqlz@u$mbGP(U=mv%7yGx5F@1A{AMQD51)bjhM zww(+SFIyaS#yl)U>s#`HQ@7mqu6|`&s1>-8d8OOhn#ad_jq@UItjW`BsR`kpJ^S{% zT`${j&*qoU+nv2NCS8fU$MXgMW&Z8Ls&oAWF5fdSGy4`3F`**f%Tg@xyYl~&@u=QUZjPz}+1+VX zn%6WA>RvmOEgHSs?$pi4C)d2$?`>V4{J15qU~7)boOQQPrSa8jKXX+y{B-pm$0gP2 z9Gzj-tCf1*&e(ck^2sh=+xE~IUDNjLemvobqs*U8<{oGC?)59}|NMi`HFWE}WtSHn zoKc%k<{-%C|4f`Q;7zg zabeON(Z|A-FOHws6Se$W^{PvyOS*?#5vf`@DO zu3u}j>WHP~s~tB>R~@;bHC1Bjv6wS=!@8rY3fD)y{ zp?y2vzH`04YPG^2z0~(*lV)GayPLS{;Hk9#L8T_ApKZPorS`d}=(oz+`jV=9|Mq+g z+cw|oc(`+E!RKPuzl9YQ8#!MIUk~3`_xINZ;dduHtMe-&`ft?DC=5?|62tRHc+%P6 zMK_;@*4}^H{yiko&n}%=vXn8!ru2f4W%k~af4V=Ne|ES!?Sjy|xgXwaKHoLzX?_S3 zI60nAyp_q3?Y`D_?bU-buC;^84AWao;mh9N**p1c>gJu+X+)9Or&*-qzdVO_K)#-F<-w)`Ns z%9CBv=TcJMF1sp!X3N7x*;hja>ZWs9{$E?|zoD?~HJ|WRrnxu5%l6z5(_ZcI`nRKH zrfFDD<>PaAHXd6m^Eu{b@uJ`F_nk|BJ}LD1YTYv}VcWtjyLTs~a#s7D(mG+&XLhIm zP~Oekw{N|OS+;pC_K^_27?3-BY_6Vd|8zU(-LBaEFQQ6CTjn3>joLZ2d`8};P4_%| zB_DsCx#pbUn+)yS%-5>|FJAQ!J+&>bRNFdu_vF5W*G*PO1aZ;Rcu>3e}C-@0G>SXq8`z4w>( zvni^{kMkZj8cF9iYG_}-%=Ga3-2Y6Rapl)Sw`a&A5Lh&*t0S z)9Y^UF}s~zr?I9mYQyHztq$gYwuSFX&39}4x2~gn#m%cJRzKa6FPZ;I3pvs`@8pW$ z4Y$0ur_P$97V-J7RN3)UrDhdr`dbe0t&tIS)4MYBp%eG1oZhMBC5Q`ejcZJ3%UUis(a@u&N@PyVm=Pz5xY(FAH1#8%HpigNgO z`6hJoBZ@)0T$7z&_SM_BQzt9T_460FCBEeEQ;icFElOSll*=vqA!cD~lJd{}r0jjB zO|w6xOawPJ?sm_4^=a>$K+xz*>kRLW*ak@)xIwMPhP~XN#uvEl2yRc}ZFUl^?05IY z?&%B+4BxClEjdt=1m1WCb*;dCVNiz?K5+>ekAd0`aSuq}1|!ng(6%s!SsT(V|9$D_ zJ+qgG;X>|-yZqXR=Q;bGt*zR}$nb_`=kLT+kiQ}%wIRI=kTc58&98g-89boHz_6xg zDx)^2QvhNxe49SC{rsHThppmve;)Gh|8S@}1w3NL!*Ib&d;j;nt@UQ+<&U0d{?tAl zVL5Z^=AB2ErY2sKww(QSDbF#MlRuMsjF$e9nU;Iu)Z>>^rn9))#A-YVUbuQm%Z3v> zYvMdyMI-KCvo)Q0`ubGWxkg!ww2b5Kd(JzxUgXNQMcXBIy+3^d)wFU*|_ndy@3Yzr|@YTi*mKkuM1r@_0p_OpQ=^{ zX-58v(E~NCR=f-o3R|7lv*v1erPt~;PyfhoKAoK%_tZH^d--!N>7$R_HpZ-*b~-ZZW3#JjI|@z|c`*j8x!`-s3Ei{Odj`L~Ks>%HEdW0?2C-FBwA z@7q~N?l@dFeOIn%9v|PToOkEq_je&{7j5y|S-$@DerC4S7q=W+nfmD3mWbNl^J;_x zcS>oiR8AGzR#xNY|Cw#=9GmSexb+f>`tZ&Gi1rPf~iwx#66(eI(k$26|_#cUMKyMAi=4UOen)Z}}U zgn5>iFPr+jYgKu)$-i^0$1TG1KPA+4?dzMJ$4}ZGU3_Cplx3cXhGXhvrp0I0 zPMW&*ty|8yz3D3__3~|x{B&&2MPoDPt8eP1f4|r*Sdq2p`n9kfd*4gDX=eV_lg!b$ z|M#xP0yl*#9xjS+@4v3vW%@76WN+c4U;guwX5UVlxLC?)-y*XmlUTo*plB>`rjoR(LPIoMllX+fq&X7qQ0sWc&(mkUcgqhX-04I(=xw>D_-vk zt8NQbyYZ~*=$FvEt#9{!R$Z|Ej*Yf{r+KNi_1@^<6-i#f8<+J@j);6MZ+)tK&6--y z4K;5%>OCcI$o$C8w_Z>YT8}TD670Wu66 z!?)!pg?`^BpS#k*bk-eut44HIR}QqEB0SkCCC4;nP6=1lGYHJl86w_-V5$llxlB*Vcx*#a}nQZ5%N(Vb+W{=Tn8kwTd>#3=y^@^V6RO}I|diy0nP z=Z^nV-yghvQ|kTg=jT;@+@G9!KRF@SY1(Sr$(^@^ ztV}s2_qnG96LMH-0s4IJfABI@8C>$tEFNrY>fCo4vhZ=iLdxSL&8) z=Y(G2D7%ug{@=mJ%j;hCKV2_eob`AA*ZI|4+UgbYk+y5rhV=xL^1ijYD$x-q_ci+F zxy4iV%2aI0+2ix*$ZoT9(s zKW~;O_G}7Yxw!IviRjzjm5WSopY~gLR%)~Q42jQ$r&2%bJ-$E3-6l`*Abaew>EA`u zl?6>N{+g0{d~s-bozJ12-q-fcuDlwZ?x%j>?zJCY8|M`4yXxR!I_sW=;oUC>6!Yr3 zkJkEfzR8TpZV6c&ajlJgl8DfMzu2v>>dJYhJlh<5r;+2#w=OFIzwmZp+Qrr{70C-ja4X_vU@S6=&l9?3}vyr?%3s z%_->u(%PS`Z$#{To3Z_hi@pD~Y4_(XDO_NE{=nT0o8Ip|=yBOd=#fjk7Q|@BryXBbBE=F59auS7UJ4u2^mlYV>Tleh{+w3pAVvYTbdG zF3@SOuw$nL4u3vx|G&XOLEu~5gx$hn$4;Oh^UK53Vb5Ur)AhfifM{d#j-bmiKh$jfhc$E=drdP?th)xGj3*SwaxuHj+0oAva| zktf#oe>OX+$Z7wM&iV-u9HnN*PMzH3UTL_kW!LTpo4;;#%Uk;>`-w~# zTf@3n+TG3OdmNKqXtN(*cU^nw(+hkhTZ6PD>&4HeT9$A@9pT~ z^Ne4+CiScCw4N0g_I;{SHLE_lYD4(Lh0)VDGH#W*|83Ie~Bcw2u8qnJV!00fRQPgL-em>!duNld%a;RbOi9A76RPaI&uATK&~i zmMxLkZ+0W~%BADe*t>EjN_k z`w}6^VD)R~Ce3GUQ}3(|+ZMA((&~sw+~lKcLTe8`J!-nyS!z;TsKe>d^;6frSz20r z=vInO1$YFM-`U z>+IG|Mwfr(n2F!op0{sm>zeo3?q9Bjrd*ZEH%r|ktUY^n-}X)4To(qdHDu+{W@aef zu)AQ}^!zzH>x_@C>y`glwk7K7vBuZiijG|VIP3A-s&>04*KXZus7GXD%oQFf`<`Lvj@;qk)n>*f7x0 zGH4B@q_(q-vhreOWo2lIP4UWLx4ltbVy|g?`tw|gl>I61EsiiWOii30`7=fxl;c5} z9~8hnQx^tm`}_LZ-t2Vz#;wiF5XJ`XmS`uZf;&_jigLBni#JEcrx+ZI-MV9n_m#3p z&z(AF%=YQ_F8vy`G)Qyp`CXzX)~>DOe($1ve^2G-HPU)HLND~%?lY&t(~GX_sZA@|%yTP&b%PN@!qc`jF__|LUAw>zOL&ongqvgUt%`k^Bw(ZuY2MhR=p!%IuOciwrc09s`B8#L9Y z?JiN`8M5_~&`KIv}HrSG#f0&HICglMNt`1gL69oO2J-7?oM_udWLGF9Ar zm2<4A`-Zt(8DVi-vLm-93-xxrPuGs0xwF>X+&KBq-lP@9L4VAXkKCzsbM1>eJ+m|Q z;kwl0yUX+atCnU>DUROswCMbkl)3XFj?O+Ev|#65sjz7ZFaN*g-yiLs)N~T;!5MXH zCC-^FdU+z@{*|vKN0+C6y|6tb^0J(nzURc#c58Qq_1y{Ew6EyGsaw+-oIl^&Rk~#A z(YeOqvg@^G$IaZCeY_)MYE`MWwU(*y?!5`+S6@8IJ$-7QMD)*NNx9m;kI1Y_S;NB+ zvGZ8Q=GVrl7T23L-+X#>>!h3fp=rGvHn|@*T_dw~t=rl)R`*{&JG064s`mNPp!lD^ zzP>)3x5H@eT$zdW$CqsuRt~#!BBktC*O5CD_aA%Snd7&1N`>*p%?T-6CP&K8Epk&U z%DOrGMx?b_?v$4y3&KvM6+;$PL6TWt9b1mYrB6$f9iN6vnw;CY_=4w}H}6+fxo=p! z?W%}2_sw&bKVNOwH0k4A>zi{r46>`XuML}~@c+NdnJAFkE$h;z6{R0F-nPbS>$eLf zwqaqZS^l$1``z+aYbxI;-M??E|Jt0HHy-;%&pEtqt@2tMBQvu{lS?kIm5~Pru+-y!Wxo;(IpYH6`=KH1^ zW;l;`x9E+;34afrVrZBuoycBwdZqkd0a5+8hZdeHeKI>RPWyMWw#V58a+}q-l*^V) zTzHoYlzoe42kien@v%?VnNyP|PhLK`Wx3J&8C9pE?B>s#>pR~*Hr~J})?#loG}E^6 zZT<9;+u!$WRHD}3D?fLcR{mRA@=FsGQj*%v!fW=NX9DGRp5NzB2@4A^w=z6Ymzc_M z;1p;XE2wPa;f?(H=xBFxa(U<c*n)inYOl3;%rgdj8#Q!Yq&4C1EmBpa#Rv*ApC* zUoM}Ss0GD2WUVe};RM)K z+V59EM^m=B6+fvl+}yimWsdgo&Z!qpndjfLdChHX%v9RqvTQw+3YzPS~_*TKBIRQ{H^Kb?cMP^DyVId69S5<>jx{(p;aHo1Y(< zH4n5hfkP`~(e~9>bCq+}o&&qG`rfJ2OIPK^KTpnE`)K>8jIzB!QIO$>n=OBzSyU#! zkkG!rqwsN$w3ylI+1!fq%jNT4fBbgq?c4Ut>62PEZru3%P}7m$L0(|LJ)IVLQ#;D} z*r}~acUHA@wFIPBPgC8fqU|~D)UP#>%S!fza!yK!bPe}%^E`L!YovAZ)l(TFs;hf^ zy(Z+&J~jVrQmXZjr`q$Umb>nMm9SE7VcR_Q8gI zo9@|{m8`3bJ+{T$ds&S4wBY8&clxG&)o1Zmo$4c8=D`!j*AZ5e^QG6Gl+N$3{MXb#CoU$|8z-fn=PI5nJe~7N565}C-)l4?|GBA7_yrEtwK504 zmAI`He50XlEgQ4_@|x(#6KtnNHg|1EopVcW*}CJWV*kb5On%xUweeg_4d3=nYDx9y zW+;5#nRG1)ysWK$tK8^j6t6%v}yKb%4TD9uMniFi@{_K&ws-k^c>>N+(v!(xEPb?_j(>;}u zLHqqoP;cVnLH_)=irW5ue)IacfY#m0*DKF+WtO1 zb8dM%zG?=U0$$e6$gsg^OaHxl_qxUPPt^++7Ui?7?7ZThb#x&kD2wmzYix83KJ&7q zYSCTCR|#5`2?Z0JnHeG^wab^zV4pfe{;o8mDl;f+f*Ujp3`C6Df;QghfktY1q&$^HbM8Y<+8~yy;DZZt54?)2$`*_pbRP zzGc(ngxzzT?BWeh7wX7q*r?cP`Bom**pL;fwrQJmYWjPwN^mdh`_1B1|Ls>_#Y<({ z#6H|}SJ+g}iG6KOxld{L?x#n@<$A7LfBDI~*}=4FF8}K_)ka25yr2yuX)M+nuGcGP zeaMQuDOXcAFVS6O-hoqTjr-mUUfg>06az!V&dF=vluW$qS1kPNRB6=BSK70WTonTi zYd`(_C+22VyydM^)5K5D%3Hkl&T{*3z3Z=TsYxCzlT#E2?Q(hTSi!3u-uwJire83~ ztLNuwx7%oa`?~z@&zRKnS2hG_|9+mZ{zz%=UtS)kgA7-jdwd*b%6FfeSmkH2$_JJo}hAA###28OV_ zrm5+hd(Fbk%(FNAX3xBKujH=iiDzQdr%B&WWoY<&{_M&#Z~F2dgx{Z6^=;?#Gp$p< z@Adze^z_)8Ju$1+oZmGqYW)lO$x5vucLUrxcWw<@xn-O2MDMw)t5&R0-To%X(`d@H zTNSn@i&+^Mq@Mojojw2One@7s)9Zg;4f6c)Cf)vbpLO}-J--366I9YKDg+YitX;M_2xN|H*Y_T*0G%XY)+K^qm!>^VnaFy>8W|u4_%L zHwAGTuL@e(^8Ki;_VcE>3D)bkUb`_TaMNR_J?`@F zQ=1gb-6FN?<7>ZO4X|CVu6Fs}xC_HN|&?F{A|3>n*}&gI(}5oVI(wr=fu zZ+WX5;op{ikBlthG}Tt%yZ3>ubK!cK7ux!rx<>+L=}z-HwPRUu^SNmYqbB;gzSfc2 zxAE_in2fTOzMt3XKCOAYeVI{c_@0neKdd%YoxiPlEj`tEdGIFv^*4oiLr$ir8t)Ah zUj01lDX*^XwyLe=$FFBUf5*U3y>k7UwoUQ1q5rt-e;(xTimwgZSNvVFvqa97eXY*q z{V7vd#ELySzOmHsxc1K5^R>^XxgJmw^>$h}wY5Vs)GhtuW9hRFZ98*IrHeNmS{q}e z?r=5v=>@?z0jyr91UCO#o8v2)-8J=aIlDIVfqR=bDTm)Z)#UT+(pnuuqZ-}MMJhp; z+M^<;Z}-vYo~5>|d*`xAyAPlGwItQB{l37bkQ?tZ+)gTIufFw4FI(34bLHxp7d^vP zRjgUlpRj(W@iv~<*Hcs9N*~TyGWBfHndQe%FBS~j);{a6@{Q8S$}P{{y$DNVk!JYT zHg#@ddM(Rs$u(xIYt&a~KE05cwD1miY~!Z$FGMlpM}^6MHCdHeIboR56VS>N@qD!8^b_5bWZ!LVq(7#qrG{r%JiLH zpS(`}`ToD*{HaN<*Sx0R@;M;$rmEgm<;~pr6SlV{?J7xJFJ$Rou+=F2vDw_)*85*x z?3txGpIMZp`sAZt**>XE3=C_| z{P$x79jyYYHWN}o)hK9|5_IeeJ~ni8f`NhI3JXLhcnKV=fP3`gf3nk!)7!1)dND9C OFnGH9xvXJ$(bVBxb^fq_B)$4aVyT&MZl>AE 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 Date: Thu, 15 Feb 2024 11:48:30 +0100 Subject: [PATCH 06/35] Update change log with documentation links and missing item Change-Id: I5260192b2b07fba0d915b1fa1e0625be60b671ae Reviewed-by: Leena Miettinen Reviewed-by: --- dist/changelog/changes-13.0.0.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/dist/changelog/changes-13.0.0.md b/dist/changelog/changes-13.0.0.md index 793e47e97f2..f1199018f8b 100644 --- a/dist/changelog/changes-13.0.0.md +++ b/dist/changelog/changes-13.0.0.md @@ -18,7 +18,7 @@ What's new? ### Qt Application Manager Adds support for Qt 6 based applications with CMake for creating, building, -deploying, running, and debugging on devices that use the +deploying, running, and debugging for devices that use the [Qt Application Manager](https://doc.qt.io/QtApplicationManager/). ([Documentation](https://doc.qt.io/qtcreator/creator-overview-qtasam.html)) @@ -63,6 +63,7 @@ Editing ([QTCREATORBUG-21826](https://bugreports.qt.io/browse/QTCREATORBUG-21826)) * Improved the coding style settings by separating Clang Format and other coding style settings, and using a plain text editor for custom Clang Format settings + ([Documentation](https://doc-snapshots.qt.io/qtcreator-13.0/creator-preferences-cpp-code-style.html)) * Fixed that the class wizards used the class name for the include guard instead of the file name ([QTCREATORBUG-30140](https://bugreports.qt.io/browse/QTCREATORBUG-30140)) @@ -96,6 +97,7 @@ Editing * Added automatic setup up of language servers for `YAML`, `JSON`, and `Bash` (requires `npm`) + ([Documentation](https://doc-snapshots.qt.io/qtcreator-13.0/creator-language-servers.html#adding-language-servers)) ### Widget Designer @@ -123,6 +125,7 @@ Projects * Added a section `Vanished Targets` to `Projects` mode in case the project was configured for kits that have vanished, as a replacement for the automatic creation of "Replacement" kits + ([Documentation](https://doc-snapshots.qt.io/qtcreator-13.0/creator-how-to-activate-kits.html#copy-custom-settings-from-vanished-targets)) * Added the status of devices to the device lists ([QTCREATORBUG-20941](https://bugreports.qt.io/browse/QTCREATORBUG-20941)) * Added the `Preferences > Build & Run > General > Application environment` @@ -130,6 +133,8 @@ Projects ([QTCREATORBUG-29530](https://bugreports.qt.io/browse/QTCREATORBUG-29530)) * Added a file wizard for Qt translation (`.ts`) files ([QTCREATORBUG-29775](https://bugreports.qt.io/browse/QTCREATORBUG-29775)) +* Improved the environment settings by making the changes explicit in a + separate, text-based editor * Increased the maximum width of the target selector ([QTCREATORBUG-30038](https://bugreports.qt.io/browse/QTCREATORBUG-30038)) * Fixed that the `Left` cursor key did not always collapse the current item @@ -164,6 +169,7 @@ Projects * Added `Generate Kit` to the Python interpreter preferences for generating a Python kit with this interpreter + ([Documentation](https://doc-snapshots.qt.io/qtcreator-13.0/creator-python-development.html#create-kits-for-python-interpreters)) * Added the target setup page when loading unconfigured Python projects * Added a `requirements.txt` file to the application wizard * Fixed that the same Python interpreter could be auto-detected multiple times @@ -244,6 +250,7 @@ Platforms * Fixed deployment and running applications for iOS 17 devices (application output, debugging, and profiling are not supported) ([QTCREATORBUG-29682](https://bugreports.qt.io/browse/QTCREATORBUG-29682)) + ([Documentation](https://doc-snapshots.qt.io/qtcreator-13.0/creator-developing-ios.html)) ### Remote Linux From 3e7ef867dd55e17c9a1ccf73f3b32cdb4db883a5 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 15 Feb 2024 15:57:56 +0100 Subject: [PATCH 07/35] QmlJSPluginDumper: Prevent potential crash when no results in QFuture Ensure we don't reference non-existing QFuture's result. Change-Id: I57668390e6ca83ae30c0b1de3e3a083a344ddbaa Reviewed-by: Christian Kandeler --- src/libs/qmljs/qmljsplugindumper.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/libs/qmljs/qmljsplugindumper.cpp b/src/libs/qmljs/qmljsplugindumper.cpp index d2407bb1137..b2591fbf0ab 100644 --- a/src/libs/qmljs/qmljsplugindumper.cpp +++ b/src/libs/qmljs/qmljsplugindumper.cpp @@ -427,6 +427,10 @@ QFuture PluginDumper::loadDependencies(const FileP Utils::onFinished(loadQmlTypeDescription(dependenciesPaths), const_cast(this), [this, iface, visited](const QFuture &typesFuture) { + if (typesFuture.resultCount() == 0 || typesFuture.isCanceled()) { + iface->reportCanceled(); + return; + } PluginDumper::QmlTypeDescription typesResult = typesFuture.result(); FilePaths newDependencies = FileUtils::toFilePathList(typesResult.dependencies); From a6374bc5a9790b6784964a2175f5b44ca3fc8fc4 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 15 Feb 2024 16:49:29 +0100 Subject: [PATCH 08/35] ProjectManager: Add a hint on how to run the testSessionSwitch() Change-Id: I4852d15bb3f17dd9f2495f44376f62e85046db36 Reviewed-by: Christian Kandeler --- src/plugins/projectexplorer/projectmanager.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/projectexplorer/projectmanager.cpp b/src/plugins/projectexplorer/projectmanager.cpp index fe1e69aac02..e0cb5e2ca52 100644 --- a/src/plugins/projectexplorer/projectmanager.cpp +++ b/src/plugins/projectexplorer/projectmanager.cpp @@ -740,7 +740,8 @@ void ProjectExplorerTest::testSessionSwitch() = ProjectExplorerPlugin::openProject( FilePath::fromString(sessionSpec.projectFile.fileName())); if (openResult.errorMessage().contains("text/plain")) - QSKIP("This test requires the presence of QmakeProjectManager to be fully functional"); + QSKIP("This test requires the presence of QmakeProjectManager to be fully functional. " + "Hint: run this test with \"-load QmakeProjectManager\" option."); QVERIFY(openResult); QCOMPARE(openResult.projects().count(), 1); QVERIFY(openResult.project()); From 01f106b279845780d5fe858c46cc50177b5ea9b4 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 15 Feb 2024 16:50:58 +0100 Subject: [PATCH 09/35] DebuggerRunConfigurationAspect: Don't leak m_pythonAspect Change-Id: Icef93f08d0d24306c5f187c25cc4ca8d809a4c9f Reviewed-by: hjk --- src/plugins/debugger/debuggerrunconfigurationaspect.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/debugger/debuggerrunconfigurationaspect.cpp b/src/plugins/debugger/debuggerrunconfigurationaspect.cpp index e5a8aeb5eb6..814ca0e81b5 100644 --- a/src/plugins/debugger/debuggerrunconfigurationaspect.cpp +++ b/src/plugins/debugger/debuggerrunconfigurationaspect.cpp @@ -150,6 +150,7 @@ DebuggerRunConfigurationAspect::~DebuggerRunConfigurationAspect() { delete m_cppAspect; delete m_qmlAspect; + delete m_pythonAspect; delete m_multiProcessAspect; delete m_overrideStartupAspect; } From e3b62d0aa51dc5324ba32cb58138b0017cb97566 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 15 Feb 2024 17:10:32 +0100 Subject: [PATCH 10/35] Debugger: Make DebuggerRunConfig sub-aspects direct members Change-Id: I53979892598164b26c8fc1977b1366b0a56fa152 Reviewed-by: Jarek Kobus --- src/libs/utils/aspects.cpp | 17 ++- src/libs/utils/aspects.h | 8 +- .../debuggerrunconfigurationaspect.cpp | 123 ++++++++---------- .../debugger/debuggerrunconfigurationaspect.h | 10 +- 4 files changed, 82 insertions(+), 76 deletions(-) diff --git a/src/libs/utils/aspects.cpp b/src/libs/utils/aspects.cpp index 2098c68d1c0..b72fc2060e3 100644 --- a/src/libs/utils/aspects.cpp +++ b/src/libs/utils/aspects.cpp @@ -2518,9 +2518,20 @@ TriStateAspect::TriStateAspect(AspectContainer *container, { setDisplayStyle(DisplayStyle::ComboBox); setDefaultValue(TriState::Default); - addOption(onString.isEmpty() ? Tr::tr("Enable") : onString); - addOption(offString.isEmpty() ? Tr::tr("Disable") : offString); - addOption(defaultString.isEmpty() ? Tr::tr("Leave at Default") : defaultString); + SelectionAspect::addOption({}); + SelectionAspect::addOption({}); + SelectionAspect::addOption({}); + setOptionTexts(onString, offString, defaultString); +} + +void TriStateAspect::setOptionTexts(const QString &onString, + const QString &offString, + const QString &defaultString) +{ + QTC_ASSERT(d->m_options.size() == 3, return); + d->m_options[0].displayName = onString.isEmpty() ? Tr::tr("Enable") : onString; + d->m_options[1].displayName = offString.isEmpty() ? Tr::tr("Disable") : offString; + d->m_options[2].displayName = defaultString.isEmpty() ? Tr::tr("Leave at Default") : defaultString; } TriState TriStateAspect::value() const diff --git a/src/libs/utils/aspects.h b/src/libs/utils/aspects.h index d4d1f704e02..cb885cc495a 100644 --- a/src/libs/utils/aspects.h +++ b/src/libs/utils/aspects.h @@ -554,7 +554,6 @@ protected: void bufferToGui() override; bool guiToBuffer() override; -private: std::unique_ptr d; }; @@ -812,6 +811,13 @@ public: TriState defaultValue() const; void setDefaultValue(TriState setting); + + void setOptionTexts(const QString &onString, + const QString &offString, + const QString &defaultString); +private: + void addOption(const QString &displayName, const QString &toolTip = {}) = delete; + void addOption(const Option &option) = delete; }; class QTCREATOR_UTILS_EXPORT StringListAspect : public TypedAspect diff --git a/src/plugins/debugger/debuggerrunconfigurationaspect.cpp b/src/plugins/debugger/debuggerrunconfigurationaspect.cpp index 814ca0e81b5..1b44afd821b 100644 --- a/src/plugins/debugger/debuggerrunconfigurationaspect.cpp +++ b/src/plugins/debugger/debuggerrunconfigurationaspect.cpp @@ -26,10 +26,8 @@ #include #include -#include #include #include -#include using namespace ProjectExplorer; using namespace Utils; @@ -79,26 +77,26 @@ DebuggerRunConfigurationAspect::DebuggerRunConfigurationAspect(Target *target) const auto setSummaryText = [this, details] { QStringList items; - if (m_cppAspect->value() == TriState::Enabled) + if (m_cppAspect() == TriState::Enabled) items.append(Tr::tr("Enable C++ debugger.")); - else if (m_cppAspect->value() == TriState::Default) + else if (m_cppAspect() == TriState::Default) items.append(Tr::tr("Try to determine need for C++ debugger.")); - if (m_qmlAspect->value() == TriState::Enabled) + if (m_qmlAspect() == TriState::Enabled) items.append(Tr::tr("Enable QML debugger.")); - else if (m_qmlAspect->value() == TriState::Default) + else if (m_qmlAspect() == TriState::Default) items.append(Tr::tr("Try to determine need for QML debugger.")); - items.append(m_overrideStartupAspect->value().isEmpty() + items.append(m_overrideStartupAspect().isEmpty() ? Tr::tr("Without additional startup commands.") : Tr::tr("With additional startup commands.")); details->setSummaryText(items.join(" ")); }; setSummaryText(); - connect(m_cppAspect, &BaseAspect::changed, this, setSummaryText); - connect(m_qmlAspect, &BaseAspect::changed, this, setSummaryText); - connect(m_overrideStartupAspect, &BaseAspect::changed, this, setSummaryText); + connect(&m_cppAspect, &BaseAspect::changed, this, setSummaryText); + connect(&m_qmlAspect, &BaseAspect::changed, this, setSummaryText); + connect(&m_overrideStartupAspect, &BaseAspect::changed, this, setSummaryText); return details; }); @@ -109,63 +107,54 @@ DebuggerRunConfigurationAspect::DebuggerRunConfigurationAspect(Target *target) addDataExtractor(this, &DebuggerRunConfigurationAspect::useMultiProcess, &Data::useMultiProcess); addDataExtractor(this, &DebuggerRunConfigurationAspect::overrideStartup, &Data::overrideStartup); - m_cppAspect = new TriStateAspect(nullptr, Tr::tr("Enabled"), Tr::tr("Disabled"), Tr::tr("Automatic")); - m_cppAspect->setLabelText(Tr::tr("C++ debugger:")); - m_cppAspect->setSettingsKey("RunConfiguration.UseCppDebugger"); + m_cppAspect.setSettingsKey("RunConfiguration.UseCppDebugger"); + m_cppAspect.setLabelText(Tr::tr("C++ debugger:")); + m_cppAspect.setOptionTexts(Tr::tr("Enabled"), Tr::tr("Disabled"), Tr::tr("Automatic")); - m_qmlAspect = new TriStateAspect(nullptr, Tr::tr("Enabled"), Tr::tr("Disabled"), Tr::tr("Automatic")); - m_qmlAspect->setLabelText(Tr::tr("QML debugger:")); - m_qmlAspect->setSettingsKey("RunConfiguration.UseQmlDebugger"); + m_qmlAspect.setSettingsKey("RunConfiguration.UseQmlDebugger"); + m_qmlAspect.setLabelText(Tr::tr("QML debugger:")); + m_qmlAspect.setOptionTexts(Tr::tr("Enabled"), Tr::tr("Disabled"), Tr::tr("Automatic")); - m_pythonAspect = new TriStateAspect(nullptr, Tr::tr("Enabled"), Tr::tr("Disabled"), Tr::tr("Automatic")); - m_pythonAspect->setLabelText(Tr::tr("Python debugger:")); - m_pythonAspect->setSettingsKey("RunConfiguration.UsePythonDebugger"); + m_pythonAspect.setSettingsKey("RunConfiguration.UsePythonDebugger"); + m_pythonAspect.setLabelText(Tr::tr("Python debugger:")); + m_pythonAspect.setOptionTexts(Tr::tr("Enabled"), Tr::tr("Disabled"), Tr::tr("Automatic")); // Make sure at least one of the debuggers is set to be active. - connect(m_cppAspect, &TriStateAspect::changed, this, [this]{ - if (Utils::allOf({m_cppAspect, m_qmlAspect, m_pythonAspect}, &isDisabled)) - m_qmlAspect->setValue(TriState::Default); + connect(&m_cppAspect, &TriStateAspect::changed, this, [this] { + if (Utils::allOf({&m_cppAspect, &m_qmlAspect, &m_pythonAspect}, &isDisabled)) + m_qmlAspect.setValue(TriState::Default); }); - connect(m_qmlAspect, &TriStateAspect::changed, this, [this]{ - if (Utils::allOf({m_cppAspect, m_qmlAspect, m_pythonAspect}, &isDisabled)) - m_cppAspect->setValue(TriState::Default); + connect(&m_qmlAspect, &TriStateAspect::changed, this, [this] { + if (Utils::allOf({&m_cppAspect, &m_qmlAspect, &m_pythonAspect}, &isDisabled)) + m_cppAspect.setValue(TriState::Default); }); - connect(m_qmlAspect, &TriStateAspect::changed, this, [this] { - if (Utils::allOf({m_cppAspect, m_qmlAspect, m_pythonAspect}, &isDisabled)) - m_cppAspect->setValue(TriState::Default); + connect(&m_qmlAspect, &TriStateAspect::changed, this, [this] { + if (Utils::allOf({&m_cppAspect, &m_qmlAspect, &m_pythonAspect}, &isDisabled)) + m_cppAspect.setValue(TriState::Default); }); - m_multiProcessAspect = new BoolAspect; - m_multiProcessAspect->setSettingsKey("RunConfiguration.UseMultiProcess"); - m_multiProcessAspect->setLabel(Tr::tr("Enable Debugging of Subprocesses"), + m_multiProcessAspect.setSettingsKey("RunConfiguration.UseMultiProcess"); + m_multiProcessAspect.setLabel(Tr::tr("Enable Debugging of Subprocesses"), BoolAspect::LabelPlacement::AtCheckBox); - m_overrideStartupAspect = new StringAspect; - m_overrideStartupAspect->setSettingsKey("RunConfiguration.OverrideDebuggerStartup"); - m_overrideStartupAspect->setDisplayStyle(StringAspect::TextEditDisplay); - m_overrideStartupAspect->setLabelText(Tr::tr("Additional startup commands:")); + m_overrideStartupAspect.setSettingsKey("RunConfiguration.OverrideDebuggerStartup"); + m_overrideStartupAspect.setDisplayStyle(StringAspect::TextEditDisplay); + m_overrideStartupAspect.setLabelText(Tr::tr("Additional startup commands:")); } -DebuggerRunConfigurationAspect::~DebuggerRunConfigurationAspect() -{ - delete m_cppAspect; - delete m_qmlAspect; - delete m_pythonAspect; - delete m_multiProcessAspect; - delete m_overrideStartupAspect; -} +DebuggerRunConfigurationAspect::~DebuggerRunConfigurationAspect() = default; void DebuggerRunConfigurationAspect::setUseQmlDebugger(bool value) { - m_qmlAspect->setValue(value ? TriState::Enabled : TriState::Disabled); + m_qmlAspect.setValue(value ? TriState::Enabled : TriState::Disabled); } bool DebuggerRunConfigurationAspect::useCppDebugger() const { - if (m_cppAspect->value() == TriState::Default) + if (m_cppAspect() == TriState::Default) return m_target->project()->projectLanguages().contains( ProjectExplorer::Constants::CXX_LANGUAGE_ID); - return m_cppAspect->value() == TriState::Enabled; + return m_cppAspect() == TriState::Enabled; } static bool projectHasQmlDefines(ProjectExplorer::Project *project) @@ -185,7 +174,7 @@ static bool projectHasQmlDefines(ProjectExplorer::Project *project) bool DebuggerRunConfigurationAspect::useQmlDebugger() const { - if (m_qmlAspect->value() == TriState::Default) { + if (m_qmlAspect() == TriState::Default) { const Core::Context languages = m_target->project()->projectLanguages(); if (!languages.contains(ProjectExplorer::Constants::QMLJS_LANGUAGE_ID)) return projectHasQmlDefines(m_target->project()); @@ -199,31 +188,31 @@ bool DebuggerRunConfigurationAspect::useQmlDebugger() const return !languages.contains(ProjectExplorer::Constants::CXX_LANGUAGE_ID); } - return m_qmlAspect->value() == TriState::Enabled; + return m_qmlAspect() == TriState::Enabled; } bool DebuggerRunConfigurationAspect::usePythonDebugger() const { - if (m_pythonAspect->value() == TriState::Default) { + if (m_pythonAspect() == TriState::Default) { const Core::Context languages = m_target->project()->projectLanguages(); return languages.contains(ProjectExplorer::Constants::PYTHON_LANGUAGE_ID); } - return m_pythonAspect->value() == TriState::Enabled; + return m_pythonAspect() == TriState::Enabled; } bool DebuggerRunConfigurationAspect::useMultiProcess() const { - return m_multiProcessAspect->value(); + return m_multiProcessAspect(); } void DebuggerRunConfigurationAspect::setUseMultiProcess(bool value) { - m_multiProcessAspect->setValue(value); + m_multiProcessAspect.setValue(value); } QString DebuggerRunConfigurationAspect::overrideStartup() const { - return m_overrideStartupAspect->value(); + return m_overrideStartupAspect(); } int DebuggerRunConfigurationAspect::portsUsedByDebugger() const @@ -238,31 +227,31 @@ int DebuggerRunConfigurationAspect::portsUsedByDebugger() const void DebuggerRunConfigurationAspect::toMap(Store &map) const { - m_cppAspect->toMap(map); - m_qmlAspect->toMap(map); - m_pythonAspect->toMap(map); - m_multiProcessAspect->toMap(map); - m_overrideStartupAspect->toMap(map); + m_cppAspect.toMap(map); + m_qmlAspect.toMap(map); + m_pythonAspect.toMap(map); + m_multiProcessAspect.toMap(map); + m_overrideStartupAspect.toMap(map); // compatibility to old settings - map.insert("RunConfiguration.UseCppDebuggerAuto", m_cppAspect->value() == TriState::Default); - map.insert("RunConfiguration.UseQmlDebuggerAuto", m_qmlAspect->value() == TriState::Default); + map.insert("RunConfiguration.UseCppDebuggerAuto", m_cppAspect() == TriState::Default); + map.insert("RunConfiguration.UseQmlDebuggerAuto", m_qmlAspect() == TriState::Default); } void DebuggerRunConfigurationAspect::fromMap(const Store &map) { - m_cppAspect->fromMap(map); - m_qmlAspect->fromMap(map); - m_pythonAspect->fromMap(map); + m_cppAspect.fromMap(map); + m_qmlAspect.fromMap(map); + m_pythonAspect.fromMap(map); // respect old project settings if (map.value("RunConfiguration.UseCppDebuggerAuto", false).toBool()) - m_cppAspect->setValue(TriState::Default); + m_cppAspect.setValue(TriState::Default); if (map.value("RunConfiguration.UseQmlDebuggerAuto", false).toBool()) - m_qmlAspect->setValue(TriState::Default); + m_qmlAspect.setValue(TriState::Default); - m_multiProcessAspect->fromMap(map); - m_overrideStartupAspect->fromMap(map); + m_multiProcessAspect.fromMap(map); + m_overrideStartupAspect.fromMap(map); } } // namespace Debugger diff --git a/src/plugins/debugger/debuggerrunconfigurationaspect.h b/src/plugins/debugger/debuggerrunconfigurationaspect.h index 16bcce9f5de..5dcbbce7a5f 100644 --- a/src/plugins/debugger/debuggerrunconfigurationaspect.h +++ b/src/plugins/debugger/debuggerrunconfigurationaspect.h @@ -40,11 +40,11 @@ public: }; private: - Utils::TriStateAspect *m_cppAspect; - Utils::TriStateAspect *m_qmlAspect; - Utils::TriStateAspect *m_pythonAspect; - Utils::BoolAspect *m_multiProcessAspect; - Utils::StringAspect *m_overrideStartupAspect; + Utils::TriStateAspect m_cppAspect; + Utils::TriStateAspect m_qmlAspect; + Utils::TriStateAspect m_pythonAspect; + Utils::BoolAspect m_multiProcessAspect; + Utils::StringAspect m_overrideStartupAspect; ProjectExplorer::Target *m_target; }; From d95fa019d4bff2bbdcf148c0096970f8aca4b585 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 15 Feb 2024 17:59:57 +0100 Subject: [PATCH 11/35] PythonSettings: Don't leak running watchers Detected by memory analyzer. When shutdown comes while pythonsFromRegistry() or pythonsFromPath() is still running, the corresponding QFutureWatcher is leaked. Employ TaskTreeRunner instead. It handles the cancellation of the running tasks automatically on its destruction. Make pythonsFromRegistry() and pythonsFromPath() cancelable, by providing QPromise as a parameter and check for canceled state on every iteration. Change-Id: Iae7c7d1ed764646b8203bd7ca8b9580cb999b80c Reviewed-by: David Schulz --- src/plugins/python/pythonsettings.cpp | 81 +++++++++++++-------------- src/plugins/python/pythonsettings.h | 3 + 2 files changed, 43 insertions(+), 41 deletions(-) diff --git a/src/plugins/python/pythonsettings.cpp b/src/plugins/python/pythonsettings.cpp index f2f5975ff40..d9f5f74e9ff 100644 --- a/src/plugins/python/pythonsettings.cpp +++ b/src/plugins/python/pythonsettings.cpp @@ -53,9 +53,9 @@ #include #include +using namespace Layouting; using namespace ProjectExplorer; using namespace Utils; -using namespace Layouting; namespace Python::Internal { @@ -645,12 +645,15 @@ void PythonSettings::disableOutdatedPyls() } } -static QList pythonsFromRegistry() +static void pythonsFromRegistry(QPromise> &promise) { QList pythons; QSettings pythonRegistry("HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore", QSettings::NativeFormat); for (const QString &versionGroup : pythonRegistry.childGroups()) { + if (promise.isCanceled()) + return; + pythonRegistry.beginGroup(versionGroup); QString name = pythonRegistry.value("DisplayName").toString(); QVariant regVal = pythonRegistry.value("InstallPath/ExecutablePath"); @@ -671,14 +674,17 @@ static QList pythonsFromRegistry() } pythonRegistry.endGroup(); } - return pythons; + promise.addResult(pythons); } -static QList pythonsFromPath() +static void pythonsFromPath(QPromise> &promise) { QList pythons; if (HostOsInfo::isWindowsHost()) { for (const FilePath &executable : FilePath("python").searchAllInPath()) { + if (promise.isCanceled()) + return; + // Windows creates empty redirector files that may interfere if (executable.toFileInfo().size() == 0) continue; @@ -695,6 +701,9 @@ static QList pythonsFromPath() for (const FilePath &path : dirs) { const QDir dir(path.toString()); for (const QFileInfo &fi : dir.entryInfoList(filters)) { + if (promise.isCanceled()) + return; + const FilePath executable = FilePath::fromUserInput(fi.canonicalFilePath()); if (!used.contains(executable) && executable.exists()) { used.insert(executable); @@ -703,7 +712,7 @@ static QList pythonsFromPath() } } } - return pythons; + promise.addResult(pythons); } static QString idForPythonFromPath(const QList &pythons) @@ -732,41 +741,6 @@ static bool alreadyRegistered(const Interpreter &candidate) }); } -static void scanPath() -{ - auto watcher = new QFutureWatcher>(); - QObject::connect(watcher, &QFutureWatcher>::finished, [watcher]() { - for (const Interpreter &interpreter : watcher->result()) { - if (!alreadyRegistered(interpreter)) - settingsInstance->addInterpreter(interpreter); - } - watcher->deleteLater(); - }); - watcher->setFuture(Utils::asyncRun(pythonsFromPath)); -} - -static void scanRegistry() -{ - auto watcher = new QFutureWatcher>(); - QObject::connect(watcher, &QFutureWatcher>::finished, [watcher]() { - for (const Interpreter &interpreter : watcher->result()) { - if (!alreadyRegistered(interpreter)) - settingsInstance->addInterpreter(interpreter); - } - watcher->deleteLater(); - scanPath(); - }); - watcher->setFuture(Utils::asyncRun(pythonsFromRegistry)); -} - -static void scanSystemForInterpreters() -{ - if (Utils::HostOsInfo::isWindowsHost()) - scanRegistry(); - else - scanPath(); -} - PythonSettings::PythonSettings() { QTC_ASSERT(!settingsInstance, return); @@ -777,7 +751,32 @@ PythonSettings::PythonSettings() initFromSettings(Core::ICore::settings()); - scanSystemForInterpreters(); + const auto onRegistrySetup = [](Async> &task) { + task.setFutureSynchronizer(ExtensionSystem::PluginManager::futureSynchronizer()); + task.setConcurrentCallData(pythonsFromRegistry); + }; + const auto onPathSetup = [](Async> &task) { + task.setFutureSynchronizer(ExtensionSystem::PluginManager::futureSynchronizer()); + task.setConcurrentCallData(pythonsFromPath); + }; + const auto onTaskDone = [](const Async> &task) { + if (!task.isResultAvailable()) + return; + + const auto interpreters = task.result(); + for (const Interpreter &interpreter : interpreters) { + if (!alreadyRegistered(interpreter)) + settingsInstance->addInterpreter(interpreter); + } + }; + + const Tasking::Group recipe { + Tasking::finishAllAndSuccess, + Utils::HostOsInfo::isWindowsHost() + ? AsyncTask>(onRegistrySetup, onTaskDone) : Tasking::GroupItem({}), + AsyncTask>(onPathSetup, onTaskDone) + }; + m_taskTreeRunner.start(recipe); if (m_defaultInterpreterId.isEmpty()) m_defaultInterpreterId = idForPythonFromPath(m_interpreters); diff --git a/src/plugins/python/pythonsettings.h b/src/plugins/python/pythonsettings.h index 892069431d5..ab5d092a5ff 100644 --- a/src/plugins/python/pythonsettings.h +++ b/src/plugins/python/pythonsettings.h @@ -5,6 +5,8 @@ #include +#include + #include namespace Python::Internal { @@ -69,6 +71,7 @@ private: QString m_defaultInterpreterId; bool m_pylsEnabled = true; QString m_pylsConfiguration; + Tasking::TaskTreeRunner m_taskTreeRunner; static void saveSettings(); }; From 36241b4462f7a61ffadd3e51d6ea24ece2dbd4c9 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 15 Feb 2024 22:44:50 +0100 Subject: [PATCH 12/35] TaskTree: Add global nullItem This might be useful when using conditional operator. Might also be used in place of the default c'tor for GroupItem. Add a test for it. Change-Id: I622e5d3d94f7020dc294cf5bca643c53a0813d8a Reviewed-by: David Schulz Reviewed-by: --- src/libs/solutions/tasking/tasktree.cpp | 2 ++ src/libs/solutions/tasking/tasktree.h | 2 ++ tests/auto/solutions/tasking/tst_tasking.cpp | 19 +++++++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/src/libs/solutions/tasking/tasktree.cpp b/src/libs/solutions/tasking/tasktree.cpp index 2bbb745b527..255fe5243a8 100644 --- a/src/libs/solutions/tasking/tasktree.cpp +++ b/src/libs/solutions/tasking/tasktree.cpp @@ -1178,6 +1178,8 @@ GroupItem workflowPolicy(WorkflowPolicy policy) return Group::workflowPolicy(policy); } +const GroupItem nullItem = GroupItem({}); + const GroupItem sequential = parallelLimit(1); const GroupItem parallel = parallelLimit(0); diff --git a/src/libs/solutions/tasking/tasktree.h b/src/libs/solutions/tasking/tasktree.h index 181f91e85d1..7295c47e1ea 100644 --- a/src/libs/solutions/tasking/tasktree.h +++ b/src/libs/solutions/tasking/tasktree.h @@ -366,6 +366,8 @@ static GroupItem onGroupDone(Handler &&handler, CallDoneIf callDoneIf = CallDone TASKING_EXPORT GroupItem parallelLimit(int limit); TASKING_EXPORT GroupItem workflowPolicy(WorkflowPolicy policy); +TASKING_EXPORT extern const GroupItem nullItem; + TASKING_EXPORT extern const GroupItem sequential; TASKING_EXPORT extern const GroupItem parallel; diff --git a/tests/auto/solutions/tasking/tst_tasking.cpp b/tests/auto/solutions/tasking/tst_tasking.cpp index 477dd57a460..2c20ce14d30 100644 --- a/tests/auto/solutions/tasking/tst_tasking.cpp +++ b/tests/auto/solutions/tasking/tst_tasking.cpp @@ -2951,6 +2951,25 @@ void tst_Tasking::testTree_data() << TestData{storage, root, {}, 1, DoneWith::Success}; } + { + const auto recipe = [storage, createSuccessTask](bool withTask) { + return Group { + storage, + withTask ? createSuccessTask(1) : nullItem + }; + }; + + const Log withTaskLog { + {1, Handler::Setup}, + {1, Handler::Success} + }; + + QTest::newRow("RecipeWithTask") + << TestData{storage, recipe(true), withTaskLog, 1, DoneWith::Success}; + QTest::newRow("RecipeWithNull") + << TestData{storage, recipe(false), {}, 0, DoneWith::Success}; + } + { const auto createRoot = [=](DoneResult doneResult, CallDoneIf callDoneIf) { return Group { From f1f4422dcea46d982feaca177c7b18aedd79486a Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 15 Feb 2024 22:54:03 +0100 Subject: [PATCH 13/35] PythonSettings: Reuse Tasking::nullItem Change-Id: I50675730fa7a7e228b151213610996456a8eacf4 Reviewed-by: Reviewed-by: David Schulz --- src/plugins/python/pythonsettings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/python/pythonsettings.cpp b/src/plugins/python/pythonsettings.cpp index d9f5f74e9ff..b144f4a7e84 100644 --- a/src/plugins/python/pythonsettings.cpp +++ b/src/plugins/python/pythonsettings.cpp @@ -773,7 +773,7 @@ PythonSettings::PythonSettings() const Tasking::Group recipe { Tasking::finishAllAndSuccess, Utils::HostOsInfo::isWindowsHost() - ? AsyncTask>(onRegistrySetup, onTaskDone) : Tasking::GroupItem({}), + ? AsyncTask>(onRegistrySetup, onTaskDone) : Tasking::nullItem, AsyncTask>(onPathSetup, onTaskDone) }; m_taskTreeRunner.start(recipe); From 2ceb1e2ad7be8b4d6ec2856da97530723cde7eb8 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 13 Feb 2024 05:18:33 +0100 Subject: [PATCH 14/35] TextEditor: update ksyntaxhighlighting engine to v5.249.0 Task-number: QTCREATORBUG-22558 Change-Id: I0f75fd00828992df37f596148fac98069794248e Reviewed-by: Christian Stenger --- qt_attributions.json | 28 +- .../syntax-highlighting/CMakeLists.txt | 3 +- .../ksyntaxhighlighting_version.h | 14 +- .../src/lib/ksyntaxhighlighting_export.h | 115 +- .../data/generators/Pipfile | 1 + .../data/generators/cmake.xml.tpl | 27 +- .../data/generators/cmake.yaml | 354 ++- .../data/generators/generate-cmake-syntax.py | 242 +- .../data/generators/generate-html.pl | 143 ++ .../data/generators/generate-nginx-lists.rb | 55 + .../data/generators/generate-php.pl | 78 - .../data/generators/spdx-comments.xml.tpl | 2 +- .../data/generators/update_css_and_scss.py | 498 ++++ .../data/generators/update_less.py | 45 + .../data/schema/language.xsd | 103 +- .../data/schema/validatehl.sh | 3 +- .../syntax-highlighting/data/syntax/alert.xml | 6 +- .../syntax-highlighting/data/syntax/bash.xml | 50 +- .../syntax-highlighting/data/syntax/cmake.xml | 355 ++- .../data/syntax/comments.xml | 2 +- .../syntax-highlighting/data/syntax/css.xml | 2028 +++++++++-------- .../data/syntax/doxygen.xml | 7 +- .../syntax-highlighting/data/syntax/dtd.xml | 2 +- .../data/syntax/gnuassembler.xml | 2 +- .../syntax-highlighting/data/syntax/html.xml | 190 +- .../syntax-highlighting/data/syntax/ini.xml | 4 +- .../syntax-highlighting/data/syntax/java.xml | 40 +- .../data/syntax/javadoc.xml | 4 +- .../syntax-highlighting/data/syntax/json.xml | 22 +- .../data/syntax/markdown.xml | 123 +- .../data/syntax/modelines.xml | 2 +- .../syntax-highlighting/data/syntax/perl.xml | 2 +- .../data/syntax/powershell.xml | 276 ++- .../data/syntax/qdocconf.xml | 2 +- .../syntax-highlighting/data/syntax/ruby.xml | 12 +- .../data/syntax/spdx-comments.xml | 2 +- .../syntax-highlighting/data/syntax/toml.xml | 183 ++ .../data/syntax/valgrind-suppression.xml | 2 +- .../syntax-highlighting/data/syntax/xml.xml | 4 +- .../syntax-highlighting/data/syntax/yacc.xml | 2 +- .../syntax-highlighting/data/syntax/yaml.xml | 642 ++++++ .../data/themes/default.theme | 174 -- .../data/themes/theme-data.qrc | 50 +- .../syntax-highlighting/src/CMakeLists.txt | 4 +- .../syntax-highlighting/src/Messages.sh | 2 +- .../src/cli/CMakeLists.txt | 8 +- ...highlighter.cpp => ksyntaxhighlighter.cpp} | 70 +- .../src/indexer/CMakeLists.txt | 19 +- .../src/indexer/katehighlightingindexer.cpp | 366 ++- .../src/lib/CMakeLists.txt | 50 +- .../src/lib/abstracthighlighter.cpp | 123 +- .../src/lib/abstracthighlighter.h | 24 +- .../src/lib/abstracthighlighter_p.h | 3 +- .../src/lib/ansihighlighter.cpp | 107 +- .../src/lib/ansihighlighter.h | 34 +- .../syntax-highlighting/src/lib/context.cpp | 13 +- .../syntax-highlighting/src/lib/context_p.h | 19 +- .../src/lib/definition.cpp | 85 +- .../syntax-highlighting/src/lib/definition.h | 22 +- .../src/lib/definition_p.h | 26 +- .../src/lib/definitiondownloader.cpp | 6 +- .../src/lib/definitionref_p.h | 6 +- .../src/lib/dynamicregexpcache_p.h | 39 + .../src/lib/foldingregion.cpp | 31 +- .../src/lib/foldingregion.h | 19 +- .../syntax-highlighting/src/lib/format.cpp | 2 +- .../syntax-highlighting/src/lib/format.h | 10 +- .../syntax-highlighting/src/lib/format_p.h | 11 +- .../src/lib/highlightingdata.cpp | 1 + .../src/lib/highlightingdata_p.hpp | 1 + .../src/lib/htmlhighlighter.cpp | 153 +- .../src/lib/htmlhighlighter.h | 7 +- .../src/lib/keywordlist.cpp | 7 +- .../src/lib/matchresult_p.h | 6 +- .../src/lib/repository.cpp | 76 +- .../syntax-highlighting/src/lib/repository.h | 66 +- .../src/lib/repository_p.h | 26 +- .../syntax-highlighting/src/lib/rule.cpp | 105 +- .../syntax-highlighting/src/lib/rule_p.h | 55 +- .../syntax-highlighting/src/lib/state.cpp | 81 +- .../syntax-highlighting/src/lib/state.h | 14 +- .../syntax-highlighting/src/lib/state_p.h | 56 +- .../src/lib/syntaxhighlighter.cpp | 141 +- .../src/lib/syntaxhighlighter.h | 1 + .../syntax-highlighting/src/lib/theme.cpp | 2 + .../syntax-highlighting/src/lib/theme.h | 9 +- .../syntax-highlighting/src/lib/themedata.cpp | 54 +- .../syntax-highlighting/src/lib/themedata_p.h | 11 +- .../src/lib/worddelimiters.cpp | 6 + .../src/lib/worddelimiters_p.h | 5 + .../src/quick/CMakeLists.txt | 5 +- .../src/quick/kquicksyntaxhighlighter.cpp | 14 +- .../src/quick/kquicksyntaxhighlighter.h | 10 +- .../quick/kquicksyntaxhighlightingplugin.cpp | 20 +- .../src/quick/repositorywrapper.cpp | 65 - .../src/quick/repositorywrapper.h | 45 - .../syntax-highlighting.qbs | 3 +- 97 files changed, 5300 insertions(+), 2743 deletions(-) create mode 100644 src/libs/3rdparty/syntax-highlighting/data/generators/generate-html.pl create mode 100644 src/libs/3rdparty/syntax-highlighting/data/generators/generate-nginx-lists.rb delete mode 100644 src/libs/3rdparty/syntax-highlighting/data/generators/generate-php.pl create mode 100644 src/libs/3rdparty/syntax-highlighting/data/generators/update_css_and_scss.py create mode 100644 src/libs/3rdparty/syntax-highlighting/data/generators/update_less.py create mode 100644 src/libs/3rdparty/syntax-highlighting/data/syntax/toml.xml create mode 100644 src/libs/3rdparty/syntax-highlighting/data/syntax/yaml.xml delete mode 100644 src/libs/3rdparty/syntax-highlighting/data/themes/default.theme rename src/libs/3rdparty/syntax-highlighting/src/cli/{kate-syntax-highlighter.cpp => ksyntaxhighlighter.cpp} (77%) create mode 100644 src/libs/3rdparty/syntax-highlighting/src/lib/dynamicregexpcache_p.h delete mode 100644 src/libs/3rdparty/syntax-highlighting/src/quick/repositorywrapper.cpp delete mode 100644 src/libs/3rdparty/syntax-highlighting/src/quick/repositorywrapper.h diff --git a/qt_attributions.json b/qt_attributions.json index 2a2a866b110..0a9e762dae1 100644 --- a/qt_attributions.json +++ b/qt_attributions.json @@ -258,9 +258,22 @@ "Description": "Syntax highlighting definition ruby.xml", "Homepage": "https://invent.kde.org/frameworks/syntax-highlighting/-/tree/master/data/syntax", "License": "GNU Lesser General Public License v2.0 or later", - "LicenseFile": "doc/qtcreator/src/overview/license-LGPLv2.1.txt", + "LicenseFile": "doc/qtcreator/src/overview/license-LGPLv2.0.txt", "Copyright": "Copyright (C) 2004 by Sebastian Vuorinen (sebastian dot vuorinen at helsinki dot fi). Copyright (C) 2004 by Stefan Lang (langstefan@gmx.at). Copyright (C) 2008 by Robin Pedersen (robinpeder@gmail.com). Copyright (C) 2011 by Miquel Sabaté (mikisabate@gmail.com)." }, + { + "Id": "ksyntaxhighlighting-toml", + "Name": "KSyntaxHighlighting: toml.xml", + "QDocModule": "qtcreator", + "QtParts": ["tools"], + "QtUsage": "Used for the generic highlighter for text files.", + "Path": "src/libs/3rdparty/syntax-highlighting/data/syntax", + "Description": "Syntax highlighting definition toml.xml", + "Homepage": "https://invent.kde.org/frameworks/syntax-highlighting/-/tree/master/data/syntax", + "License": "GNU Lesser General Public License v2.0", + "LicenseFile": "doc/qtcreator/src/overview/license-LGPLv2.0.txt", + "Copyright": "Copyright (C) flying-sheep@web.de" + }, { "Id": "ksyntaxhighlighting-valgrind-suppression", "Name": "KSyntaxHighlighting: valgrind-suppression.xml", @@ -300,6 +313,19 @@ "LicenseFile": "doc/qtcreator/src/overview/license-LGPLv2.1.txt", "Copyright": "Copyright (C) 2004, Jan Villat . Changes by: 2018 Nibaldo González , 2007 Sebastian Pipping ." }, + { + "Id": "ksyntaxhighlighting-yaml", + "Name": "KSyntaxHighlighting: yaml.xml", + "QDocModule": "qtcreator", + "QtParts": ["tools"], + "QtUsage": "Used for the generic highlighter for text files.", + "Path": "src/libs/3rdparty/syntax-highlighting/data/syntax", + "Description": "Syntax highlighting definition yaml.xml", + "Homepage": "https://invent.kde.org/frameworks/syntax-highlighting/-/tree/master/data/syntax", + "License": "GNU Lesser General Public License v2.1", + "LicenseFile": "doc/qtcreator/src/overview/license-LGPLv2.1.txt", + "Copyright": "Copyright (C) Dr Orlovsky MA (dr.orlovsky@gmail.com), Nibaldo González (nibgonz@gmail.com)" + }, { "Id": "std-span-martinmoene", "Name": "std::span Implementation for C++11 and Later", diff --git a/src/libs/3rdparty/syntax-highlighting/CMakeLists.txt b/src/libs/3rdparty/syntax-highlighting/CMakeLists.txt index 66c1d919512..ce22946d84f 100644 --- a/src/libs/3rdparty/syntax-highlighting/CMakeLists.txt +++ b/src/libs/3rdparty/syntax-highlighting/CMakeLists.txt @@ -26,6 +26,7 @@ add_qtc_library(KSyntaxHighlighting src/lib/definitiondownloader.cpp src/lib/definitiondownloader.h src/lib/definitionref_p.h src/lib/definition_p.h + src/lib/dynamicregexpcache_p.h src/lib/foldingregion.cpp src/lib/foldingregion.h src/lib/format.cpp src/lib/format.h src/lib/format_p.h src/lib/htmlhighlighter.cpp src/lib/htmlhighlighter.h @@ -44,7 +45,7 @@ add_qtc_library(KSyntaxHighlighting src/lib/xml_p.h ) -set(export_symbol_declaration DEFINES KF5SyntaxHighlighting_EXPORTS) +set(export_symbol_declaration DEFINES KF6SyntaxHighlighting_EXPORTS) if (QTC_STATIC_BUILD) set(export_symbol_declaration PUBLIC_DEFINES KSYNTAXHIGHLIGHTING_STATIC_DEFINE) endif() diff --git a/src/libs/3rdparty/syntax-highlighting/autogenerated/ksyntaxhighlighting_version.h b/src/libs/3rdparty/syntax-highlighting/autogenerated/ksyntaxhighlighting_version.h index 007fe4acae3..d568d1813d6 100644 --- a/src/libs/3rdparty/syntax-highlighting/autogenerated/ksyntaxhighlighting_version.h +++ b/src/libs/3rdparty/syntax-highlighting/autogenerated/ksyntaxhighlighting_version.h @@ -1,12 +1,12 @@ // This file was generated by ecm_setup_version(): DO NOT EDIT! -#ifndef SyntaxHighlighting_VERSION_H -#define SyntaxHighlighting_VERSION_H +#ifndef KSYNTAXHIGHLIGHTING_VERSION_H +#define KSYNTAXHIGHLIGHTING_VERSION_H -#define SyntaxHighlighting_VERSION_STRING "5.103.0" -#define SyntaxHighlighting_VERSION_MAJOR 5 -#define SyntaxHighlighting_VERSION_MINOR 103 -#define SyntaxHighlighting_VERSION_PATCH 0 -#define SyntaxHighlighting_VERSION ((5<<16)|(103<<8)|(0)) +#define KSYNTAXHIGHLIGHTING_VERSION_STRING "5.249.0" +#define KSYNTAXHIGHLIGHTING_VERSION_MAJOR 5 +#define KSYNTAXHIGHLIGHTING_VERSION_MINOR 249 +#define KSYNTAXHIGHLIGHTING_VERSION_PATCH 0 +#define KSYNTAXHIGHLIGHTING_VERSION ((5<<16)|(249<<8)|(0)) #endif diff --git a/src/libs/3rdparty/syntax-highlighting/autogenerated/src/lib/ksyntaxhighlighting_export.h b/src/libs/3rdparty/syntax-highlighting/autogenerated/src/lib/ksyntaxhighlighting_export.h index e376e94505e..a7b9e09afa7 100644 --- a/src/libs/3rdparty/syntax-highlighting/autogenerated/src/lib/ksyntaxhighlighting_export.h +++ b/src/libs/3rdparty/syntax-highlighting/autogenerated/src/lib/ksyntaxhighlighting_export.h @@ -2,14 +2,12 @@ #ifndef KSYNTAXHIGHLIGHTING_EXPORT_H #define KSYNTAXHIGHLIGHTING_EXPORT_H -#include - #ifdef KSYNTAXHIGHLIGHTING_STATIC_DEFINE # define KSYNTAXHIGHLIGHTING_EXPORT # define KSYNTAXHIGHLIGHTING_NO_EXPORT #else # ifndef KSYNTAXHIGHLIGHTING_EXPORT -# ifdef KF5SyntaxHighlighting_EXPORTS +# ifdef KF6SyntaxHighlighting_EXPORTS /* We are building this library */ # define KSYNTAXHIGHLIGHTING_EXPORT Q_DECL_EXPORT # else @@ -43,8 +41,6 @@ #define KSYNTAXHIGHLIGHTING_DECL_DEPRECATED_TEXT(text) __declspec(deprecated(text)) -#define ECM_GENERATEEXPORTHEADER_VERSION_VALUE(major, minor, patch) ((major<<16)|(minor<<8)|(patch)) - /* Take any defaults from group settings */ #if !defined(KSYNTAXHIGHLIGHTING_NO_DEPRECATED) && !defined(KSYNTAXHIGHLIGHTING_DISABLE_DEPRECATED_BEFORE_AND_AT) # ifdef KF_NO_DEPRECATED @@ -88,7 +84,7 @@ #define KSYNTAXHIGHLIGHTING_BUILD_DEPRECATED_SINCE(major, minor) 1 #ifdef KSYNTAXHIGHLIGHTING_NO_DEPRECATED -# define KSYNTAXHIGHLIGHTING_DISABLE_DEPRECATED_BEFORE_AND_AT 0x56700 +# define KSYNTAXHIGHLIGHTING_DISABLE_DEPRECATED_BEFORE_AND_AT KSYNTAXHIGHLIGHTING_VERSION #endif #ifdef KSYNTAXHIGHLIGHTING_NO_DEPRECATED_WARNINGS # define KSYNTAXHIGHLIGHTING_DEPRECATED_WARNINGS_SINCE 0 @@ -98,7 +94,7 @@ # ifdef KSYNTAXHIGHLIGHTING_DISABLE_DEPRECATED_BEFORE_AND_AT # define KSYNTAXHIGHLIGHTING_DEPRECATED_WARNINGS_SINCE KSYNTAXHIGHLIGHTING_DISABLE_DEPRECATED_BEFORE_AND_AT # else -# define KSYNTAXHIGHLIGHTING_DEPRECATED_WARNINGS_SINCE 0x56700 +# define KSYNTAXHIGHLIGHTING_DEPRECATED_WARNINGS_SINCE KSYNTAXHIGHLIGHTING_VERSION # endif #endif @@ -107,112 +103,9 @@ #endif #ifdef KSYNTAXHIGHLIGHTING_DEPRECATED -# define KSYNTAXHIGHLIGHTING_ENABLE_DEPRECATED_SINCE(major, minor) (ECM_GENERATEEXPORTHEADER_VERSION_VALUE(major, minor, 0) > KSYNTAXHIGHLIGHTING_DISABLE_DEPRECATED_BEFORE_AND_AT) +# define KSYNTAXHIGHLIGHTING_ENABLE_DEPRECATED_SINCE(major, minor) (((major<<16)|(minor<<8)) > KSYNTAXHIGHLIGHTING_DISABLE_DEPRECATED_BEFORE_AND_AT) #else # define KSYNTAXHIGHLIGHTING_ENABLE_DEPRECATED_SINCE(major, minor) 0 #endif -#if KSYNTAXHIGHLIGHTING_DEPRECATED_WARNINGS_SINCE >= 0x55700 -# define KSYNTAXHIGHLIGHTING_DEPRECATED_VERSION_5_87(text) KSYNTAXHIGHLIGHTING_DECL_DEPRECATED_TEXT(text) -#else -# define KSYNTAXHIGHLIGHTING_DEPRECATED_VERSION_5_87(text) -#endif -#define KSYNTAXHIGHLIGHTING_DEPRECATED_VERSION_5(minor, text) KSYNTAXHIGHLIGHTING_DEPRECATED_VERSION_5_##minor(text) -#define KSYNTAXHIGHLIGHTING_DEPRECATED_VERSION(major, minor, text) KSYNTAXHIGHLIGHTING_DEPRECATED_VERSION_##major(minor, "Since "#major"."#minor". " text) -#define KSYNTAXHIGHLIGHTING_DEPRECATED_VERSION_BELATED(major, minor, textmajor, textminor, text) KSYNTAXHIGHLIGHTING_DEPRECATED_VERSION_##major(minor, "Since "#textmajor"."#textminor". " text) -// Not yet implemented for MSVC -#define KSYNTAXHIGHLIGHTING_ENUMERATOR_DEPRECATED_VERSION(major, minor, text) -#define KSYNTAXHIGHLIGHTING_ENUMERATOR_DEPRECATED_VERSION_BELATED(major, minor, textmajor, textminor, text) - #endif /* KSYNTAXHIGHLIGHTING_EXPORT_H */ - - -#ifndef ECM_GENERATEEXPORTHEADER_KSYNTAXHIGHLIGHTING_EXPORT_H -#define ECM_GENERATEEXPORTHEADER_KSYNTAXHIGHLIGHTING_EXPORT_H - - -#define KSYNTAXHIGHLIGHTING_DECL_DEPRECATED_TEXT(text) __declspec(deprecated(text)) - -#define ECM_GENERATEEXPORTHEADER_VERSION_VALUE(major, minor, patch) ((major<<16)|(minor<<8)|(patch)) - -/* Take any defaults from group settings */ -#if !defined(KSYNTAXHIGHLIGHTING_NO_DEPRECATED) && !defined(KSYNTAXHIGHLIGHTING_DISABLE_DEPRECATED_BEFORE_AND_AT) -# ifdef KF_NO_DEPRECATED -# define KSYNTAXHIGHLIGHTING_NO_DEPRECATED -# elif defined(KF_DISABLE_DEPRECATED_BEFORE_AND_AT) -# define KSYNTAXHIGHLIGHTING_DISABLE_DEPRECATED_BEFORE_AND_AT KF_DISABLE_DEPRECATED_BEFORE_AND_AT -# endif -#endif -#if !defined(KSYNTAXHIGHLIGHTING_DISABLE_DEPRECATED_BEFORE_AND_AT) && defined(KF_DISABLE_DEPRECATED_BEFORE_AND_AT) -# define KSYNTAXHIGHLIGHTING_DISABLE_DEPRECATED_BEFORE_AND_AT KF_DISABLE_DEPRECATED_BEFORE_AND_AT -#endif - -#if !defined(KSYNTAXHIGHLIGHTING_NO_DEPRECATED_WARNINGS) && !defined(KSYNTAXHIGHLIGHTING_DEPRECATED_WARNINGS_SINCE) -# ifdef KF_NO_DEPRECATED_WARNINGS -# define KSYNTAXHIGHLIGHTING_NO_DEPRECATED_WARNINGS -# elif defined(KF_DEPRECATED_WARNINGS_SINCE) -# define KSYNTAXHIGHLIGHTING_DEPRECATED_WARNINGS_SINCE KF_DEPRECATED_WARNINGS_SINCE -# endif -#endif -#if !defined(KSYNTAXHIGHLIGHTING_DEPRECATED_WARNINGS_SINCE) && defined(KF_DEPRECATED_WARNINGS_SINCE) -# define KSYNTAXHIGHLIGHTING_DEPRECATED_WARNINGS_SINCE KF_DEPRECATED_WARNINGS_SINCE -#endif - -#if defined(KSYNTAXHIGHLIGHTING_NO_DEPRECATED) -# undef KSYNTAXHIGHLIGHTING_DEPRECATED -# define KSYNTAXHIGHLIGHTING_DEPRECATED_EXPORT KSYNTAXHIGHLIGHTING_EXPORT -# define KSYNTAXHIGHLIGHTING_DEPRECATED_NO_EXPORT KSYNTAXHIGHLIGHTING_NO_EXPORT -#elif defined(KSYNTAXHIGHLIGHTING_NO_DEPRECATED_WARNINGS) -# define KSYNTAXHIGHLIGHTING_DEPRECATED -# define KSYNTAXHIGHLIGHTING_DEPRECATED_EXPORT KSYNTAXHIGHLIGHTING_EXPORT -# define KSYNTAXHIGHLIGHTING_DEPRECATED_NO_EXPORT KSYNTAXHIGHLIGHTING_NO_EXPORT -#else -# define KSYNTAXHIGHLIGHTING_DEPRECATED KSYNTAXHIGHLIGHTING_DECL_DEPRECATED -# define KSYNTAXHIGHLIGHTING_DEPRECATED_EXPORT KSYNTAXHIGHLIGHTING_DECL_DEPRECATED_EXPORT -# define KSYNTAXHIGHLIGHTING_DEPRECATED_NO_EXPORT KSYNTAXHIGHLIGHTING_DECL_DEPRECATED_NO_EXPORT -#endif - -/* No deprecated API had been removed from build */ -#define KSYNTAXHIGHLIGHTING_EXCLUDE_DEPRECATED_BEFORE_AND_AT 0 - -#define KSYNTAXHIGHLIGHTING_BUILD_DEPRECATED_SINCE(major, minor) 1 - -#ifdef KSYNTAXHIGHLIGHTING_NO_DEPRECATED -# define KSYNTAXHIGHLIGHTING_DISABLE_DEPRECATED_BEFORE_AND_AT 0x56700 -#endif -#ifdef KSYNTAXHIGHLIGHTING_NO_DEPRECATED_WARNINGS -# define KSYNTAXHIGHLIGHTING_DEPRECATED_WARNINGS_SINCE 0 -#endif - -#ifndef KSYNTAXHIGHLIGHTING_DEPRECATED_WARNINGS_SINCE -# ifdef KSYNTAXHIGHLIGHTING_DISABLE_DEPRECATED_BEFORE_AND_AT -# define KSYNTAXHIGHLIGHTING_DEPRECATED_WARNINGS_SINCE KSYNTAXHIGHLIGHTING_DISABLE_DEPRECATED_BEFORE_AND_AT -# else -# define KSYNTAXHIGHLIGHTING_DEPRECATED_WARNINGS_SINCE 0x56700 -# endif -#endif - -#ifndef KSYNTAXHIGHLIGHTING_DISABLE_DEPRECATED_BEFORE_AND_AT -# define KSYNTAXHIGHLIGHTING_DISABLE_DEPRECATED_BEFORE_AND_AT 0 -#endif - -#ifdef KSYNTAXHIGHLIGHTING_DEPRECATED -# define KSYNTAXHIGHLIGHTING_ENABLE_DEPRECATED_SINCE(major, minor) (ECM_GENERATEEXPORTHEADER_VERSION_VALUE(major, minor, 0) > KSYNTAXHIGHLIGHTING_DISABLE_DEPRECATED_BEFORE_AND_AT) -#else -# define KSYNTAXHIGHLIGHTING_ENABLE_DEPRECATED_SINCE(major, minor) 0 -#endif - -#if KSYNTAXHIGHLIGHTING_DEPRECATED_WARNINGS_SINCE >= 0x55700 -# define KSYNTAXHIGHLIGHTING_DEPRECATED_VERSION_5_87(text) KSYNTAXHIGHLIGHTING_DECL_DEPRECATED_TEXT(text) -#else -# define KSYNTAXHIGHLIGHTING_DEPRECATED_VERSION_5_87(text) -#endif -#define KSYNTAXHIGHLIGHTING_DEPRECATED_VERSION_5(minor, text) KSYNTAXHIGHLIGHTING_DEPRECATED_VERSION_5_##minor(text) -#define KSYNTAXHIGHLIGHTING_DEPRECATED_VERSION(major, minor, text) KSYNTAXHIGHLIGHTING_DEPRECATED_VERSION_##major(minor, "Since "#major"."#minor". " text) -#define KSYNTAXHIGHLIGHTING_DEPRECATED_VERSION_BELATED(major, minor, textmajor, textminor, text) KSYNTAXHIGHLIGHTING_DEPRECATED_VERSION_##major(minor, "Since "#textmajor"."#textminor". " text) -// Not yet implemented for MSVC -#define KSYNTAXHIGHLIGHTING_ENUMERATOR_DEPRECATED_VERSION(major, minor, text) -#define KSYNTAXHIGHLIGHTING_ENUMERATOR_DEPRECATED_VERSION_BELATED(major, minor, textmajor, textminor, text) - - -#endif /* ECM_GENERATEEXPORTHEADER_KSYNTAXHIGHLIGHTING_EXPORT_H */ diff --git a/src/libs/3rdparty/syntax-highlighting/data/generators/Pipfile b/src/libs/3rdparty/syntax-highlighting/data/generators/Pipfile index 8e9c570084c..227d4cd2cca 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/generators/Pipfile +++ b/src/libs/3rdparty/syntax-highlighting/data/generators/Pipfile @@ -8,4 +8,5 @@ name = "pypi" [packages] click = "~= 8.0" jinja2 = "~= 3.0" +lxml = "*" PyYAML = "*" diff --git a/src/libs/3rdparty/syntax-highlighting/data/generators/cmake.xml.tpl b/src/libs/3rdparty/syntax-highlighting/data/generators/cmake.xml.tpl index 5f57c8eeacc..48f56f7b607 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/generators/cmake.xml.tpl +++ b/src/libs/3rdparty/syntax-highlighting/data/generators/cmake.xml.tpl @@ -1,5 +1,5 @@ - @@ -12,7 +12,7 @@ SPDX-FileCopyrightText: 2004 Alexander Neundorf SPDX-FileCopyrightText: 2005 Dominik Haumann SPDX-FileCopyrightText: 2007, 2008, 2013, 2014 Matthew Woehlke - SPDX-FileCopyrightText: 2013-2015, 2017-2020 Alex Turbov + SPDX-FileCopyrightText: 2013-2015, 2017-2023 Alex Turbov SPDX-License-Identifier: LGPL-2.0-or-later --> @@ -26,7 +26,7 @@ + + + + + + + @@ -135,7 +142,7 @@ - + beginRegion="" endRegion="" /> @@ -427,11 +434,22 @@ + + + + + + + + + + + @@ -460,6 +478,7 @@ + diff --git a/src/libs/3rdparty/syntax-highlighting/data/generators/cmake.yaml b/src/libs/3rdparty/syntax-highlighting/data/generators/cmake.yaml index 624299346f9..e247237dda4 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/generators/cmake.yaml +++ b/src/libs/3rdparty/syntax-highlighting/data/generators/cmake.yaml @@ -1,4 +1,4 @@ -version: 44 +version: 50 global-properties: - ALLOW_DUPLICATE_CUSTOM_TARGETS @@ -112,11 +112,12 @@ target-properties: - AUTOGEN_BUILD_DIR - AUTOGEN_ORIGIN_DEPENDS # Since 3.14 - AUTOGEN_TARGET_DEPENDS - - AUTOMOC_COMPILER_PREDEFINES # Since ??? + - AUTOGEN_USE_SYSTEM_INCLUDE # Since 3.27 + - AUTOMOC_COMPILER_PREDEFINES # Since 3.10 - AUTOMOC_DEPEND_FILTERS - AUTOMOC_EXECUTABLE # Since 3.14 - AUTOMOC_MACRO_NAMES - - AUTOMOC_MOC_OPTIONS # Since ??? + - AUTOMOC_MOC_OPTIONS - AUTOMOC_PATH_PREFIX # Since 3.16 - AUTOMOC - AUTOUIC @@ -154,14 +155,23 @@ target-properties: - _POSTFIX - CROSSCOMPILING_EMULATOR - CUDA_ARCHITECTURES # Since 3.18 + - CUDA_CUBIN_COMPILATION # Since 3.27 + - CUDA_EXTENSIONS + - CUDA_FATBIN_COMPILATION # Since 3.27 + - CUDA_OPTIX_COMPILATION # Since 3.27 - CUDA_PTX_COMPILATION - CUDA_SEPARABLE_COMPILATION - CUDA_RESOLVE_DEVICE_SYMBOLS - CUDA_RUNTIME_LIBRARY # Since 3.17 - - CUDA_EXTENSIONS - CUDA_STANDARD - CUDA_STANDARD_REQUIRED - CXX_EXTENSIONS + - CXX_MODULE_DIRS # Since 3.28 + - CXX_MODULE_DIRS_ # Since 3.28 + - CXX_MODULE_SET # Since 3.28 + - CXX_MODULE_SET_ # Since 3.28 + - CXX_MODULE_SETS # Since 3.28 + - CXX_SCAN_FOR_MODULES # Since 3.28 - CXX_STANDARD - CXX_STANDARD_REQUIRED # - DEBUG_POSTFIX # NOTE: Handled by `_POSTFIX` @@ -170,6 +180,7 @@ target-properties: - DEPLOYMENT_REMOTE_DIRECTORY - DEPRECATION # Since 3.17 - DISABLE_PRECOMPILE_HEADERS # Since 3.16 + - DLL_NAME_WITH_SOVERSION # Since 3.27 - DOTNET_SDK # Since 3.23 - DOTNET_TARGET_FRAMEWORK # Since 3.17 - DOTNET_TARGET_FRAMEWORK_VERSION # Since 3.12 @@ -234,10 +245,12 @@ target-properties: - INSTALL_REMOVE_ENVIRONMENT_RPATH # Since 3.16 - INSTALL_RPATH - INSTALL_RPATH_USE_LINK_PATH + - INTERFACE_AUTOMOC_MACRO_NAMES # Since 3.27 - INTERFACE_AUTOUIC_OPTIONS - INTERFACE_COMPILE_DEFINITIONS - INTERFACE_COMPILE_FEATURES - INTERFACE_COMPILE_OPTIONS + - INTERFACE_CXX_MODULE_SETS # Since 3.28 - INTERFACE_HEADER_SETS # Since 3.23 - INTERFACE_HEADER_SETS_TO_VERIFY # Since 3.24 - INTERFACE_INCLUDE_DIRECTORIES @@ -261,6 +274,7 @@ target-properties: - JOB_POOL_LINK - LABELS - _CLANG_TIDY + - _CLANG_TIDY_EXPORT_FIXES_DIR # Since 3.26 - _COMPILER_LAUNCHER - _CPPCHECK # Since 3.10 - _CPPLINT @@ -451,18 +465,22 @@ test-properties: - FIXTURES_CLEANUP - FIXTURES_REQUIRED - FIXTURES_SETUP + - GENERATED_RESOURCE_SPEC_FILE # Since 3.28 - LABELS - MEASUREMENT - PASS_REGULAR_EXPRESSION - PROCESSOR_AFFINITY # Since 3.12 - PROCESSORS - REQUIRED_FILES + - RESOURCE_GROUPS # Since 3.16 - RESOURCE_LOCK - RUN_SERIAL - SKIP_REGULAR_EXPRESSION # Since 3.16 - SKIP_RETURN_CODE - TIMEOUT - TIMEOUT_AFTER_MATCH + - TIMEOUT_SIGNAL_GRACE_PERIOD # Since 3.27 + - TIMEOUT_SIGNAL_NAME # Since 3.27 - WILL_FAIL - WORKING_DIRECTORY @@ -473,6 +491,7 @@ source-properties: - COMPILE_DEFINITIONS - COMPILE_FLAGS - COMPILE_OPTIONS # Since 3.11 + - CXX_SCAN_FOR_MODULES # Since 3.28 - EXTERNAL_OBJECT - Fortran_FORMAT - Fortran_PREPROCESS # Since 3.18 @@ -490,6 +509,7 @@ source-properties: - SKIP_AUTOMOC - SKIP_AUTORCC - SKIP_AUTOUIC + - SKIP_LINTING # Since 3.27 - SKIP_PRECOMPILE_HEADERS # Since 3.16 - SKIP_UNITY_BUILD_INCLUSION # Since 3.16 - Swift_DEPENDENCIES_FILE # Since 3.15 @@ -535,76 +555,155 @@ install-properties: - CPACK_WIX_ACL generator-expressions: - # Boolean Generator Expressions - # * Logical Operators + # Conditional Expressions + - IF - 0 - 1 - BOOL + # Logical Operators - AND - OR - NOT - # * String Comparisons + # String Comparisons - STREQUAL - EQUAL - - IN_LIST # Since 3.12 + # Version Comparisons - VERSION_LESS - VERSION_GREATER - VERSION_EQUAL - VERSION_LESS_EQUAL - VERSION_GREATER_EQUAL - # * Path Comparisons - - PATH_EQUAL # Since 3.24 - # * Path Queries - # * Path Decomposition - # * Path Transformations - # TODO Need a bit deeper genex parsing to get sub-commands of `PATH` - - PATH # Since 3.24 - # * Variable Queries - - TARGET_EXISTS # Since 3.12 - - CONFIG - - PLATFORM_ID - - C_COMPILER_ID - - CXX_COMPILER_ID - - CUDA_COMPILER_ID # Since 3.15 - - Fortran_COMPILER_ID - - C_COMPILER_VERSION - - CXX_COMPILER_VERSION - - CUDA_COMPILER_VERSION # Since 3.15 - - Fortran_COMPILER_VERSION - - TARGET_POLICY - - COMPILE_FEATURES - - COMPILE_LANG_AND_ID # Since 3.15 - - COMPILE_LANGUAGE - - LINK_LANG_AND_ID # Since 3.18 - - LINK_LANGUAGE # Since 3.18 - - DEVICE_LINK # Since 3.18 - - HOST_LINK # Since 3.18 - - LINK_LIBRARY # Since 3.24 - - LINK_GROUP # Since 3.24 - # String-Valued Generator Expressions - # * Escaped Characters - - ANGLE-R - - COMMA - - SEMICOLON - # * Conditional Expressions - - IF - # * String Transformations + # String Transformations + - LOWER_CASE + - UPPER_CASE + - MAKE_C_IDENTIFIER + # List Expressions + # * List Comparisons + - IN_LIST # Since 3.12 + - name: LIST # Since 3.27 + subcommands: + # * List Queries + - LENGTH + - GET + - SUBLIST + - FIND + # * List Transformations + - JOIN + - APPEND + - PREPEND + - INSERT + - POP_BACK + - POP_FRONT + - REMOVE_ITEM + - REMOVE_AT + - REMOVE_DUPLICATES + - FILTER + - TRANSFORM + - FRANSFORM + # * List Ordering + - REVERSE + - SORT - JOIN - REMOVE_DUPLICATES # Since 3.15 - FILTER # Since 3.15 - - LOWER_CASE - - UPPER_CASE - - GENEX_EVAL # Since 3.12 - - TARGET_GENEX_EVAL # Since 3.12 - # * Variable Queries (NOTE Already included above) - # * Target-Dependent Queries + # Path Expressions + # * Path Comparisons + - PATH_EQUAL # Since 3.24 + - name: PATH # Since 3.24 + subcommands: + # * Path Queries + - HAS_ROOT_NAME + - HAS_ROOT_DIRECTORY + - HAS_ROOT_PATH + - HAS_FILENAME + - HAS_EXTENSION + - HAS_STEM + - HAS_RELATIVE_PART + - HAS_PARENT_PATH + - IS_ABSOLUTE + - IS_RELATIVE + - IS_PREFIX + # * Path Decomposition + - GET_ROOT_NAME + - GET_ROOT_DIRECTORY + - GET_ROOT_PATH + - GET_FILENAME + - GET_EXTENSION + - GET_STEM + - GET_RELATIVE_PART + - GET_PARENT_PATH + # * Path Transformations + - CMAKE_PATH + - APPEND + - REMOVE_FILENAME + - REPLACE_FILENAME + - REMOVE_EXTENSION + - REPLACE_EXTENSION + - NORMAL_PATH + - RELATIVE_PATH + - ABSOLUTE_PATH + # Shell Paths + - SHELL_PATH + # Configuration Expressions + - CONFIG + - OUTPUT_CONFIG # Since 3.20 + - COMMAND_CONFIG # Since 3.20 + # Toolchain And Language Expressions + # * Platform + - PLATFORM_ID + # * Compiler Version + - C_COMPILER_VERSION + - CXX_COMPILER_VERSION + - CUDA_COMPILER_VERSION # Since 3.15 + - OBJC_COMPILER_VERSION # Since 3.16 + - OBJCXX_COMPILER_VERSION # Since 3.16 + - Fortran_COMPILER_VERSION + - HIP_COMPILER_VERSION # Since 3.21 + - ISPC_COMPILER_VERSION # Since 3.19 + # * Compiler Language And ID + - C_COMPILER_ID + - CXX_COMPILER_ID + - CUDA_COMPILER_ID # Since 3.15 + - OBJC_COMPILER_ID # Since 3.16 + - OBJCXX_COMPILER_ID # Since 3.16 + - Fortran_COMPILER_ID + - HIP_COMPILER_ID # Since 3.21 + - ISPC_COMPILER_ID # Since 3.19 + - COMPILE_LANGUAGE # Since 3.3 + - COMPILE_LANG_AND_ID # Since 3.15 + # * Compile Features + - COMPILE_FEATURES + # * Compile Context + - COMPILE_ONLY # Since 3.27 + # * Linker Language And ID + - LINK_LANGUAGE # Since 3.18 + - LINK_LANG_AND_ID # Since 3.18 + # * Link Features + - LINK_LIBRARY # Since 3.24 + - LINK_GROUP # Since 3.24 + # * Link Context + - LINK_ONLY + - DEVICE_LINK # Since 3.18 + - HOST_LINK # Since 3.18 + # Target-Dependent Expressions + - TARGET_EXISTS # Since 3.12 - TARGET_NAME_IF_EXISTS # Since 3.12 + - TARGET_NAME + - TARGET_PROPERTY + - TARGET_OBJECTS + - TARGET_POLICY - TARGET_FILE - TARGET_FILE_BASE_NAME # Since 3.15 - TARGET_FILE_PREFIX # Since 3.15 - TARGET_FILE_SUFFIX # Since 3.15 - TARGET_FILE_NAME - TARGET_FILE_DIR + - TARGET_IMPORT_FILE # Since 3.27 + - TARGET_IMPORT_FILE_BASE_NAME # Since 3.27 + - TARGET_IMPORT_FILE_PREFIX # Since 3.27 + - TARGET_IMPORT_FILE_SUFFIX # Since 3.27 + - TARGET_IMPORT_FILE_NAME # Since 3.27 + - TARGET_IMPORT_FILE_DIR # Since 3.27 - TARGET_LINKER_FILE - TARGET_LINKER_FILE_BASE_NAME # Since 3.15 - TARGET_LINKER_FILE_PREFIX # Since 3.15 @@ -612,7 +711,6 @@ generator-expressions: - TARGET_LINKER_FILE_NAME - TARGET_LINKER_FILE_DIR - TARGET_SONAME_FILE - - TARGET_SONAME_FILE - TARGET_SONAME_FILE_NAME - TARGET_SONAME_FILE_DIR - TARGET_PDB_FILE @@ -622,19 +720,22 @@ generator-expressions: - TARGET_BUNDLE_DIR_NAME # Since 3.24 - TARGET_BUNDLE_DIR - TARGET_BUNDLE_CONTENT_DIR - - TARGET_PROPERTY - TARGET_RUNTIME_DLLS # Since 3.21 - - INSTALL_PREFIX - # Output-Related Expressions - - TARGET_NAME - - LINK_ONLY + - TARGET_RUNTIME_DLL_DIRS # Since 3.27 + # Export And Install Expressions - INSTALL_INTERFACE - BUILD_INTERFACE - - MAKE_C_IDENTIFIER - - TARGET_OBJECTS - - SHELL_PATH - - OUTPUT_CONFIG # Since 3.20 - - COMMAND_CONFIG # Since 3.20 + - BUILD_LOCAL_INTERFACE # Since 3.26 + - INSTALL_PREFIX + # Multi-level Expression Evaluation + - GENEX_EVAL # Since 3.12 + - TARGET_GENEX_EVAL # Since 3.12 + # Escaped Characters + - ANGLE-R + - COMMA + - SEMICOLON + # Deprecated Expressions + # - CONFIGURATION variables: # Variables that Provide Information @@ -686,6 +787,7 @@ variables: - CMAKE_JOB_POOL_LINK - CMAKE_JOB_POOLS # Since 3.11 - CMAKE__COMPILER_AR + - CMAKE__COMPILER_FRONTEND_VARIANT # Since 3.14 - CMAKE__COMPILER_RANLIB - CMAKE_LINK_LIBRARY_SUFFIX - CMAKE_LINK_SEARCH_END_STATIC @@ -735,9 +837,17 @@ variables: - CMAKE_VS_NsightTegra_VERSION - CMAKE_VS_NUGET_PACKAGE_RESTORE # Since 3.23 - CMAKE_VS_PLATFORM_NAME + - CMAKE_VS_PLATFORM_NAME_DEFAULT # Since 3.14.3 - CMAKE_VS_PLATFORM_TOOLSET - CMAKE_VS_PLATFORM_TOOLSET_CUDA - - CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE + - CMAKE_VS_PLATFORM_TOOLSET_CUDA_CUSTOM_DIR # Since 3.16 + - CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE # Since 3.8 + - CMAKE_VS_PLATFORM_TOOLSET_VERSION # Since 3.12 + - CMAKE_VS_TARGET_FRAMEWORK_IDENTIFIER # Since 3.22 + - CMAKE_VS_TARGET_FRAMEWORK_TARGETS_VERSION # Since 3.22 + - CMAKE_VS_TARGET_FRAMEWORK_VERSION # Since 3.22 + - CMAKE_VS_VERSION_BUILD_NUMBER # Since 3.26 + - CMAKE_VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION # Since 3.27 - CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION - CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION_MAXIMUM # Since 3.19 - CMAKE_XCODE_BUILD_SYSTEM # Since 3.19 @@ -766,6 +876,7 @@ variables: # Variables that Change Behavior - BUILD_SHARED_LIBS - CMAKE_ABSOLUTE_DESTINATION_FILES + - CMAKE_ADD_CUSTOM_COMMAND_DEPENDS_EXPLICIT_ONLY # Since 3.27 - CMAKE_APPBUNDLE_PATH - CMAKE_AUTOMOC_RELAXED_MODE - CMAKE_BACKWARDS_COMPATIBILITY @@ -973,16 +1084,20 @@ variables: - CMAKE_ARCHIVE_OUTPUT_DIRECTORY_ - CMAKE_AUTOGEN_ORIGIN_DEPENDS # Since 3.14 - CMAKE_AUTOGEN_PARALLEL + - CMAKE_AUTOGEN_USE_SYSTEM_INCLUDE # Since 3.27 - CMAKE_AUTOGEN_VERBOSE # Since 3.13 - CMAKE_AUTOMOC - CMAKE_AUTOMOC_DEPEND_FILTERS - CMAKE_AUTOMOC_MOC_OPTIONS - CMAKE_AUTOMOC_PATH_PREFIX # Since 3.16 + - CMAKE_AUTOMOC_EXECUTABLE # Since 3.27 - CMAKE_AUTORCC - CMAKE_AUTORCC_OPTIONS + - CMAKE_AUTORCC_EXECUTABLE # Since 3.27 - CMAKE_AUTOUIC - CMAKE_AUTOUIC_OPTIONS - CMAKE_AUTOUIC_SEARCH_PATHS + - CMAKE_AUTOUIC_EXECUTABLE # Since 3.27 - CMAKE_BUILD_RPATH - CMAKE_BUILD_RPATH_USE_ORIGIN # Since 3.14 - CMAKE_BUILD_WITH_INSTALL_NAME_DIR @@ -993,14 +1108,17 @@ variables: - CMAKE__POSTFIX - CMAKE_CROSS_CONFIGS # Since 3.17 - CMAKE_CTEST_ARGUMENTS # Since 3.17 - - CMAKE_CUDA_SEPARABLE_COMPILATION # Since 3.11 - CMAKE_CUDA_RESOLVE_DEVICE_SYMBOLS # Since 3.16 - CMAKE_CUDA_RUNTIME_LIBRARY # Since 3.17 + - CMAKE_CUDA_SEPARABLE_COMPILATION # Since 3.11 + - CMAKE_CXX_SCAN_FOR_MODULES # Since 3.28 - CMAKE_DEBUG_POSTFIX - CMAKE_DEFAULT_BUILD_TYPE # Since 3.17 - CMAKE_DEFAULT_CONFIGS # Since 3.17 - CMAKE_DISABLE_PRECOMPILE_HEADERS # Since 3.17 - - CMAKE_ENABLE_EXPORTS + - CMAKE_DLL_NAME_WITH_SOVERSION # Since 3.27 + # `CMAKE_ENABLE_EXPORTS` has been moved to deprecated section + - CMAKE_EXECUTABLE_ENABLE_EXPORTS # Since 3.27 - CMAKE_EXE_LINKER_FLAGS - CMAKE_EXE_LINKER_FLAGS_ - CMAKE_EXE_LINKER_FLAGS__INIT @@ -1024,8 +1142,8 @@ variables: - CMAKE_INSTALL_RPATH_USE_LINK_PATH - CMAKE_INTERPROCEDURAL_OPTIMIZATION - CMAKE_INTERPROCEDURAL_OPTIMIZATION_ - - CMAKE_IOS_INSTALL_COMBINED - CMAKE__CLANG_TIDY + - CMAKE__CLANG_TIDY_EXPORT_FIXES_DIR # Since 3.26 - CMAKE__COMPILER_LAUNCHER - CMAKE__CPPCHECK # Since 3.10 - CMAKE__CPPLINT @@ -1044,6 +1162,9 @@ variables: - CMAKE_LIBRARY_PATH_FLAG - CMAKE_LINK_DEF_FILE_FLAG - CMAKE_LINK_DEPENDS_NO_SHARED + - CMAKE_LINK_DEPENDS_USE_LINKER # Since 3.27 + - CMAKE_LINK_GROUP_USING_ # Since 3.24 + - CMAKE_LINK_GROUP_USING__SUPPORTED # Since 3.24 - CMAKE_LINK_INTERFACE_LIBRARIES - CMAKE_LINK_LIBRARY_FILE_FLAG - CMAKE_LINK_LIBRARY_FLAG @@ -1072,9 +1193,11 @@ variables: - CMAKE_PCH_INSTANTIATE_TEMPLATES # Since 3.19 - CMAKE_PDB_OUTPUT_DIRECTORY - CMAKE_PDB_OUTPUT_DIRECTORY_ + - CMAKE_PLATFORM_NO_VERSIONED_SONAME # Since 3.1 - CMAKE_POSITION_INDEPENDENT_CODE - CMAKE_RUNTIME_OUTPUT_DIRECTORY - CMAKE_RUNTIME_OUTPUT_DIRECTORY_ + - CMAKE_SHARED_LIBRARY_ENABLE_EXPORTS # Since 3.27 - CMAKE_SHARED_LINKER_FLAGS - CMAKE_SHARED_LINKER_FLAGS_ - CMAKE_SHARED_LINKER_FLAGS__INIT @@ -1095,6 +1218,10 @@ variables: - CMAKE_USE_RELATIVE_PATHS - CMAKE_VERIFY_INTERFACE_HEADER_SETS # Since 3.24 - CMAKE_VISIBILITY_INLINES_HIDDEN + - CMAKE_VS_DEBUGGER_COMMAND # Since 3.27 + - CMAKE_VS_DEBUGGER_COMMAND_ARGUMENTS # Since 3.27 + - CMAKE_VS_DEBUGGER_ENVIRONMENT # Since 3.27 + - CMAKE_VS_DEBUGGER_WORKING_DIRECTORY # Since 3.27 - CMAKE_VS_GLOBALS # Since 3.13 - CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD - CMAKE_VS_INCLUDE_PACKAGE_TO_DEFAULT_BUILD @@ -1137,6 +1264,7 @@ variables: - CMAKE_Fortran_MODOUT_FLAG - CMAKE_HIP_ARCHITECTURES # Since 3.21 - CMAKE_HIP_EXTENSIONS # Since 3.21 + - CMAKE_HIP_PLATFORM # Since 3.28 - CMAKE_HIP_STANDARD # Since 3.21 - CMAKE_HIP_STANDARD_REQUIRED # Since 3.21 - CMAKE_ISPC_HEADER_DIRECTORY # Since 3.19 @@ -1533,6 +1661,41 @@ variables: - CPACK_COMMAND_HDIUTIL - CPACK_COMMAND_SETFILE - CPACK_COMMAND_REZ + # [built-in]: CPack Inno Setup Generator (Since 3.27) + - CPACK_INNOSETUP_USE_CMAKE_BOOL_FORMAT + - CPACK_INNOSETUP_ARCHITECTURE + - CPACK_INNOSETUP_INSTALL_ROOT + - CPACK_INNOSETUP_ALLOW_CUSTOM_DIRECTORY + - CPACK_INNOSETUP_PROGRAM_MENU_FOLDER + - CPACK_INNOSETUP_LANGUAGES + - CPACK_INNOSETUP_IGNORE_LICENSE_PAGE + - CPACK_INNOSETUP_IGNORE_README_PAGE + - CPACK_INNOSETUP_PASSWORD + - CPACK_INNOSETUP_USE_MODERN_WIZARD + - CPACK_INNOSETUP_ICON_FILE + - CPACK_INNOSETUP_SETUP_ + - CPACK_INNOSETUP_CUSTOM_INSTALL_INSTRUCTIONS + - CPACK_INNOSETUP_MENU_LINKS + - CPACK_INNOSETUP_CREATE_UNINSTALL_LINK + - CPACK_INNOSETUP_RUN_EXECUTABLES + - CPACK_INNOSETUP__INSTALL_DIRECTORY + - CPACK_INNOSETUP_VERIFY_DOWNLOADS + - CPACK_INNOSETUP_EXECUTABLE + - CPACK_INNOSETUP_EXECUTABLE_ARGUMENTS + - CPACK_INNOSETUP_DEFINE_ + - CPACK_INNOSETUP_EXTRA_SCRIPTS + - CPACK_INNOSETUP_CODE_FILES + # [built-in]: CPack FreeBSD Generator (Since 3.10) + - CPACK_FREEBSD_PACKAGE_NAME + - CPACK_FREEBSD_PACKAGE_COMMENT + - CPACK_FREEBSD_PACKAGE_DESCRIPTION + - CPACK_FREEBSD_PACKAGE_WWW + - CPACK_FREEBSD_PACKAGE_LICENSE + - CPACK_FREEBSD_PACKAGE_LICENSE_LOGIC + - CPACK_FREEBSD_PACKAGE_MAINTAINER + - CPACK_FREEBSD_PACKAGE_ORIGIN + - CPACK_FREEBSD_PACKAGE_CATEGORIES + - CPACK_FREEBSD_PACKAGE_DEPS # -CPackExt (Since 3.13) - CPACK_EXTERNAL_REQUESTED_VERSIONS - CPACK_EXTERNAL_ENABLE_STAGING @@ -1970,6 +2133,7 @@ variables: - CUPS_INCLUDE_DIR # - FindCURL - CURL_NO_CURL_CMAKE + - CURL_USE_STATIC_LIBS # Since 3.28 # - FindCurses - CURSES_CFLAGS - CURSES_HAVE_CURSES_H @@ -1989,7 +2153,6 @@ variables: - CXXTEST_TESTGEN_EXECUTABLE - CXXTEST_TESTGEN_INTERPRETER # - FindCygwin - # - FindDart # - FindDCMTK # - FindDevIL # - FindDoxygen @@ -1997,6 +2160,7 @@ variables: # - FindEnvModules - EnvModules_COMMAND # - FindEXPAT + - EXPAT_USE_STATIC_LIBS # Since 3.28 # - FindFLEX - FLEX_EXECUTABLE # - FindFLTK @@ -2598,6 +2762,11 @@ deprecated-or-internal-variables: - CMAKE_OBJDUMP # Mentioned in "Deprecated and Removed Features" of release notes 3.21 - CMAKE_SYSTEM_ARCH + # Superseded by `CMAKE_EXECUTABLE_ENABLE_EXPORTS` + - CMAKE_ENABLE_EXPORTS + - CMAKE_IOS_INSTALL_COMBINED # Since 3.28 + + # https://cmake.org/cmake/help/latest/manual/cmake-env-variables.7.html # NOTE Added to syntax file version 14 at 3.15.0 version of CMake @@ -2614,6 +2783,7 @@ environment-variables: - CMAKE_COLOR_DIAGNOSTICS # Since 3.24 - CMAKE_CONFIGURATION_TYPES # Since 3.22 - CMAKE_CONFIG_TYPE + - CMAKE_CROSSCOMPILING_EMULATOR # Since 3.28 - CMAKE_EXPORT_COMPILE_COMMANDS # Since 3.17 - CMAKE_GENERATOR - CMAKE_GENERATOR_INSTANCE @@ -2657,11 +2827,13 @@ environment-variables: # Environment Variables for CTest - CMAKE_CONFIG_TYPE - CTEST_INTERACTIVE_DEBUG_MODE + - CTEST_NO_TESTS_ACTION # Since 3.26 - CTEST_OUTPUT_ON_FAILURE - CTEST_PARALLEL_LEVEL - CTEST_PROGRESS_OUTPUT - CTEST_USE_LAUNCHERS_DEFAULT - DASHBOARD_TEST_FROM_CTEST + # Environment Variables for the CMake curses interface - CCMAKE_COLORS # Here are the `find_package` specific variables described at the # https://cmake.org/cmake/help/latest/command/find_package.html @@ -2731,6 +2903,7 @@ scripting-commands: , OS_RELEASE , OS_VERSION , OS_PLATFORM + , MSYSTEM_PREFIX # Since 3.28 # Since 3.22 , DISTRIB_INFO , DISTRIB_ @@ -3380,6 +3553,8 @@ scripting-commands: , CHECK_START , CHECK_PASS , CHECK_FAIL + # Since 3.26 + , CONFIGURE_LOG ] - name: option @@ -3520,10 +3695,12 @@ project-commands: , COMMENT , DEPFILE , JOB_POOL # Since 3.15 + , JOB_SERVER_AWARE # Since 3.28 , VERBATIM , APPEND , USES_TERMINAL , COMMAND_EXPAND_LISTS + , DEPENDS_EXPLICIT_ONLY # Since 3.27 , TARGET , PRE_BUILD , PRE_LINK @@ -3543,6 +3720,7 @@ project-commands: , COMMENT , DEPFILE , JOB_POOL # Since 3.15 + , JOB_SERVER_AWARE # Since 3.28 , VERBATIM , APPEND , USES_TERMINAL @@ -3587,6 +3765,9 @@ project-commands: , TARGET ] has-target-name-after-kw: TARGET + - + name: cmake_file_api # Since 3.27 + named-args: [QUERY, API_VERSION, CODEMODEL, CACHE, CMAKEFILES, TOOLCHAINS] - name: create_test_sourcelist named-args: [EXTRA_INCLUDE, FUNCTION] @@ -3614,6 +3795,7 @@ project-commands: ASM , ASM-ATT , ASM_NASM + , ASM_MARMASM # Since 3.26 , ASM_MASM , C , CSharp @@ -3650,6 +3832,7 @@ project-commands: property-args: &get_target_property [target-properties] - name: get_test_property + named-args: [DIRECTORY] # Since 3.28 property-args: &get_test_property [test-properties] - name: include_directories @@ -3741,7 +3924,7 @@ project-commands: named-args: [AFTER, BEFORE] - name: link_libraries - named-args: [debug, optimized, general] + special-args: &link_libraries_sa [debug, optimized, general] - name: load_cache named-args: [READ_WITH_PREFIX, EXCLUDE, INCLUDE_INTERNALS] @@ -3793,7 +3976,10 @@ project-commands: first-args-are-targets?: true # NOTE Multiple target args - name: set_tests_properties - named-args: [PROPERTIES] + named-args: [ + DIRECTORY # Since 3.28 + , PROPERTIES + ] property-args: *get_test_property - name: source_group @@ -3888,6 +4074,7 @@ project-commands: , cuda_std_17 , cuda_std_20 , cuda_std_23 # Since 3.21 + , cuda_std_26 # Since 3.25 ] first-arg-is-target?: true - @@ -3913,6 +4100,7 @@ project-commands: - name: target_link_libraries named-args: *target_compile_definitions + special-args: *link_libraries_sa first-arg-is-target?: true - name: target_link_options @@ -3935,6 +4123,10 @@ project-commands: , BASE_DIRS , FILES ] + special-args: [ + HEADERS + , CXX_MODULES # Since 3.28 + ] first-arg-is-target?: true - name: try_compile @@ -3959,6 +4151,9 @@ project-commands: , SOURCE_FROM_CONTENT , SOURCE_FROM_VAR , SOURCE_FROM_FILE + # Since 3.26 + , LOG_DESCRIPTION + , NO_LOG ] - name: try_run @@ -3987,6 +4182,9 @@ project-commands: , NO_CACHE , RUN_OUTPUT_STDOUT_VARIABLE , RUN_OUTPUT_STDERR_VARIABLE + # Since 3.26 + , LOG_DESCRIPTION + , NO_LOG ] ctest-commands: @@ -4150,7 +4348,6 @@ modules: - CTestCoverageCollectGCOV - CTestScriptMode - CTestUseLaunchers - - Dart - DeployQt4 - ExternalData - ExternalProject @@ -4196,7 +4393,6 @@ modules: - FindCVS - FindCxxTest - FindCygwin - - FindDart - FindDCMTK - FindDevIL - FindDoxygen @@ -4339,6 +4535,7 @@ modules: - CMakeExpandImportedTargets - CMakeForceCompiler - CMakeParseArguments + - Dart # Since 3.27 - Documentation - MacroAddFileDependencies - TestCXXAcceptsFlag @@ -4350,6 +4547,7 @@ modules: - WriteCompilerDetectionHeader # Deprecated Find Modules - FindCUDA + - FindDart # Since 3.27 - FindPythonInterp - FindPythonLibs - FindQt @@ -4773,6 +4971,7 @@ standard-module-commands: - BUILD_IN_SOURCE - BUILD_ALWAYS - BUILD_BYPRODUCTS + - BUILD_JOB_SERVER_AWARE # Since 3.28 - INSTALL_COMMAND - TEST_COMMAND - TEST_BEFORE_INSTALL @@ -4800,6 +4999,7 @@ standard-module-commands: - INDEPENDENT_STEP_TARGETS - LIST_SEPARATOR - COMMAND + - INSTALL_BYPRODUCTS # Since 3.26 special-args: [IGNORED, OPTIONAL, REQUIRED, CHECKOUT, REBASE, REBASE_CHECKOUT] property-args: *get_target_property - name: ExternalProject_Get_Property @@ -4814,6 +5014,7 @@ standard-module-commands: - INDEPENDENT - BYPRODUCTS - ALWAYS + - JOB_SERVER_AWARE # Since 3.28 - EXCLUDE_FROM_MAIN - WORKING_DIRECTORY - LOG @@ -4901,7 +5102,10 @@ standard-module-commands: - UPDATE_DISCONNECTED - PATCH_COMMAND - SOURCE_SUBDIR + - OVERRIDE_FIND_PACKAGE + - FIND_PACKAGE_ARGS - SYSTEM + - EXCLUDE_FROM_ALL # Since 3.28 - name: FetchContent_Populate named-args: @@ -5169,7 +5373,12 @@ standard-module-commands: # FindDoxygen - name: doxygen_add_docs - named-args: [ALL, USE_STAMP_FILE, WORKING_DIRECTORY, COMMENT] + named-args: + - ALL + - USE_STAMP_FILE + - WORKING_DIRECTORY + - COMMENT + - CONFIG_FILE # Since 3.27 # FindEnvModules - name: env_module @@ -5248,6 +5457,7 @@ standard-module-commands: named-args: *pkgcm - name: pkg_get_variable + named-args: [DEFINE_VARIABLES] # Since 3.28 # FindProtobuf - name: protobuf_generate_cpp diff --git a/src/libs/3rdparty/syntax-highlighting/data/generators/generate-cmake-syntax.py b/src/libs/3rdparty/syntax-highlighting/data/generators/generate-cmake-syntax.py index f500061f47e..0d9597320ee 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/generators/generate-cmake-syntax.py +++ b/src/libs/3rdparty/syntax-highlighting/data/generators/generate-cmake-syntax.py @@ -3,25 +3,31 @@ # # Generate Kate syntax file for CMake # -# SPDX-FileCopyrightText: 2017-2020 Alex Turbov +# SPDX-FileCopyrightText: 2017-2023 Alex Turbov # # To install prerequisites: # -# $ pip install --user click jinja2 pyyaml +# $ pip install --user click jinja2 lxml pyyaml # # To use: # # $ ./generate-cmake-syntax.py cmake.yaml > ../syntax/cmake.xml # + +from __future__ import annotations + +import functools +import re +from dataclasses import dataclass, field + import click import jinja2 -import re import yaml - +import sys from lxml import etree -_TEMPLATED_NAME = re.compile('<[^>]+>') +_TEMPLATED_NAME = re.compile(r'(?:<[^>]+>)') _PROPERTY_KEYS = [ 'global-properties' , 'directory-properties' @@ -33,7 +39,7 @@ _PROPERTY_KEYS = [ ] _KW_RE_LIST = ['kw', 're'] _VAR_KIND_LIST = ['variables', 'deprecated-or-internal-variables', 'environment-variables'] -_CONTROL_FLOW_LIST = set(( +_CONTROL_FLOW_LIST = { 'break' , 'continue' , 'elseif' @@ -45,39 +51,226 @@ _CONTROL_FLOW_LIST = set(( , 'if' , 'return' , 'while' -)) + } +_VAR_REF_ENTITY = '&var_ref_re;' + +_HEURISTICS = [ + ( + {'MAX(_(COUNT|MAJOR|MINOR|PATCH|TWEAK))?', 'MIN(_(COUNT|MAJOR|MINOR|PATCH|TWEAK))?'} + , 'M(AX|IN)(_(COUNT|MAJOR|MINOR|PATCH|TWEAK))?' + ) + , ({'OUTPUTS', 'OUTPUT_(HEADER|SOURCE)'}, 'OUTPUT(S|_(HEADER|SOURCE))') + , ({'PREFIX', 'SUFFIX'}, '(PRE|SUF)FIX') + , ({'CPPCHECK', 'CPPLINT'}, 'CPP(CHECK|LINT)') + , ({'DEPENDS', 'PREDEPENDS'}, '(PRE)?DEPENDS') + , ({'ICON', 'ICONURL'}, 'ICON(URL)?') + , ( + { + '&var%ref%re;(_INIT)?' + , 'DEBUG(_INIT)?' + , 'MINSIZEREL(_INIT)?' + , 'RELEASE(_INIT)?' + , 'RELWITHDEBINFO(_INIT)?' + } + , '(DEBUG|MINSIZEREL|REL(EASE|WITHDEBINFO)|&var%ref%re;)(_INIT)?' + ) + , ({'RELEASE', 'RELWITHDEBINFO'}, 'REL(EASE|WITHDEBINFO)') + , ({'POST', 'POSTUN', 'PRE', 'PREUN'}, 'P(RE|OST)(UN)?') + , ({'AUTOPROV', 'AUTOREQ', 'AUTOREQPROV'}, 'AUTO(PROV|REQ(PROV)?)') + , ({'DEFINITIONS', 'OPTIONS'}, '(DEFINI|OP)TIONS') + , ({'LIB_NAMES', 'LIBRARY'}, 'LIB(_NAMES|RARY)') + , ({'EXTENSIONS', 'EXTRA_FLAGS'}, 'EXT(ENSIONS|RA_FLAGS)') + , ({'DISABLED', 'DISPLAY_NAME'}, 'DIS(ABLED|PLAY_NAME)') + , ({'LIBRARIES', 'LINK_LIBRARIES', 'STATIC_LINK_LIBRARIES'}, '((STATIC_)?LINK_)?LIBRARIES') + , ({'INCLUDE_DIRS', 'LIBRARY_DIRS'}, '(INCLUDE|LIBRARY)_DIRS') + , ({'BINARY_DIR', 'SOURCE_DIR'}, '(BINARY|SOURCE)_DIR') + , ({'CFLAGS(_OTHER)?', 'LDFLAGS(_OTHER)?'}, '(C|LD)FLAGS(_OTHER)?') + , ({'INCLUDE_DIRECTORIES', 'LIBRARIES'}, '(INCLUDE_DIRECTO|LIBRA)RIES') + , ({'POSTFLIGHT_&var%ref%re;_SCRIPT', 'PREFLIGHT_&var%ref%re;_SCRIPT'}, 'P(RE|OST)FLIGHT_&var%ref%re;_SCRIPT') + , ({'DIRECTORIES', 'FRAMEWORK_DIRECTORIES'}, '(FRAMEWORK_)?DIRECTORIES') + , ({'FILE_FLAG', 'FILE'}, 'FILE(_FLAG)?') + , ({'DIR_PERMISSIONS', 'FILE_PERMISSIONS'}, '(DIR|FILE)_PERMISSIONS') + , ({'COMPILER_LAUNCHER', 'LINKER_LAUNCHER'}, '(COMPIL|LINK)ER_LAUNCHER') + , ({'COMPILER', 'COMPILE_(DEFINI|OP)TIONS'}, 'COMPILE(R|_(DEFINI|OP)TIONS)') + , ({'LICENSEURL', 'LICENSE_(EXPRESSION|FILE_NAME)'}, 'LICENSE(URL|_(EXPRESSION|FILE_NAME))') + , ({'NO_SONAME', 'SONAME'}, '(NO_)?SONAME') + , ({'CODE_SIGN_ON_COPY', 'REMOVE_HEADERS_ON_COPY'}, '(CODE_SIGN|REMOVE_HEADERS)_ON_COPY') + , ({'(REFERENCE|REFERENCEPROP_&var%ref%re;_TAG)_&var%ref%re;'}, 'REFERENCE(PROP_&var%ref%re;_TAG)?_&var%ref%re;') + , ({'DISABLE_FIND_PACKAGE', 'REQUIRE_FIND_PACKAGE'}, '(DISABLE|REQUIRE)_FIND_PACKAGE') + , ( + {'GROUP_USING_&var%ref%re;(_SUPPORTED)?', 'LIBRARY_USING_&var%ref%re;(_SUPPORTED)?'} + , '(GROUP|LIBRARY)_USING_&var%ref%re;(_SUPPORTED)?' + ) + , ( + { + 'EXE_LINKER_FLAGS_&var%ref%re;(_INIT)?' + , 'MODULE_LINKER_FLAGS_&var%ref%re;(_INIT)?' + , 'SHARED_LINKER_FLAGS_&var%ref%re;(_INIT)?' + , 'STATIC_LINKER_FLAGS_&var%ref%re;(_INIT)?' + } + , '(EXE|MODULE|SHARED|STATIC)_LINKER_FLAGS_&var%ref%re;(_INIT)?' + ) + , ( + { + 'ARCHIVE_OUTPUT_DIRECTORY' + , 'COMPILE_PDB_OUTPUT_DIRECTORY' + , 'LIBRARY_OUTPUT_DIRECTORY' + , 'PDB_OUTPUT_DIRECTORY' + , 'RUNTIME_OUTPUT_DIRECTORY' + } + , '(ARCHIVE|(COMPILE_)?PDB|LIBRARY|RUNTIME)_OUTPUT_DIRECTORY' + ) + , ( + { + 'ARCHIVE_OUTPUT_(DIRECTORY|NAME)' + , 'LIBRARY_OUTPUT_(DIRECTORY|NAME)' + , 'RUNTIME_OUTPUT_(DIRECTORY|NAME)' + } + , '(ARCHIVE|LIBRARY|RUNTIME)_OUTPUT_(DIRECTORY|NAME)' + ) + , ({'ASM&var_ref_re;', 'ASM&var_ref_re;FLAGS'}, 'ASM&var_ref_re;(FLAGS)?') + , ( + { + 'CMAKE_POLICY_DEFAULT_CMP[0-9]{4}' + , 'CMAKE_POLICY_WARNING_CMP[0-9]{4}' + } + , 'CMAKE_POLICY_(DEFAULT|WARNING)_CMP[0-9]{4}' + ) + , ({'CMAKE_ARGV[0-9]+', 'CMAKE_MATCH_[0-9]+'}, 'CMAKE_(ARGV|MATCH_)[0-9]+') + ] + +@dataclass +class RePartNode: + children: dict[str, RePartNode] = field(default_factory=dict, hash=False) + is_leaf: bool = False -def try_transform_placeholder_string_to_regex(name): +@dataclass +class RegexCollection: + special_cases: list[str] = field(default_factory=list, hash=False) + re_tree: dict[str, RePartNode] = field(default_factory=dict, hash=False) + + def add_case(self, regex: str) -> RegexCollection: + self.special_cases.append(regex) + return self + + def update_tree(self, name_parts: list[str]) -> RegexCollection: + safe_var_ref = _VAR_REF_ENTITY.replace('_', '%') + current = functools.reduce( + lambda current, part: ( + self.re_tree if current is None else current.children + ).setdefault(part, RePartNode()) + , safe_var_ref.join(name_parts).replace(f'{safe_var_ref}_{safe_var_ref}', safe_var_ref).split('_') + , None + ) + current.is_leaf = True + return self + + +def try_transform_placeholder_string_to_regex(state: RegexCollection, name: str): ''' NOTE Some placeholders are not IDs, but numbers... `CMAKE_MATCH_` 4 example ''' - m = _TEMPLATED_NAME.split(name) - if 'CMAKE_MATCH_' in m: - return 'CMAKE_MATCH_[0-9]+' + name_parts = _TEMPLATED_NAME.split(name) + match name_parts: + case ['CMAKE_MATCH_' as head, ''] | ['CMAKE_ARGV' as head, ''] | ['ARGV' as head, '']: + return state.add_case(head + '[0-9]+') - if 'CMAKE_ARGV' in m: - return 'CMAKE_ARGV[0-9]+' + case ['CMAKE_POLICY_DEFAULT_CMP' as head, ''] | ['CMAKE_POLICY_WARNING_CMP' as head, '']: + return state.add_case(head + '[0-9]{4}') - if 'CMAKE_POLICY_DEFAULT_CMP' in m: - return 'CMAKE_POLICY_DEFAULT_CMP[0-9]{4}' + case ['', '__TRYRUN_OUTPUT']: + return state.add_case(f'{_VAR_REF_ENTITY}__TRYRUN_OUTPUT') - if 'CMAKE_POLICY_WARNING_CMP' in m: - return 'CMAKE_POLICY_WARNING_CMP[0-9]{4}' + case (['ASM', ''] | ['ASM', 'FLAGS']) as asm_env: + return state.add_case(f'{asm_env[0]}{_VAR_REF_ENTITY}{asm_env[1]}') - if 'ARGV' in m: - return 'ARGV[0-9]+' + return state.update_tree(name_parts) - return '&var_ref_re;'.join(m) if 1 < len(m) else name + +def is_first_subset_of_second(first, second): + subset = set(first) + fullset = set(second) + return subset.issubset(fullset) + + +def try_optimize_known_alt_groups(groups: list[str]) -> list[str]: + for case in _HEURISTICS: + if is_first_subset_of_second(case[0], groups): + groups = sorted([*filter(lambda item: item not in case[0], groups), case[1]]) + return groups + + +def try_optimize_trailing_var_ref_regex(groups: list[str]) -> list[str]: + tail_var_ref_re = '_' + _VAR_REF_ENTITY.replace('_', '%') + candidates = [*filter(lambda s: s.endswith(tail_var_ref_re), groups)] + return sorted([ + *filter(lambda item: item not in candidates, groups) + , f'({"|".join(try_optimize_known_alt_groups([s[:-len(tail_var_ref_re)] for s in candidates]))}){tail_var_ref_re}' + ]) if len(candidates) > 1 else groups + + +def build_regex(state: list[str], kv: tuple[str, RePartNode]) -> list[str]: + name, value = kv + match (value, len(value.children)): + case (RePartNode(children={}, is_leaf=True), 0): + return [*state, name] + + case (node, sz) if sz > 0: + alt_group = try_optimize_known_alt_groups( + try_optimize_trailing_var_ref_regex( + functools.reduce(build_regex, node.children.items(), []) + ) + ) + + match (len(alt_group), node.is_leaf): + case (1, False): + return [*state, f'{name}_{alt_group[0]}'] + + case (1, True): + return [*state, f'{name}(_{alt_group[0]})?'] + + case (sz, False) if sz > 0: + return [*state, f'{name}_({"|".join(alt_group)})'] + + case (sz, True) if sz > 0: + return [*state, f'{name}(_({"|".join(alt_group)}))?'] + + case _: + raise AssertionError('Zero children?') + + case _: + raise AssertionError(f'NOT MATCHED: {name=}→{value=}') + + return state def try_placeholders_to_regex(names): if not names: return None - l = map(try_transform_placeholder_string_to_regex, names) - l = sorted(l, reverse=True) - return '\\b(?:' + '|'.join(l) + ')\\b' + + data = functools.reduce( + try_transform_placeholder_string_to_regex + , names + , RegexCollection() + ) + + return ( + '\\b(?:' + + '|'.join( + try_optimize_known_alt_groups( + try_optimize_trailing_var_ref_regex( + functools.reduce( + build_regex + , data.re_tree.items() + , data.special_cases + ) + ) + ) + ).replace('%', '_') + + ')\\b' + ) def partition_iterable(fn, iterable): @@ -287,7 +480,8 @@ def cli(input_yaml, template): del data['standard-module-commands'] # Fix node names to be accessible from Jinja template - data['generator_expressions'] = data['generator-expressions'] + data['generator_expressions'] = (ex for ex in data['generator-expressions'] if isinstance(ex, str)) + data['complex_generator_expressions'] = [ex for ex in data['generator-expressions'] if not isinstance(ex, str)] data['deprecated_or_internal_variables'] = data['deprecated-or-internal-variables'] data['environment_variables'] = data['environment-variables'] del data['generator-expressions'] diff --git a/src/libs/3rdparty/syntax-highlighting/data/generators/generate-html.pl b/src/libs/3rdparty/syntax-highlighting/data/generators/generate-html.pl new file mode 100644 index 00000000000..a5b9bc9d058 --- /dev/null +++ b/src/libs/3rdparty/syntax-highlighting/data/generators/generate-html.pl @@ -0,0 +1,143 @@ +#!/usr/bin/perl + +# This perl script read stdin and write on stdout. It shall be an XML language file. +# +# * If the name of the language is 'HTML', then it creates the language 'PHP (HTML)' +# which shall be used for PHP hl. +# +# * If the name of the language is something else (say '*'), it creates the language '*/PHP'. +# This new language is the same as the old one, but is able to detect PHP everywhere. +# +# This script will correctly set extensions & mimetype, and will replace +# by +# +# Generated languages need a language named 'PHP/PHP', which shall take care of PHP hl itself +# and which will be called every time something like +# License: LGPL + +my $file = ""; + +open(my $input, '<:encoding(UTF-8)', $ARGV[0]) + or die "Could not open file '$ARGV[0]': $!"; + +open(my $output, '>:encoding(UTF-8)', $ARGV[1]) + or die "Could not open file '$ARGV[1]': $!"; + +my $language = $ARGV[1]; +if ($language =~ /-php\.xml$/) +{ + $language = "PHP"; +} +else +{ + $language = "Twig"; +} + +while (<$input>) +{ + $file .= $_; +} + +$warning = "\n\n\n"; + +$file =~ s/(?=]+)priority="[^"]*"/]+)name="[^"]*"/]+)section="[^"]*"/]+)extensions="[^"]*"/]+)mimetype="[^"]*"/]+)*/]+)extensions="[^"]*"/]+)mimetype="[^"]*"/]+)hidden="[^"]*"/]+)section="[^"]*"/]+)mimetype="[^"]*"/]+)name="([^"]*)"/]+)extensions="[^"]*"/.*?<\/list>/$1##$syntaxName<\/include><\/list>/gs; + +$file =~ s/]+)kateversion="[^"]*"///gs; + } +} +elsif ($root == 1 || $ARGV[0] =~ /mustache.xml$/) +{ + $file =~ s/<(?:RegExpr (attribute="Processing Instruction" context="PI"|context="PI" attribute="Processing Instruction")|itemData name="Processing Instruction")[^\/]+\/>|//gs; +} + +my $find_language = "##$language/$language"; +my $language_suffix = "/$language"; +if ($language eq "PHP") +{ + $find_language = "FindPHP"; +} + +$file =~ s/]*)context="([^"#]*)##(?!Alerts|Comments|Doxygen|Modelines)([^"]+)"/]*[^>\/]>)/$1\n/g; +$file =~ s/(]*[^>\/])\s*\/>/$1>\n\n<\/context>/g; + +if ($language eq "PHP") +{ + $findphp = "\n\n\n"; + $file =~ s/(?=<\/contexts\s*>)/$findphp/; +} + +print $output $file; +print $output $warning; diff --git a/src/libs/3rdparty/syntax-highlighting/data/generators/generate-nginx-lists.rb b/src/libs/3rdparty/syntax-highlighting/data/generators/generate-nginx-lists.rb new file mode 100644 index 00000000000..577dea47c4c --- /dev/null +++ b/src/libs/3rdparty/syntax-highlighting/data/generators/generate-nginx-lists.rb @@ -0,0 +1,55 @@ +#!/usr/bin/env ruby +# +# Generates the keyword lists for directives and variables used in nginx and +# prints them to stdout, ready to be copy & pasted into nginx.xml. +# +# SPDX-FileCopyrightText: 2023 Georg Gadinger +# SPDX-License-Identifier: MIT +# +# Usage: +# % ./generate-nginx-lists.rb +# +# if you want to install the required dependencies provide `INSTALL_GEMS` in +# your ENV: +# % INSTALL_GEMS=1 ./generate-nginx-lists.rb + +require "bundler/inline" + +gemfile(ENV["INSTALL_GEMS"]) do + source "https://rubygems.org" + + gem "nokogiri", "~> 1.14" + gem "faraday", "~> 2.7" + gem "builder", "~> 3.2" +end + +def fetch_vars(url) + Faraday.get(url) + .then { Nokogiri::HTML.parse _1.body } + .css("div#content a[href]") + .map(&:text) + .reject { _1.end_with?("_") } # some vars are just a prefix, ignore those + .sort + .uniq +end + +def build_xml_list(name, url: nil, items: []) + builder = Builder::XmlMarkup.new(indent: 2) + + builder.comment! "see #{url} for a full list of #{name}" + builder.list(name:) do |b| + items.each do |item| + b.item item + end + end +end + +{ + directives: "https://nginx.org/en/docs/dirindex.html", + variables: "https://nginx.org/en/docs/varindex.html", +}.each do |name, url| + items = fetch_vars(url) + + puts build_xml_list(name, url:, items:).gsub(/^/, ' ' * 4) + puts +end diff --git a/src/libs/3rdparty/syntax-highlighting/data/generators/generate-php.pl b/src/libs/3rdparty/syntax-highlighting/data/generators/generate-php.pl deleted file mode 100644 index a516332ef2f..00000000000 --- a/src/libs/3rdparty/syntax-highlighting/data/generators/generate-php.pl +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/perl - -# This perl script read stdin and write on stdout. It shall be an XML language file. -# -# * If the name of the language is 'HTML', then it creates the language 'PHP (HTML)' -# which shall be used for PHP hl. -# -# * If the name of the language is something else (say '*'), it creates the language '*/PHP'. -# This new language is the same as the old one, but is able to detect PHP everywhere. -# -# This script will correctly set extensions & mimetype, and will replace -# by -# -# Generated languages need a language named 'PHP/PHP', which shall take care of PHP hl itself -# and which will be called every time something like -# License: LGPL - -my $file = ""; - -open(my $input, '<:encoding(UTF-8)', $ARGV[0]) - or die "Could not open file '$ARGV[0]': $!"; - -open(my $output, '>:encoding(UTF-8)', $ARGV[1]) - or die "Could not open file '$ARGV[1]': $!"; - -while (<$input>) -{ - $file .= $_; -} - -$warning = "\n\n\n"; - -$file =~ s/(?=]+name="HTML"/) -{ - $root = 1; -} - -if ($root == 1) -{ - $file =~ s/]+)name="[^"]*"/]+)section="[^"]*"/]+)extensions="[^"]*"/]+)mimetype="[^"]*"/]+)*/]+hidden="[^"]*"/) { - $file =~ s/]+)name="([^"]*)"/]+)hidden="[^"]*"/]+)name="([^"]*)"/' else sep + return f'{sep}{seq}\n{end}{m[3]}' + + current_at_rules.update(item_extractor.findall(m[2])) + return m[0] + + +css_content = css_filename.read_text() +original_css_content = css_content + +names = f"{'|'.join(css_replacements)}|at-rules(?: definitions)?" +css_content = re.sub(rf'(.*?)(|)', + _css_update_and_extract_items, css_content, flags=re.DOTALL) + +_regexpr_unit_prefix = r'( None: + at_rule_added = new_at_rules - old_at_rules + at_rule_removed = old_at_rules - new_at_rules + nl = '\n ' + if at_rule_added or at_rule_removed: + print(f"""\x1b[31m{language} At-rules requires a manual update +New ({len(at_rule_added)}):\x1b[0m + {nl.join(at_rule_added)} +\x1b[31mRemoved ({len(at_rule_removed)}):\x1b[0m + {nl.join(at_rule_removed)}""") + +show_at_rule_difference('CSS', current_at_rules, at_rules) + +# +# Extract SCSS data +# + +scss_functions:list[str] = [] +scss_at_rules:set[str] = {'@content', '@return'} + +_function_list_extractor = re.compile(r'{% function (.*?) %}') +_function_extractor = re.compile(r"'([-._a-zA-Z0-9]+)\(") +_at_rule_extractor = re.compile(r'@[-a-z0-9]+') + +for md in sorted(scss_dir.glob('source/documentation/modules/**/*.md')): + func_list = _function_list_extractor.findall(md.read_text()) + func_items = set(_function_extractor.findall(''.join(func_list))) + scss_functions.append(f'\n{sep}') + scss_functions.extend(f'{sep}{func}' for func in sorted(func_items - functions)) + +for md in scss_dir.glob('source/documentation/at-rules/**/*.md'): + with open(md) as f: + f.readline() + scss_at_rules.update(_at_rule_extractor.findall(f.readline())) + +subproperties = set( + '-'.join(splitted[i:n]) + for prop in properties + for splitted in (prop.rsplit('-', prop.count('-') - 1) # '-aaa-bbb' -> ['-aaa', 'bbb'] + if prop.startswith('-') + else prop.split('-'), ) # 'aaa-bbb' -> ['aaa', 'bbb'] + for i in range(len(splitted)) + for n in range(i+1, len(splitted)+1) +) + +# +# Update SCSS +# + +scss_current_at_rules = set() + +def _scss_update_and_extract_items(m) -> str: + name = m[1] + + if name == 'functions': + return f""" + functions##CSS + + {f''.join(scss_functions)} + """ + + if name == 'at-rules': + scss_current_at_rules.update(_at_rule_extractor.findall(m[2])) + return m[0] + + # sub-properties + items = f'{sep}'.join(sorted(subproperties - properties)) + return f'{sep}{items}\n ' + +scss_content = scss_filename.read_text() +original_scss_content = scss_content + +scss_content = re.sub(r'(.*?)', + _scss_update_and_extract_items, scss_content, count=3, flags=re.DOTALL) + +scss_content = re.sub(r'', + f'', + scss_content, count=1) + +scss_content = regexpr_unit_extractor.sub('\\1' + "|".join(units), scss_content, 1) + +if original_scss_content != scss_content: + scss_content = update_version(scss_content) + scss_filename.write_text(scss_content) + +show_at_rule_difference('SCSS', scss_current_at_rules, scss_at_rules) diff --git a/src/libs/3rdparty/syntax-highlighting/data/generators/update_less.py b/src/libs/3rdparty/syntax-highlighting/data/generators/update_less.py new file mode 100644 index 00000000000..d509aeabe77 --- /dev/null +++ b/src/libs/3rdparty/syntax-highlighting/data/generators/update_less.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 +# SPDX-FileCopyrightText: 2023 Jonathan Poelen +# SPDX-License-Identifier: MIT + +from pathlib import Path +from urllib import request +import re +import sys + + +if len(sys.argv) < 1: + print(f'{sys.argv[0]} syntax/less.xml', file=sys.stderr) + exit(1) + +# +# Extract functions +# + +data = request.urlopen('https://lesscss.org/functions/').read().decode() + +functions = re.findall(r'([-_\w\d]+)
', data, flags=re.DOTALL) +functions.append('%') + +# +# Update syntax +# + +sep = '\n ' +new_list = f""" + functions##CSS + + + {f'{sep}'.join(sorted(functions))} + """ + +less_filename = Path(sys.argv[1]) +less_content = less_filename.read_text() +original_less_content = less_content +less_content = re.sub(r'.*?', + new_list, less_content, count=1, flags=re.DOTALL) + +if original_less_content != less_content: + less_content = re.sub(' version="(\d+)" ', lambda m: f' version="{int(m[1])+1}" ', + less_content, count=1) + less_filename.write_text(less_content) diff --git a/src/libs/3rdparty/syntax-highlighting/data/schema/language.xsd b/src/libs/3rdparty/syntax-highlighting/data/schema/language.xsd index fdea0dd7521..b6402194144 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/schema/language.xsd +++ b/src/libs/3rdparty/syntax-highlighting/data/schema/language.xsd @@ -6,39 +6,22 @@ SPDX-FileCopyrightText: 2005 Dominik Haumann SPDX-FileCopyrightText: 2008 Wilbert Berendsen - This file describes the XML format used for syntax highlight descriptions - for the Kate text editor (http://kate.kde.org), which is part of the KDE - desktop environment (http://www.kde.org). - You'll find the "Writing a Kate Highlighting XML File HOWTO" at - http://kate.kde.org/doc/hlhowto.php + This file describes the XML format used for syntax highlight descriptions + for the Kate text editor (https://kate-editor.org), which is part of the + KDE desktop environment (https://kde.org). + You'll find the "Working with Syntax Highlighting" at + https://docs.kde.org/stable5/en/kate/katepart/highlight.html - This format is identified using the SYSTEM identifier - SYSTEM "language.dtd" + You can validate your syntax files using "validatehl.sh yourSyntax.xml". + This needs xmllint from the libxml2 XML library. - Files using this format should include a DOCTYPE declaration like this: - - - You can validate your syntax files using "validatehl.sh yourSyntax.xml". - This needs xmllint from the libxml2 XML library. - - In any case, the katehighlightingindexer will validate all files bundled - with KTextEditor during compile time and fail on errors. - - To use your syntax file, copy it to ~/.local/share/katepart5/syntax/ in - your home directory. You have to open a new instance of kwrite/kate to use - the new syntax file. + In any case, the katehighlightingindexer will validate all files bundled + with KTextEditor during compile time and fail on errors. TODO - find a more readable way for the - -dtdvalid stuff, it's just annoying xml comments don't allow it. --> - @@ -160,6 +136,7 @@ + @@ -317,20 +294,18 @@ context specification name: The name of this context specification. Used in '*Context' attributes [optional] attribute: The name of the ItemData to be used for matching text - lineEndContext: Next context if end of line is encountered - lineEmptyContext: Next context if an empty line is encountered [optional] + lineEndContext: Next context if end of line is encountered [optional, default='#stay'] + lineEmptyContext: Next context if an empty line is encountered [optional, default=value of lineEndContext] fallthrough: Use a fallthrough context [optional] deprecated since 5.62 but preserved to maintain compatibility in older versions of KF5 - fallthroughContext: Fall through to this context [optional] + fallthroughContext: Fall through to this context [optional, default='#stay'] dynamic: Dynamic context [boolean, optional] + deprecated since always but preserved to maintain compatibility in older versions of KF5 noIndentationBasedFolding: Python uses indentation based folding. However, Python has parts where - it does not use indentation based folding (e.g. for """ strings). In this case - switch to an own context and set this attribute to true. Then the indentation - based folding will ignore this parts and not change folding markers. [optional] - - TODO: - - Explain fallthrough. - - Make lineEndContext optional, defaults to '#stay'. Reasonable? + it does not use indentation based folding (e.g. for """ strings). In this case + switch to an own context and set this attribute to true. Then the indentation + based folding will ignore this parts and not change folding markers. [optional] + stopEmptyLineContextSwitchLoop: Do not continue the context switching if an empty line is encountered. [boolean, optional, default=false] --> @@ -356,11 +331,11 @@ - + - + @@ -368,8 +343,11 @@ + + + @@ -504,12 +479,9 @@ @@ -523,9 +495,6 @@ String: The string to look for insensitive: Whether the string is matched case INsensitive. [boolean, optional, default=false] dynamic: Uses %1 .. %9 as placeholders for dynamic arguments [boolean, optional, default=false] - - TODO - - What's default of insensitive? I'm not sure... --> @@ -542,9 +511,6 @@ insensitive: Whether the string is matched case INsensitive. [boolean, optional, default=false] weakDeliminator: Add weak deliminators [optional] additionalDeliminator: Add deliminators [optional] - - TODO - - What's default of insensitive? I'm not sure... --> @@ -560,7 +526,7 @@ commonAttributes: Common attributes String: The regular expression pattern insensitive: Whether the text is matched case INsensitive. [boolean, optional, default=false] - minimal: Wheather to use minimal matching for wild cards in the pattern [boolean, optional, default='false'] + minimal: Wheather to use minimal matching for wild cards in the pattern [boolean, optional, default=false] dynamic: Uses %1 .. %9 as placeholders for dynamic arguments [boolean, optional, default=false] --> @@ -584,11 +550,8 @@ @@ -596,7 +559,7 @@ + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/bash.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/bash.xml index 84d0cf84183..b3e8334fdaa 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/bash.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/bash.xml @@ -1,5 +1,5 @@ - @@ -66,7 +66,7 @@ - + @@ -1005,13 +1005,15 @@ - + + - + + @@ -1019,7 +1021,8 @@ - + + @@ -1046,8 +1049,9 @@ - - + + + @@ -1073,7 +1077,7 @@ - + @@ -1081,27 +1085,32 @@ - + + + + + + + - + - - + - + - - + @@ -1262,6 +1271,7 @@ + @@ -1270,6 +1280,8 @@ + + @@ -1277,6 +1289,10 @@ + + + + @@ -1352,7 +1368,7 @@ - + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/cmake.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/cmake.xml index 053d983c343..256619d3ff8 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/cmake.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/cmake.xml @@ -1,5 +1,5 @@ - @@ -12,7 +12,7 @@ SPDX-FileCopyrightText: 2004 Alexander Neundorf SPDX-FileCopyrightText: 2005 Dominik Haumann SPDX-FileCopyrightText: 2007, 2008, 2013, 2014 Matthew Woehlke - SPDX-FileCopyrightText: 2013-2015, 2017-2020 Alex Turbov + SPDX-FileCopyrightText: 2013-2015, 2017-2023 Alex Turbov SPDX-License-Identifier: LGPL-2.0-or-later --> @@ -25,8 +25,8 @@ add_test aux_source_directory build_command + cmake_file_api create_test_sourcelist define_property enable_language @@ -192,6 +193,7 @@ HOST HOSTNAME IS_64BIT + MSYSTEM_PREFIX NUMBER_OF_LOGICAL_CORES NUMBER_OF_PHYSICAL_CORES OS_NAME @@ -729,6 +731,7 @@ CHECK_FAIL CHECK_PASS CHECK_START + CONFIGURE_LOG DEBUG DEPRECATION FATAL_ERROR @@ -849,9 +852,11 @@ COMMAND_EXPAND_LISTS COMMENT DEPENDS + DEPENDS_EXPLICIT_ONLY DEPFILE IMPLICIT_DEPENDS JOB_POOL + JOB_SERVER_AWARE MAIN_DEPENDENCY OUTPUT POST_BUILD @@ -873,6 +878,7 @@ DEPFILE IMPLICIT_DEPENDS JOB_POOL + JOB_SERVER_AWARE SOURCES USES_TERMINAL VERBATIM @@ -914,6 +920,14 @@ PARALLEL_LEVEL TARGET + + API_VERSION + CACHE + CMAKEFILES + CODEMODEL + QUERY + TOOLCHAINS + EXTRA_INCLUDE FUNCTION @@ -937,6 +951,7 @@ ASM ASM-ATT + ASM_MARMASM ASM_MASM ASM_NASM C @@ -965,6 +980,9 @@ DIRECTORY TARGET_DIRECTORY + + DIRECTORY + AFTER BEFORE @@ -1045,7 +1063,7 @@ AFTER BEFORE - + debug general optimized @@ -1085,6 +1103,10 @@ PROPERTIES TARGET_DIRECTORY + + DIRECTORY + PROPERTIES + FILES PREFIX @@ -1112,6 +1134,7 @@ cuda_std_17 cuda_std_20 cuda_std_23 + cuda_std_26 cxx_aggregate_default_initializers cxx_alias_templates cxx_alignas @@ -1206,6 +1229,10 @@ PUBLIC TYPE + + CXX_MODULES + HEADERS + BINARY_DIR CMAKE_FLAGS @@ -1214,7 +1241,9 @@ COPY_FILE_ERROR LINK_LIBRARIES LINK_OPTIONS + LOG_DESCRIPTION NO_CACHE + NO_LOG OUTPUT_VARIABLE PROJECT SOURCES @@ -1234,7 +1263,9 @@ COPY_FILE_ERROR LINK_LIBRARIES LINK_OPTIONS + LOG_DESCRIPTION NO_CACHE + NO_LOG OUTPUT_VARIABLE RUN_OUTPUT_STDERR_VARIABLE RUN_OUTPUT_STDOUT_VARIABLE @@ -1563,6 +1594,7 @@ BUILD_BYPRODUCTS BUILD_COMMAND BUILD_IN_SOURCE + BUILD_JOB_SERVER_AWARE CMAKE_ARGS CMAKE_CACHE_ARGS CMAKE_CACHE_DEFAULT_ARGS @@ -1601,6 +1633,7 @@ HTTP_USERNAME INACTIVITY_TIMEOUT INDEPENDENT_STEP_TARGETS + INSTALL_BYPRODUCTS INSTALL_COMMAND INSTALL_DIR LIST_SEPARATOR @@ -1666,6 +1699,7 @@ DEPENDS EXCLUDE_FROM_MAIN INDEPENDENT + JOB_SERVER_AWARE LOG USES_TERMINAL WORKING_DIRECTORY @@ -1708,6 +1742,8 @@ DOWNLOAD_NAME DOWNLOAD_NO_EXTRACT DOWNLOAD_NO_PROGRESS + EXCLUDE_FROM_ALL + FIND_PACKAGE_ARGS GIT_CONFIG GIT_PROGRESS GIT_REMOTE_NAME @@ -1725,6 +1761,7 @@ INACTIVITY_TIMEOUT NETRC NETRC_FILE + OVERRIDE_FIND_PACKAGE PATCH_COMMAND SOURCE_SUBDIR SVN_PASSWORD @@ -1946,6 +1983,7 @@ ALL COMMENT + CONFIG_FILE USE_STAMP_FILE WORKING_DIRECTORY @@ -2009,6 +2047,9 @@ REQUIRED STATIC_TARGET + + DEFINE_VARIABLES + DESCRIPTORS EXPORT_MACRO @@ -2081,6 +2122,7 @@ CABLE_INCLUDE_DIR CABLE_TCL_LIBRARY CMAKE_ABSOLUTE_DESTINATION_FILES + CMAKE_ADD_CUSTOM_COMMAND_DEPENDS_EXPLICIT_ONLY CMAKE_AIX_EXPORT_ALL_SYMBOLS CMAKE_ANDROID_ANT_ADDITIONAL_OPTIONS CMAKE_ANDROID_API @@ -2116,15 +2158,19 @@ CMAKE_ARGC CMAKE_AUTOGEN_ORIGIN_DEPENDS CMAKE_AUTOGEN_PARALLEL + CMAKE_AUTOGEN_USE_SYSTEM_INCLUDE CMAKE_AUTOGEN_VERBOSE CMAKE_AUTOMOC CMAKE_AUTOMOC_DEPEND_FILTERS + CMAKE_AUTOMOC_EXECUTABLE CMAKE_AUTOMOC_MOC_OPTIONS CMAKE_AUTOMOC_PATH_PREFIX CMAKE_AUTOMOC_RELAXED_MODE CMAKE_AUTORCC + CMAKE_AUTORCC_EXECUTABLE CMAKE_AUTORCC_OPTIONS CMAKE_AUTOUIC + CMAKE_AUTOUIC_EXECUTABLE CMAKE_AUTOUIC_OPTIONS CMAKE_AUTOUIC_SEARCH_PATHS CMAKE_BACKWARDS_COMPATIBILITY @@ -2185,6 +2231,7 @@ CMAKE_CXX_EXTENSIONS CMAKE_CXX_LINK_NO_PIE_SUPPORTED CMAKE_CXX_LINK_PIE_SUPPORTED + CMAKE_CXX_SCAN_FOR_MODULES CMAKE_CXX_STANDARD CMAKE_CXX_STANDARD_REQUIRED CMAKE_C_COMPILE_FEATURES @@ -2200,6 +2247,7 @@ CMAKE_DEPENDS_IN_PROJECT_ONLY CMAKE_DIRECTORY_LABELS CMAKE_DISABLE_PRECOMPILE_HEADERS + CMAKE_DLL_NAME_WITH_SOVERSION CMAKE_DL_LIBS CMAKE_DOTNET_SDK CMAKE_DOTNET_TARGET_FRAMEWORK @@ -2210,9 +2258,9 @@ CMAKE_ECLIPSE_RESOURCE_ENCODING CMAKE_ECLIPSE_VERSION CMAKE_EDIT_COMMAND - CMAKE_ENABLE_EXPORTS CMAKE_ERROR_DEPRECATED CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION + CMAKE_EXECUTABLE_ENABLE_EXPORTS CMAKE_EXECUTABLE_SUFFIX CMAKE_EXECUTE_PROCESS_COMMAND_ECHO CMAKE_EXE_LINKER_FLAGS @@ -2286,6 +2334,7 @@ CMAKE_HIP_EXTENSIONS CMAKE_HIP_LINK_NO_PIE_SUPPORTED CMAKE_HIP_LINK_PIE_SUPPORTED + CMAKE_HIP_PLATFORM CMAKE_HIP_STANDARD CMAKE_HIP_STANDARD_REQUIRED CMAKE_HOST_APPLE @@ -2360,7 +2409,6 @@ CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP CMAKE_INSTALL_UCRT_LIBRARIES CMAKE_INTERPROCEDURAL_OPTIMIZATION - CMAKE_IOS_INSTALL_COMBINED CMAKE_ISPC_HEADER_DIRECTORY CMAKE_ISPC_HEADER_SUFFIX CMAKE_ISPC_INSTRUCTION_SETS @@ -2378,6 +2426,7 @@ CMAKE_LIBRARY_PATH_FLAG CMAKE_LINK_DEF_FILE_FLAG CMAKE_LINK_DEPENDS_NO_SHARED + CMAKE_LINK_DEPENDS_USE_LINKER CMAKE_LINK_DIRECTORIES_BEFORE CMAKE_LINK_INTERFACE_LIBRARIES CMAKE_LINK_LIBRARIES_ONLY_TARGETS @@ -2436,6 +2485,7 @@ CMAKE_PCH_INSTANTIATE_TEMPLATES CMAKE_PCH_WARN_INVALID CMAKE_PDB_OUTPUT_DIRECTORY + CMAKE_PLATFORM_NO_VERSIONED_SONAME CMAKE_POSITION_INDEPENDENT_CODE CMAKE_PREFIX_PATH CMAKE_PROGRAM_PATH @@ -2460,6 +2510,7 @@ CMAKE_ROOT CMAKE_RUNTIME_OUTPUT_DIRECTORY CMAKE_SCRIPT_MODE_FILE + CMAKE_SHARED_LIBRARY_ENABLE_EXPORTS CMAKE_SHARED_LIBRARY_PREFIX CMAKE_SHARED_LIBRARY_SUFFIX CMAKE_SHARED_LINKER_FLAGS @@ -2520,6 +2571,10 @@ CMAKE_VERIFY_INTERFACE_HEADER_SETS CMAKE_VERSION CMAKE_VISIBILITY_INLINES_HIDDEN + CMAKE_VS_DEBUGGER_COMMAND + CMAKE_VS_DEBUGGER_COMMAND_ARGUMENTS + CMAKE_VS_DEBUGGER_ENVIRONMENT + CMAKE_VS_DEBUGGER_WORKING_DIRECTORY CMAKE_VS_DEVENV_COMMAND CMAKE_VS_GLOBALS CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD @@ -2529,9 +2584,12 @@ CMAKE_VS_NUGET_PACKAGE_RESTORE CMAKE_VS_NsightTegra_VERSION CMAKE_VS_PLATFORM_NAME + CMAKE_VS_PLATFORM_NAME_DEFAULT CMAKE_VS_PLATFORM_TOOLSET CMAKE_VS_PLATFORM_TOOLSET_CUDA + CMAKE_VS_PLATFORM_TOOLSET_CUDA_CUSTOM_DIR CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE + CMAKE_VS_PLATFORM_TOOLSET_VERSION CMAKE_VS_SDK_EXCLUDE_DIRECTORIES CMAKE_VS_SDK_EXECUTABLE_DIRECTORIES CMAKE_VS_SDK_INCLUDE_DIRECTORIES @@ -2539,6 +2597,11 @@ CMAKE_VS_SDK_LIBRARY_WINRT_DIRECTORIES CMAKE_VS_SDK_REFERENCE_DIRECTORIES CMAKE_VS_SDK_SOURCE_DIRECTORIES + CMAKE_VS_TARGET_FRAMEWORK_IDENTIFIER + CMAKE_VS_TARGET_FRAMEWORK_TARGETS_VERSION + CMAKE_VS_TARGET_FRAMEWORK_VERSION + CMAKE_VS_VERSION_BUILD_NUMBER + CMAKE_VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION_MAXIMUM CMAKE_VS_WINRT_BY_DEFAULT @@ -2653,6 +2716,16 @@ CPACK_EXTERNAL_ENABLE_STAGING CPACK_EXTERNAL_PACKAGE_SCRIPT CPACK_EXTERNAL_REQUESTED_VERSIONS + CPACK_FREEBSD_PACKAGE_CATEGORIES + CPACK_FREEBSD_PACKAGE_COMMENT + CPACK_FREEBSD_PACKAGE_DEPS + CPACK_FREEBSD_PACKAGE_DESCRIPTION + CPACK_FREEBSD_PACKAGE_LICENSE + CPACK_FREEBSD_PACKAGE_LICENSE_LOGIC + CPACK_FREEBSD_PACKAGE_MAINTAINER + CPACK_FREEBSD_PACKAGE_NAME + CPACK_FREEBSD_PACKAGE_ORIGIN + CPACK_FREEBSD_PACKAGE_WWW CPACK_GENERATOR CPACK_IFW_ADMIN_TARGET_DIRECTORY CPACK_IFW_ARCHIVE_COMPRESSION @@ -2701,6 +2774,26 @@ CPACK_IFW_TARGET_DIRECTORY CPACK_IFW_VERBOSE CPACK_INCLUDE_TOPLEVEL_DIRECTORY + CPACK_INNOSETUP_ALLOW_CUSTOM_DIRECTORY + CPACK_INNOSETUP_ARCHITECTURE + CPACK_INNOSETUP_CODE_FILES + CPACK_INNOSETUP_CREATE_UNINSTALL_LINK + CPACK_INNOSETUP_CUSTOM_INSTALL_INSTRUCTIONS + CPACK_INNOSETUP_EXECUTABLE + CPACK_INNOSETUP_EXECUTABLE_ARGUMENTS + CPACK_INNOSETUP_EXTRA_SCRIPTS + CPACK_INNOSETUP_ICON_FILE + CPACK_INNOSETUP_IGNORE_LICENSE_PAGE + CPACK_INNOSETUP_IGNORE_README_PAGE + CPACK_INNOSETUP_INSTALL_ROOT + CPACK_INNOSETUP_LANGUAGES + CPACK_INNOSETUP_MENU_LINKS + CPACK_INNOSETUP_PASSWORD + CPACK_INNOSETUP_PROGRAM_MENU_FOLDER + CPACK_INNOSETUP_RUN_EXECUTABLES + CPACK_INNOSETUP_USE_CMAKE_BOOL_FORMAT + CPACK_INNOSETUP_USE_MODERN_WIZARD + CPACK_INNOSETUP_VERIFY_DOWNLOADS CPACK_INSTALLED_DIRECTORIES CPACK_INSTALL_CMAKE_PROJECTS CPACK_INSTALL_COMMANDS @@ -2988,6 +3081,7 @@ CUDAToolkit_NVCC_EXECUTABLE CUPS_INCLUDE_DIR CURL_NO_CURL_CMAKE + CURL_USE_STATIC_LIBS CURSES_CFLAGS CURSES_HAVE_CURSES_H CURSES_HAVE_NCURSES_CURSES_H @@ -3006,6 +3100,7 @@ DVIPDF_CONVERTER DVIPS_CONVERTER EXECUTABLE_OUTPUT_PATH + EXPAT_USE_STATIC_LIBS EnvModules_COMMAND ExternalData_BINARY_ROOT ExternalData_CUSTOM_ERROR @@ -3434,9 +3529,11 @@ + CMAKE_ENABLE_EXPORTS CMAKE_FILES_DIRECTORY CMAKE_HOME_DIRECTORY CMAKE_INTERNAL_PLATFORM_ABI + CMAKE_IOS_INSTALL_COMBINED CMAKE_NOT_USING_CONFIG_FLAGS CMAKE_OBJDUMP CMAKE_SUPPRESS_DEVELOPER_ERRORS @@ -3463,6 +3560,7 @@ CMAKE_COLOR_DIAGNOSTICS CMAKE_CONFIGURATION_TYPES CMAKE_CONFIG_TYPE + CMAKE_CROSSCOMPILING_EMULATOR CMAKE_EXPORT_COMPILE_COMMANDS CMAKE_FRAMEWORK_PATH CMAKE_GENERATOR @@ -3477,6 +3575,7 @@ CMAKE_TOOLCHAIN_FILE CSFLAGS CTEST_INTERACTIVE_DEBUG_MODE + CTEST_NO_TESTS_ACTION CTEST_OUTPUT_ON_FAILURE CTEST_PARALLEL_LEVEL CTEST_PROGRESS_OUTPUT @@ -3612,6 +3711,7 @@ AUTOGEN_BUILD_DIR AUTOGEN_ORIGIN_DEPENDS AUTOGEN_TARGET_DEPENDS + AUTOGEN_USE_SYSTEM_INCLUDE AUTOMOC AUTOMOC_COMPILER_PREDEFINES AUTOMOC_DEPEND_FILTERS @@ -3647,7 +3747,10 @@ COMPILE_WARNING_AS_ERROR CROSSCOMPILING_EMULATOR CUDA_ARCHITECTURES + CUDA_CUBIN_COMPILATION CUDA_EXTENSIONS + CUDA_FATBIN_COMPILATION + CUDA_OPTIX_COMPILATION CUDA_PTX_COMPILATION CUDA_RESOLVE_DEVICE_SYMBOLS CUDA_RUNTIME_LIBRARY @@ -3655,6 +3758,10 @@ CUDA_STANDARD CUDA_STANDARD_REQUIRED CXX_EXTENSIONS + CXX_MODULE_DIRS + CXX_MODULE_SET + CXX_MODULE_SETS + CXX_SCAN_FOR_MODULES CXX_STANDARD CXX_STANDARD_REQUIRED C_EXTENSIONS @@ -3665,6 +3772,7 @@ DEPLOYMENT_REMOTE_DIRECTORY DEPRECATION DISABLE_PRECOMPILE_HEADERS + DLL_NAME_WITH_SOVERSION DOTNET_SDK DOTNET_TARGET_FRAMEWORK DOTNET_TARGET_FRAMEWORK_VERSION @@ -3715,10 +3823,12 @@ INSTALL_REMOVE_ENVIRONMENT_RPATH INSTALL_RPATH INSTALL_RPATH_USE_LINK_PATH + INTERFACE_AUTOMOC_MACRO_NAMES INTERFACE_AUTOUIC_OPTIONS INTERFACE_COMPILE_DEFINITIONS INTERFACE_COMPILE_FEATURES INTERFACE_COMPILE_OPTIONS + INTERFACE_CXX_MODULE_SETS INTERFACE_HEADER_SETS INTERFACE_HEADER_SETS_TO_VERIFY INTERFACE_INCLUDE_DIRECTORIES @@ -3896,6 +4006,7 @@ COMPILE_DEFINITIONS COMPILE_FLAGS COMPILE_OPTIONS + CXX_SCAN_FOR_MODULES EXTERNAL_OBJECT Fortran_FORMAT Fortran_PREPROCESS @@ -3913,6 +4024,7 @@ SKIP_AUTOMOC SKIP_AUTORCC SKIP_AUTOUIC + SKIP_LINTING SKIP_PRECOMPILE_HEADERS SKIP_UNITY_BUILD_INCLUSION SYMBOLIC @@ -3952,18 +4064,22 @@ FIXTURES_CLEANUP FIXTURES_REQUIRED FIXTURES_SETUP + GENERATED_RESOURCE_SPEC_FILE LABELS MEASUREMENT PASS_REGULAR_EXPRESSION PROCESSORS PROCESSOR_AFFINITY REQUIRED_FILES + RESOURCE_GROUPS RESOURCE_LOCK RUN_SERIAL SKIP_REGULAR_EXPRESSION SKIP_RETURN_CODE TIMEOUT TIMEOUT_AFTER_MATCH + TIMEOUT_SIGNAL_GRACE_PERIOD + TIMEOUT_SIGNAL_NAME WILL_FAIL WORKING_DIRECTORY @@ -3985,6 +4101,7 @@ + IF 0 1 BOOL @@ -3993,53 +4110,69 @@ NOT STREQUAL EQUAL - IN_LIST VERSION_LESS VERSION_GREATER VERSION_EQUAL VERSION_LESS_EQUAL VERSION_GREATER_EQUAL - PATH_EQUAL - PATH - TARGET_EXISTS - CONFIG - PLATFORM_ID - C_COMPILER_ID - CXX_COMPILER_ID - CUDA_COMPILER_ID - Fortran_COMPILER_ID - C_COMPILER_VERSION - CXX_COMPILER_VERSION - CUDA_COMPILER_VERSION - Fortran_COMPILER_VERSION - TARGET_POLICY - COMPILE_FEATURES - COMPILE_LANG_AND_ID - COMPILE_LANGUAGE - LINK_LANG_AND_ID - LINK_LANGUAGE - DEVICE_LINK - HOST_LINK - LINK_LIBRARY - LINK_GROUP - ANGLE-R - COMMA - SEMICOLON - IF + LOWER_CASE + UPPER_CASE + MAKE_C_IDENTIFIER + IN_LIST JOIN REMOVE_DUPLICATES FILTER - LOWER_CASE - UPPER_CASE - GENEX_EVAL - TARGET_GENEX_EVAL + PATH_EQUAL + SHELL_PATH + CONFIG + OUTPUT_CONFIG + COMMAND_CONFIG + PLATFORM_ID + C_COMPILER_VERSION + CXX_COMPILER_VERSION + CUDA_COMPILER_VERSION + OBJC_COMPILER_VERSION + OBJCXX_COMPILER_VERSION + Fortran_COMPILER_VERSION + HIP_COMPILER_VERSION + ISPC_COMPILER_VERSION + C_COMPILER_ID + CXX_COMPILER_ID + CUDA_COMPILER_ID + OBJC_COMPILER_ID + OBJCXX_COMPILER_ID + Fortran_COMPILER_ID + HIP_COMPILER_ID + ISPC_COMPILER_ID + COMPILE_LANGUAGE + COMPILE_LANG_AND_ID + COMPILE_FEATURES + COMPILE_ONLY + LINK_LANGUAGE + LINK_LANG_AND_ID + LINK_LIBRARY + LINK_GROUP + LINK_ONLY + DEVICE_LINK + HOST_LINK + TARGET_EXISTS TARGET_NAME_IF_EXISTS + TARGET_NAME + TARGET_PROPERTY + TARGET_OBJECTS + TARGET_POLICY TARGET_FILE TARGET_FILE_BASE_NAME TARGET_FILE_PREFIX TARGET_FILE_SUFFIX TARGET_FILE_NAME TARGET_FILE_DIR + TARGET_IMPORT_FILE + TARGET_IMPORT_FILE_BASE_NAME + TARGET_IMPORT_FILE_PREFIX + TARGET_IMPORT_FILE_SUFFIX + TARGET_IMPORT_FILE_NAME + TARGET_IMPORT_FILE_DIR TARGET_LINKER_FILE TARGET_LINKER_FILE_BASE_NAME TARGET_LINKER_FILE_PREFIX @@ -4047,7 +4180,6 @@ TARGET_LINKER_FILE_NAME TARGET_LINKER_FILE_DIR TARGET_SONAME_FILE - TARGET_SONAME_FILE TARGET_SONAME_FILE_NAME TARGET_SONAME_FILE_DIR TARGET_PDB_FILE @@ -4057,18 +4189,67 @@ TARGET_BUNDLE_DIR_NAME TARGET_BUNDLE_DIR TARGET_BUNDLE_CONTENT_DIR - TARGET_PROPERTY TARGET_RUNTIME_DLLS - INSTALL_PREFIX - TARGET_NAME - LINK_ONLY + TARGET_RUNTIME_DLL_DIRS INSTALL_INTERFACE BUILD_INTERFACE - MAKE_C_IDENTIFIER - TARGET_OBJECTS - SHELL_PATH - OUTPUT_CONFIG - COMMAND_CONFIG + BUILD_LOCAL_INTERFACE + INSTALL_PREFIX + GENEX_EVAL + TARGET_GENEX_EVAL + ANGLE-R + COMMA + SEMICOLON + + + LENGTH + GET + SUBLIST + FIND + JOIN + APPEND + PREPEND + INSERT + POP_BACK + POP_FRONT + REMOVE_ITEM + REMOVE_AT + REMOVE_DUPLICATES + FILTER + TRANSFORM + FRANSFORM + REVERSE + SORT + + + HAS_ROOT_NAME + HAS_ROOT_DIRECTORY + HAS_ROOT_PATH + HAS_FILENAME + HAS_EXTENSION + HAS_STEM + HAS_RELATIVE_PART + HAS_PARENT_PATH + IS_ABSOLUTE + IS_RELATIVE + IS_PREFIX + GET_ROOT_NAME + GET_ROOT_DIRECTORY + GET_ROOT_PATH + GET_FILENAME + GET_EXTENSION + GET_STEM + GET_RELATIVE_PART + GET_PARENT_PATH + CMAKE_PATH + APPEND + REMOVE_FILENAME + REPLACE_FILENAME + REMOVE_EXTENSION + REPLACE_EXTENSION + NORMAL_PATH + RELATIVE_PATH + ABSOLUTE_PATH @@ -4126,7 +4307,6 @@ CTestCoverageCollectGCOV CTestScriptMode CTestUseLaunchers - Dart DeployQt4 ExternalData ExternalProject @@ -4171,7 +4351,6 @@ CVS CxxTest Cygwin - Dart DCMTK DevIL Doxygen @@ -4314,6 +4493,7 @@ CMakeExpandImportedTargets CMakeForceCompiler CMakeParseArguments + Dart Documentation MacroAddFileDependencies TestCXXAcceptsFlag @@ -4324,6 +4504,7 @@ WriteBasicConfigVersionFile WriteCompilerDetectionHeader FindCUDA + FindDart FindPythonInterp FindPythonLibs FindQt @@ -4432,6 +4613,7 @@ + @@ -4461,7 +4643,7 @@ - + @@ -4636,7 +4818,7 @@ - + @@ -5227,6 +5409,16 @@ + + + + + + + + + + @@ -5319,6 +5511,7 @@ + @@ -5380,7 +5573,7 @@ - + @@ -5447,7 +5640,7 @@ - + @@ -5530,6 +5723,24 @@ + + + + + + + + + + + + + + + + + + @@ -5562,6 +5773,7 @@ + @@ -6345,6 +6557,16 @@ + + + + + + + + + + @@ -6380,11 +6602,11 @@ - + - + @@ -6409,8 +6631,8 @@ - - + + @@ -6423,7 +6645,7 @@ - + @@ -6549,10 +6771,22 @@ + + + + + + + + + + + + @@ -6582,6 +6816,7 @@ + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/comments.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/comments.xml index cd66a4133d8..011dc8ab215 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/comments.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/comments.xml @@ -1,5 +1,5 @@ - + - - - + + + + + + + ]> - - - + + - + -webkit-line-clamp + -webkit-text-fill-color + -webkit-text-stroke + -webkit-text-stroke-color + -webkit-text-stroke-width accent-color + additive-symbols align-content align-items - alignment-baseline align-self all animation + animation-composition animation-delay animation-direction animation-duration @@ -60,8 +69,8 @@ Changelog: animation-play-state animation-timing-function appearance + ascent-override aspect-ratio - azimuth backdrop-filter backface-visibility background @@ -76,13 +85,8 @@ Changelog: background-position-y background-repeat background-size - baseline-shift - baseline-source - block-ellipsis + base-palette block-size - bookmark-label - bookmark-level - bookmark-state border border-block border-block-color @@ -102,7 +106,6 @@ Changelog: border-bottom-right-radius border-bottom-style border-bottom-width - border-boundary border-collapse border-color border-end-end-radius @@ -149,24 +152,15 @@ Changelog: box-decoration-break box-shadow box-sizing - box-snap break-after break-before break-inside caption-side - caret caret-color - caret-shape - chains clear - clip clip-path - clip-rule color - color-adjust - color-interpolation-filters color-scheme - columns column-count column-fill column-gap @@ -176,6 +170,7 @@ Changelog: column-rule-width column-span column-width + columns contain contain-intrinsic-block-size contain-intrinsic-height @@ -186,30 +181,15 @@ Changelog: container-name container-type content - content-visibility - continue counter-increment counter-reset counter-set - cue - cue-after - cue-before cursor + descent-override direction display - dominant-baseline - elevation empty-cells - fill - fill-break - fill-color - fill-image - fill-opacity - fill-origin - fill-position - fill-repeat - fill-rule - fill-size + fallback filter flex flex-basis @@ -219,12 +199,8 @@ Changelog: flex-shrink flex-wrap float - flood-color - flood-opacity - flow - flow-from - flow-into font + font-display font-family font-feature-settings font-kerning @@ -236,6 +212,7 @@ Changelog: font-stretch font-style font-synthesis + font-synthesis-position font-synthesis-small-caps font-synthesis-style font-synthesis-weight @@ -249,11 +226,8 @@ Changelog: font-variant-position font-variation-settings font-weight - footnote-display - footnote-policy forced-color-adjust gap - glyph-orientation-vertical grid grid-area grid-auto-columns @@ -273,18 +247,12 @@ Changelog: height hyphenate-character hyphenate-limit-chars - hyphenate-limit-last - hyphenate-limit-lines - hyphenate-limit-zone hyphens image-orientation image-rendering - image-resolution - initial-letter - initial-letter-align - initial-letter-wrap + inherits + initial-value inline-size - inline-sizing inset inset-block inset-block-end @@ -296,17 +264,11 @@ Changelog: justify-content justify-items justify-self - leading-trim left letter-spacing - lighting-color line-break - line-clamp - line-grid + line-gap-override line-height - line-height-step - line-padding - line-snap list-style list-style-image list-style-position @@ -322,11 +284,6 @@ Changelog: margin-left margin-right margin-top - margin-trim - marker-end - marker-mid - marker-side - marker-start mask mask-border mask-border-mode @@ -344,28 +301,24 @@ Changelog: mask-repeat mask-size mask-type + math-depth + math-style max-block-size max-height max-inline-size - max-lines max-width min-block-size min-height min-inline-size - min-intrinsic-sizing min-width mix-blend-mode - nav-up - nav-down - nav-left - nav-right + negative object-fit object-position offset offset-anchor offset-distance offset-path - offset-position offset-rotate opacity order @@ -383,11 +336,13 @@ Changelog: overflow-wrap overflow-x overflow-y + override-colors overscroll-behavior overscroll-behavior-block overscroll-behavior-inline overscroll-behavior-x overscroll-behavior-y + pad padding padding-block padding-block-end @@ -403,37 +358,24 @@ Changelog: page-break-after page-break-before page-break-inside + page-orientation paint-order - pause - pause-after - pause-before perspective perspective-origin - pitch - pitch-range place-content place-items place-self - play-during pointer-events position + prefix print-color-adjust quotes - region-fragment + range resize - rest - rest-after - rest-before - richness right rotate - rotation row-gap - ruby-align - ruby-merge - ruby-overhang ruby-position - running scale scroll-behavior scroll-margin @@ -465,58 +407,42 @@ Changelog: scrollbar-gutter scrollbar-width shape-image-threshold - shape-inside shape-margin shape-outside + size + size-adjust speak-as - spatial-navigation-action - spatial-navigation-contain - spatial-navigation-function - speak - speak-header - speak-numeral - speak-punctuation - speech-rate - stress - string-set + src + suffix + symbols + syntax + system tab-size table-layout - text-align-all text-align text-align-last text-combine-upright text-decoration text-decoration-color text-decoration-line - text-decoration-skip - text-decoration-skip-box text-decoration-skip-ink - text-decoration-skip-inset - text-decoration-skip-self - text-decoration-skip-spaces text-decoration-style text-decoration-thickness - text-edge text-emphasis text-emphasis-color text-emphasis-position - text-emphasis-skip text-emphasis-style - text-group-align text-indent text-justify text-orientation text-overflow text-rendering text-shadow - text-space-collapse - text-space-trim - text-spacing text-transform text-underline-offset text-underline-position - text-wrap top + touch-action transform transform-box transform-origin @@ -528,55 +454,50 @@ Changelog: transition-timing-function translate unicode-bidi + unicode-range user-select vertical-align visibility - voice-balance - voice-duration - voice-family - voice-pitch - voice-range - voice-rate - voice-stress - voice-volume - volume white-space widows width will-change - word-boundary-detection - word-boundary-expansion word-break word-spacing - word-wrap - wrap-after - wrap-before - wrap-flow - wrap-inside - wrap-through writing-mode z-index + + + alignment-baseline + baseline-shift + color-interpolation + color-interpolation-filters + dominant-baseline + fill + fill-opacity + fill-rule + flood-color + flood-opacity + marker-end + marker-mid + marker-start + shape-rendering + stop-color + stop-opacity + stroke + stroke-dasharray + stroke-dashoffset + stroke-linecap + stroke-linejoin + stroke-miterlimit + stroke-opacity + text-anchor + vector-effect + + + - -moz-animation - -moz-animation-delay - -moz-animation-direction - -moz-animation-duration - -moz-animation-fill-mode - -moz-animation-iteration-count - -moz-animation-name - -moz-animation-play-state - -moz-animation-timing-function - -moz-appearance - -moz-background-clip - -moz-background-origin - -moz-background-size - -moz-border-image - -moz-border-radius - -moz-border-radius-bottomleft - -moz-border-radius-bottomright - -moz-border-radius-topleft - -moz-border-radius-topright -moz-box-align -moz-box-direction -moz-box-flex @@ -584,80 +505,16 @@ Changelog: -moz-box-ordinal-group -moz-box-orient -moz-box-pack - -moz-box-shadow - -moz-box-sizing -moz-box - -moz-column-count - -moz-column-fill - -moz-column-gap - -moz-column-rule - -moz-column-rule-color - -moz-column-rule-style - -moz-column-rule-width - -moz-columns - -moz-column-width - -moz-hyphens - -moz-opacity - -moz-outline-style - -moz-perspective - -moz-resize - -moz-text-align-last - -moz-text-decoration-color - -moz-text-decoration-line - -moz-text-decoration-style - -moz-transform - -moz-transform-origin - -moz-transform-style - -moz-transition - -moz-transition-delay - -moz-transition-duration - -moz-transition-property - -moz-transition-timing-function - -moz-user-select - -o-background-size -o-linear-gradient - -o-text-overflow - -o-transition - -o-transform-origin konq_bgpos_x konq_bgpos_y - -khtml-background-size - -khtml-border-top-left-radius - -khtml-border-top-right-radius - -khtml-border-bottom-left-radius - -khtml-border-bottom-right-radius - -khtml-border-radius - -khtml-box-shadow - -khtml-opacity - -webkit-appearance - -webkit-animation - -webkit-animation-name - -webkit-animation-duration - -webkit-animation-iteration - -webkit-animation-direction - -webkit-animation-delay - -webkit-animation-play-state - -webkit-animation-fill-mode - -webkit-background-size - -webkit-backface-visibility - -webkit-border-image - -webkit-border-bottom-colors - -webkit-border-left-colors - -webkit-border-radius - -webkit-border-right-colors - -webkit-border-top-colors - -webkit-border-top-left-radius - -webkit-border-top-right-radius - -webkit-border-bottom-left-radius - -webkit-border-bottom-right-radius - -webkit-border-radius-bottomleft - -webkit-border-radius-bottomright -webkit-box-align -webkit-box-direction -webkit-box-flex @@ -665,46 +522,17 @@ Changelog: -webkit-box-orient -webkit-box-pack -webkit-box-reflect - -webkit-box-shadow - -webkit-box-sizing - -webkit-column-count - -webkit-column-gap - -webkit-hyphens -webkit-linear-gradient -webkit-gradient -webkit-overflow-scrolling - -webkit-perspective - -webkit-text-decoration -webkit-text-decoration-skip - -webkit-text-fill-color - -webkit-text-stroke-color - -webkit-text-stroke-width -webkit-text-size-adjust -webkit-tap-highlight-color - -webkit-transform - -webkit-transform-origin - -webkit-transform-style - -webkit-transition - -webkit-transition-property - -webkit-transition-delay - -webkit-transition-duration - -webkit-user-select - zoom - -ms-animation-name - -ms-animation-duration - -ms-animation-iteration - -ms-animation-direction - -ms-animation-delay - -ms-animation-play-state - -ms-animation-fill-mode - -ms-box-sizing -ms-filter -ms-flex -ms-flex-align - -ms-flex-direction - -ms-flex-flow -ms-flex-item-align -ms-flex-line-pack -ms-flex-negative @@ -713,278 +541,537 @@ Changelog: -ms-flex-positive -ms-flex-position -ms-flex-preferred-size - -ms-flex-wrap -ms-interpolation-mode -ms-linear-gradient - -ms-overflow-style -ms-text-size-adjust - -ms-transform - -ms-transition - -ms-user-select auto inherit + initial + revert + revert-layer unset - none - hidden - initial - revert - revert-layer - dotted - dashed - solid - double - groove - ridge - inset - outset - xx-small - x-small - small - medium - large - x-large - xx-large - smaller - larger - italic - oblique - small-caps - normal + -moz-arabic-indic + -moz-bengali + -moz-cjk-earthly-branch + -moz-cjk-heavenly-stem + -moz-devanagari + -moz-gujarati + -moz-gurmukhi + -moz-kannada + -moz-lao + -moz-malayalam + -moz-myanmar + -moz-oriya + -moz-persian + -moz-tamil + -moz-telugu + -moz-thai + absolute + accumulate + add + additive + alias + all + all-petite-caps + all-scroll + all-small-caps + allow-end + alpha + alphabetic + alternate + alternate-reverse + always + anywhere + arabic-indic + armenian + auto-add + auto-fill + auto-fit + avoid + avoid-column + avoid-page + avoid-region + backwards + balance + balance-all + baseline + bengali + bidi-override + bigger + block + block-end + block-start bold bolder - lighter - light - transparent - repeat - repeat-x - repeat-y - no-repeat - baseline - sub - super - top - text-top - middle + border + border-box + both + both-edges bottom - text-bottom - left - right + break-all + break-spaces + break-word + bullets + cambodian + cap-height + capitalize + cell center - justify - konq-center - disc + ch-width circle - square - box + cjk-decimal + cjk-earthly-branch + cjk-heavenly-stem + cjk-ideographic + clip + clone + close-quote + col-resize + collapse + color + color-burn + color-dodge + column + column-reverse + common-ligatures + compact + condensed + contain + content + content-box + contents + context-menu + contextual + copy + cover + crisp-edges + crosshair + currentcolor + cursive + cyclic + dark + darken + dashed decimal decimal-leading-zero - lower-roman - upper-roman - lower-greek - lower-alpha - lower-latin - upper-alpha - upper-latin - hebrew - armenian - georgian - cjk-ideographic - hiragana - katakana - hiragana-iroha - katakana-iroha - list-item - compact - marker - crosshair default - pointer - move + dense + devanagari + diagonal-fractions + difference + disc + disclosure-closed + disclosure-open + discretionary-ligatures + dot + dotted + double + double-circle e-resize - ne-resize - nw-resize - n-resize - se-resize - sw-resize - s-resize - w-resize - text - wait - help - above - absolute - always - avoid - avoid-page - avoid-column - avoid-region - below - bidi-override - blink - both - break-word - capitalize - caption - clip - close-quote - collapse - column - condensed - crop - cross + each-line + ease + ease-in + ease-in-out + ease-out + economy ellipsis - ellipsis-word embed + emoji + end + ethiopic-numeric + ew-resize + ex-height + exact + exclude + exclusion expanded + extends extra-condensed extra-expanded + fade + fallback + false + fangsong + fantasy + fill + fill-box + filled + first + fit-content fixed - hand + flat + flex + flex-end + flex-start + flow + flow-root + force-end + forwards + from-font + from-image + full-size-kana + full-width + georgian + grab + grabbing + grid + groove + gujarati + gurmukhi + hanging + hard-light + hebrew + help + hidden hide - higher - icon + high-quality + hiragana + hiragana-iroha + historical-forms + historical-ligatures + horizontal + horizontal-tb + hue + ic-height + ic-width + infinite + inline + inline-block + inline-end + inline-flex + inline-grid + inline-size + inline-start + inline-table + inset inside + inter-character + inter-word + intersect invert + isolate + isolate-override + italic + japanese-formal + japanese-informal + jump-both + jump-end + jump-none + jump-start + justify + justify-all + kannada + katakana + katakana-iroha + keep-all + keyword + khmer + korean-hangul-formal + korean-hanja-formal + korean-hanja-informal landscape - level + lao + large + larger + last + layout + left + legacy + light + lighten + lighter line-through - loud - lower + linear + lining-nums + local + loose + lower-alpha + lower-armenian + lower-greek + lower-latin + lower-roman lowercase ltr - menu - message-box - mix - narrower + luminance + luminosity + malayalam + mandatory + manipulation + manual + margin-box + match-parent + match-source + math + max-content + medium + min-content + mixed + mongolian + monospace + move + multiply + myanmar + n-resize + ne-resize + nesw-resize + no-clip no-close-quote + no-common-ligatures + no-contextual + no-discretionary-ligatures + no-drop + no-historical-ligatures no-open-quote + no-repeat + none + normal + not-allowed nowrap + ns-resize + numbers + numeric + nw-resize + nwse-resize + oblique + oldstyle-nums + only + open open-quote + optional + ordinal + oriya + outset outside + over + overlay overline + padding + padding-box + paint + painted + pan-down + pan-left + pan-right + pan-up + pan-x + pan-y + paused + persian + petite-caps + pinch-zoom + pixelated + plaintext + pointer portrait + position pre pre-line pre-wrap + preserve-3d + progress + proportional-nums + proportional-width + proximity + recto relative + repeat + repeat-x + repeat-y + replace + reverse + ridge + right + rotate-left + rotate-right + round + row + row-resize + row-reverse rtl + ruby + ruby-base + ruby-base-container + ruby-text + ruby-text-container + running + s-resize + safe + sans-serif + saturation + scale-down + screen scroll + scroll-position + se-resize + self-end + self-start semi-condensed semi-expanded separate + serif + sesame show - small-caption + sideways + sideways-lr + sideways-right + sideways-rl + simp-chinese-formal + simp-chinese-informal + size + slashed-zero + slice + small + small-caps + smaller + smooth + soft-light + solid + space + space-around + space-between + space-evenly + spell-out + square + stable + stacked-fractions + start static - static-position - status-bar + step-end + step-start sticky + stretch + strict + stroke + stroke-box + style + sub + subtract + super + sw-resize + swap + symbolic + system-ui + table + table-caption + table-cell + table-column + table-column-group + table-footer-group + table-header-group + table-row + table-row-group + tabular-nums + tamil + telugu + text + thai thick thin + tibetan + titling-caps + top + trad-chinese-formal + trad-chinese-informal + transparent + triangle + true + ui-monospace + ui-rounded + ui-sans-serif + ui-serif ultra-condensed ultra-expanded + under underline + unicase + unicode + unsafe + upper-alpha + upper-armenian + upper-latin + upper-roman uppercase + upright + use-glyph-orientation + verso + vertical + vertical-lr + vertical-rl + vertical-text + view-box visible - wider - break - serif - sans-serif - cursive - fantasy - monospace - border-box - content-box - -epub-hyphens - contain - cover + visibleFill + visiblePainted + visibleStroke + w-resize + wait + weight + words + wrap + wrap-reverse + x-large + x-small + xx-large + xx-small + xxx-large + zoom-in + zoom-out - - - block - inline - run-in + - flow - flow-root - table - flex - grid - ruby + after-edge + arcs + before-edge + bevel + bounding-box + butt + central + crispEdges + evenodd + fixed-position + freeze + geometricPrecision + ideographic + linearRGB + mathematical + middle + miter + miter-clip + non-rotation + non-scaling-size + non-scaling-stroke + nonzero + optimizeLegibility + optimizeQuality + optimizeSpeed + remove + sRGB + text-after-edge + text-before-edge + text-bottom + text-top - list-item - - table-row-group - table-header-group - table-footer-group - table-row - table-cell - table-column-group - table-column - table-caption - ruby-base - ruby-text - ruby-base-container - ruby-text-container - - contents - - inline-block - inline-table - inline-flex - inline-grid - - - all - ease - ease-in - ease-out - ease-in-out - step-start - step-end - linear - - - infinite - reverse - alternate - alternate-reverse - forwards - backwards - running - paused + + konq-center - black - silver - gray - white - maroon - red - purple - fuchsia - green - lime - olive - yellow - navy - blue - teal - aqua - orange aliceblue antiquewhite + aqua aquamarine azure beige bisque + black blanchedalmond + blue blueviolet brown burlywood @@ -996,7 +1083,6 @@ Changelog: cornsilk crimson cyan - aqua darkblue darkcyan darkgoldenrod @@ -1024,10 +1110,13 @@ Changelog: firebrick floralwhite forestgreen + fuchsia gainsboro ghostwhite gold goldenrod + gray + green greenyellow grey honeydew @@ -1055,10 +1144,11 @@ Changelog: lightslategrey lightsteelblue lightyellow + lime limegreen linen magenta - fuchsia + maroon mediumaquamarine mediumblue mediumorchid @@ -1073,8 +1163,11 @@ Changelog: mistyrose moccasin navajowhite + navy oldlace + olive olivedrab + orange orangered orchid palegoldenrod @@ -1087,7 +1180,9 @@ Changelog: pink plum powderblue + purple rebeccapurple + red rosybrown royalblue saddlebrown @@ -1096,6 +1191,7 @@ Changelog: seagreen seashell sienna + silver skyblue slateblue slategray @@ -1104,225 +1200,186 @@ Changelog: springgreen steelblue tan + teal thistle tomato turquoise violet wheat + white whitesmoke + yellow yellowgreen - rebeccapurple - - ActiveBorder - ActiveCaption - AppWorkspace - Background + + + AccentColor + AccentColorText + ActiveText + ButtonBorder ButtonFace - ButtonHighlight - ButtonShadow ButtonText - CaptionText + Canvas + CanvasText + Field + FieldText GrayText Highlight HighlightText - InactiveBorder - InactiveCaption - InactiveCaptionText - InfoBackground - InfoText - Menu - MenuText - Scrollbar - ThreeDDarkShadow - ThreeDFace - ThreeDHighlight - ThreeDLightShadow - ThreeDShadow - Window - WindowFrame - WindowText + LinkText + Mark + MarkText + VisitedText + - attr - cross-fade - env - fit-content - minmax - path - repeat - url - var - - - abs acos + annotation asin - atan2 atan - calc - clamp - cos - exp - hypot - log - max - min - mod - pow - rem - round - sign - sin - sqrt - tan - - - linear-gradient - radial-gradient - repeating-linear-gradient - repeating-radial-gradient - - - rgb - rgba - hsl - hsla - hwb - lab - lch - oklab - oklch - color - - - toggle - hwb - device-cmyk - color - element - image - image-set - conic-gradient - - - symbols - counter - counters - - - rect - - - inset - circle - ellipse - polygon - - + atan2 + attr blur brightness + calc + character-variant + circle + clamp + color + color-mix + conic-gradient contrast + cos + counter + counters + cross-fade + device-cmyk drop-shadow + ellipse + env + exp + fit-content + format grayscale + hsl hue-rotate + hwb + hypot + image + image-set + inset invert - opacity - saturate - sepia - - - max-content - min-content - repeat - - - cubic-bezier - frames - steps - - + lab + lch + linear-gradient + local + log matrix matrix3d + max + min + minmax + mod + oklab + oklch + opacity + ornaments + paint + path perspective + polygon + pow + radial-gradient + rem + repeat + repeating-conic-gradient + repeating-linear-gradient + repeating-radial-gradient + rgb rotate rotate3d rotateX rotateY rotateZ + round + saturate scale scale3d scaleX scaleY scaleZ + sepia + sign + sin skew skewX skewY + sqrt + styleset + stylistic + swash + symbols + tan + tech translate translate3d translateX translateY translateZ - - - local - format + url + var - - + all print screen speech + - - any-pointer + + -webkit-device-pixel-ratio + -webkit-transform-3d any-hover + any-pointer aspect-ratio color color-gamut color-index display-mode + dynamic-range + forced-colors grid height hover - max-aspect-ratio - max-color - max-color-index - max-device-aspect-ratio - max-device-height - max-device-width + inverted-colors max-height - max-monochrome - max-resolution max-width - min-aspect-ratio - min-color - min-color-index - min-device-aspect-ratio - min-device-height - min-device-width min-height - min-monochrome - min-resolution min-width monochrome orientation + overflow-block + overflow-inline pointer + prefers-color-scheme + prefers-contrast + prefers-reduced-motion resolution - scan + scripting update + video-dynamic-range width - + after backdrop before cue + cue-region file-selector-button first-letter first-line @@ -1332,16 +1389,7 @@ Changelog: selection slotted - - - - - - - value - choices - repeat-item - repeat-index + -moz-progress-bar -moz-range-progress @@ -1360,37 +1408,42 @@ Changelog: - - future - local-link - modal - picture-in-picture - + active any-link autofill + buffering checked + current default defined - + dir disabled empty enabled + first first-child first-of-type focus focus-visible focus-within fullscreen + has host + host-context hover in-range indeterminate invalid + is lang last-child last-of-type + left link + local-link + modal + muted not nth-child nth-last-child @@ -1400,36 +1453,28 @@ Changelog: only-of-type optional out-of-range + paused + picture-in-picture placeholder-shown + playing read-only read-write required + right root scope + seeking + stalled target + user-invalid + user-valid valid visited - - - after - before - cue - first-letter - first-line - selection - - - - has - host - host-context - is - matches - not + volume-locked where - + blank first left @@ -1439,412 +1484,548 @@ Changelog: - @character - @layer - @container @charset - @import - @namespace - - - + @container @font-feature-values - @document + @import + @keyframes + @layer @media + @namespace + @page @supports - + + @color-profile @counter-style - @viewport - @page @font-face - @keyframes - - - - min-width - max-width - width - min-height - max-height - height - zoom - min-zoom - max-zoom - user-zoom - orientation - viewport-fit - - - - size - marks - bleed - - - - font-display - font-family - font-stretch - font-style - font-weight - font-variant - font-feature-settings - font-variation-settings - src - unicode-range - - - - from - to + @font-palette-values + @property + or and only not - - - - - - + + + + + - - - - - - - - + + + + + + + + + + - - + + + + + - - - - - - - - + + + + + + + + - - + + - + + + + + + + + + + + + + - - + + - - - + + + - - - + + + - + - - - - + + + + - - - - - - - + + + + + + + - - - - + + + + + + + + + + - - - - - - - + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + + - - - - + + + + + + + + + + + + + + + + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + + + + + + + + + - - - + + + + + + - - - - + + + + + + + + - - - + + + + + + + - - - - + + + + + + + + + + + + + - - - - + + - - - - + + + + + + + + + + + + + + - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + - - - + + + + + + + + + + - - - - - + + + + + + + + + + + + + + - - - + + + + + + + + + + - - + + + + + - - - - - - + + + + + + + - - + + + + + + + - - - + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + + + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + + + - - - - + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - + + + - - - + + + - - - + + + @@ -1852,36 +2033,49 @@ Changelog: + + + + + + + + + + - + + + + - + - + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/doxygen.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/doxygen.xml index 5516c1454b7..da87e4d9170 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/doxygen.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/doxygen.xml @@ -1,12 +1,12 @@ - ]> - + @@ -598,6 +598,7 @@ + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/dtd.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/dtd.xml index 8093b1c4e81..0526efc6250 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/dtd.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/dtd.xml @@ -1,5 +1,5 @@ - ]> diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/gnuassembler.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/gnuassembler.xml index 35b9763277e..26a306c28af 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/gnuassembler.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/gnuassembler.xml @@ -1,5 +1,5 @@ - + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -79,8 +96,8 @@ - - + + @@ -136,49 +153,40 @@ - - - + + + - - + - - - - - - - - - - - - - + + + - - + + + + - + - + - - - + + + @@ -186,25 +194,35 @@ - + + + + + + + + - + - + - + + + - + + @@ -220,11 +238,11 @@ - + - + @@ -250,8 +268,8 @@ - - + + @@ -259,8 +277,8 @@ - - + + @@ -268,25 +286,25 @@ - - + + - + - + - - + + - + - + @@ -299,7 +317,9 @@ + + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/ini.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/ini.xml index 849b90e7eee..56a35e80c7c 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/ini.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/ini.xml @@ -1,6 +1,6 @@ - - + + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/java.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/java.xml index 478fb6ff3e7..aaeef26c3fb 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/java.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/java.xml @@ -1,5 +1,5 @@ - @@ -7,7 +7,7 @@ ]> - + ACTIVE @@ -3705,6 +3705,8 @@ + + abstract class @@ -3714,7 +3716,6 @@ false implements instanceof - @interface interface native new @@ -3730,6 +3731,11 @@ transient true volatile + + non-sealed + permits + record + sealed assert @@ -3748,6 +3754,7 @@ throw try while + yield boolean @@ -3764,6 +3771,25 @@ var void + + + + @Override + @Deprecated + @SuppressWarnings + @SafeVarargs + @FunctionalInterface + @interface + + @Retention + @Documented + @Target + @Inherited + @Repeatable + + + + @@ -3783,6 +3809,7 @@ + @@ -3795,6 +3822,7 @@ + @@ -3831,6 +3859,11 @@ + + + + + @@ -3898,6 +3931,7 @@ + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/javadoc.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/javadoc.xml index 336fedd53c1..84c7841cadf 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/javadoc.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/javadoc.xml @@ -1,6 +1,6 @@ - - + + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/json.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/json.xml index 791a8081331..f302ff13692 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/json.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/json.xml @@ -1,5 +1,5 @@ - + - + null @@ -40,7 +40,12 @@ - + + + + + + @@ -57,13 +62,18 @@ - - + + - + + + + + + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/markdown.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/markdown.xml index 30b226ada01..c3811c772fb 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/markdown.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/markdown.xml @@ -22,7 +22,7 @@ Example: **bold text and _italic and bold text_** __bold and ~~strikeout and bold~~__ --> - @@ -72,6 +72,10 @@ + + + + @@ -90,7 +94,7 @@ ]> - + @@ -137,9 +141,12 @@ + + + @@ -148,6 +155,16 @@ + + + + + + + + + + @@ -207,6 +224,7 @@ + @@ -226,6 +244,7 @@ + @@ -254,6 +273,8 @@ + + @@ -284,13 +305,14 @@ to check the indentation of the text and determine if the content of the list ends. --> - + + @@ -303,6 +325,12 @@ + + + + + + @@ -312,42 +340,42 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -450,13 +478,13 @@ - + - + @@ -494,7 +522,7 @@ - + @@ -505,6 +533,8 @@ + + @@ -523,6 +553,7 @@ + @@ -531,8 +562,7 @@ - - + @@ -606,6 +636,7 @@ + @@ -621,6 +652,7 @@ + @@ -629,11 +661,14 @@ + + + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/modelines.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/modelines.xml index 43b49f3388c..855bca48029 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/modelines.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/modelines.xml @@ -1,5 +1,5 @@ - diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/perl.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/perl.xml index b3822fe7b72..ed843a7d461 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/perl.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/perl.xml @@ -1,5 +1,5 @@ - + Add-Content Add-ADComputerServiceAccount @@ -847,11 +790,23 @@ \% \? + + + $Global: + $Local: + $Private: + $Script: + $Using: + $Workflow: + $Alias: + $Env: + $Function: + $Variable: + $_ $True $False - $Env $Null $^ $$ @@ -873,75 +828,176 @@ $Host $OFS + + + + .SYNOPSIS + .DESCRIPTION + .PARAMETER + .EXAMPLE + .INPUTS + .OUTPUTS + .NOTES + .LINK + .COMPONENT + .ROLE + .FUNCTIONALITY + .FORWARDHELPTARGETNAME + .FORWARDHELPCATEGORY + .REMOTEHELPRUNSPACE + .EXTERNALHELP + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + - + - - - - - + - - + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + + + - - + + - - + + + + + + + - - + + + + + + + + + + + + + + + - - + + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/qdocconf.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/qdocconf.xml index b735ca9f4a9..dfd8008d988 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/qdocconf.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/qdocconf.xml @@ -1,5 +1,5 @@ - + - + + @@ -374,6 +375,7 @@ + @@ -387,6 +389,7 @@ + @@ -401,6 +404,7 @@ + @@ -459,6 +463,7 @@ + @@ -595,6 +600,7 @@ + @@ -789,6 +795,7 @@ + @@ -855,6 +862,7 @@ + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/spdx-comments.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/spdx-comments.xml index 7d893119279..2b89fc5ac79 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/spdx-comments.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/spdx-comments.xml @@ -1,5 +1,5 @@ - + + + + + + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/valgrind-suppression.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/valgrind-suppression.xml index 46d8c646f7d..e795aca79f1 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/valgrind-suppression.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/valgrind-suppression.xml @@ -1,5 +1,5 @@ - + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/xml.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/xml.xml index 94a0f473244..da1910e26c3 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/xml.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/xml.xml @@ -1,12 +1,12 @@ - ]> - + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/yacc.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/yacc.xml index 8b939115947..4129a09bd7e 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/yacc.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/yacc.xml @@ -1,5 +1,5 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/libs/3rdparty/syntax-highlighting/data/themes/default.theme b/src/libs/3rdparty/syntax-highlighting/data/themes/default.theme deleted file mode 100644 index e9c5c838d39..00000000000 --- a/src/libs/3rdparty/syntax-highlighting/data/themes/default.theme +++ /dev/null @@ -1,174 +0,0 @@ -{ - "metadata" : { - "revision" : 3, - "name" : "Default" - }, - "text-styles": { - "Normal" : { - "text-color" : "#1f1c1b", - "selected-text-color" : "#ffffff", - "bold" : false, - "italic" : false, - "underline" : false, - "strike-through" : false - }, - "Keyword" : { - "text-color" : "#1f1c1b", - "selected-text-color" : "#ffffff", - "bold" : true - }, - "Function" : { - "text-color" : "#644a9b", - "selected-text-color" : "#452886" - }, - "Variable" : { - "text-color" : "#0057ae", - "selected-text-color" : "#00316e" - }, - "ControlFlow" : { - "text-color" : "#1f1c1b", - "selected-text-color" : "#ffffff", - "bold" : true - }, - "Operator" : { - "text-color" : "#1f1c1b", - "selected-text-color" : "#ffffff" - }, - "BuiltIn" : { - "text-color" : "#644a9b", - "selected-text-color" : "#452886", - "bold" : true - }, - "Extension" : { - "text-color" : "#0095ff", - "selected-text-color" : "#ffffff", - "bold" : true - }, - "Preprocessor" : { - "text-color" : "#006e28", - "selected-text-color" : "#006e28" - }, - "Attribute" : { - "text-color" : "#0057ae", - "selected-text-color" : "#00316e" - }, - "Char" : { - "text-color" : "#924c9d", - "selected-text-color" : "#6c2477" - }, - "SpecialChar" : { - "text-color" : "#3daee9", - "selected-text-color" : "#fcfcfc" - }, - "String" : { - "text-color" : "#bf0303", - "selected-text-color" : "#9c0e0e" - }, - "VerbatimString" : { - "text-color" : "#bf0303", - "selected-text-color" : "#9c0e0e" - }, - "SpecialString" : { - "text-color" : "#ff5500", - "selected-text-color" : "#ff5500" - }, - "Import" : { - "text-color" : "#ff5500", - "selected-text-color" : "#ff5500" - }, - "DataType" : { - "text-color" : "#0057ae", - "selected-text-color" : "#00316e" - }, - "DecVal" : { - "text-color" : "#b08000", - "selected-text-color" : "#805c00" - }, - "BaseN" : { - "text-color" : "#b08000", - "selected-text-color" : "#805c00" - }, - "Float" : { - "text-color" : "#b08000", - "selected-text-color" : "#805c00" - }, - "Constant" : { - "text-color" : "#aa5500", - "selected-text-color" : "#5e2f00" - }, - "Comment" : { - "text-color" : "#898887", - "selected-text-color" : "#5e5d5d" - }, - "Documentation" : { - "text-color" : "#607880", - "selected-text-color" : "#46585e" - }, - "Annotation" : { - "text-color" : "#ca60ca", - "selected-text-color" : "#a44ea4" - }, - "CommentVar" : { - "text-color" : "#0095ff", - "selected-text-color" : "#ffffff" - }, - "RegionMarker" : { - "text-color" : "#0057ae", - "selected-text-color" : "#00316e", - "background-color" : "#e0e9f8" - }, - "Information" : { - "text-color" : "#b08000", - "selected-text-color" : "#805c00" - }, - "Warning" : { - "text-color" : "#bf0303", - "selected-text-color" : "#9c0e0e" - }, - "Alert" : { - "text-color" : "#bf0303", - "selected-text-color" : "#9c0e0e", - "background-color" : "#f7e6e6", - "bold" : true - }, - "Error" : { - "text-color" : "#bf0303", - "selected-text-color" : "#9c0e0e", - "underline" : true - }, - "Others" : { - "text-color" : "#006e28", - "selected-text-color" : "#006e28" - } - }, - "editor-colors": { - "background-color" : "#ffffff", - "code-folding" : "#94caef", - "bracket-matching" : "#ffff00", - "current-line" : "#f8f7f6", - "icon-border" : "#f0f0f0", - "indentation-line" : "#d2d2d2", - "line-numbers" : "#a0a0a0", - "current-line-number" : "#1e1e1e", - "mark-bookmark" : "#0000ff", - "mark-breakpoint-active" : "#ff0000", - "mark-breakpoint-reached" : "#ffff00", - "mark-breakpoint-disabled" : "#ff00ff", - "mark-execution" : "#a0a0a4", - "mark-warning" : "#00ff00", - "mark-error" : "#ff0000", - "modified-lines" : "#fdbc4b", - "replace-highlight" : "#00ff00", - "saved-lines" : "#2ecc71", - "search-highlight" : "#ffff00", - "selection" : "#94caef", - "separator" : "#898887", - "spell-checking" : "#bf0303", - "tab-marker" : "#d2d2d2", - "template-background" : "#d6d2d0", - "template-placeholder" : "#baf8ce", - "template-focused-placeholder" : "#76da98", - "template-read-only-placeholder" : "#f6e6e6", - "word-wrap-marker" : "#ededed" - } -} diff --git a/src/libs/3rdparty/syntax-highlighting/data/themes/theme-data.qrc b/src/libs/3rdparty/syntax-highlighting/data/themes/theme-data.qrc index cf9d658c824..8f4aa6c7e43 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/themes/theme-data.qrc +++ b/src/libs/3rdparty/syntax-highlighting/data/themes/theme-data.qrc @@ -1,26 +1,26 @@ - - - - atom-one-dark.theme - atom-one-light.theme - breeze-dark.theme - breeze-light.theme - ayu-dark.theme - ayu-light.theme - ayu-mirage.theme - dracula.theme - falcon.theme - github-dark.theme - github-light.theme - gruvbox-dark.theme - gruvbox-light.theme - monokai.theme - nord.theme - oblivion.theme - printing.theme - radical.theme - solarized-dark.theme - solarized-light.theme - vim-dark.theme - + + + atom-one-dark.theme + atom-one-light.theme + ayu-dark.theme + ayu-light.theme + ayu-mirage.theme + breeze-dark.theme + breeze-light.theme + dracula.theme + falcon.theme + github-dark.theme + github-light.theme + gruvbox-dark.theme + gruvbox-light.theme + homunculus.theme + monokai.theme + nord.theme + oblivion.theme + printing.theme + radical.theme + solarized-dark.theme + solarized-light.theme + vim-dark.theme + diff --git a/src/libs/3rdparty/syntax-highlighting/src/CMakeLists.txt b/src/libs/3rdparty/syntax-highlighting/src/CMakeLists.txt index 419b8ed5b7c..9d53a5bc3d5 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/CMakeLists.txt +++ b/src/libs/3rdparty/syntax-highlighting/src/CMakeLists.txt @@ -1,9 +1,9 @@ add_subdirectory(indexer) -if(TARGET Qt${QT_MAJOR_VERSION}::Gui) +if(TARGET Qt6::Gui) add_subdirectory(lib) add_subdirectory(cli) endif() -if(TARGET Qt${QT_MAJOR_VERSION}::Quick) +if(TARGET Qt6::Quick) add_subdirectory(quick) endif() diff --git a/src/libs/3rdparty/syntax-highlighting/src/Messages.sh b/src/libs/3rdparty/syntax-highlighting/src/Messages.sh index 6fb605ddf08..4024d9b74d4 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/Messages.sh +++ b/src/libs/3rdparty/syntax-highlighting/src/Messages.sh @@ -8,4 +8,4 @@ sed -i -e 's/^i18nc/QT_TRANSLATE_NOOP/' rc.cpp grep --no-filename '"name"' ../data/themes/*.theme | \ sed -r -e 's/"name"/QT_TRANSLATE_NOOP("Theme", /; s/://; s/,?$/);/' >> rc.cpp -$EXTRACT_TR_STRINGS `find . -name \*.cpp -o -name \*.h -o -name \*.ui -o -name \*.qml` -o $podir/syntaxhighlighting5_qt.pot +$EXTRACT_TR_STRINGS `find . -name \*.cpp -o -name \*.h -o -name \*.ui -o -name \*.qml` -o $podir/syntaxhighlighting6_qt.pot diff --git a/src/libs/3rdparty/syntax-highlighting/src/cli/CMakeLists.txt b/src/libs/3rdparty/syntax-highlighting/src/cli/CMakeLists.txt index 1a4d24d8284..3aa3a8afc3f 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/cli/CMakeLists.txt +++ b/src/libs/3rdparty/syntax-highlighting/src/cli/CMakeLists.txt @@ -1,5 +1,5 @@ -add_executable(kate-syntax-highlighter kate-syntax-highlighter.cpp) -ecm_mark_nongui_executable(kate-syntax-highlighter) -target_link_libraries(kate-syntax-highlighter KF5SyntaxHighlighting) +add_executable(ksyntaxhighlighter6 ksyntaxhighlighter.cpp) +ecm_mark_nongui_executable(ksyntaxhighlighter6) +target_link_libraries(ksyntaxhighlighter6 KF6SyntaxHighlighting) -install(TARGETS kate-syntax-highlighter ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}) +install(TARGETS ksyntaxhighlighter6 ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}) diff --git a/src/libs/3rdparty/syntax-highlighting/src/cli/kate-syntax-highlighter.cpp b/src/libs/3rdparty/syntax-highlighting/src/cli/ksyntaxhighlighter.cpp similarity index 77% rename from src/libs/3rdparty/syntax-highlighting/src/cli/kate-syntax-highlighter.cpp rename to src/libs/3rdparty/syntax-highlighting/src/cli/ksyntaxhighlighter.cpp index 5ce90e00530..681410cb706 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/cli/kate-syntax-highlighter.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/cli/ksyntaxhighlighter.cpp @@ -26,7 +26,6 @@ static void applyHighlighter(Highlighter &highlighter, QCommandLineParser &parser, bool fromFileName, const QString &inFileName, - const QCommandLineOption &stdinOption, const QCommandLineOption &outputName, const Ts &...highlightParams) { @@ -38,30 +37,36 @@ static void applyHighlighter(Highlighter &highlighter, if (fromFileName) { highlighter.highlightFile(inFileName, highlightParams...); - } else if (parser.isSet(stdinOption)) { + } else { QFile inFile; inFile.open(stdin, QIODevice::ReadOnly); highlighter.highlightData(&inFile, highlightParams...); - } else { - parser.showHelp(1); } } +static Theme theme(const Repository &repo, const QString &themeName, Repository::DefaultTheme t) +{ + if (themeName.isEmpty()) { + return repo.defaultTheme(t); + } + return repo.theme(themeName); +} + int main(int argc, char **argv) { QCoreApplication app(argc, argv); - QCoreApplication::setApplicationName(QStringLiteral("kate-syntax-highlighter")); + QCoreApplication::setApplicationName(QStringLiteral("ksyntaxhighlighter")); QCoreApplication::setOrganizationDomain(QStringLiteral("kde.org")); QCoreApplication::setOrganizationName(QStringLiteral("KDE")); - QCoreApplication::setApplicationVersion(QStringLiteral(SyntaxHighlighting_VERSION_STRING)); - - Repository repo; + QCoreApplication::setApplicationVersion(QStringLiteral(KSYNTAXHIGHLIGHTING_VERSION_STRING)); QCommandLineParser parser; - parser.setApplicationDescription(app.translate("SyntaxHighlightingCLI", "Command line syntax highlighter using Kate syntax definitions.")); + parser.setApplicationDescription(app.translate("SyntaxHighlightingCLI", "Command line syntax highlighter using KSyntaxHighlighting syntax definitions.")); parser.addHelpOption(); parser.addVersionOption(); - parser.addPositionalArgument(app.translate("SyntaxHighlightingCLI", "source"), app.translate("SyntaxHighlightingCLI", "The source file to highlight.")); + parser.addPositionalArgument( + app.translate("SyntaxHighlightingCLI", "source"), + app.translate("SyntaxHighlightingCLI", "The source file to highlight. If absent, read the file from stdin and the --syntax option must be used.")); QCommandLineOption listDefs(QStringList() << QStringLiteral("l") << QStringLiteral("list"), app.translate("SyntaxHighlightingCLI", "List all available syntax definitions.")); @@ -85,8 +90,7 @@ int main(int argc, char **argv) QCommandLineOption themeName(QStringList() << QStringLiteral("t") << QStringLiteral("theme"), app.translate("SyntaxHighlightingCLI", "Color theme to use for highlighting."), - app.translate("SyntaxHighlightingCLI", "theme"), - repo.defaultTheme(Repository::LightTheme).name()); + app.translate("SyntaxHighlightingCLI", "theme")); parser.addOption(themeName); QCommandLineOption outputFormatOption( @@ -99,7 +103,7 @@ int main(int argc, char **argv) QCommandLineOption traceOption(QStringList() << QStringLiteral("syntax-trace"), app.translate("SyntaxHighlightingCLI", "Add information to debug a syntax file. Only works with --output-format=ansi or ansi256Colors. Possible " - "values are format, region, context and stackSize."), + "values are format, region, context, stackSize and all."), app.translate("SyntaxHighlightingCLI", "type")); parser.addOption(traceOption); @@ -107,18 +111,20 @@ int main(int argc, char **argv) app.translate("SyntaxHighlightingCLI", "Disable ANSI background for the default color.")); parser.addOption(noAnsiEditorBg); + QCommandLineOption unbufferedAnsi(QStringList() << QStringLiteral("U") << QStringLiteral("unbuffered"), + app.translate("SyntaxHighlightingCLI", "For ansi and ansi256Colors formats, flush the output buffer on each line.")); + parser.addOption(unbufferedAnsi); + QCommandLineOption titleOption( QStringList() << QStringLiteral("T") << QStringLiteral("title"), - app.translate("SyntaxHighlightingCLI", "Set HTML page's title\n(default: the filename or \"Kate Syntax Highlighter\" if reading from stdin)."), + app.translate("SyntaxHighlightingCLI", "Set HTML page's title\n(default: the filename or \"KSyntaxHighlighter\" if reading from stdin)."), app.translate("SyntaxHighlightingCLI", "title")); parser.addOption(titleOption); - QCommandLineOption stdinOption(QStringList() << QStringLiteral("stdin"), - app.translate("SyntaxHighlightingCLI", "Read file from stdin. The -s option must also be used.")); - parser.addOption(stdinOption); - parser.process(app); + Repository repo; + if (parser.isSet(listDefs)) { for (const auto &def : repo.definitions()) { std::cout << qPrintable(def.name()) << std::endl; @@ -177,7 +183,7 @@ int main(int argc, char **argv) return 1; } - QString outputFormat = parser.value(outputFormatOption); + const QString outputFormat = parser.value(outputFormatOption); if (0 == outputFormat.compare(QLatin1String("html"), Qt::CaseInsensitive)) { QString title; if (parser.isSet(titleOption)) { @@ -186,8 +192,8 @@ int main(int argc, char **argv) HtmlHighlighter highlighter; highlighter.setDefinition(def); - highlighter.setTheme(repo.theme(parser.value(themeName))); - applyHighlighter(highlighter, parser, fromFileName, inFileName, stdinOption, outputName, title); + highlighter.setTheme(theme(repo, parser.value(themeName), Repository::LightTheme)); + applyHighlighter(highlighter, parser, fromFileName, inFileName, outputName, title); } else { auto AnsiFormat = AnsiHighlighter::AnsiFormat::TrueColor; if (0 == outputFormat.compare(QLatin1String("ansi256Colors"), Qt::CaseInsensitive)) { @@ -197,18 +203,22 @@ int main(int argc, char **argv) return 2; } - auto debugOptions = AnsiHighlighter::TraceOptions(); + AnsiHighlighter::Options options{}; + options |= parser.isSet(noAnsiEditorBg) ? AnsiHighlighter::Option::NoOptions : AnsiHighlighter::Option::UseEditorBackground; + options |= parser.isSet(unbufferedAnsi) ? AnsiHighlighter::Option::Unbuffered : AnsiHighlighter::Option::NoOptions; if (parser.isSet(traceOption)) { - const auto options = parser.values(traceOption); - for (auto const &option : options) { + const auto traceOptions = parser.values(traceOption); + for (auto const &option : traceOptions) { if (option == QStringLiteral("format")) { - debugOptions |= AnsiHighlighter::TraceOption::Format; + options |= AnsiHighlighter::Option::TraceFormat; } else if (option == QStringLiteral("region")) { - debugOptions |= AnsiHighlighter::TraceOption::Region; + options |= AnsiHighlighter::Option::TraceRegion; } else if (option == QStringLiteral("context")) { - debugOptions |= AnsiHighlighter::TraceOption::Context; + options |= AnsiHighlighter::Option::TraceContext; } else if (option == QStringLiteral("stackSize")) { - debugOptions |= AnsiHighlighter::TraceOption::StackSize; + options |= AnsiHighlighter::Option::TraceStackSize; + } else if (option == QStringLiteral("all")) { + options |= AnsiHighlighter::Option::TraceAll; } else { std::cerr << "Unknown trace name." << std::endl; return 2; @@ -218,8 +228,8 @@ int main(int argc, char **argv) AnsiHighlighter highlighter; highlighter.setDefinition(def); - highlighter.setTheme(repo.theme(parser.value(themeName))); - applyHighlighter(highlighter, parser, fromFileName, inFileName, stdinOption, outputName, AnsiFormat, !parser.isSet(noAnsiEditorBg), debugOptions); + highlighter.setTheme(theme(repo, parser.value(themeName), Repository::DarkTheme)); + applyHighlighter(highlighter, parser, fromFileName, inFileName, outputName, AnsiFormat, options); } return 0; diff --git a/src/libs/3rdparty/syntax-highlighting/src/indexer/CMakeLists.txt b/src/libs/3rdparty/syntax-highlighting/src/indexer/CMakeLists.txt index 77a16faf22e..cf6940b7bd5 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/indexer/CMakeLists.txt +++ b/src/libs/3rdparty/syntax-highlighting/src/indexer/CMakeLists.txt @@ -4,13 +4,8 @@ if(CMAKE_CROSSCOMPILING AND KATEHIGHLIGHTINGINDEXER_EXECUTABLE) add_executable(katehighlightingindexer IMPORTED GLOBAL) set_target_properties(katehighlightingindexer PROPERTIES IMPORTED_LOCATION ${KATEHIGHLIGHTINGINDEXER_EXECUTABLE}) elseif(CMAKE_CROSSCOMPILING) - if (NOT KF5_HOST_TOOLING) - message(FATAL_ERROR "Please provide a prefix with a native Qt build and pass -DKF5_HOST_TOOLING=path") - endif() - - # search native tooling prefix - string(FIND ${KF5_HOST_TOOLING} /lib idx) - string(SUBSTRING ${KF5_HOST_TOOLING} 0 ${idx} NATIVE_PREFIX) + include(ECMQueryQt) + ecm_query_qt(NATIVE_PREFIX QT_HOST_PREFIX) message(STATUS "Building katehighlightingindexer against ${NATIVE_PREFIX}") include(ExternalProject) @@ -19,7 +14,7 @@ elseif(CMAKE_CROSSCOMPILING) CMAKE_ARGS -DKSYNTAXHIGHLIGHTING_USE_GUI=OFF -DECM_DIR=${ECM_DIR} -DCMAKE_PREFIX_PATH=${NATIVE_PREFIX} -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR} - -DQT_MAJOR_VERSION=${QT_MAJOR_VERSION} + -DQT_MAJOR_VERSION=6 INSTALL_COMMAND "" BUILD_BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/native_katehighlightingindexer-prefix/src/native_katehighlightingindexer-build/bin/katehighlightingindexer ) @@ -31,9 +26,11 @@ else() # host build add_executable(katehighlightingindexer katehighlightingindexer.cpp ../lib/worddelimiters.cpp) ecm_mark_nongui_executable(katehighlightingindexer) - if(Qt5XmlPatterns_FOUND AND NOT ECM_ENABLE_SANITIZERS) - target_link_libraries(katehighlightingindexer Qt5::XmlPatterns) + if(XercesC_FOUND) + add_definitions(-DHAS_XERCESC) + kde_target_enable_exceptions(katehighlightingindexer PRIVATE) + target_link_libraries(katehighlightingindexer Qt6::Core XercesC::XercesC) else() - target_link_libraries(katehighlightingindexer Qt${QT_MAJOR_VERSION}::Core) + target_link_libraries(katehighlightingindexer Qt6::Core) endif() endif() diff --git a/src/libs/3rdparty/syntax-highlighting/src/indexer/katehighlightingindexer.cpp b/src/libs/3rdparty/syntax-highlighting/src/indexer/katehighlightingindexer.cpp index 9c541ef1b42..787747e21c0 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/indexer/katehighlightingindexer.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/indexer/katehighlightingindexer.cpp @@ -12,12 +12,167 @@ #include #include #include +#include #include #include -#ifdef QT_XMLPATTERNS_LIB -#include -#include +#ifdef HAS_XERCESC + +#include + +#include + +#include +#include + +#include +#include +#include + +#include +#include + +using namespace xercesc; + +/* + * Ideas taken from: + * + * author : Boris Kolpackov + * copyright : not copyrighted - public domain + * + * This program uses Xerces-C++ SAX2 parser to load a set of schema files + * and then to validate a set of XML documents against these schemas. To + * build this program you will need Xerces-C++ 3.0.0 or later. For more + * information, see: + * + * http://www.codesynthesis.com/~boris/blog/2010/03/15/validating-external-schemas-xerces-cxx/ + */ + +/** + * Error handler object used during xml schema validation. + */ +class CustomErrorHandler : public ErrorHandler +{ +public: + /** + * Constructor + * @param messages Pointer to the error message string to fill. + */ + CustomErrorHandler(QString *messages) + : m_messages(messages) + { + } + + /** + * Check global success/fail state. + * @return True if there was a failure, false otherwise. + */ + bool failed() const + { + return m_failed; + } + +private: + /** + * Severity classes for error messages. + */ + enum severity { s_warning, s_error, s_fatal }; + + /** + * Wrapper for warning exceptions. + * @param e Exception to handle. + */ + void warning(const SAXParseException &e) override + { + m_failed = true; // be strict, warnings are evil, too! + handle(e, s_warning); + } + + /** + * Wrapper for error exceptions. + * @param e Exception to handle. + */ + void error(const SAXParseException &e) override + { + m_failed = true; + handle(e, s_error); + } + + /** + * Wrapper for fatal error exceptions. + * @param e Exception to handle. + */ + void fatalError(const SAXParseException &e) override + { + m_failed = true; + handle(e, s_fatal); + } + + /** + * Reset the error status to "no error". + */ + void resetErrors() override + { + m_failed = false; + } + + /** + * Generic handler for error/warning/fatal error message exceptions. + * @param e Exception to handle. + * @param s Enum value encoding the message severtity. + */ + void handle(const SAXParseException &e, severity s) + { + // get id to print + const XMLCh *xid(e.getPublicId()); + if (!xid) + xid = e.getSystemId(); + + m_messages << QString::fromUtf16(xid) << ":" << e.getLineNumber() << ":" << e.getColumnNumber() << " " << (s == s_warning ? "warning: " : "error: ") + << QString::fromUtf16(e.getMessage()) << Qt::endl; + } + +private: + /** + * Storage for created error messages in this handler. + */ + QTextStream m_messages; + + /** + * Global error state. True if there was an error, false otherwise. + */ + bool m_failed = false; +}; + +void init_parser(SAX2XMLReaderImpl &parser) +{ + // Commonly useful configuration. + // + parser.setFeature(XMLUni::fgSAX2CoreNameSpaces, true); + parser.setFeature(XMLUni::fgSAX2CoreNameSpacePrefixes, true); + parser.setFeature(XMLUni::fgSAX2CoreValidation, true); + + // Enable validation. + // + parser.setFeature(XMLUni::fgXercesSchema, true); + parser.setFeature(XMLUni::fgXercesSchemaFullChecking, true); + parser.setFeature(XMLUni::fgXercesValidationErrorAsFatal, true); + + // Use the loaded grammar during parsing. + // + parser.setFeature(XMLUni::fgXercesUseCachedGrammarInParse, true); + + // Don't load schemas from any other source (e.g., from XML document's + // xsi:schemaLocation attributes). + // + parser.setFeature(XMLUni::fgXercesLoadSchema, false); + + // Xerces-C++ 3.1.0 is the first version with working multi import + // support. + // + parser.setFeature(XMLUni::fgXercesHandleMultipleImports, true); +} + #endif #include "../lib/worddelimiters_p.h" @@ -152,12 +307,10 @@ public: success = false; } - QSet referencedKeywords; QSet usedAttributeNames; QSet ignoredAttributeNames; - success = checkKeywordsList(definition, referencedKeywords) && success; - success = - checkContexts(definition, referencedKeywords, usedAttributeNames, ignoredAttributeNames, usedContexts, unreachableIncludedRules) && success; + success = checkKeywordsList(definition) && success; + success = checkContexts(definition, usedAttributeNames, ignoredAttributeNames, usedContexts, unreachableIncludedRules) && success; // search for non-existing itemDatas. const auto invalidNames = usedAttributeNames - definition.itemDatas.styleNames; @@ -362,7 +515,7 @@ private: QString content; int line; - friend uint qHash(const Item &item, uint seed = 0) + friend size_t qHash(const Item &item, size_t seed = 0) { return qHash(item.content, seed); } @@ -373,7 +526,7 @@ private: } }; - QVector keywords; + QList keywords; QSet includes; bool parseElement(const QString &filename, QXmlStreamReader &xml) @@ -486,7 +639,7 @@ private: QString weakDeliminator; // rules included by IncludeRules (without IncludeRule) - QVector includedRules; + QList includedRules; // IncludeRules included by IncludeRules QSet includedIncludeRules; @@ -683,9 +836,10 @@ private: ContextName lineEndContext; ContextName lineEmptyContext; ContextName fallthroughContext; - QVector rules; + QList rules; XmlBool dynamic{}; XmlBool fallthrough{}; + XmlBool stopEmptyLineContextSwitchLoop{}; bool parseElement(const QString &filename, QXmlStreamReader &xml) { @@ -697,12 +851,17 @@ private: Parser parser{filename, xml, attr, success}; XmlBool noIndentationBasedFolding{}; - const bool isExtracted = parser.extractString(name, QStringLiteral("name")) || parser.extractString(attribute, QStringLiteral("attribute")) + // clang-format off + const bool isExtracted = parser.extractString(name, QStringLiteral("name")) + || parser.extractString(attribute, QStringLiteral("attribute")) || parser.extractString(lineEndContext.name, QStringLiteral("lineEndContext")) || parser.extractString(lineEmptyContext.name, QStringLiteral("lineEmptyContext")) || parser.extractString(fallthroughContext.name, QStringLiteral("fallthroughContext")) - || parser.extractXmlBool(dynamic, QStringLiteral("dynamic")) || parser.extractXmlBool(fallthrough, QStringLiteral("fallthrough")) + || parser.extractXmlBool(dynamic, QStringLiteral("dynamic")) + || parser.extractXmlBool(fallthrough, QStringLiteral("fallthrough")) + || parser.extractXmlBool(stopEmptyLineContextSwitchLoop, QStringLiteral("stopEmptyLineContextSwitchLoop")) || parser.extractXmlBool(noIndentationBasedFolding, QStringLiteral("noIndentationBasedFolding")); + // clang-format on success = parser.checkIfExtracted(isExtracted); } @@ -717,11 +876,6 @@ private: success = false; } - if (lineEndContext.name.isEmpty()) { - qWarning() << filename << "line" << xml.lineNumber() << "missing attribute: lineEndContext"; - success = false; - } - return success; } }; @@ -747,7 +901,7 @@ private: QString name; int line; - friend uint qHash(const Style &style, uint seed = 0) + friend size_t qHash(const Style &style, size_t seed = 0) { return qHash(style.name, seed); } @@ -802,7 +956,6 @@ private: const Context *firstContext = nullptr; QString filename; WordDelimiters wordDelimiters; - XmlBool casesensitive{}; Version kateVersion{}; QString kateVersionStr; QString languageName; @@ -865,7 +1018,7 @@ private: void resolveIncludeRules() { QSet usedContexts; - QVector contexts; + QList contexts; QMutableMapIterator def(m_definitions); while (def.hasNext()) { @@ -936,7 +1089,7 @@ private: QSet extractUsedContexts() const { QSet usedContexts; - QVector contexts; + QList contexts; QMapIterator def(m_definitions); while (def.hasNext()) { @@ -982,13 +1135,12 @@ private: }; struct IncludedRuleUnreachableBy { - QVector unreachableBy; + QList unreachableBy; bool alwaysUnreachable = true; }; //! Check contexts and rules bool checkContexts(const Definition &definition, - QSet &referencedKeywords, QSet &usedAttributeNames, QSet &ignoredAttributeNames, const QSet &usedContexts, @@ -1018,7 +1170,7 @@ private: usedAttributeNames.insert({context.attribute, context.line}); } - success = checkfallthrough(definition, context) && success; + success = checkContextAttribute(definition, context) && success; success = checkUreachableRules(definition.filename, context, unreachableIncludedRules) && success; success = suggestRuleMerger(definition.filename, context) && success; @@ -1032,7 +1184,7 @@ private: } success = checkLookAhead(rule) && success; success = checkStringDetect(rule) && success; - success = checkKeyword(definition, rule, referencedKeywords) && success; + success = checkKeyword(definition, rule) && success; success = checkRegExpr(filename, rule, context) && success; success = checkDelimiters(definition, rule) && success; } @@ -1047,12 +1199,13 @@ private: //! - dynamic=true but no place holder used? //! - is not . with lookAhead="1" //! - is not ^... without column ou firstNonSpace attribute - //! - is not equivalent to DetectSpaces, DetectChar, Detect2Chars, StringDetect, DetectIdentifier, RangeDetect + //! - is not equivalent to DetectSpaces, DetectChar, Detect2Chars, StringDetect, DetectIdentifier, RangeDetect, LineContinue or AnyChar //! - has no unused captures //! - has no unnecessary quantifier with lookAhead bool checkRegExpr(const QString &filename, const Context::Rule &rule, const Context &context) const { - if (rule.type == Context::Rule::Type::RegExpr) { + // ignore empty regex because the error is raised during xml parsing + if (rule.type == Context::Rule::Type::RegExpr && !rule.string.isEmpty()) { const QRegularExpression regexp(rule.string); if (!checkRegularExpression(rule.filename, regexp, rule.line)) { return false; @@ -1092,13 +1245,21 @@ private: // is RangeDetect static const QRegularExpression isRange(QStringLiteral("^\\^?" REG_CHAR "(?:" - "\\.\\*[?*]?" REG_CHAR "|" - "\\[\\^(" REG_ESCAPE_CHAR "|.)\\]\\*[?*]?\\1" + "\\.\\*[?+]?" REG_CHAR "|" + "\\[\\^(" REG_ESCAPE_CHAR "|.)\\]\\*[?+]?\\1" ")$")); if ((rule.lookAhead == XmlBool::True || rule.minimal == XmlBool::True || rule.string.contains(QStringLiteral(".*?")) || rule.string.contains(QStringLiteral("[^"))) && reg.contains(isRange)) { - qWarning() << filename << "line" << rule.line << "RegExpr should be replaced by RangeDetect:" << rule.string; + qWarning() << rule.filename << "line" << rule.line << "RegExpr should be replaced by RangeDetect:" << rule.string; + return false; + } + + // is AnyChar + static const QRegularExpression isAnyChar(QStringLiteral(R"(^(\^|\((\?:)?)*\[(?!\^)[-\]]?(\\[^0BDPSWbdpswoux]|[^-\]\\])*\]\)*$)")); + if (rule.string.contains(isAnyChar)) { + auto extra = (reg[0] == QLatin1Char('^') || reg[1] == QLatin1Char('^')) ? "with column=\"0\"" : ""; + qWarning() << rule.filename << "line" << rule.line << "RegExpr should be replaced by AnyChar:" << rule.string << extra; return false; } @@ -1106,7 +1267,7 @@ private: static const QRegularExpression isLineContinue(QStringLiteral("^\\^?" REG_CHAR "\\$$")); if (reg.contains(isLineContinue)) { auto extra = (reg[0] == QLatin1Char('^')) ? "with column=\"0\"" : ""; - qWarning() << filename << "line" << rule.line << "RegExpr should be replaced by LineContinue:" << rule.string << extra; + qWarning() << rule.filename << "line" << rule.line << "RegExpr should be replaced by LineContinue:" << rule.string << extra; return false; } @@ -1124,7 +1285,7 @@ private: if (rule.lookAhead == XmlBool::True && rule.minimal != XmlBool::True && reg.contains(isMinimal) && !reg.contains(hasNotGreedy) && (!rule.context.context || !rule.context.context->hasDynamicRule || regexp.captureCount() == 0) && (reg.back() != QLatin1Char('$') || reg.contains(QLatin1Char('|')))) { - qWarning() << filename << "line" << rule.line + qWarning() << rule.filename << "line" << rule.line << "RegExpr should be have minimal=\"1\" or use lazy operator (i.g, '.*' -> '.*?'):" << rule.string; return false; } @@ -1160,8 +1321,8 @@ private: return false; } - // column="0" or firstNonSpace="1" - if (rule.column == -1 && rule.firstNonSpace != XmlBool::True) { + // column="0" + if (rule.column == -1) { // ^ without | // (^sas*) -> ok // (^sa|s*) -> ko @@ -1204,7 +1365,7 @@ private: } if (replace) { - qWarning() << rule.filename << "line" << rule.line << "column=\"0\" or firstNonSpace=\"1\" missing with RegExpr:" << rule.string; + qWarning() << rule.filename << "line" << rule.line << "column=\"0\" missing with RegExpr:" << rule.string; return false; } } @@ -1306,11 +1467,8 @@ private: if (!useCapture) { // is DetectIdentifier - static const QRegularExpression isInsensitiveDetectIdentifier( - QStringLiteral(R"(^(\((\?:)?)?\[((a-z|_){2}|(A-Z|_){2})\]([+][*?]?)?\[((0-9|a-z|_){3}|(0-9|A-Z|_){3})\][*][*?]?(\))?$)")); - static const QRegularExpression isSensitiveDetectIdentifier( - QStringLiteral(R"(^(\((\?:)?)?\[(a-z|A-Z|_){3}\]([+][*?]?)?\[(0-9|a-z|A-Z|_){4}\][*][*?]?(\))?$)")); - auto &isDetectIdentifier = (rule.insensitive == XmlBool::True) ? isInsensitiveDetectIdentifier : isSensitiveDetectIdentifier; + static const QRegularExpression isDetectIdentifier( + QStringLiteral(R"(^(\((\?:)?|\^)*\[(\\p\{L\}|_){2}\]([+][?+]?)?\[(\\p\{N\}|\\p\{L\}|_){3}\][*][?+]?\)*$)")); if (rule.string.contains(isDetectIdentifier)) { qWarning() << rule.filename << "line" << rule.line << "RegExpr should be replaced by DetectIdentifier:" << rule.string; return false; @@ -1357,7 +1515,7 @@ private: static const QRegularExpression unnecessaryQuantifier2(QStringLiteral(R"([*+?]([.][*+?]{0,2})?[)]*$)")); auto &unnecessaryQuantifier = useCapture ? unnecessaryQuantifier1 : unnecessaryQuantifier2; if (rule.lookAhead == XmlBool::True && rule.minimal != XmlBool::True && reg.contains(unnecessaryQuantifier)) { - qWarning() << filename << "line" << rule.line + qWarning() << rule.filename << "line" << rule.line << "Last quantifier is not necessary (i.g., 'xyz*' -> 'xy', 'xyz+.' -> 'xyz.'):" << rule.string; return false; } @@ -1418,19 +1576,13 @@ private: return true; } - //! Search for rules with lookAhead="true" and context="#stay". - //! This would cause an infinite loop. - bool checkfallthrough(const Definition &definition, const Context &context) const + //! Check fallthrough and fallthroughContext. + //! Check kateversion for stopEmptyLineContextSwitchLoop. + bool checkContextAttribute(const Definition &definition, const Context &context) const { bool success = true; if (!context.fallthroughContext.name.isEmpty()) { - if (context.fallthroughContext.stay) { - qWarning() << definition.filename << "line" << context.line << "possible infinite loop due to fallthroughContext=\"#stay\" in context " - << context.name; - success = false; - } - const bool mandatoryFallthroughAttribute = definition.kateVersion < Version{5, 62}; if (context.fallthrough == XmlBool::True && !mandatoryFallthroughAttribute) { qWarning() << definition.filename << "line" << context.line << "fallthrough attribute is unnecessary with kateversion >= 5.62 in context" @@ -1444,6 +1596,12 @@ private: } } + if (context.stopEmptyLineContextSwitchLoop != XmlBool::Unspecified && definition.kateVersion < Version{5, 103}) { + qWarning() << definition.filename << "line" << context.line + << "stopEmptyLineContextSwitchLoop attribute is only valid with kateversion >= 5.103 in context" << context.name; + success = false; + } + return success; } @@ -1478,15 +1636,12 @@ private: return false; } - //! Search for rules with lookAhead="true" and context="#stay". - //! This would cause an infinite loop. - bool checkKeyword(const Definition &definition, const Context::Rule &rule, QSet &referencedKeywords) const + //! Check that keyword rule reference an existing keyword list. + bool checkKeyword(const Definition &definition, const Context::Rule &rule) const { if (rule.type == Context::Rule::Type::keyword) { auto it = definition.keywordsList.find(rule.string); - if (it != definition.keywordsList.end()) { - referencedKeywords.insert(&*it); - } else { + if (it == definition.keywordsList.end()) { qWarning() << rule.filename << "line" << rule.line << "reference of non-existing keyword list:" << rule.string; return false; } @@ -1504,13 +1659,7 @@ private: return true; } - //! Check that StringDetect contains more that 2 characters - //! Fix with following command: - //! \code - //! sed -E - //! '/StringDetect/{/dynamic="(1|true)|insensitive="(1|true)/!{s/StringDetect(.*)String="(.|<|>|"|&)(.|<|>|"|&)"/Detect2Chars\1char="\2" - //! char1="\3"/;t;s/StringDetect(.*)String="(.|<|>|"|&)"/DetectChar\1char="\2"/}}' -i file.xml... - //! \endcode + //! Check that StringDetect contains a placeHolder when dynamic="1" bool checkStringDetect(const Context::Rule &rule) const { if (rule.type == Context::Rule::Type::StringDetect) { @@ -1527,7 +1676,7 @@ private: } //! Check \ and delimiter in a keyword list - bool checkKeywordsList(const Definition &definition, QSet &referencedKeywords) const + bool checkKeywordsList(const Definition &definition) const { bool success = true; @@ -1542,7 +1691,7 @@ private: << " is only available since version \"5.53\". Please, increase kateversion."; success = false; } - success = checkKeywordInclude(definition, include, referencedKeywords) && success; + success = checkKeywordInclude(definition, include) && success; } // Check that keyword list items do not have deliminator character @@ -1562,16 +1711,13 @@ private: } //! Search for non-existing keyword include. - bool checkKeywordInclude(const Definition &definition, const Keywords::Items::Item &include, QSet &referencedKeywords) const + bool checkKeywordInclude(const Definition &definition, const Keywords::Items::Item &include) const { bool containsKeywordName = true; int const idx = include.content.indexOf(QStringLiteral("##")); if (idx == -1) { auto it = definition.keywordsList.find(include.content); containsKeywordName = (it != definition.keywordsList.end()); - if (containsKeywordName) { - referencedKeywords.insert(&*it); - } } else { auto defName = include.content.mid(idx + 2); auto listName = include.content.left(idx); @@ -1644,10 +1790,10 @@ private: } /// Search RuleAndInclude associated with the characters of @p s. - /// \return an empty QVector when at least one character is not found. - QVector find(QStringView s) const + /// \return an empty QList when at least one character is not found. + QList find(QStringView s) const { - QVector result; + QList result; for (QChar c : s) { if (!find(c)) { @@ -1731,8 +1877,8 @@ private: } /// Search RuleAndInclude associated with the characters of @p s. - /// \return an empty QVector when at least one character is not found. - QVector find(QStringView s) const + /// \return an empty QList when at least one character is not found. + QList find(QStringView s) const { for (int i = 0; i < m_size; ++i) { auto result = m_charTables[i]->find(s); @@ -1743,7 +1889,7 @@ private: return result; } } - return QVector(); + return QList(); } /// Associates @p c with a rule. @@ -1785,7 +1931,7 @@ private: // Iterates over all the rules, including those in includedRules struct RuleIterator { - RuleIterator(const QVector &rules, const ObservableRule &endRule) + RuleIterator(const QList &rules, const ObservableRule &endRule) : m_end(&endRule - rules.data()) , m_rules(rules) { @@ -1830,10 +1976,10 @@ private: private: int m_i = 0; - int m_i2; - int m_end; - const QVector &m_rules; - const QVector *m_includedRules = nullptr; + int m_i2 = 0; + const int m_end; + const QList &m_rules; + const QList *m_includedRules = nullptr; }; // Dot regex container that satisfies firstNonSpace and column. @@ -1915,7 +2061,7 @@ private: DotRegex dotRegex; - QVector observedRules; + QList observedRules; observedRules.reserve(context.rules.size()); for (const Context::Rule &rule : context.rules) { const Context::Rule *includeRule = nullptr; @@ -1937,7 +2083,7 @@ private: for (auto &observedRule : observedRules) { const Context::Rule &rule = *observedRule.rule; bool isUnreachable = false; - QVector unreachableBy; + QList unreachableBy; // declare rule as unreachable if ruleAndInclude is not empty auto updateUnreachable1 = [&](RuleAndInclude ruleAndInclude) { @@ -1948,7 +2094,7 @@ private: }; // declare rule as unreachable if ruleAndIncludes is not empty - auto updateUnreachable2 = [&](const QVector &ruleAndIncludes) { + auto updateUnreachable2 = [&](const QList &ruleAndIncludes) { if (!ruleAndIncludes.isEmpty()) { isUnreachable = true; unreachableBy.append(ruleAndIncludes); @@ -2030,6 +2176,8 @@ private: case Context::Rule::Type::Float: updateUnreachable2(CharTableArray(detectChars, rule).find(QStringLiteral("0123456789."))); updateUnreachable1(floatRule.setRule(rule)); + // check that Float is before Int + updateUnreachable1(Rule4(intRule).setRule(rule)); break; // check if hidden by another DetectIdentifier rule @@ -2629,12 +2777,32 @@ int main(int argc, char *argv[]) return 1; } -#ifdef QT_XMLPATTERNS_LIB - // open schema - QXmlSchema schema; - if (!schema.load(QUrl::fromLocalFile(app.arguments().at(2)))) { +#ifdef HAS_XERCESC + // care for proper init and cleanup + XMLPlatformUtils::Initialize(); + auto cleanup = qScopeGuard(XMLPlatformUtils::Terminate); + + /* + * parse XSD first time and cache it + */ + XMLGrammarPoolImpl xsd(XMLPlatformUtils::fgMemoryManager); + + // create parser for the XSD + SAX2XMLReaderImpl parser(XMLPlatformUtils::fgMemoryManager, &xsd); + init_parser(parser); + QString messages; + CustomErrorHandler eh(&messages); + parser.setErrorHandler(&eh); + + // load grammar into the pool, on error just abort + const auto xsdFile = app.arguments().at(2); + if (!parser.loadGrammar((const char16_t *)xsdFile.utf16(), Grammar::SchemaGrammarType, true) || eh.failed()) { + qWarning("Failed to parse XSD %s: %s", qPrintable(xsdFile), qPrintable(messages)); return 2; } + + // lock the pool, no later modifications wanted! + xsd.lockPool(); #endif const QString hlFilenamesListing = app.arguments().value(3); @@ -2665,10 +2833,20 @@ int main(int argc, char *argv[]) continue; } -#ifdef QT_XMLPATTERNS_LIB - // validate against schema - QXmlSchemaValidator validator(schema); - if (!validator.validate(&hlFile, QUrl::fromLocalFile(hlFile.fileName()))) { +#ifdef HAS_XERCESC + // create parser + SAX2XMLReaderImpl parser(XMLPlatformUtils::fgMemoryManager, &xsd); + init_parser(parser); + QString messages; + CustomErrorHandler eh(&messages); + parser.setErrorHandler(&eh); + + // parse the XML file + parser.parse((const char16_t *)hlFile.fileName().utf16()); + + // report issues + if (eh.failed()) { + qWarning("Failed to validate XML %s: %s", qPrintable(hlFile.fileName()), qPrintable(messages)); anyError = 4; continue; } @@ -2708,6 +2886,10 @@ int main(int argc, char *argv[]) // add boolean one hl[QStringLiteral("hidden")] = attrToBool(xml.attributes().value(QLatin1String("hidden"))); + // keep some strings as UTF-8 for faster translations + hl[QStringLiteral("nameUtf8")] = hl[QStringLiteral("name")].toString().toUtf8(); + hl[QStringLiteral("sectionUtf8")] = hl[QStringLiteral("section")].toString().toUtf8(); + // remember hl hls[QFileInfo(hlFile).fileName()] = hl; diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/CMakeLists.txt b/src/libs/3rdparty/syntax-highlighting/src/lib/CMakeLists.txt index fe89fdd715e..2b2845eba4d 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/CMakeLists.txt +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/CMakeLists.txt @@ -1,8 +1,14 @@ -add_library(KF5SyntaxHighlighting) +add_library(KF6SyntaxHighlighting) -ecm_create_qm_loader(syntax_highlighting_QM_LOADER syntaxhighlighting5_qt) +set_target_properties(KF6SyntaxHighlighting PROPERTIES + VERSION ${KSYNTAXHIGHLIGHTING_VERSION} + SOVERSION ${KSYNTAXHIGHLIGHTING_SOVERSION} + EXPORT_NAME SyntaxHighlighting +) -target_sources(KF5SyntaxHighlighting PRIVATE +ecm_create_qm_loader(syntax_highlighting_QM_LOADER syntaxhighlighting6_qt) + +target_sources(KF6SyntaxHighlighting PRIVATE abstracthighlighter.cpp context.cpp contextswitch.cpp @@ -25,7 +31,7 @@ target_sources(KF5SyntaxHighlighting PRIVATE ${syntax_highlighting_QM_LOADER} $ ) -ecm_qt_declare_logging_category(KF5SyntaxHighlighting +ecm_qt_declare_logging_category(KF6SyntaxHighlighting HEADER ksyntaxhighlighting_logging.h IDENTIFIER KSyntaxHighlighting::Log CATEGORY_NAME kf.syntaxhighlighting @@ -34,25 +40,21 @@ ecm_qt_declare_logging_category(KF5SyntaxHighlighting EXPORT KSYNTAXHIGHLIGHTING ) -ecm_generate_export_header(KF5SyntaxHighlighting +ecm_generate_export_header(KF6SyntaxHighlighting BASE_NAME KSyntaxHighlighting GROUP_BASE_NAME KF VERSION ${KF_VERSION} + USE_VERSION_HEADER DEPRECATED_BASE_VERSION 0 - DEPRECATION_VERSIONS 5.87 + DEPRECATION_VERSIONS EXCLUDE_DEPRECATED_BEFORE_AND_AT ${EXCLUDE_DEPRECATED_BEFORE_AND_AT} ) -set_target_properties(KF5SyntaxHighlighting PROPERTIES - VERSION ${SyntaxHighlighting_VERSION} - SOVERSION ${SyntaxHighlighting_SOVERSION} - EXPORT_NAME SyntaxHighlighting -) -target_link_libraries(KF5SyntaxHighlighting +target_link_libraries(KF6SyntaxHighlighting PUBLIC - Qt${QT_MAJOR_VERSION}::Gui + Qt6::Gui PRIVATE - Qt${QT_MAJOR_VERSION}::Network + Qt6::Network ) set(Forwarding_Header_Names @@ -74,12 +76,12 @@ ecm_generate_headers(CamelCase_HEADERS OUTPUT_DIR ${CMAKE_BINARY_DIR}/KSyntaxHighlighting/KSyntaxHighlighting ) -target_include_directories(KF5SyntaxHighlighting +target_include_directories(KF6SyntaxHighlighting INTERFACE "$" PUBLIC "$" ) -install(TARGETS KF5SyntaxHighlighting EXPORT KF5SyntaxHighlightingTargets ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}) +install(TARGETS KF6SyntaxHighlighting EXPORT KF6SyntaxHighlightingTargets ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}) install(FILES ${CamelCase_HEADERS} @@ -90,17 +92,17 @@ install(FILES if(BUILD_QCH) ecm_add_qch( - KF5SyntaxHighlighting_QCH + KF6SyntaxHighlighting_QCH NAME KSyntaxHighlighting - BASE_NAME KF5SyntaxHighlighting + BASE_NAME KF6SyntaxHighlighting VERSION ${KF_VERSION} ORG_DOMAIN org.kde SOURCES # using only public headers, to cover only public API ${SyntaxHighlighting_HEADERS} MD_MAINPAGE "${CMAKE_SOURCE_DIR}/README.md" LINK_QCHS - Qt5Core_QCH - Qt5Gui_QCH + Qt6Core_QCH + Qt6Gui_QCH INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR} BLANK_MACROS @@ -111,11 +113,3 @@ if(BUILD_QCH) COMPONENT Devel ) endif() -ecm_generate_pri_file( - BASE_NAME KSyntaxHighlighting LIB_NAME - KF5SyntaxHighlighting - DEPS "gui" - FILENAME_VAR PRI_FILENAME - INCLUDE_INSTALL_DIR ${KDE_INSTALL_INCLUDEDIR_KF}/KSyntaxHighlighting -) -install(FILES ${PRI_FILENAME} DESTINATION ${ECM_MKSPECS_INSTALL_DIR}) diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/abstracthighlighter.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/abstracthighlighter.cpp index ac5d98abfb3..87dabadc7b1 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/abstracthighlighter.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/abstracthighlighter.cpp @@ -12,6 +12,7 @@ #include "format.h" #include "ksyntaxhighlighting_logging.h" #include "repository.h" +#include "repository_p.h" #include "rule_p.h" #include "state.h" #include "state_p.h" @@ -97,13 +98,6 @@ static inline int firstNonSpaceChar(QStringView text) return text.size(); } -#if KSYNTAXHIGHLIGHTING_BUILD_DEPRECATED_SINCE(5, 87) -State AbstractHighlighter::highlightLine(const QString &text, const State &state) -{ - return highlightLine(QStringView(text), state); -} -#endif - State AbstractHighlighter::highlightLine(QStringView text, const State &state) { Q_D(AbstractHighlighter); @@ -116,43 +110,47 @@ State AbstractHighlighter::highlightLine(QStringView text, const State &state) return State(); } + // limit the cache for unification to some reasonable size + // we use here at the moment 64k elements to not hog too much memory + // and to make the clearing no big stall + if (defData->unify.size() > 64 * 1024) + defData->unify.clear(); + // verify/initialize state auto newState = state; auto stateData = StateData::get(newState); - const auto definitionId = DefinitionData::get(d->m_definition)->id; - if (!stateData->isEmpty() && stateData->m_defId != definitionId) { + bool isSharedData = true; + if (Q_UNLIKELY(stateData && stateData->m_defId != defData->id)) { qCDebug(Log) << "Got invalid state, resetting."; - stateData->clear(); + stateData = nullptr; } - if (stateData->isEmpty()) { + if (Q_UNLIKELY(!stateData)) { + stateData = StateData::reset(newState); stateData->push(defData->initialContext(), QStringList()); - stateData->m_defId = definitionId; + stateData->m_defId = defData->id; + isSharedData = false; } // process empty lines - if (text.isEmpty()) { + if (Q_UNLIKELY(text.isEmpty())) { /** * handle line empty context switches * guard against endless loops * see https://phabricator.kde.org/D18509 */ int endlessLoopingCounter = 0; - while (!stateData->topContext()->lineEmptyContext().isStay() || !stateData->topContext()->lineEndContext().isStay()) { + while (!stateData->topContext()->lineEmptyContext().isStay()) { /** * line empty context switches */ - if (!stateData->topContext()->lineEmptyContext().isStay()) { - if (!d->switchContext(stateData, stateData->topContext()->lineEmptyContext(), QStringList())) { - /** - * end when trying to #pop the main context - */ - break; - } + if (!d->switchContext(stateData, stateData->topContext()->lineEmptyContext(), QStringList(), newState, isSharedData)) { /** - * line end context switches only when lineEmptyContext is #stay. This avoids - * skipping empty lines after a line continuation character (see bug 405903) + * end when trying to #pop the main context */ - } else if (!d->switchContext(stateData, stateData->topContext()->lineEndContext(), QStringList())) { + break; + } + + if (stateData->topContext()->stopEmptyLineContextSwitchLoop()) { break; } @@ -165,9 +163,11 @@ State AbstractHighlighter::highlightLine(QStringView text, const State &state) } auto context = stateData->topContext(); applyFormat(0, 0, context->attributeFormat()); - return newState; + return *defData->unify.insert(newState); } + auto &dynamicRegexpCache = RepositoryPrivate::get(defData->repo)->m_dynamicRegexpCache; + int offset = 0; int beginOffset = 0; bool lineContinuation = false; @@ -178,10 +178,10 @@ State AbstractHighlighter::highlightLine(QStringView text, const State &state) * - store the result of the first position that matches (or -1 for no match in the full line) in the skipOffsets hash for re-use * - have capturesForLastDynamicSkipOffset as guard for dynamic regexes to invalidate the cache if they might have changed */ - QVarLengthArray, 8> skipOffsets; + QVarLengthArray, 8> skipOffsets; QStringList capturesForLastDynamicSkipOffset; - auto getSkipOffsetValue = [&skipOffsets](Rule *r) -> int { + auto getSkipOffsetValue = [&skipOffsets](const Rule *r) -> int { auto i = std::find_if(skipOffsets.begin(), skipOffsets.end(), [r](const auto &v) { return v.first == r; }); @@ -190,7 +190,7 @@ State AbstractHighlighter::highlightLine(QStringView text, const State &state) return i->second; }; - auto insertSkipOffset = [&skipOffsets](Rule *r, int i) { + auto insertSkipOffset = [&skipOffsets](const Rule *r, int i) { auto it = std::find_if(skipOffsets.begin(), skipOffsets.end(), [r](const auto &v) { return v.first == r; }); @@ -237,7 +237,8 @@ State AbstractHighlighter::highlightLine(QStringView text, const State &state) bool isLookAhead = false; int newOffset = 0; const Format *newFormat = nullptr; - for (const auto &rule : stateData->topContext()->rules()) { + for (const auto &ruleShared : stateData->topContext()->rules()) { + auto rule = ruleShared.get(); /** * filter out rules that require a specific column */ @@ -265,29 +266,33 @@ State AbstractHighlighter::highlightLine(QStringView text, const State &state) } } - /** - * shall we skip application of this rule? two cases: - * - rule can't match at all => currentSkipOffset < 0 - * - rule will only match for some higher offset => currentSkipOffset > offset - * - * we need to invalidate this if we are dynamic and have different captures then last time - */ - if (rule->isDynamic() && (capturesForLastDynamicSkipOffset != stateData->topCaptures())) { - skipOffsets.clear(); - } - const auto currentSkipOffset = getSkipOffsetValue(rule.get()); - if (currentSkipOffset < 0 || currentSkipOffset > offset) { - continue; + int currentSkipOffset = 0; + if (Q_UNLIKELY(rule->hasSkipOffset())) { + /** + * shall we skip application of this rule? two cases: + * - rule can't match at all => currentSkipOffset < 0 + * - rule will only match for some higher offset => currentSkipOffset > offset + * + * we need to invalidate this if we are dynamic and have different captures then last time + */ + if (rule->isDynamic() && (capturesForLastDynamicSkipOffset != stateData->topCaptures())) { + skipOffsets.clear(); + } else { + currentSkipOffset = getSkipOffsetValue(rule); + if (currentSkipOffset < 0 || currentSkipOffset > offset) { + continue; + } + } } - const auto newResult = rule->doMatch(text, offset, stateData->topCaptures()); + auto newResult = rule->doMatch(text, offset, stateData->topCaptures(), dynamicRegexpCache); newOffset = newResult.offset(); /** * update skip offset if new one rules out any later match or is larger than current one */ if (newResult.skipOffset() < 0 || newResult.skipOffset() > currentSkipOffset) { - insertSkipOffset(rule.get(), newResult.skipOffset()); + insertSkipOffset(rule, newResult.skipOffset()); // remember new captures, if dynamic to enforce proper reset above on change! if (rule->isDynamic()) { @@ -316,12 +321,12 @@ State AbstractHighlighter::highlightLine(QStringView text, const State &state) if (rule->isLookAhead()) { Q_ASSERT(!rule->context().isStay()); - d->switchContext(stateData, rule->context(), newResult.captures()); + d->switchContext(stateData, rule->context(), std::move(newResult.captures()), newState, isSharedData); isLookAhead = true; break; } - d->switchContext(stateData, rule->context(), newResult.captures()); + d->switchContext(stateData, rule->context(), std::move(newResult.captures()), newState, isSharedData); newFormat = rule->attributeFormat().isValid() ? &rule->attributeFormat() : &stateData->topContext()->attributeFormat(); if (newOffset == text.size() && rule->isLineContinue()) { lineContinuation = true; @@ -334,7 +339,7 @@ State AbstractHighlighter::highlightLine(QStringView text, const State &state) if (newOffset <= offset) { // no matching rule if (stateData->topContext()->fallthrough()) { - d->switchContext(stateData, stateData->topContext()->fallthroughContext(), QStringList()); + d->switchContext(stateData, stateData->topContext()->fallthroughContext(), QStringList(), newState, isSharedData); continue; } @@ -381,7 +386,7 @@ State AbstractHighlighter::highlightLine(QStringView text, const State &state) { int endlessLoopingCounter = 0; while (!stateData->topContext()->lineEndContext().isStay() && !lineContinuation) { - if (!d->switchContext(stateData, stateData->topContext()->lineEndContext(), QStringList())) { + if (!d->switchContext(stateData, stateData->topContext()->lineEndContext(), QStringList(), newState, isSharedData)) { break; } @@ -394,18 +399,30 @@ State AbstractHighlighter::highlightLine(QStringView text, const State &state) } } - return newState; + return *defData->unify.insert(newState); } -bool AbstractHighlighterPrivate::switchContext(StateData *data, const ContextSwitch &contextSwitch, const QStringList &captures) +bool AbstractHighlighterPrivate::switchContext(StateData *&data, const ContextSwitch &contextSwitch, QStringList &&captures, State &state, bool &isSharedData) { + const auto popCount = contextSwitch.popCount(); + const auto context = contextSwitch.context(); + if (popCount <= 0 && !context) { + return true; + } + + // a modified state must be detached before modification + if (isSharedData) { + data = StateData::detach(state); + isSharedData = false; + } + // kill as many items as requested from the stack, will always keep the initial context alive! - const bool initialContextSurvived = data->pop(contextSwitch.popCount()); + const bool initialContextSurvived = data->pop(popCount); // if we have a new context to add, push it // then we always "succeed" - if (contextSwitch.context()) { - data->push(contextSwitch.context(), captures); + if (context) { + data->push(context, std::move(captures)); return true; } diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/abstracthighlighter.h b/src/libs/3rdparty/syntax-highlighting/src/lib/abstracthighlighter.h index 49cfbf25303..676a0f522ab 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/abstracthighlighter.h +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/abstracthighlighter.h @@ -7,20 +7,15 @@ #ifndef KSYNTAXHIGHLIGHTING_ABSTRACTHIGHLIGHTERM_H #define KSYNTAXHIGHLIGHTING_ABSTRACTHIGHLIGHTERM_H +#include "definition.h" #include "ksyntaxhighlighting_export.h" #include - -#include - -QT_BEGIN_NAMESPACE -class QString; -QT_END_NAMESPACE +#include namespace KSyntaxHighlighting { class AbstractHighlighterPrivate; -class Definition; class FoldingRegion; class Format; class State; @@ -106,21 +101,8 @@ public: protected: AbstractHighlighter(); - AbstractHighlighter(AbstractHighlighterPrivate *dd); + KSYNTAXHIGHLIGHTING_NO_EXPORT explicit AbstractHighlighter(AbstractHighlighterPrivate *dd); -#if KSYNTAXHIGHLIGHTING_ENABLE_DEPRECATED_SINCE(5, 87) - /** - * @copydoc highlightLine(QStringView,const State&) - * @deprecated since 5.87, use highlightLine(QStringView, const State&) instead. - */ - // no deprecation warning, as removal of this will automatically "port" the using code - State highlightLine(const QString &text, const State &state); -#endif - - // TODO KF6: add an optional void* context argument that is passed through - // to the applyX() calls, so highlighters dealing with some form of line object - // (such as QSyntaxHighlighter or KTextEditor) can avoid some ugly hacks to have - // this context available in their applyX methods /** * Highlight the given line. Call this from your derived class * where appropriate. This will result in any number of applyFormat() diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/abstracthighlighter_p.h b/src/libs/3rdparty/syntax-highlighting/src/lib/abstracthighlighter_p.h index 6128beccfa0..04ac9898f8c 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/abstracthighlighter_p.h +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/abstracthighlighter_p.h @@ -14,6 +14,7 @@ namespace KSyntaxHighlighting { class ContextSwitch; class StateData; +class State; class AbstractHighlighterPrivate { @@ -22,7 +23,7 @@ public: virtual ~AbstractHighlighterPrivate(); void ensureDefinitionLoaded(); - bool switchContext(StateData *data, const ContextSwitch &contextSwitch, const QStringList &captures); + bool switchContext(StateData *&data, const ContextSwitch &contextSwitch, QStringList &&captures, State &state, bool &isSharedData); Definition m_definition; Theme m_theme; diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/ansihighlighter.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/ansihighlighter.cpp index 31678018f9f..e9bea02d1c7 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/ansihighlighter.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/ansihighlighter.cpp @@ -5,6 +5,7 @@ */ #include "ansihighlighter.h" +#include "abstracthighlighter_p.h" #include "context_p.h" #include "definition.h" #include "definition_p.h" @@ -18,6 +19,7 @@ #include #include #include +#include #include #include @@ -783,7 +785,7 @@ GraphLine &lineAtOffset(std::vector &graphLines, int offset) } // disable bold, italic and underline on | -const QLatin1String graphSymbol("\x1b[21;23;24m|"); +const QLatin1String graphSymbol("\x1b[22;23;24m|"); // reverse video const QLatin1String nameStyle("\x1b[7m"); @@ -793,8 +795,8 @@ const QLatin1String nameStyle("\x1b[7m"); class DebugSyntaxHighlighter : public KSyntaxHighlighting::AbstractHighlighter { public: - using TraceOption = KSyntaxHighlighting::AnsiHighlighter::TraceOption; - using TraceOptions = KSyntaxHighlighting::AnsiHighlighter::TraceOptions; + using Option = KSyntaxHighlighting::AnsiHighlighter::Option; + using Options = KSyntaxHighlighting::AnsiHighlighter::Options; void setDefinition(const KSyntaxHighlighting::Definition &def) override { @@ -815,14 +817,14 @@ public: QLatin1String infoStyle, QLatin1String editorBackground, const std::vector> &ansiStyles, - TraceOptions traceOptions) + Options options) { initRegionStyles(ansiStyles); - m_hasFormatTrace = traceOptions.testFlag(TraceOption::Format); - m_hasRegionTrace = traceOptions.testFlag(TraceOption::Region); - m_hasStackSizeTrace = traceOptions.testFlag(TraceOption::StackSize); - m_hasContextTrace = traceOptions.testFlag(TraceOption::Context); + m_hasFormatTrace = options.testFlag(Option::TraceFormat); + m_hasRegionTrace = options.testFlag(Option::TraceRegion); + m_hasStackSizeTrace = options.testFlag(Option::TraceStackSize); + m_hasContextTrace = options.testFlag(Option::TraceContext); const bool hasFormatOrContextTrace = m_hasFormatTrace || m_hasContextTrace || m_hasStackSizeTrace; const bool hasSeparator = hasFormatOrContextTrace && m_hasRegionTrace; @@ -831,6 +833,7 @@ public: bool firstLine = true; State state; QString currentLine; + const bool isUnbuffered = options.testFlag(Option::Unbuffered); while (in.readLineInto(¤tLine)) { auto oldState = state; state = highlightLine(currentLine, state); @@ -864,6 +867,10 @@ public: } m_highlightedFragments.clear(); + + if (isUnbuffered) { + out.flush(); + } } } @@ -970,12 +977,14 @@ private: QString label; if (m_hasStackSizeTrace) { - label += QLatin1Char('(') % QString::number(stateData->size()) % QLatin1Char(')'); + // first state is empty + int stateSize = stateData ? stateData->size() : 0; + label = QLatin1Char('(') % QString::number(stateSize) % QLatin1Char(')'); } if (m_hasContextTrace) { // first state is empty - if (stateData->isEmpty()) { + if (!stateData) { return label + QStringLiteral("[???]"); } @@ -1138,7 +1147,7 @@ private: QString name; int offset; int length; - quint16 formatId; + int formatId; }; struct ContextCaptureHighlighter : KSyntaxHighlighting::AbstractHighlighter { @@ -1168,7 +1177,7 @@ private: int depth; int offset; int bindIndex; - quint16 regionId; + int regionId; State state; }; @@ -1190,7 +1199,7 @@ private: }; } // anonymous namespace -class KSyntaxHighlighting::AnsiHighlighterPrivate +class KSyntaxHighlighting::AnsiHighlighterPrivate : public AbstractHighlighterPrivate { public: QTextStream out; @@ -1201,7 +1210,7 @@ public: }; AnsiHighlighter::AnsiHighlighter() - : d(new AnsiHighlighterPrivate()) + : AbstractHighlighter(new AnsiHighlighterPrivate()) { } @@ -1209,6 +1218,7 @@ AnsiHighlighter::~AnsiHighlighter() = default; void AnsiHighlighter::setOutputFile(const QString &fileName) { + Q_D(AnsiHighlighter); if (d->file.isOpen()) { d->file.close(); } @@ -1218,21 +1228,16 @@ void AnsiHighlighter::setOutputFile(const QString &fileName) return; } d->out.setDevice(&d->file); -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) - d->out.setCodec("UTF-8"); -#endif } void AnsiHighlighter::setOutputFile(FILE *fileHandle) { + Q_D(AnsiHighlighter); d->file.open(fileHandle, QIODevice::WriteOnly); d->out.setDevice(&d->file); -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) - d->out.setCodec("UTF-8"); -#endif } -void AnsiHighlighter::highlightFile(const QString &fileName, AnsiFormat format, bool useEditorBackground, TraceOptions traceOptions) +void AnsiHighlighter::highlightFile(const QString &fileName, AnsiFormat format, Options options) { QFileInfo fi(fileName); QFile f(fileName); @@ -1241,19 +1246,21 @@ void AnsiHighlighter::highlightFile(const QString &fileName, AnsiFormat format, return; } - highlightData(&f, format, useEditorBackground, traceOptions); + highlightData(&f, format, options); } -void AnsiHighlighter::highlightData(QIODevice *dev, AnsiFormat format, bool useEditorBackground, TraceOptions traceOptions) +void AnsiHighlighter::highlightData(QIODevice *dev, AnsiFormat format, Options options) { + Q_D(AnsiHighlighter); + if (!d->out.device()) { qCWarning(Log) << "No output stream defined!"; return; } const auto is256Colors = (format == AnsiFormat::XTerm256Color); - const auto theme = this->theme(); - const auto definition = this->definition(); + const auto &theme = d->m_theme; + const auto &definition = d->m_definition; auto definitions = definition.includedDefinitions(); definitions.append(definition); @@ -1265,6 +1272,8 @@ void AnsiHighlighter::highlightData(QIODevice *dev, AnsiFormat format, bool useE QLatin1String foregroundDefaultColor; QLatin1String backgroundDefaultColor; + const bool useEditorBackground = options.testFlag(Option::UseEditorBackground); + // https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters if (useEditorBackground) { @@ -1277,23 +1286,19 @@ void AnsiHighlighter::highlightData(QIODevice *dev, AnsiFormat format, bool useE backgroundDefaultColor = backgroundColorBuffer.latin1().mid(2); } - // ansiStyles must not be empty for applyFormat to work even with a definition without any context - if (d->ansiStyles.empty()) { - d->ansiStyles.resize(32); - } else { - d->ansiStyles[0].first.clear(); - d->ansiStyles[0].second.clear(); + int maxId = 0; + for (const auto &definition : std::as_const(definitions)) { + for (const auto &format : std::as_const(DefinitionData::get(definition)->formats)) { + maxId = qMax(maxId, format.id()); + } } + d->ansiStyles.clear(); + // ansiStyles must not be empty for applyFormat to work even with a definition without any context + d->ansiStyles.resize(maxId + 1); // initialize ansiStyles - for (auto &&definition : std::as_const(definitions)) { - for (auto &&format : std::as_const(DefinitionData::get(definition)->formats)) { - const auto id = format.id(); - if (id >= d->ansiStyles.size()) { - // better than id + 1 to avoid successive allocations - d->ansiStyles.resize(id * 2); - } - + for (const auto &definition : std::as_const(definitions)) { + for (const auto &format : std::as_const(DefinitionData::get(definition)->formats)) { AnsiBuffer buffer; buffer.append(QLatin1String("\x1b[")); @@ -1329,7 +1334,8 @@ void AnsiHighlighter::highlightData(QIODevice *dev, AnsiFormat format, bool useE // if there is ANSI style if (buffer.latin1().size() > 2) { buffer.setFinalStyle(); - d->ansiStyles[id].first = buffer.latin1(); + auto &style = d->ansiStyles[format.id()]; + style.first = buffer.latin1(); if (useEditorBackground) { buffer.clear(); @@ -1338,11 +1344,11 @@ void AnsiHighlighter::highlightData(QIODevice *dev, AnsiFormat format, bool useE buffer.append(hasEffect ? QLatin1String("\x1b[0;") : QLatin1String("\x1b[")); buffer.append(backgroundDefaultColor); buffer.setFinalStyle(); - d->ansiStyles[id].second = buffer.latin1(); + style.second = buffer.latin1(); } else if (hasEffect) { buffer.append(QLatin1String("\x1b[")); if (hasBold) { - buffer.append(QLatin1String("21;")); + buffer.append(QLatin1String("22;")); } if (hasItalic) { buffer.append(QLatin1String("23;")); @@ -1354,10 +1360,10 @@ void AnsiHighlighter::highlightData(QIODevice *dev, AnsiFormat format, bool useE buffer.append(QLatin1String("29;")); } buffer.setFinalStyle(); - d->ansiStyles[id].second = buffer.latin1(); + style.second = buffer.latin1(); } } else { - d->ansiStyles[id].second = QStringLiteral("\x1b[0m"); + style.second = QStringLiteral("\x1b[0m"); } } } @@ -1370,13 +1376,11 @@ void AnsiHighlighter::highlightData(QIODevice *dev, AnsiFormat format, bool useE } QTextStream in(dev); -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) - in.setCodec("UTF-8"); -#endif - if (!traceOptions) { + if (!options.testAnyFlag(Option::TraceAll)) { State state; QString currentLine; + const bool isUnbuffered = options.testFlag(Option::Unbuffered); while (in.readLineInto(¤tLine)) { d->currentLine = currentLine; state = highlightLine(d->currentLine, state); @@ -1386,6 +1390,10 @@ void AnsiHighlighter::highlightData(QIODevice *dev, AnsiFormat format, bool useE } else { d->out << QLatin1Char('\n'); } + + if (isUnbuffered) { + d->out.flush(); + } } } else { AnsiBuffer buffer; @@ -1394,7 +1402,7 @@ void AnsiHighlighter::highlightData(QIODevice *dev, AnsiFormat format, bool useE buffer.setFinalStyle(); DebugSyntaxHighlighter debugHighlighter; debugHighlighter.setDefinition(definition); - debugHighlighter.highlightData(in, d->out, buffer.latin1(), backgroundDefaultColor, d->ansiStyles, traceOptions); + debugHighlighter.highlightData(in, d->out, buffer.latin1(), backgroundDefaultColor, d->ansiStyles, options); } if (useEditorBackground) { @@ -1408,6 +1416,7 @@ void AnsiHighlighter::highlightData(QIODevice *dev, AnsiFormat format, bool useE void AnsiHighlighter::applyFormat(int offset, int length, const Format &format) { + Q_D(AnsiHighlighter); auto const &ansiStyle = d->ansiStyles[format.id()]; d->out << ansiStyle.first << d->currentLine.mid(offset, length) << ansiStyle.second; } diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/ansihighlighter.h b/src/libs/3rdparty/syntax-highlighting/src/lib/ansihighlighter.h index ffb13f38f37..0942aa0242b 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/ansihighlighter.h +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/ansihighlighter.h @@ -11,10 +11,11 @@ #include "ksyntaxhighlighting_export.h" #include -#include #include -#include +QT_BEGIN_NAMESPACE +class QIODevice; +QT_END_NAMESPACE namespace KSyntaxHighlighting { @@ -29,24 +30,25 @@ public: XTerm256Color, }; - enum class TraceOption { + enum class Option { NoOptions, - Format = 1 << 0, - Region = 1 << 1, - Context = 1 << 2, - StackSize = 1 << 3, + UseEditorBackground = 1 << 0, + Unbuffered = 1 << 1, + + // Options that displays a useful visual aid for syntax creation + TraceFormat = 1 << 2, + TraceRegion = 1 << 3, + TraceContext = 1 << 4, + TraceStackSize = 1 << 5, + TraceAll = TraceFormat | TraceRegion | TraceContext | TraceStackSize, }; - Q_DECLARE_FLAGS(TraceOptions, TraceOption) + Q_DECLARE_FLAGS(Options, Option) AnsiHighlighter(); ~AnsiHighlighter() override; - void highlightFile(const QString &fileName, - AnsiFormat format = AnsiFormat::TrueColor, - bool useEditorBackground = true, - TraceOptions traceOptions = TraceOptions()); - void - highlightData(QIODevice *device, AnsiFormat format = AnsiFormat::TrueColor, bool useEditorBackground = true, TraceOptions traceOptions = TraceOptions()); + void highlightFile(const QString &fileName, AnsiFormat format = AnsiFormat::TrueColor, Options options = Option::UseEditorBackground); + void highlightData(QIODevice *device, AnsiFormat format = AnsiFormat::TrueColor, Options options = Option::UseEditorBackground); void setOutputFile(const QString &fileName); void setOutputFile(FILE *fileHandle); @@ -55,10 +57,10 @@ protected: void applyFormat(int offset, int length, const Format &format) override; private: - std::unique_ptr d; + Q_DECLARE_PRIVATE(AnsiHighlighter) }; } -Q_DECLARE_OPERATORS_FOR_FLAGS(KSyntaxHighlighting::AnsiHighlighter::TraceOptions) +Q_DECLARE_OPERATORS_FOR_FLAGS(KSyntaxHighlighting::AnsiHighlighter::Options) #endif // KSYNTAXHIGHLIGHTING_ANSIHIGHLIGHTER_H diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/context.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/context.cpp index ff5254cb6e5..af269d14d03 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/context.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/context.cpp @@ -38,7 +38,15 @@ void Context::resolveContexts(DefinitionData &def, const HighlightingContextData m_lineEndContext.resolve(def, data.lineEndContext); m_lineEmptyContext.resolve(def, data.lineEmptyContext); m_fallthroughContext.resolve(def, data.fallthroughContext); - m_fallthrough = !m_fallthroughContext.isStay(); + m_stopEmptyLineContextSwitchLoop = data.stopEmptyLineContextSwitchLoop; + + /** + * line end context switches only when lineEmptyContext is #stay. This avoids + * skipping empty lines after a line continuation character (see bug 405903) + */ + if (m_lineEmptyContext.isStay()) { + m_lineEmptyContext = m_lineEndContext; + } m_rules.reserve(data.rules.size()); for (const auto &ruleData : data.rules) { @@ -65,6 +73,7 @@ void Context::resolveIncludes(DefinitionData &def) for (auto it = m_rules.begin(); it != m_rules.end();) { const IncludeRules *includeRules = it->get()->castToIncludeRules(); if (!includeRules) { + m_hasDynamicRule = m_hasDynamicRule || it->get()->isDynamic(); ++it; continue; } @@ -111,6 +120,8 @@ void Context::resolveIncludes(DefinitionData &def) context->resolveIncludes(*defData); } + m_hasDynamicRule = m_hasDynamicRule || context->m_hasDynamicRule; + /** * handle included attribute * transitive closure: we might include attributes included from somewhere else diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/context_p.h b/src/libs/3rdparty/syntax-highlighting/src/lib/context_p.h index 7e077b5a244..8cf0f1bfaba 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/context_p.h +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/context_p.h @@ -16,10 +16,6 @@ #include -QT_BEGIN_NAMESPACE -class QXmlStreamReader; -QT_END_NAMESPACE - namespace KSyntaxHighlighting { class DefinitionData; @@ -52,7 +48,17 @@ public: bool fallthrough() const { - return m_fallthrough; + return !m_fallthroughContext.isStay(); + } + + bool hasDynamicRule() const + { + return m_hasDynamicRule; + } + + bool stopEmptyLineContextSwitchLoop() const + { + return m_stopEmptyLineContextSwitchLoop; } const ContextSwitch &fallthroughContext() const @@ -96,7 +102,8 @@ private: Format m_attributeFormat; ResolveState m_resolveState = Unresolved; - bool m_fallthrough = false; + bool m_hasDynamicRule = false; + bool m_stopEmptyLineContextSwitchLoop = true; bool m_indentationBasedFolding; }; } diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/definition.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/definition.cpp index 670dfddedb6..e2cca6da712 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/definition.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/definition.cpp @@ -26,8 +26,6 @@ #include #include #include -#include -#include #include #include @@ -43,13 +41,8 @@ DefinitionData::DefinitionData() DefinitionData::~DefinitionData() = default; -DefinitionData *DefinitionData::get(const Definition &def) -{ - return def.d.get(); -} - Definition::Definition() - : d(new DefinitionData) + : d(std::make_shared()) { d->q = *this; } @@ -63,6 +56,9 @@ Definition &Definition::operator=(const Definition &) = default; Definition::Definition(std::shared_ptr &&dd) : d(std::move(dd)) { + if (!d) { + Definition().d.swap(d); + } } bool Definition::operator==(const Definition &other) const @@ -92,7 +88,10 @@ QString Definition::name() const QString Definition::translatedName() const { - return QCoreApplication::instance()->translate("Language", d->name.toUtf8().constData()); + if (d->translatedName.isEmpty()) { + d->translatedName = QCoreApplication::instance()->translate("Language", d->nameUtf8.isEmpty() ? d->name.toUtf8().constData() : d->nameUtf8.constData()); + } + return d->translatedName; } QString Definition::section() const @@ -102,15 +101,19 @@ QString Definition::section() const QString Definition::translatedSection() const { - return QCoreApplication::instance()->translate("Language Section", d->section.toUtf8().constData()); + if (d->translatedSection.isEmpty()) { + d->translatedSection = QCoreApplication::instance()->translate("Language Section", + d->sectionUtf8.isEmpty() ? d->section.toUtf8().constData() : d->sectionUtf8.constData()); + } + return d->translatedSection; } -QVector Definition::mimeTypes() const +QList Definition::mimeTypes() const { return d->mimetypes; } -QVector Definition::extensions() const +QList Definition::extensions() const { return d->extensions; } @@ -218,12 +221,12 @@ bool Definition::setKeywordList(const QString &name, const QStringList &content) } } -QVector Definition::formats() const +QList Definition::formats() const { d->load(); // sort formats so that the order matches the order of the itemDatas in the xml files. - auto formatList = QVector::fromList(d->formats.values()); + auto formatList = d->formats.values(); std::sort(formatList.begin(), formatList.end(), [](const KSyntaxHighlighting::Format &lhs, const KSyntaxHighlighting::Format &rhs) { return lhs.id() < rhs.id(); }); @@ -231,13 +234,13 @@ QVector Definition::formats() const return formatList; } -QVector Definition::includedDefinitions() const +QList Definition::includedDefinitions() const { d->load(); // init worklist and result used as guard with this definition - QVector queue{d.get()}; - QVector definitions{*this}; + QList queue{d.get()}; + QList definitions{*this}; while (!queue.empty()) { const auto *def = queue.back(); queue.pop_back(); @@ -275,7 +278,7 @@ QPair Definition::multiLineCommentMarker() const return {d->multiLineCommentStartMarker, d->multiLineCommentEndMarker}; } -QVector> Definition::characterEncodings() const +QList> Definition::characterEncodings() const { d->load(); return d->characterEncodings; @@ -394,7 +397,11 @@ void DefinitionData::clear() characterEncodings.clear(); fileName.clear(); + nameUtf8.clear(); + translatedName.clear(); section.clear(); + sectionUtf8.clear(); + translatedSection.clear(); style.clear(); indenter.clear(); author.clear(); @@ -405,6 +412,9 @@ void DefinitionData::clear() version = 0.0f; priority = 0; hidden = false; + + // purge our cache that is used to unify states + unify.clear(); } bool DefinitionData::loadMetaData(const QString &definitionFileName) @@ -433,7 +443,9 @@ bool DefinitionData::loadMetaData(const QString &definitionFileName) bool DefinitionData::loadMetaData(const QString &file, const QCborMap &obj) { name = obj.value(QLatin1String("name")).toString(); + nameUtf8 = obj.value(QLatin1String("name")).toByteArray(); section = obj.value(QLatin1String("section")).toString(); + sectionUtf8 = obj.value(QLatin1String("section")).toByteArray(); version = obj.value(QLatin1String("version")).toInteger(); priority = obj.value(QLatin1String("priority")).toInteger(); style = obj.value(QLatin1String("style")).toString(); @@ -444,13 +456,10 @@ bool DefinitionData::loadMetaData(const QString &file, const QCborMap &obj) fileName = file; const auto exts = obj.value(QLatin1String("extensions")).toString(); - for (const auto &ext : exts.split(QLatin1Char(';'), Qt::SkipEmptyParts)) { - extensions.push_back(ext); - } + extensions = exts.split(QLatin1Char(';'), Qt::SkipEmptyParts); + const auto mts = obj.value(QLatin1String("mimetype")).toString(); - for (const auto &mt : mts.split(QLatin1Char(';'), Qt::SkipEmptyParts)) { - mimetypes.push_back(mt); - } + mimetypes = mts.split(QLatin1Char(';'), Qt::SkipEmptyParts); return true; } @@ -805,10 +814,10 @@ bool DefinitionData::checkKateVersion(QStringView verStr) qCWarning(Log) << "Skipping" << fileName << "due to having no valid kateversion attribute:" << verStr; return false; } - const auto major = verStr.left(idx).toString().toInt(); - const auto minor = verStr.mid(idx + 1).toString().toInt(); + const auto major = verStr.left(idx).toInt(); + const auto minor = verStr.mid(idx + 1).toInt(); - if (major > SyntaxHighlighting_VERSION_MAJOR || (major == SyntaxHighlighting_VERSION_MAJOR && minor > SyntaxHighlighting_VERSION_MINOR)) { + if (major > KSYNTAXHIGHLIGHTING_VERSION_MAJOR || (major == KSYNTAXHIGHLIGHTING_VERSION_MAJOR && minor > KSYNTAXHIGHLIGHTING_VERSION_MINOR)) { qCWarning(Log) << "Skipping" << fileName << "due to being too new, version:" << verStr; return false; } @@ -834,34 +843,20 @@ void DefinitionData::addImmediateIncludedDefinition(const Definition &def) DefinitionRef::DefinitionRef() = default; -DefinitionRef::DefinitionRef(const Definition &def) +DefinitionRef::DefinitionRef(const Definition &def) noexcept : d(def.d) { } -DefinitionRef::DefinitionRef(Definition &&def) - : d(std::move(def.d)) -{ -} - -DefinitionRef &DefinitionRef::operator=(const Definition &def) +DefinitionRef &DefinitionRef::operator=(const Definition &def) noexcept { d = def.d; return *this; } -DefinitionRef &DefinitionRef::operator=(Definition &&def) -{ - d = std::move(def.d); - return *this; -} - Definition DefinitionRef::definition() const { - if (!d.expired()) { - return Definition(d.lock()); - } - return Definition(); + return Definition(d.lock()); } bool DefinitionRef::operator==(const DefinitionRef &other) const @@ -873,3 +868,5 @@ bool DefinitionRef::operator==(const Definition &other) const { return !d.owner_before(other.d) && !other.d.owner_before(d); } + +#include "moc_definition.cpp" diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/definition.h b/src/libs/3rdparty/syntax-highlighting/src/lib/definition.h index 05757ea52a3..e69492bee42 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/definition.h +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/definition.h @@ -10,16 +10,12 @@ #include "ksyntaxhighlighting_export.h" +#include #include -#include +#include #include #include -QT_BEGIN_NAMESPACE -class QChar; -class QString; -QT_END_NAMESPACE - namespace KSyntaxHighlighting { class Context; @@ -185,13 +181,13 @@ public: /** * Mime types associated with this syntax definition. */ - QVector mimeTypes() const; + QList mimeTypes() const; /** * File extensions associated with this syntax definition. * The returned list contains wildcards. */ - QVector extensions() const; + QList extensions() const; /** * Returns the definition version. @@ -360,7 +356,7 @@ public: * The order of the Format items equals the order of the itemDatas in the xml file. * @since 5.49 */ - QVector formats() const; + QList formats() const; /** * Returns a list of Definitions that are referenced with the IncludeRules rule. @@ -369,7 +365,7 @@ public: * * @since 5.49 */ - QVector includedDefinitions() const; + QList includedDefinitions() const; /** * Returns the marker that starts a single line comment. @@ -400,7 +396,7 @@ public: * the string \"{A} represents the character Ä. * @since 5.50 */ - QVector> characterEncodings() const; + QList> characterEncodings() const; /** * @} @@ -409,14 +405,14 @@ public: private: friend class DefinitionData; friend class DefinitionRef; - explicit Definition(std::shared_ptr &&dd); + KSYNTAXHIGHLIGHTING_NO_EXPORT explicit Definition(std::shared_ptr &&dd); std::shared_ptr d; }; } QT_BEGIN_NAMESPACE -Q_DECLARE_TYPEINFO(KSyntaxHighlighting::Definition, Q_MOVABLE_TYPE); +Q_DECLARE_TYPEINFO(KSyntaxHighlighting::Definition, Q_RELOCATABLE_TYPE); QT_END_NAMESPACE #endif diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/definition_p.h b/src/libs/3rdparty/syntax-highlighting/src/lib/definition_p.h index 542f255b321..ec00b318970 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/definition_p.h +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/definition_p.h @@ -10,11 +10,13 @@ #include "definitionref_p.h" #include "highlightingdata_p.hpp" +#include "state.h" #include "worddelimiters_p.h" #include +#include +#include #include -#include #include @@ -36,7 +38,10 @@ public: DefinitionData(const DefinitionData &) = delete; DefinitionData &operator=(const DefinitionData &) = delete; - static DefinitionData *get(const Definition &def); + static DefinitionData *get(const Definition &def) + { + return def.d.get(); + } bool isLoaded() const; bool loadMetaData(const QString &definitionFileName); @@ -80,9 +85,9 @@ public: std::vector contexts; QHash formats; // data loaded from xml file and emptied after loading contexts - QVector contextDatas; + QList contextDatas; // Definition referenced by IncludeRules and ContextSwitch - QVector immediateIncludedDefinitions; + QList immediateIncludedDefinitions; WordDelimiters wordDelimiters; WordDelimiters wordWrapDelimiters; bool keywordIsLoaded = false; @@ -93,21 +98,28 @@ public: CommentPosition singleLineCommentPosition = CommentPosition::StartOfLine; QString multiLineCommentStartMarker; QString multiLineCommentEndMarker; - QVector> characterEncodings; + QList> characterEncodings; QString fileName; QString name = QStringLiteral(QT_TRANSLATE_NOOP("Language", "None")); + QByteArray nameUtf8; + mutable QString translatedName; QString section; + QByteArray sectionUtf8; + mutable QString translatedSection; QString style; QString indenter; QString author; QString license; - QVector mimetypes; - QVector extensions; + QList mimetypes; + QList extensions; Qt::CaseSensitivity caseSensitive = Qt::CaseSensitive; int version = 0; int priority = 0; bool hidden = false; + + // cache that is used to unify states in AbstractHighlighter::highlightLine + mutable QSet unify; }; } diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/definitiondownloader.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/definitiondownloader.cpp index c1335789dc9..88ba5d77591 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/definitiondownloader.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/definitiondownloader.cpp @@ -169,8 +169,8 @@ DefinitionDownloader::~DefinitionDownloader() void DefinitionDownloader::start() { - const QString url = QLatin1String("https://www.kate-editor.org/syntax/update-") + QString::number(SyntaxHighlighting_VERSION_MAJOR) + QLatin1Char('.') - + QString::number(SyntaxHighlighting_VERSION_MINOR) + QLatin1String(".xml"); + const QString url = QLatin1String("https://www.kate-editor.org/syntax/update-") + QString::number(KSYNTAXHIGHLIGHTING_VERSION_MAJOR) + QLatin1Char('.') + + QString::number(KSYNTAXHIGHLIGHTING_VERSION_MINOR) + QLatin1String(".xml"); auto req = QNetworkRequest(QUrl(url)); req.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy); auto reply = d->nam->get(req); @@ -178,3 +178,5 @@ void DefinitionDownloader::start() d->definitionListDownloadFinished(reply); }); } + +#include "moc_definitiondownloader.cpp" diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/definitionref_p.h b/src/libs/3rdparty/syntax-highlighting/src/lib/definitionref_p.h index 0bd805624dd..a7ef08f614f 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/definitionref_p.h +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/definitionref_p.h @@ -30,10 +30,8 @@ class DefinitionRef { public: DefinitionRef(); - explicit DefinitionRef(const Definition &def); - explicit DefinitionRef(Definition &&def); - DefinitionRef &operator=(const Definition &def); - DefinitionRef &operator=(Definition &&def); + explicit DefinitionRef(const Definition &def) noexcept; + DefinitionRef &operator=(const Definition &def) noexcept; Definition definition() const; diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/dynamicregexpcache_p.h b/src/libs/3rdparty/syntax-highlighting/src/lib/dynamicregexpcache_p.h new file mode 100644 index 00000000000..dcef97a8416 --- /dev/null +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/dynamicregexpcache_p.h @@ -0,0 +1,39 @@ +/* + SPDX-FileCopyrightText: 2023 Jonathan Poelen + + SPDX-License-Identifier: MIT +*/ + +#ifndef KSYNTAXHIGHLIGHTING_DYNAMICREGEXPCACHE_P_H +#define KSYNTAXHIGHLIGHTING_DYNAMICREGEXPCACHE_P_H + +#include +#include +#include + +#include + +namespace KSyntaxHighlighting +{ + +class DynamicRegexpCache +{ +public: + const QRegularExpression &compileRegexp(QString &&pattern, QRegularExpression::PatternOptions patternOptions) + { + const auto key = std::pair{std::move(pattern), patternOptions}; + if (const auto regexp = m_cache.object(key)) { + return *regexp; + } + auto regexp = new QRegularExpression(key.first, patternOptions); + m_cache.insert(key, regexp); + return *regexp; + } + +private: + QCache, QRegularExpression> m_cache; +}; + +} + +#endif diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/foldingregion.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/foldingregion.cpp index 3bca63eecda..9ed625b12ed 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/foldingregion.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/foldingregion.cpp @@ -8,36 +8,39 @@ using namespace KSyntaxHighlighting; -static_assert(sizeof(FoldingRegion) == 2, "FoldingRegion is size-sensitive to frequent use in KTextEditor!"); +static_assert(sizeof(FoldingRegion) == sizeof(int), "FoldingRegion is size-sensitive to frequent use in KTextEditor!"); -FoldingRegion::FoldingRegion() - : m_type(None) - , m_id(0) -{ -} +FoldingRegion::FoldingRegion() = default; -FoldingRegion::FoldingRegion(Type type, quint16 id) - : m_type(type) - , m_id(id) +FoldingRegion::FoldingRegion(Type type, int id) + : m_idWithType((type == End) ? -id : id) { } bool FoldingRegion::operator==(const FoldingRegion &other) const { - return m_id == other.m_id && m_type == other.m_type; + return m_idWithType == other.m_idWithType; } bool FoldingRegion::isValid() const { - return type() != None; + return m_idWithType != 0; } -quint16 FoldingRegion::id() const +int FoldingRegion::id() const { - return m_id; + return (m_idWithType < 0) ? -m_idWithType : m_idWithType; } FoldingRegion::Type FoldingRegion::type() const { - return static_cast(m_type); + if (isValid()) { + return (m_idWithType < 0) ? End : Begin; + } + return None; +} + +FoldingRegion FoldingRegion::sibling() const +{ + return isValid() ? FoldingRegion(type() ? End : Begin, id()) : FoldingRegion(); } diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/foldingregion.h b/src/libs/3rdparty/syntax-highlighting/src/lib/foldingregion.h index ca4cacafb25..e2a9e1fc680 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/foldingregion.h +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/foldingregion.h @@ -22,7 +22,7 @@ public: * Defines whether a FoldingRegion starts or ends a folding region. */ enum Type { - //! Used internally as indicator for invalid FoldingRegion%s. + //! Used internally as indicator for an invalid FoldingRegion. None, //! Indicates the start of a FoldingRegion. Begin, @@ -64,7 +64,7 @@ public: * brace, you need to do kind of a reference counting to find the correct * closing brace. */ - quint16 id() const; + int id() const; /** * Returns whether this is the begin or end of a region. @@ -74,12 +74,21 @@ public: */ Type type() const; + /** + * Returns the matching start or end region. + * + * @note Will return invalid region for an invalid region. + * + * @since 6.0 + */ + FoldingRegion sibling() const; + private: friend class Rule; - FoldingRegion(Type type, quint16 id); + KSYNTAXHIGHLIGHTING_NO_EXPORT FoldingRegion(Type type, int id); - quint16 m_type : 2; - quint16 m_id : 14; + // 0 is invalid, positive begin, negative end + int m_idWithType = 0; }; } diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/format.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/format.cpp index 518a1e9ee9e..2259cd34115 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/format.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/format.cpp @@ -98,7 +98,7 @@ QString Format::name() const return d->name; } -quint16 Format::id() const +int Format::id() const { return d->id; } diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/format.h b/src/libs/3rdparty/syntax-highlighting/src/lib/format.h index 496a54e42cb..397a1bab01c 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/format.h +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/format.h @@ -13,12 +13,6 @@ #include -QT_BEGIN_NAMESPACE -class QColor; -class QString; -class QXmlStreamReader; -QT_END_NAMESPACE - namespace KSyntaxHighlighting { class FormatPrivate; @@ -54,7 +48,7 @@ public: * the repository is reloaded (which also invalidatess the corresponding * Definition anyway). */ - quint16 id() const; + int id() const; /** Returns the underlying TextStyle of this Format. * Every Theme::TextStyle is visually defined by a Theme. A Format uses one @@ -192,7 +186,7 @@ private: } QT_BEGIN_NAMESPACE -Q_DECLARE_TYPEINFO(KSyntaxHighlighting::Format, Q_MOVABLE_TYPE); +Q_DECLARE_TYPEINFO(KSyntaxHighlighting::Format, Q_RELOCATABLE_TYPE); QT_END_NAMESPACE #endif // KSYNTAXHIGHLIGHTING_FORMAT_H diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/format_p.h b/src/libs/3rdparty/syntax-highlighting/src/lib/format_p.h index d8770f1ef7c..ea74531445e 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/format_p.h +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/format_p.h @@ -13,6 +13,10 @@ #include #include +QT_BEGIN_NAMESPACE +class QXmlStreamReader; +QT_END_NAMESPACE + namespace KSyntaxHighlighting { class FormatPrivate : public QSharedData @@ -21,6 +25,11 @@ public: FormatPrivate() = default; static FormatPrivate *detachAndGet(Format &format); + static std::intptr_t ptrId(const Format &format) + { + return std::intptr_t(format.d.data()); + } + TextStyleData styleOverride(const Theme &theme) const; void load(QXmlStreamReader &reader); @@ -33,7 +42,7 @@ public: QString name; TextStyleData style; Theme::TextStyle defaultStyle = Theme::Normal; - quint16 id = 0; + int id = 0; bool spellCheck = true; }; diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/highlightingdata.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/highlightingdata.cpp index adb1c346c13..d95ad43b7fe 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/highlightingdata.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/highlightingdata.cpp @@ -379,6 +379,7 @@ void HighlightingContextData::load(const QString &defName, QXmlStreamReader &rea lineEmptyContext = reader.attributes().value(QLatin1String("lineEmptyContext")).toString(); fallthroughContext = reader.attributes().value(QLatin1String("fallthroughContext")).toString(); noIndentationBasedFolding = Xml::attrToBool(reader.attributes().value(QLatin1String("noIndentationBasedFolding"))); + stopEmptyLineContextSwitchLoop = Xml::attrToBool(reader.attributes().value(QLatin1String("stopEmptyLineContextSwitchLoop"))); rules.reserve(8); diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/highlightingdata_p.hpp b/src/libs/3rdparty/syntax-highlighting/src/lib/highlightingdata_p.hpp index 80aeaf49340..f49227dbf96 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/highlightingdata_p.hpp +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/highlightingdata_p.hpp @@ -208,6 +208,7 @@ public: std::vector rules; + bool stopEmptyLineContextSwitchLoop = false; bool noIndentationBasedFolding = false; }; } diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/htmlhighlighter.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/htmlhighlighter.cpp index 1f68e33d3e4..928ae149d1b 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/htmlhighlighter.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/htmlhighlighter.cpp @@ -6,7 +6,9 @@ */ #include "htmlhighlighter.h" +#include "abstracthighlighter_p.h" #include "definition.h" +#include "definition_p.h" #include "format.h" #include "ksyntaxhighlighting_logging.h" #include "state.h" @@ -14,21 +16,22 @@ #include #include +#include #include -#include using namespace KSyntaxHighlighting; -class KSyntaxHighlighting::HtmlHighlighterPrivate +class KSyntaxHighlighting::HtmlHighlighterPrivate : public AbstractHighlighterPrivate { public: std::unique_ptr out; std::unique_ptr file; QString currentLine; + std::vector htmlStyles; }; HtmlHighlighter::HtmlHighlighter() - : d(new HtmlHighlighterPrivate()) + : AbstractHighlighter(new HtmlHighlighterPrivate()) { } @@ -38,27 +41,21 @@ HtmlHighlighter::~HtmlHighlighter() void HtmlHighlighter::setOutputFile(const QString &fileName) { + Q_D(HtmlHighlighter); d->file.reset(new QFile(fileName)); if (!d->file->open(QFile::WriteOnly | QFile::Truncate)) { qCWarning(Log) << "Failed to open output file" << fileName << ":" << d->file->errorString(); return; } d->out.reset(new QTextStream(d->file.get())); -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) d->out->setEncoding(QStringConverter::Utf8); -#else - d->out->setCodec("UTF-8"); -#endif } void HtmlHighlighter::setOutputFile(FILE *fileHandle) { + Q_D(HtmlHighlighter); d->out.reset(new QTextStream(fileHandle, QIODevice::WriteOnly)); -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) d->out->setEncoding(QStringConverter::Utf8); -#else - d->out->setCodec("UTF-8"); -#endif } void HtmlHighlighter::highlightFile(const QString &fileName, const QString &title) @@ -79,7 +76,7 @@ void HtmlHighlighter::highlightFile(const QString &fileName, const QString &titl /** * @brief toHtmlRgba - * Converts QColor -> rgba(r, g, b, a) if there is an alpha channel + * Converts QColor -> #RRGGBBAA if there is an alpha channel * otherwise it will just return the hexcode. This is because QColor * outputs #AARRGGBB, whereas browser support #RRGGBBAA. * @@ -91,22 +88,24 @@ static QString toHtmlRgbaString(const QColor &color) if (color.alpha() == 0xFF) { return color.name(); } - - QString rgba = QStringLiteral("rgba("); - rgba.append(QString::number(color.red())); - rgba.append(QLatin1Char(',')); - rgba.append(QString::number(color.green())); - rgba.append(QLatin1Char(',')); - rgba.append(QString::number(color.blue())); - rgba.append(QLatin1Char(',')); - // this must be alphaF - rgba.append(QString::number(color.alphaF())); - rgba.append(QLatin1Char(')')); - return rgba; + static const char16_t digits[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + QChar hexcode[9]; + hexcode[0] = QLatin1Char('#'); + hexcode[1] = digits[color.red() >> 4]; + hexcode[2] = digits[color.red() & 0xf]; + hexcode[3] = digits[color.green() >> 4]; + hexcode[4] = digits[color.green() & 0xf]; + hexcode[5] = digits[color.blue() >> 4]; + hexcode[6] = digits[color.blue() & 0xf]; + hexcode[7] = digits[color.alpha() >> 4]; + hexcode[8] = digits[color.alpha() & 0xf]; + return QString(hexcode, 9); } void HtmlHighlighter::highlightData(QIODevice *dev, const QString &title) { + Q_D(HtmlHighlighter); + if (!d->out) { qCWarning(Log) << "No output stream defined!"; return; @@ -114,29 +113,73 @@ void HtmlHighlighter::highlightData(QIODevice *dev, const QString &title) QString htmlTitle; if (title.isEmpty()) { - htmlTitle = QStringLiteral("Kate Syntax Highlighter"); + htmlTitle = QStringLiteral("KSyntaxHighlighter"); } else { htmlTitle = title.toHtmlEscaped(); } + const auto &theme = d->m_theme; + const auto &definition = d->m_definition; + + auto definitions = definition.includedDefinitions(); + definitions.append(definition); + + int maxId = 0; + for (const auto &definition : std::as_const(definitions)) { + for (const auto &format : std::as_const(DefinitionData::get(definition)->formats)) { + maxId = qMax(maxId, format.id()); + } + } + d->htmlStyles.clear(); + // htmlStyles must not be empty for applyFormat to work even with a definition without any context + d->htmlStyles.resize(maxId + 1); + + // initialize htmlStyles + for (const auto &definition : std::as_const(definitions)) { + for (const auto &format : std::as_const(DefinitionData::get(definition)->formats)) { + auto &buffer = d->htmlStyles[format.id()]; + if (format.hasTextColor(theme)) { + buffer += QStringLiteral("color:") + toHtmlRgbaString(format.textColor(theme)) + QStringLiteral(";"); + } + if (format.hasBackgroundColor(theme)) { + buffer += QStringLiteral("background-color:") + toHtmlRgbaString(format.backgroundColor(theme)) + QStringLiteral(";"); + } + if (format.isBold(theme)) { + buffer += QStringLiteral("font-weight:bold;"); + } + if (format.isItalic(theme)) { + buffer += QStringLiteral("font-style:italic;"); + } + if (format.isUnderline(theme)) { + buffer += QStringLiteral("text-decoration:underline;"); + } + if (format.isStrikeThrough(theme)) { + buffer += QStringLiteral("text-decoration:line-through;"); + } + + if (!buffer.isEmpty()) { + buffer.insert(0, QStringLiteral("'; + } + } + } + State state; *d->out << "\n"; *d->out << "\n"; *d->out << "\n"; *d->out << "" << htmlTitle << "\n"; - *d->out << "\n"; + *d->out << "\n"; *d->out << "out << " style=\"background-color:" << toHtmlRgbaString(QColor::fromRgba(theme().editorColor(Theme::BackgroundColor))); - if (theme().textColor(Theme::Normal)) { - *d->out << ";color:" << toHtmlRgbaString(QColor::fromRgba(theme().textColor(Theme::Normal))); + *d->out << " style=\"background-color:" << toHtmlRgbaString(QColor::fromRgba(theme.editorColor(Theme::BackgroundColor))); + if (theme.textColor(Theme::Normal)) { + *d->out << ";color:" << toHtmlRgbaString(QColor::fromRgba(theme.textColor(Theme::Normal))); } *d->out << "\">
\n";
 
     QTextStream in(dev);
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
-    in.setCodec("UTF-8");
-#endif
     while (in.readLineInto(&d->currentLine)) {
         state = highlightLine(d->currentLine, state);
         *d->out << "\n";
@@ -155,38 +198,24 @@ void HtmlHighlighter::applyFormat(int offset, int length, const Format &format)
         return;
     }
 
-    // collect potential output, cheaper than thinking about "is there any?"
-    QVarLengthArray formatOutput;
-    if (format.hasTextColor(theme())) {
-        formatOutput << QStringLiteral("color:") << toHtmlRgbaString(format.textColor(theme())) << QStringLiteral(";");
-    }
-    if (format.hasBackgroundColor(theme())) {
-        formatOutput << QStringLiteral("background-color:") << toHtmlRgbaString(format.backgroundColor(theme())) << QStringLiteral(";");
-    }
-    if (format.isBold(theme())) {
-        formatOutput << QStringLiteral("font-weight:bold;");
-    }
-    if (format.isItalic(theme())) {
-        formatOutput << QStringLiteral("font-style:italic;");
-    }
-    if (format.isUnderline(theme())) {
-        formatOutput << QStringLiteral("text-decoration:underline;");
-    }
-    if (format.isStrikeThrough(theme())) {
-        formatOutput << QStringLiteral("text-decoration:line-through;");
+    Q_D(HtmlHighlighter);
+
+    auto const &htmlStyle = d->htmlStyles[format.id()];
+
+    if (!htmlStyle.isEmpty()) {
+        *d->out << htmlStyle;
     }
 
-    if (!formatOutput.isEmpty()) {
-        *d->out << "out << out;
-        }
-        *d->out << "\">";
+    for (QChar ch : QStringView(d->currentLine).mid(offset, length)) {
+        if (ch == u'<')
+            *d->out << QStringLiteral("<");
+        else if (ch == u'&')
+            *d->out << QStringLiteral("&");
+        else
+            *d->out << ch;
     }
 
-    *d->out << d->currentLine.mid(offset, length).toHtmlEscaped();
-
-    if (!formatOutput.isEmpty()) {
-        *d->out << "";
+    if (!htmlStyle.isEmpty()) {
+        *d->out << QStringLiteral("");
     }
 }
diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/htmlhighlighter.h b/src/libs/3rdparty/syntax-highlighting/src/lib/htmlhighlighter.h
index 8754057345d..741cb851031 100644
--- a/src/libs/3rdparty/syntax-highlighting/src/lib/htmlhighlighter.h
+++ b/src/libs/3rdparty/syntax-highlighting/src/lib/htmlhighlighter.h
@@ -10,10 +10,11 @@
 #include "abstracthighlighter.h"
 #include "ksyntaxhighlighting_export.h"
 
-#include 
 #include 
 
-#include 
+QT_BEGIN_NAMESPACE
+class QIODevice;
+QT_END_NAMESPACE
 
 namespace KSyntaxHighlighting
 {
@@ -35,7 +36,7 @@ protected:
     void applyFormat(int offset, int length, const Format &format) override;
 
 private:
-    std::unique_ptr d;
+    Q_DECLARE_PRIVATE(HtmlHighlighter)
 };
 }
 
diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/keywordlist.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/keywordlist.cpp
index 133b6d28ac5..847f6af6d46 100644
--- a/src/libs/3rdparty/syntax-highlighting/src/lib/keywordlist.cpp
+++ b/src/libs/3rdparty/syntax-highlighting/src/lib/keywordlist.cpp
@@ -47,7 +47,7 @@ bool KeywordList::contains(QStringView str, Qt::CaseSensitivity caseSensitive) c
     /**
      * search with right predicate
      */
-    return std::binary_search(vectorToSearch.begin(), vectorToSearch.end(), QStringView(str), KeywordComparator{caseSensitive});
+    return std::binary_search(vectorToSearch.begin(), vectorToSearch.end(), str, KeywordComparator{caseSensitive});
 }
 
 void KeywordList::load(QXmlStreamReader &reader)
@@ -103,10 +103,7 @@ void KeywordList::initLookupForCaseSensitivity(Qt::CaseSensitivity caseSensitive
     /**
      * fill vector with refs to keywords
      */
-    vectorToSort.reserve(m_keywords.size());
-    for (const auto &keyword : std::as_const(m_keywords)) {
-        vectorToSort.push_back(keyword);
-    }
+    vectorToSort.assign(m_keywords.constBegin(), m_keywords.constEnd());
 
     /**
      * sort with right predicate
diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/matchresult_p.h b/src/libs/3rdparty/syntax-highlighting/src/lib/matchresult_p.h
index 1e0f7c61027..7112d4e291b 100644
--- a/src/libs/3rdparty/syntax-highlighting/src/lib/matchresult_p.h
+++ b/src/libs/3rdparty/syntax-highlighting/src/lib/matchresult_p.h
@@ -41,9 +41,9 @@ public:
      * @param offset offset of match
      * @param captures captures of the match
      */
-    explicit MatchResult(const int offset, const QStringList &captures)
+    explicit MatchResult(const int offset, QStringList &&captures)
         : m_offset(offset)
-        , m_captures(captures)
+        , m_captures(std::move(captures))
     {
     }
 
@@ -69,7 +69,7 @@ public:
      * Captures of the match.
      * @return captured text of this match
      */
-    const QStringList &captures() const
+    QStringList &captures()
     {
         return m_captures;
     }
diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/repository.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/repository.cpp
index a12d4ba1a3a..07c28454c5b 100644
--- a/src/libs/3rdparty/syntax-highlighting/src/lib/repository.cpp
+++ b/src/libs/3rdparty/syntax-highlighting/src/lib/repository.cpp
@@ -77,9 +77,9 @@ Definition findHighestPriorityDefinitionIf(const QMap &defs
 }
 
 template
-QVector findDefinitionsIf(const QMap &defs, UnaryPredicate predicate)
+QList findDefinitionsIf(const QMap &defs, UnaryPredicate predicate)
 {
-    QVector matches;
+    QList matches;
     std::copy_if(defs.cbegin(), defs.cend(), std::back_inserter(matches), predicate);
     std::stable_sort(matches.begin(), matches.end(), [](const Definition &lhs, const Definition &rhs) {
         return lhs.priority() > rhs.priority();
@@ -127,7 +127,7 @@ Definition Repository::definitionForFileName(const QString &fileName) const
     return findHighestPriorityDefinitionIf(d->m_defs, anyWildcardMatches(fileNameFromFilePath(fileName)));
 }
 
-QVector Repository::definitionsForFileName(const QString &fileName) const
+QList Repository::definitionsForFileName(const QString &fileName) const
 {
     return findDefinitionsIf(d->m_defs, anyWildcardMatches(fileNameFromFilePath(fileName)));
 }
@@ -137,22 +137,22 @@ Definition Repository::definitionForMimeType(const QString &mimeType) const
     return findHighestPriorityDefinitionIf(d->m_defs, anyMimeTypeEquals(mimeType));
 }
 
-QVector Repository::definitionsForMimeType(const QString &mimeType) const
+QList Repository::definitionsForMimeType(const QString &mimeType) const
 {
     return findDefinitionsIf(d->m_defs, anyMimeTypeEquals(mimeType));
 }
 
-QVector Repository::definitions() const
+QList Repository::definitions() const
 {
     return d->m_sortedDefs;
 }
 
-QVector Repository::themes() const
+QList Repository::themes() const
 {
     return d->m_themes;
 }
 
-static auto lowerBoundTheme(const QVector &themes, QStringView themeName)
+static auto lowerBoundTheme(const QList &themes, QStringView themeName)
 {
     return std::lower_bound(themes.begin(), themes.end(), themeName, [](const Theme &lhs, QStringView rhs) {
         return lhs.name() < rhs;
@@ -177,42 +177,32 @@ Theme Repository::defaultTheme(Repository::DefaultTheme t) const
     return theme(QStringLiteral("Breeze Light"));
 }
 
-Theme Repository::defaultTheme(Repository::DefaultTheme t)
-{
-    return std::as_const(*this).defaultTheme(t);
-}
-
 Theme Repository::themeForPalette(const QPalette &palette) const
 {
     const auto base = palette.color(QPalette::Base);
+    const auto highlight = palette.color(QPalette::Highlight).rgb();
 
-    // find themes with matching background colors
-    QVector matchingThemes;
+    // find themes with matching background and highlight colors
+    const Theme *firstMatchingTheme = nullptr;
     for (const auto &theme : std::as_const(d->m_themes)) {
-        const auto background = theme.editorColor(KSyntaxHighlighting::Theme::EditorColorRole::BackgroundColor);
+        const auto background = theme.editorColor(Theme::EditorColorRole::BackgroundColor);
         if (background == base.rgb()) {
-            matchingThemes.append(&theme);
-        }
-    }
-    if (!matchingThemes.empty()) {
-        // if there's multiple, search for one with a matching highlight color
-        const auto highlight = palette.color(QPalette::Highlight);
-        for (const auto *theme : std::as_const(matchingThemes)) {
-            auto selection = theme->editorColor(KSyntaxHighlighting::Theme::EditorColorRole::TextSelection);
-            if (selection == highlight.rgb()) {
-                return *theme;
+            // find theme with a matching highlight color
+            auto selection = theme.editorColor(Theme::EditorColorRole::TextSelection);
+            if (selection == highlight) {
+                return theme;
+            }
+            if (!firstMatchingTheme) {
+                firstMatchingTheme = &theme;
             }
         }
-        return *matchingThemes.first();
+    }
+    if (firstMatchingTheme) {
+        return *firstMatchingTheme;
     }
 
     // fallback to just use the default light or dark theme
-    return defaultTheme((base.lightness() < 128) ? KSyntaxHighlighting::Repository::DarkTheme : KSyntaxHighlighting::Repository::LightTheme);
-}
-
-Theme Repository::themeForPalette(const QPalette &palette)
-{
-    return std::as_const(*this).themeForPalette(palette);
+    return defaultTheme((base.lightness() < 128) ? Repository::DarkTheme : Repository::LightTheme);
 }
 
 void RepositoryPrivate::load(Repository *repo)
@@ -238,12 +228,6 @@ void RepositoryPrivate::load(Repository *repo)
                                                      QStandardPaths::LocateDirectory)) {
         loadSyntaxFolder(repo, dir);
     }
-
-    // backward compatibility with Kate
-    for (const auto &dir :
-         QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QStringLiteral("katepart5/syntax"), QStandardPaths::LocateDirectory)) {
-        loadSyntaxFolder(repo, dir);
-    }
 #endif
 
     // default resources are always used, this is the one location that has a index cbor file
@@ -377,25 +361,27 @@ void RepositoryPrivate::addTheme(const Theme &theme)
     }
 }
 
-quint16 RepositoryPrivate::foldingRegionId(const QString &defName, const QString &foldName)
+int RepositoryPrivate::foldingRegionId(const QString &defName, const QString &foldName)
 {
     const auto it = m_foldingRegionIds.constFind(qMakePair(defName, foldName));
     if (it != m_foldingRegionIds.constEnd()) {
         return it.value();
     }
+    Q_ASSERT(m_foldingRegionId < std::numeric_limits::max());
     m_foldingRegionIds.insert(qMakePair(defName, foldName), ++m_foldingRegionId);
     return m_foldingRegionId;
 }
 
-quint16 RepositoryPrivate::nextFormatId()
+int RepositoryPrivate::nextFormatId()
 {
-    Q_ASSERT(m_formatId < std::numeric_limits::max());
+    Q_ASSERT(m_formatId < std::numeric_limits::max());
     return ++m_formatId;
 }
 
 void Repository::reload()
 {
-    qCDebug(Log) << "Reloading syntax definitions!";
+    Q_EMIT aboutToReload();
+
     for (const auto &def : std::as_const(d->m_sortedDefs)) {
         DefinitionData::get(def)->clear();
     }
@@ -410,6 +396,8 @@ void Repository::reload()
     d->m_formatId = 0;
 
     d->load(this);
+
+    Q_EMIT reloaded();
 }
 
 void Repository::addCustomSearchPath(const QString &path)
@@ -418,7 +406,9 @@ void Repository::addCustomSearchPath(const QString &path)
     reload();
 }
 
-QVector Repository::customSearchPaths() const
+QList Repository::customSearchPaths() const
 {
     return d->m_customSearchPaths;
 }
+
+#include "moc_repository.cpp"
diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/repository.h b/src/libs/3rdparty/syntax-highlighting/src/lib/repository.h
index 7c74753bfe3..612ba54d6a4 100644
--- a/src/libs/3rdparty/syntax-highlighting/src/lib/repository.h
+++ b/src/libs/3rdparty/syntax-highlighting/src/lib/repository.h
@@ -9,7 +9,8 @@
 
 #include "ksyntaxhighlighting_export.h"
 
-#include 
+#include 
+#include 
 #include 
 
 #include 
@@ -76,13 +77,6 @@ class Theme;
  *    map to $HOME/.local5/share/org.kde.syntax-highlighting/syntax and
  *    /usr/share/org.kde.syntax-highlighting/syntax.
  *
- * -# Next, for backwards compatibility with Kate, all syntax highlighting
- *    files are loaded that are located in
- *    QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QStringLiteral("katepart5/syntax"), QStandardPaths::LocateDirectory);
- *    Again, under Unix, this uses $XDG_DATA_HOME and $XDG_DATA_DIRS, which
- *    could map to $HOME/.local5/share/katepart5/syntax and
- *    /usr/share/katepart5/syntax.
- *
  * -# Then, all files compiled into the library through resources are loaded.
  *    The internal resource path is ":/org.kde.syntax-highlighting/syntax".
  *    This path should never be touched by other applications.
@@ -124,8 +118,12 @@ class Theme;
  * @see Definition, Theme, AbstractHighlighter
  * @since 5.28
  */
-class KSYNTAXHIGHLIGHTING_EXPORT Repository
+class KSYNTAXHIGHLIGHTING_EXPORT Repository : public QObject
 {
+    Q_OBJECT
+    Q_PROPERTY(QList definitions READ definitions NOTIFY reloaded)
+    Q_PROPERTY(QList themes READ themes NOTIFY reloaded)
+
 public:
     /**
      * Create a new syntax definition repository.
@@ -148,7 +146,7 @@ public:
      *       Therefore, only the string "JavaScript" will return a valid
      *       Definition file.
      */
-    Definition definitionForName(const QString &defName) const;
+    Q_INVOKABLE KSyntaxHighlighting::Definition definitionForName(const QString &defName) const;
 
     /**
      * Returns the best matching Definition for the file named @p fileName.
@@ -159,7 +157,7 @@ public:
      * If no match is found, Definition::isValid() of the returned instance
      * returns false.
      */
-    Definition definitionForFileName(const QString &fileName) const;
+    Q_INVOKABLE KSyntaxHighlighting::Definition definitionForFileName(const QString &fileName) const;
 
     /**
      * Returns all Definition%s for the file named @p fileName sorted by priority.
@@ -168,7 +166,7 @@ public:
      *
      * @since 5.56
      */
-    QVector definitionsForFileName(const QString &fileName) const;
+    Q_INVOKABLE QList definitionsForFileName(const QString &fileName) const;
 
     /**
      * Returns the best matching Definition to the type named @p mimeType
@@ -178,34 +176,34 @@ public:
      *
      * @since 5.50
      */
-    Definition definitionForMimeType(const QString &mimeType) const;
+    Q_INVOKABLE KSyntaxHighlighting::Definition definitionForMimeType(const QString &mimeType) const;
 
     /**
      * Returns all Definition%s to the type named @p mimeType sorted by priority
      *
      * @since 5.56
      */
-    QVector definitionsForMimeType(const QString &mimeType) const;
+    Q_INVOKABLE QList definitionsForMimeType(const QString &mimeType) const;
 
     /**
      * Returns all available Definition%s.
      * Definition%ss are ordered by translated section and translated names,
      * for consistent displaying.
      */
-    QVector definitions() const;
+    Q_INVOKABLE QList definitions() const;
 
     /**
      * Returns all available color themes.
      * The returned list should never be empty.
      */
-    QVector themes() const;
+    Q_INVOKABLE QList themes() const;
 
     /**
      * Returns the theme called @p themeName.
      * If the requested theme cannot be found, the retunred Theme is invalid,
      * see Theme::isValid().
      */
-    Theme theme(const QString &themeName) const;
+    Q_INVOKABLE KSyntaxHighlighting::Theme theme(const QString &themeName) const;
 
     /**
      * Built-in default theme types.
@@ -217,21 +215,14 @@ public:
         //! Theme with a dark background color.
         DarkTheme
     };
+    Q_ENUM(DefaultTheme)
 
     /**
      * Returns a default theme instance of the given type.
      * The returned Theme is guaranteed to be a valid theme.
      * @since 5.79
      */
-    Theme defaultTheme(DefaultTheme t = LightTheme) const;
-
-    /**
-     * Returns a default theme instance of the given type.
-     * The returned Theme is guaranteed to be a valid theme.
-     *
-     * KF6: remove in favor of const variant
-     */
-    Theme defaultTheme(DefaultTheme t = LightTheme);
+    Q_INVOKABLE KSyntaxHighlighting::Theme defaultTheme(DefaultTheme t = LightTheme) const;
 
     /**
      * Returns the best matching theme for the given palette
@@ -239,14 +230,6 @@ public:
      **/
     Theme themeForPalette(const QPalette &palette) const;
 
-    /**
-     * Returns the best matching theme for the given palette
-     * @since 5.77
-     *
-     * KF6: remove in favor of const variant
-     **/
-    Theme themeForPalette(const QPalette &palette);
-
     /**
      * Reloads the repository.
      * This is a moderately expensive operations and should thus only be
@@ -278,7 +261,20 @@ public:
      * @see addCustomSearchPath()
      * @since 5.39
      */
-    QVector customSearchPaths() const;
+    QList customSearchPaths() const;
+
+Q_SIGNALS:
+    /**
+     * This signal is emitted before the reload is started.
+     * @since 6.0
+     */
+    void aboutToReload();
+
+    /**
+     * This signal is emitted when the reload is finished.
+     * @since 6.0
+     */
+    void reloaded();
 
 private:
     Q_DISABLE_COPY(Repository)
diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/repository_p.h b/src/libs/3rdparty/syntax-highlighting/src/lib/repository_p.h
index 447cfae6990..bb9f8ba0820 100644
--- a/src/libs/3rdparty/syntax-highlighting/src/lib/repository_p.h
+++ b/src/libs/3rdparty/syntax-highlighting/src/lib/repository_p.h
@@ -8,11 +8,11 @@
 #define KSYNTAXHIGHLIGHTING_REPOSITORY_P_H
 
 #include 
-#include 
+#include 
+#include 
+#include 
 
-QT_BEGIN_NAMESPACE
-class QString;
-QT_END_NAMESPACE
+#include "dynamicregexpcache_p.h"
 
 namespace KSyntaxHighlighting
 {
@@ -36,22 +36,24 @@ public:
     void loadThemeFolder(const QString &path);
     void addTheme(const Theme &theme);
 
-    quint16 foldingRegionId(const QString &defName, const QString &foldName);
-    quint16 nextFormatId();
+    int foldingRegionId(const QString &defName, const QString &foldName);
+    int nextFormatId();
 
-    QVector m_customSearchPaths;
+    QList m_customSearchPaths;
 
     // sorted map to have deterministic iteration order for e.g. definitionsForFileName
     QMap m_defs;
 
     // this vector is sorted by translated sections/names
-    QVector m_sortedDefs;
+    QList m_sortedDefs;
 
-    QVector m_themes;
+    QList m_themes;
 
-    QHash, quint16> m_foldingRegionIds;
-    quint16 m_foldingRegionId = 0;
-    quint16 m_formatId = 0;
+    QHash, int> m_foldingRegionIds;
+    int m_foldingRegionId = 0;
+    int m_formatId = 0;
+
+    DynamicRegexpCache m_dynamicRegexpCache;
 };
 }
 
diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/rule.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/rule.cpp
index 1d02bd6ac34..186ed16120d 100644
--- a/src/libs/3rdparty/syntax-highlighting/src/lib/rule.cpp
+++ b/src/libs/3rdparty/syntax-highlighting/src/lib/rule.cpp
@@ -1,20 +1,19 @@
 /*
     SPDX-FileCopyrightText: 2016 Volker Krause 
     SPDX-FileCopyrightText: 2018 Christoph Cullmann 
-    SPDX-FileCopyrightText: 2020 Jonathan Poelen 
+    SPDX-FileCopyrightText: 2020 Jonathan Poelen 
 
     SPDX-License-Identifier: MIT
 */
 
 #include "context_p.h"
 #include "definition_p.h"
+#include "dynamicregexpcache_p.h"
 #include "ksyntaxhighlighting_logging.h"
 #include "rule_p.h"
 #include "worddelimiters_p.h"
 #include "xml_p.h"
 
-#include 
-
 using namespace KSyntaxHighlighting;
 
 // QChar::isDigit() match any digit in unicode (romain numeral, etc)
@@ -90,8 +89,8 @@ static int matchEscapedChar(QStringView text, int offset)
 static QString replaceCaptures(const QString &pattern, const QStringList &captures, bool quote)
 {
     auto result = pattern;
-    for (int i = captures.size() - 1; i >= 1; --i) {
-        result.replace(QLatin1Char('%') + QString::number(i), quote ? QRegularExpression::escape(captures.at(i)) : captures.at(i));
+    for (int i = captures.size(); i >= 1; --i) {
+        result.replace(QLatin1Char('%') + QString::number(i), quote ? QRegularExpression::escape(captures.at(i - 1)) : captures.at(i - 1));
     }
     return result;
 }
@@ -233,7 +232,7 @@ AnyChar::AnyChar(const HighlightingContextData::Rule::AnyChar &data)
 {
 }
 
-MatchResult AnyChar::doMatch(QStringView text, int offset, const QStringList &) const
+MatchResult AnyChar::doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const
 {
     if (m_chars.contains(text.at(offset))) {
         return offset + 1;
@@ -243,15 +242,15 @@ MatchResult AnyChar::doMatch(QStringView text, int offset, const QStringList &)
 
 DetectChar::DetectChar(const HighlightingContextData::Rule::DetectChar &data)
     : m_char(data.char1)
-    , m_captureIndex(data.dynamic ? data.char1.digitValue() : 0)
+    , m_captureIndex((data.dynamic ? data.char1.digitValue() : 0) - 1)
 {
     m_dynamic = data.dynamic;
 }
 
-MatchResult DetectChar::doMatch(QStringView text, int offset, const QStringList &captures) const
+MatchResult DetectChar::doMatch(QStringView text, int offset, const QStringList &captures, DynamicRegexpCache &) const
 {
     if (m_dynamic) {
-        if (m_captureIndex == 0 || captures.size() <= m_captureIndex || captures.at(m_captureIndex).isEmpty()) {
+        if (m_captureIndex == -1 || captures.size() <= m_captureIndex || captures.at(m_captureIndex).isEmpty()) {
             return offset;
         }
         if (text.at(offset) == captures.at(m_captureIndex).at(0)) {
@@ -272,7 +271,7 @@ Detect2Chars::Detect2Chars(const HighlightingContextData::Rule::Detect2Chars &da
 {
 }
 
-MatchResult Detect2Chars::doMatch(QStringView text, int offset, const QStringList &) const
+MatchResult Detect2Chars::doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const
 {
     if (text.size() - offset < 2) {
         return offset;
@@ -283,7 +282,7 @@ MatchResult Detect2Chars::doMatch(QStringView text, int offset, const QStringLis
     return offset;
 }
 
-MatchResult DetectIdentifier::doMatch(QStringView text, int offset, const QStringList &) const
+MatchResult DetectIdentifier::doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const
 {
     if (!text.at(offset).isLetter() && text.at(offset) != QLatin1Char('_')) {
         return offset;
@@ -299,7 +298,7 @@ MatchResult DetectIdentifier::doMatch(QStringView text, int offset, const QStrin
     return text.size();
 }
 
-MatchResult DetectSpaces::doMatch(QStringView text, int offset, const QStringList &) const
+MatchResult DetectSpaces::doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const
 {
     while (offset < text.size() && text.at(offset).isSpace()) {
         ++offset;
@@ -313,7 +312,7 @@ Float::Float(DefinitionData &def, const HighlightingContextData::Rule::Float &da
     resolveAdditionalWordDelimiters(m_wordDelimiters, data.wordDelimiters);
 }
 
-MatchResult Float::doMatch(QStringView text, int offset, const QStringList &) const
+MatchResult Float::doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const
 {
     if (offset > 0 && !m_wordDelimiters.contains(text.at(offset - 1))) {
         return offset;
@@ -358,7 +357,7 @@ MatchResult Float::doMatch(QStringView text, int offset, const QStringList &) co
     return expOffset;
 }
 
-MatchResult HlCChar::doMatch(QStringView text, int offset, const QStringList &) const
+MatchResult HlCChar::doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const
 {
     if (text.size() < offset + 3) {
         return offset;
@@ -393,7 +392,7 @@ HlCHex::HlCHex(DefinitionData &def, const HighlightingContextData::Rule::HlCHex
     resolveAdditionalWordDelimiters(m_wordDelimiters, data.wordDelimiters);
 }
 
-MatchResult HlCHex::doMatch(QStringView text, int offset, const QStringList &) const
+MatchResult HlCHex::doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const
 {
     if (offset > 0 && !m_wordDelimiters.contains(text.at(offset - 1))) {
         return offset;
@@ -427,7 +426,7 @@ HlCOct::HlCOct(DefinitionData &def, const HighlightingContextData::Rule::HlCOct
     resolveAdditionalWordDelimiters(m_wordDelimiters, data.wordDelimiters);
 }
 
-MatchResult HlCOct::doMatch(QStringView text, int offset, const QStringList &) const
+MatchResult HlCOct::doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const
 {
     if (offset > 0 && !m_wordDelimiters.contains(text.at(offset - 1))) {
         return offset;
@@ -453,7 +452,7 @@ MatchResult HlCOct::doMatch(QStringView text, int offset, const QStringList &) c
     return offset;
 }
 
-MatchResult HlCStringChar::doMatch(QStringView text, int offset, const QStringList &) const
+MatchResult HlCStringChar::doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const
 {
     return matchEscapedChar(text, offset);
 }
@@ -464,7 +463,7 @@ IncludeRules::IncludeRules(const HighlightingContextData::Rule::IncludeRules &da
 {
 }
 
-MatchResult IncludeRules::doMatch(QStringView text, int offset, const QStringList &) const
+MatchResult IncludeRules::doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const
 {
     Q_UNUSED(text);
     qCWarning(Log) << "Unresolved include rule";
@@ -477,7 +476,7 @@ Int::Int(DefinitionData &def, const HighlightingContextData::Rule::Int &data)
     resolveAdditionalWordDelimiters(m_wordDelimiters, data.wordDelimiters);
 }
 
-MatchResult Int::doMatch(QStringView text, int offset, const QStringList &) const
+MatchResult Int::doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const
 {
     if (offset > 0 && !m_wordDelimiters.contains(text.at(offset - 1))) {
         return offset;
@@ -521,9 +520,10 @@ KeywordListRule::KeywordListRule(const KeywordList &keywordList, DefinitionData
     , m_caseSensitivity(data.hasCaseSensitivityOverride ? data.caseSensitivityOverride : keywordList.caseSensitivity())
 {
     resolveAdditionalWordDelimiters(m_wordDelimiters, data.wordDelimiters);
+    m_hasSkipOffset = true;
 }
 
-MatchResult KeywordListRule::doMatch(QStringView text, int offset, const QStringList &) const
+MatchResult KeywordListRule::doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const
 {
     auto newOffset = offset;
     while (text.size() > newOffset && !m_wordDelimiters.contains(text.at(newOffset))) {
@@ -546,7 +546,7 @@ LineContinue::LineContinue(const HighlightingContextData::Rule::LineContinue &da
 {
 }
 
-MatchResult LineContinue::doMatch(QStringView text, int offset, const QStringList &) const
+MatchResult LineContinue::doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const
 {
     if (offset == text.size() - 1 && text.at(offset) == m_char) {
         return offset + 1;
@@ -560,7 +560,7 @@ RangeDetect::RangeDetect(const HighlightingContextData::Rule::RangeDetect &data)
 {
 }
 
-MatchResult RangeDetect::doMatch(QStringView text, int offset, const QStringList &) const
+MatchResult RangeDetect::doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const
 {
     if (text.size() - offset < 2) {
         return offset;
@@ -591,25 +591,16 @@ static QRegularExpression::PatternOptions makePattenOptions(const HighlightingCo
 
 static void resolveRegex(QRegularExpression ®exp, Context *context)
 {
-    if (!regexp.isValid()) {
-        // DontCaptureOption with back reference capture is an error, remove this option then try again
+    bool enableCapture = context && context->hasDynamicRule();
+
+    // disable DontCaptureOption when reference a context with dynamic rule or
+    // with invalid regex because DontCaptureOption with back reference capture is an error
+    if (enableCapture || !regexp.isValid()) {
         regexp.setPatternOptions(regexp.patternOptions() & ~QRegularExpression::DontCaptureOption);
-
-        if (!regexp.isValid()) {
-            qCDebug(Log) << "Invalid regexp:" << regexp.pattern();
-        }
-
-        return;
     }
 
-    // disable DontCaptureOption when reference a context with dynamic rule
-    if (context) {
-        for (const Rule::Ptr &rule : context->rules()) {
-            if (rule->isDynamic()) {
-                regexp.setPatternOptions(regexp.patternOptions() & ~QRegularExpression::DontCaptureOption);
-                break;
-            }
-        }
+    if (!regexp.isValid()) {
+        qCDebug(Log) << "Invalid regexp:" << regexp.pattern();
     }
 }
 
@@ -618,15 +609,25 @@ static MatchResult regexMatch(const QRegularExpression ®exp, QStringView text
     /**
      * match the pattern
      */
+#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
+    const auto result = regexp.matchView(text, offset, QRegularExpression::NormalMatch, QRegularExpression::DontCheckSubjectStringMatchOption);
+#else
     const auto result = regexp.match(text, offset, QRegularExpression::NormalMatch, QRegularExpression::DontCheckSubjectStringMatchOption);
+#endif
     if (result.capturedStart() == offset) {
         /**
          * we only need to compute the captured texts if we have real capture groups
          * highlightings should only address %1..%.., see e.g. replaceCaptures
          * DetectChar ignores %0, too
          */
-        if (result.lastCapturedIndex() > 0) {
-            return MatchResult(offset + result.capturedLength(), result.capturedTexts());
+        int lastCapturedIndex = result.lastCapturedIndex();
+        if (lastCapturedIndex > 0) {
+            QStringList captures;
+            captures.reserve(lastCapturedIndex);
+            // ignore the capturing group number 0
+            for (int i = 1; i <= lastCapturedIndex; ++i)
+                captures.push_back(result.captured(i));
+            return MatchResult(offset + result.capturedLength(), std::move(captures));
         }
 
         /**
@@ -645,20 +646,17 @@ static MatchResult regexMatch(const QRegularExpression ®exp, QStringView text
 RegExpr::RegExpr(const HighlightingContextData::Rule::RegExpr &data)
     : m_regexp(data.pattern, makePattenOptions(data))
 {
+    m_hasSkipOffset = true;
 }
 
 void RegExpr::resolve()
 {
-    if (m_isResolved) {
-        return;
-    }
-
     m_isResolved = true;
 
     resolveRegex(m_regexp, context().context());
 }
 
-MatchResult RegExpr::doMatch(QStringView text, int offset, const QStringList &) const
+MatchResult RegExpr::doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const
 {
     if (Q_UNLIKELY(!m_isResolved)) {
         const_cast(this)->resolve();
@@ -672,14 +670,11 @@ DynamicRegExpr::DynamicRegExpr(const HighlightingContextData::Rule::RegExpr &dat
     , m_patternOptions(makePattenOptions(data))
 {
     m_dynamic = true;
+    m_hasSkipOffset = true;
 }
 
 void DynamicRegExpr::resolve()
 {
-    if (m_isResolved) {
-        return;
-    }
-
     m_isResolved = true;
 
     QRegularExpression regexp(m_pattern, m_patternOptions);
@@ -687,7 +682,7 @@ void DynamicRegExpr::resolve()
     m_patternOptions = regexp.patternOptions();
 }
 
-MatchResult DynamicRegExpr::doMatch(QStringView text, int offset, const QStringList &captures) const
+MatchResult DynamicRegExpr::doMatch(QStringView text, int offset, const QStringList &captures, DynamicRegexpCache &dynamicRegexpCache) const
 {
     if (Q_UNLIKELY(!m_isResolved)) {
         const_cast(this)->resolve();
@@ -696,8 +691,8 @@ MatchResult DynamicRegExpr::doMatch(QStringView text, int offset, const QStringL
     /**
      * create new pattern with right instantiation
      */
-    const QRegularExpression regexp(replaceCaptures(m_pattern, captures, true), m_patternOptions);
-
+    auto pattern = replaceCaptures(m_pattern, captures, true);
+    auto ®exp = dynamicRegexpCache.compileRegexp(std::move(pattern), m_patternOptions);
     return regexMatch(regexp, text, offset);
 }
 
@@ -707,7 +702,7 @@ StringDetect::StringDetect(const HighlightingContextData::Rule::StringDetect &da
 {
 }
 
-MatchResult StringDetect::doMatch(QStringView text, int offset, const QStringList &) const
+MatchResult StringDetect::doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const
 {
     return matchString(m_string, text, offset, m_caseSensitivity);
 }
@@ -719,7 +714,7 @@ DynamicStringDetect::DynamicStringDetect(const HighlightingContextData::Rule::St
     m_dynamic = true;
 }
 
-MatchResult DynamicStringDetect::doMatch(QStringView text, int offset, const QStringList &captures) const
+MatchResult DynamicStringDetect::doMatch(QStringView text, int offset, const QStringList &captures, DynamicRegexpCache &) const
 {
     /**
      * for dynamic case: create new pattern with right instantiation
@@ -736,7 +731,7 @@ WordDetect::WordDetect(DefinitionData &def, const HighlightingContextData::Rule:
     resolveAdditionalWordDelimiters(m_wordDelimiters, data.wordDelimiters);
 }
 
-MatchResult WordDetect::doMatch(QStringView text, int offset, const QStringList &) const
+MatchResult WordDetect::doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const
 {
     if (text.size() - offset < m_word.size()) {
         return offset;
diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/rule_p.h b/src/libs/3rdparty/syntax-highlighting/src/lib/rule_p.h
index 7536d92e803..bc5f367ad67 100644
--- a/src/libs/3rdparty/syntax-highlighting/src/lib/rule_p.h
+++ b/src/libs/3rdparty/syntax-highlighting/src/lib/rule_p.h
@@ -27,6 +27,7 @@ namespace KSyntaxHighlighting
 class WordDelimiters;
 class DefinitionData;
 class IncludeRules;
+class DynamicRegexpCache;
 
 class Rule
 {
@@ -83,7 +84,15 @@ public:
         return m_type == Type::LineContinue;
     }
 
-    virtual MatchResult doMatch(QStringView text, int offset, const QStringList &captures) const = 0;
+    // If true, then the rule uses the skipOffset parameter of MatchResult.
+    // This is used by AbstractHighlighter::highlightLine() to look for a rule
+    // in the skipOffsets cache only if it can be found there.
+    bool hasSkipOffset() const
+    {
+        return m_hasSkipOffset;
+    }
+
+    virtual MatchResult doMatch(QStringView text, int offset, const QStringList &captures, DynamicRegexpCache &dynamicRegexpCache) const = 0;
 
     static Rule::Ptr create(DefinitionData &def, const HighlightingContextData::Rule &ruleData, QStringView lookupContextName);
 
@@ -98,6 +107,7 @@ private:
         IncludeRules,
     };
 
+private:
     Format m_attributeFormat;
     ContextSwitch m_context;
     int m_column = -1;
@@ -108,6 +118,7 @@ private:
     bool m_lookAhead = false;
 
 protected:
+    bool m_hasSkipOffset = false;
     bool m_dynamic = false;
 };
 
@@ -117,10 +128,10 @@ public:
     AnyChar(const HighlightingContextData::Rule::AnyChar &data);
 
 protected:
-    MatchResult doMatch(QStringView text, int offset, const QStringList &) const override;
+    MatchResult doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const override;
 
 private:
-    QString m_chars;
+    WordDelimiters m_chars;
 };
 
 class DetectChar final : public Rule
@@ -129,7 +140,7 @@ public:
     DetectChar(const HighlightingContextData::Rule::DetectChar &data);
 
 protected:
-    MatchResult doMatch(QStringView text, int offset, const QStringList &) const override;
+    MatchResult doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const override;
 
 private:
     QChar m_char;
@@ -142,7 +153,7 @@ public:
     Detect2Chars(const HighlightingContextData::Rule::Detect2Chars &data);
 
 protected:
-    MatchResult doMatch(QStringView text, int offset, const QStringList &) const override;
+    MatchResult doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const override;
 
 private:
     QChar m_char1;
@@ -152,13 +163,13 @@ private:
 class DetectIdentifier final : public Rule
 {
 protected:
-    MatchResult doMatch(QStringView text, int offset, const QStringList &) const override;
+    MatchResult doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const override;
 };
 
 class DetectSpaces final : public Rule
 {
 protected:
-    MatchResult doMatch(QStringView text, int offset, const QStringList &) const override;
+    MatchResult doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const override;
 };
 
 class Float final : public Rule
@@ -167,7 +178,7 @@ public:
     Float(DefinitionData &def, const HighlightingContextData::Rule::Float &data);
 
 protected:
-    MatchResult doMatch(QStringView text, int offset, const QStringList &) const override;
+    MatchResult doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const override;
 
 private:
     WordDelimiters m_wordDelimiters;
@@ -189,7 +200,7 @@ public:
     }
 
 protected:
-    MatchResult doMatch(QStringView text, int offset, const QStringList &) const override;
+    MatchResult doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const override;
 
 private:
     QString m_contextName;
@@ -202,7 +213,7 @@ public:
     Int(DefinitionData &def, const HighlightingContextData::Rule::Int &data);
 
 protected:
-    MatchResult doMatch(QStringView text, int offset, const QStringList &) const override;
+    MatchResult doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const override;
 
 private:
     WordDelimiters m_wordDelimiters;
@@ -211,7 +222,7 @@ private:
 class HlCChar final : public Rule
 {
 protected:
-    MatchResult doMatch(QStringView text, int offset, const QStringList &) const override;
+    MatchResult doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const override;
 };
 
 class HlCHex final : public Rule
@@ -220,7 +231,7 @@ public:
     HlCHex(DefinitionData &def, const HighlightingContextData::Rule::HlCHex &data);
 
 protected:
-    MatchResult doMatch(QStringView text, int offset, const QStringList &) const override;
+    MatchResult doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const override;
 
 private:
     WordDelimiters m_wordDelimiters;
@@ -232,7 +243,7 @@ public:
     HlCOct(DefinitionData &def, const HighlightingContextData::Rule::HlCOct &data);
 
 protected:
-    MatchResult doMatch(QStringView text, int offset, const QStringList &) const override;
+    MatchResult doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const override;
 
 private:
     WordDelimiters m_wordDelimiters;
@@ -241,7 +252,7 @@ private:
 class HlCStringChar final : public Rule
 {
 protected:
-    MatchResult doMatch(QStringView text, int offset, const QStringList &) const override;
+    MatchResult doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const override;
 };
 
 class KeywordListRule final : public Rule
@@ -252,7 +263,7 @@ public:
     static Rule::Ptr create(DefinitionData &def, const HighlightingContextData::Rule::Keyword &data, QStringView lookupContextName);
 
 protected:
-    MatchResult doMatch(QStringView text, int offset, const QStringList &) const override;
+    MatchResult doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const override;
 
 private:
     WordDelimiters m_wordDelimiters;
@@ -266,7 +277,7 @@ public:
     LineContinue(const HighlightingContextData::Rule::LineContinue &data);
 
 protected:
-    MatchResult doMatch(QStringView text, int offset, const QStringList &) const override;
+    MatchResult doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const override;
 
 private:
     QChar m_char;
@@ -278,7 +289,7 @@ public:
     RangeDetect(const HighlightingContextData::Rule::RangeDetect &data);
 
 protected:
-    MatchResult doMatch(QStringView text, int offset, const QStringList &) const override;
+    MatchResult doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const override;
 
 private:
     QChar m_begin;
@@ -291,7 +302,7 @@ public:
     RegExpr(const HighlightingContextData::Rule::RegExpr &data);
 
 protected:
-    MatchResult doMatch(QStringView text, int offset, const QStringList &) const override;
+    MatchResult doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const override;
 
 private:
     void resolve();
@@ -305,7 +316,7 @@ public:
     DynamicRegExpr(const HighlightingContextData::Rule::RegExpr &data);
 
 protected:
-    MatchResult doMatch(QStringView text, int offset, const QStringList &) const override;
+    MatchResult doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const override;
 
 private:
     void resolve();
@@ -320,7 +331,7 @@ public:
     StringDetect(const HighlightingContextData::Rule::StringDetect &data);
 
 protected:
-    MatchResult doMatch(QStringView text, int offset, const QStringList &) const override;
+    MatchResult doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const override;
 
 private:
     QString m_string;
@@ -333,7 +344,7 @@ public:
     DynamicStringDetect(const HighlightingContextData::Rule::StringDetect &data);
 
 protected:
-    MatchResult doMatch(QStringView text, int offset, const QStringList &) const override;
+    MatchResult doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const override;
 
 private:
     QString m_string;
@@ -346,7 +357,7 @@ public:
     WordDetect(DefinitionData &def, const HighlightingContextData::Rule::WordDetect &data);
 
 protected:
-    MatchResult doMatch(QStringView text, int offset, const QStringList &) const override;
+    MatchResult doMatch(QStringView text, int offset, const QStringList &, DynamicRegexpCache &) const override;
 
 private:
     WordDelimiters m_wordDelimiters;
diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/state.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/state.cpp
index fc44a6dbd4c..dca58b35b7c 100644
--- a/src/libs/3rdparty/syntax-highlighting/src/lib/state.cpp
+++ b/src/libs/3rdparty/syntax-highlighting/src/lib/state.cpp
@@ -1,4 +1,4 @@
-/*
+/*
     SPDX-FileCopyrightText: 2016 Volker Krause 
     SPDX-FileCopyrightText: 2018 Christoph Cullmann 
 
@@ -14,36 +14,23 @@
 
 using namespace KSyntaxHighlighting;
 
-StateData *StateData::get(State &state)
+StateData *StateData::reset(State &state)
 {
-    // create state data on demand, to make default state construction cheap
-    if (!state.d) {
-        state.d = new StateData();
-    } else {
-        state.d.detach();
-    }
+    auto *p = new StateData();
+    state.d.reset(p);
+    return p;
+}
+
+StateData *StateData::detach(State &state)
+{
+    state.d.detach();
     return state.d.data();
 }
 
-bool StateData::isEmpty() const
-{
-    return m_contextStack.isEmpty();
-}
-
-void StateData::clear()
-{
-    m_contextStack.clear();
-}
-
-int StateData::size() const
-{
-    return m_contextStack.size();
-}
-
-void StateData::push(Context *context, const QStringList &captures)
+void StateData::push(Context *context, QStringList &&captures)
 {
     Q_ASSERT(context);
-    m_contextStack.push_back(qMakePair(context, captures));
+    m_contextStack.push_back(StackValue{context, std::move(captures)});
 }
 
 bool StateData::pop(int popCount)
@@ -54,42 +41,23 @@ bool StateData::pop(int popCount)
     }
 
     // keep the initial context alive in any case
-    Q_ASSERT(!isEmpty());
-    const bool initialContextSurvived = m_contextStack.size() > popCount;
+    Q_ASSERT(!m_contextStack.empty());
+    const bool initialContextSurvived = int(m_contextStack.size()) > popCount;
     m_contextStack.resize(std::max(1, int(m_contextStack.size()) - popCount));
     return initialContextSurvived;
 }
 
-Context *StateData::topContext() const
-{
-    Q_ASSERT(!isEmpty());
-    return m_contextStack.last().first;
-}
+State::State() = default;
 
-const QStringList &StateData::topCaptures() const
-{
-    Q_ASSERT(!isEmpty());
-    return m_contextStack.last().second;
-}
+State::State(State &&other) noexcept = default;
 
-State::State()
-{
-}
+State::State(const State &other) noexcept = default;
 
-State::State(const State &other)
-    : d(other.d)
-{
-}
+State::~State() = default;
 
-State::~State()
-{
-}
+State &State::operator=(State &&other) noexcept = default;
 
-State &State::operator=(const State &other)
-{
-    d = other.d;
-    return *this;
-}
+State &State::operator=(const State &other) noexcept = default;
 
 bool State::operator==(const State &other) const
 {
@@ -104,8 +72,13 @@ bool State::operator!=(const State &other) const
 
 bool State::indentationBasedFoldingEnabled() const
 {
-    if (!d || d->m_contextStack.isEmpty()) {
+    if (!d || d->m_contextStack.empty()) {
         return false;
     }
-    return d->m_contextStack.last().first->indentationBasedFoldingEnabled();
+    return d->m_contextStack.back().context->indentationBasedFoldingEnabled();
+}
+
+std::size_t KSyntaxHighlighting::qHash(const State &state, std::size_t seed)
+{
+    return state.d ? qHashMulti(seed, *state.d) : 0;
 }
diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/state.h b/src/libs/3rdparty/syntax-highlighting/src/lib/state.h
index 726ff32a884..3003a9b7cbf 100644
--- a/src/libs/3rdparty/syntax-highlighting/src/lib/state.h
+++ b/src/libs/3rdparty/syntax-highlighting/src/lib/state.h
@@ -10,11 +10,15 @@
 #include "ksyntaxhighlighting_export.h"
 
 #include 
+#include 
 
 namespace KSyntaxHighlighting
 {
+class State;
 class StateData;
 
+KSYNTAXHIGHLIGHTING_EXPORT std::size_t qHash(const State &state, std::size_t seed = 0);
+
 /** Opaque handle to the state of the highlighting engine.
  *  This needs to be fed into AbstractHighlighter for every line of text
  *  and allows concrete highlighter implementations to store state per
@@ -29,9 +33,11 @@ public:
      *  in a document.
      */
     State();
-    State(const State &other);
+    State(State &&other) noexcept;
+    State(const State &other) noexcept;
     ~State();
-    State &operator=(const State &rhs);
+    State &operator=(State &&rhs) noexcept;
+    State &operator=(const State &rhs) noexcept;
 
     /** Compares two states for equality.
      *  For two equal states and identical text input, AbstractHighlighter
@@ -56,13 +62,13 @@ public:
 
 private:
     friend class StateData;
+    KSYNTAXHIGHLIGHTING_EXPORT friend std::size_t qHash(const State &, std::size_t);
     QExplicitlySharedDataPointer d;
 };
-
 }
 
 QT_BEGIN_NAMESPACE
-Q_DECLARE_TYPEINFO(KSyntaxHighlighting::State, Q_MOVABLE_TYPE);
+Q_DECLARE_TYPEINFO(KSyntaxHighlighting::State, Q_RELOCATABLE_TYPE);
 QT_END_NAMESPACE
 
 #endif // KSYNTAXHIGHLIGHTING_STATE_H
diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/state_p.h b/src/libs/3rdparty/syntax-highlighting/src/lib/state_p.h
index 0248330304f..4aee1416818 100644
--- a/src/libs/3rdparty/syntax-highlighting/src/lib/state_p.h
+++ b/src/libs/3rdparty/syntax-highlighting/src/lib/state_p.h
@@ -8,8 +8,10 @@
 #ifndef KSYNTAXHIGHLIGHTING_STATE_P_H
 #define KSYNTAXHIGHLIGHTING_STATE_P_H
 
+#include 
+
 #include 
-#include 
+#include 
 
 #include "definitionref_p.h"
 
@@ -21,15 +23,25 @@ class StateData : public QSharedData
 {
     friend class State;
     friend class AbstractHighlighter;
+    friend std::size_t qHash(const StateData &, std::size_t);
 
 public:
     StateData() = default;
-    static StateData *get(State &state);
 
-    bool isEmpty() const;
-    void clear();
-    int size() const;
-    void push(Context *context, const QStringList &captures);
+    static StateData *reset(State &state);
+    static StateData *detach(State &state);
+
+    static StateData *get(const State &state)
+    {
+        return state.d.data();
+    }
+
+    int size() const
+    {
+        return m_contextStack.size();
+    }
+
+    void push(Context *context, QStringList &&captures);
 
     /**
      * Pop the number of elements given from the top of the current stack.
@@ -39,8 +51,25 @@ public:
      */
     bool pop(int popCount);
 
-    Context *topContext() const;
-    const QStringList &topCaptures() const;
+    Context *topContext() const
+    {
+        return m_contextStack.back().context;
+    }
+
+    const QStringList &topCaptures() const
+    {
+        return m_contextStack.back().captures;
+    }
+
+    struct StackValue {
+        Context *context;
+        QStringList captures;
+
+        bool operator==(const StackValue &other) const
+        {
+            return context == other.context && captures == other.captures;
+        }
+    };
 
 private:
     /**
@@ -51,9 +80,18 @@ private:
     /**
      * the context stack combines the active context + valid captures
      */
-    QVector> m_contextStack;
+    std::vector m_contextStack;
 };
 
+inline std::size_t qHash(const StateData::StackValue &stackValue, std::size_t seed = 0)
+{
+    return qHashMulti(seed, stackValue.context, stackValue.captures);
+}
+
+inline std::size_t qHash(const StateData &k, std::size_t seed = 0)
+{
+    return qHashMulti(seed, k.m_defId, qHashRange(k.m_contextStack.begin(), k.m_contextStack.end(), seed));
+}
 }
 
 #endif
diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/syntaxhighlighter.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/syntaxhighlighter.cpp
index 4754da22c61..70b26a79bf8 100644
--- a/src/libs/3rdparty/syntax-highlighting/src/lib/syntaxhighlighter.cpp
+++ b/src/libs/3rdparty/syntax-highlighting/src/lib/syntaxhighlighter.cpp
@@ -7,10 +7,13 @@
 #include "syntaxhighlighter.h"
 #include "abstracthighlighter_p.h"
 #include "definition.h"
+#include "definition_p.h"
 #include "foldingregion.h"
 #include "format.h"
+#include "format_p.h"
 #include "state.h"
 #include "theme.h"
+#include "themedata_p.h"
 
 Q_DECLARE_METATYPE(QTextBlock)
 
@@ -22,14 +25,26 @@ class TextBlockUserData : public QTextBlockUserData
 {
 public:
     State state;
-    QVector foldingRegions;
+    QList foldingRegions;
 };
 
 class SyntaxHighlighterPrivate : public AbstractHighlighterPrivate
 {
 public:
     static FoldingRegion foldingRegion(const QTextBlock &startBlock);
-    QVector foldingRegions;
+    void initTextFormat(QTextCharFormat &tf, const Format &format);
+    void computeTextFormats();
+
+    struct TextFormat {
+        QTextCharFormat tf;
+        /**
+         * id to check that the format belongs to the definition
+         */
+        std::intptr_t ptrId;
+    };
+
+    QList foldingRegions;
+    std::vector tfs;
 };
 
 }
@@ -48,6 +63,52 @@ FoldingRegion SyntaxHighlighterPrivate::foldingRegion(const QTextBlock &startBlo
     return FoldingRegion();
 }
 
+void SyntaxHighlighterPrivate::initTextFormat(QTextCharFormat &tf, const Format &format)
+{
+    // always set the foreground color to avoid palette issues
+    tf.setForeground(format.textColor(m_theme));
+
+    if (format.hasBackgroundColor(m_theme)) {
+        tf.setBackground(format.backgroundColor(m_theme));
+    }
+    if (format.isBold(m_theme)) {
+        tf.setFontWeight(QFont::Bold);
+    }
+    if (format.isItalic(m_theme)) {
+        tf.setFontItalic(true);
+    }
+    if (format.isUnderline(m_theme)) {
+        tf.setFontUnderline(true);
+    }
+    if (format.isStrikeThrough(m_theme)) {
+        tf.setFontStrikeOut(true);
+    }
+}
+
+void SyntaxHighlighterPrivate::computeTextFormats()
+{
+    auto definitions = m_definition.includedDefinitions();
+    definitions.append(m_definition);
+
+    int maxId = 0;
+    for (const auto &definition : std::as_const(definitions)) {
+        for (const auto &format : std::as_const(DefinitionData::get(definition)->formats)) {
+            maxId = qMax(maxId, format.id());
+        }
+    }
+    tfs.clear();
+    tfs.resize(maxId + 1);
+
+    // initialize tfs
+    for (const auto &definition : std::as_const(definitions)) {
+        for (const auto &format : std::as_const(DefinitionData::get(definition)->formats)) {
+            auto &tf = tfs[format.id()];
+            tf.ptrId = FormatPrivate::ptrId(format);
+            initTextFormat(tf.tf, format);
+        }
+    }
+}
+
 SyntaxHighlighter::SyntaxHighlighter(QObject *parent)
     : QSyntaxHighlighter(parent)
     , AbstractHighlighter(new SyntaxHighlighterPrivate)
@@ -68,13 +129,27 @@ SyntaxHighlighter::~SyntaxHighlighter()
 
 void SyntaxHighlighter::setDefinition(const Definition &def)
 {
-    const auto needsRehighlight = definition() != def;
-    AbstractHighlighter::setDefinition(def);
+    Q_D(SyntaxHighlighter);
+
+    const auto needsRehighlight = d->m_definition != def;
+    if (DefinitionData::get(d->m_definition) != DefinitionData::get(def)) {
+        d->m_definition = def;
+        d->tfs.clear();
+    }
     if (needsRehighlight) {
         rehighlight();
     }
 }
 
+void SyntaxHighlighter::setTheme(const Theme &theme)
+{
+    Q_D(SyntaxHighlighter);
+    if (ThemeData::get(d->m_theme) != ThemeData::get(theme)) {
+        d->m_theme = theme;
+        d->tfs.clear();
+    }
+}
+
 bool SyntaxHighlighter::startsFoldingRegion(const QTextBlock &startBlock) const
 {
     return SyntaxHighlighterPrivate::foldingRegion(startBlock).type() == FoldingRegion::Begin;
@@ -92,13 +167,13 @@ QTextBlock SyntaxHighlighter::findFoldingRegionEnd(const QTextBlock &startBlock)
         if (!data) {
             continue;
         }
-        for (auto it = data->foldingRegions.constBegin(); it != data->foldingRegions.constEnd(); ++it) {
-            if ((*it).id() != region.id()) {
+        for (const auto &foldingRegion : std::as_const(data->foldingRegions)) {
+            if (foldingRegion.id() != region.id()) {
                 continue;
             }
-            if ((*it).type() == FoldingRegion::End) {
+            if (foldingRegion.type() == FoldingRegion::End) {
                 --depth;
-            } else if ((*it).type() == FoldingRegion::Begin) {
+            } else if (foldingRegion.type() == FoldingRegion::Begin) {
                 ++depth;
             }
             if (depth == 0) {
@@ -114,30 +189,31 @@ void SyntaxHighlighter::highlightBlock(const QString &text)
 {
     Q_D(SyntaxHighlighter);
 
-    State state;
+    static const State emptyState;
+    const State *previousState = &emptyState;
     if (currentBlock().position() > 0) {
         const auto prevBlock = currentBlock().previous();
         const auto prevData = dynamic_cast(prevBlock.userData());
         if (prevData) {
-            state = prevData->state;
+            previousState = &prevData->state;
         }
     }
     d->foldingRegions.clear();
-    state = highlightLine(text, state);
+    auto newState = highlightLine(text, *previousState);
 
     auto data = dynamic_cast(currentBlockUserData());
     if (!data) { // first time we highlight this
         data = new TextBlockUserData;
-        data->state = state;
+        data->state = std::move(newState);
         data->foldingRegions = d->foldingRegions;
         setCurrentBlockUserData(data);
         return;
     }
 
-    if (data->state == state && data->foldingRegions == d->foldingRegions) { // we ended up in the same state, so we are done here
+    if (data->state == newState && data->foldingRegions == d->foldingRegions) { // we ended up in the same state, so we are done here
         return;
     }
-    data->state = state;
+    data->state = std::move(newState);
     data->foldingRegions = d->foldingRegions;
 
     const auto nextBlock = currentBlock().next();
@@ -146,40 +222,35 @@ void SyntaxHighlighter::highlightBlock(const QString &text)
     }
 }
 
-void SyntaxHighlighter::applyFormat(int offset, int length, const KSyntaxHighlighting::Format &format)
+void SyntaxHighlighter::applyFormat(int offset, int length, const Format &format)
 {
     if (length == 0) {
         return;
     }
 
-    QTextCharFormat tf;
-    // always set the foreground color to avoid palette issues
-    tf.setForeground(format.textColor(theme()));
+    Q_D(SyntaxHighlighter);
 
-    if (format.hasBackgroundColor(theme())) {
-        tf.setBackground(format.backgroundColor(theme()));
-    }
-    if (format.isBold(theme())) {
-        tf.setFontWeight(QFont::Bold);
-    }
-    if (format.isItalic(theme())) {
-        tf.setFontItalic(true);
-    }
-    if (format.isUnderline(theme())) {
-        tf.setFontUnderline(true);
-    }
-    if (format.isStrikeThrough(theme())) {
-        tf.setFontStrikeOut(true);
+    if (Q_UNLIKELY(d->tfs.empty())) {
+        d->computeTextFormats();
     }
 
-    QSyntaxHighlighter::setFormat(offset, length, tf);
+    const auto id = static_cast(format.id());
+    // This doesn't happen when format comes from the definition.
+    // But as the user can override the function to pass any format, this is a possible scenario.
+    if (id < d->tfs.size() && d->tfs[id].ptrId == FormatPrivate::ptrId(format)) {
+        QSyntaxHighlighter::setFormat(offset, length, d->tfs[id].tf);
+    } else {
+        QTextCharFormat tf;
+        d->initTextFormat(tf, format);
+        QSyntaxHighlighter::setFormat(offset, length, tf);
+    }
 }
 
 void SyntaxHighlighter::applyFolding(int offset, int length, FoldingRegion region)
 {
     Q_UNUSED(offset);
     Q_UNUSED(length);
-    [[maybe_unused]] Q_D(SyntaxHighlighter);
+    Q_D(SyntaxHighlighter);
 
     if (region.type() == FoldingRegion::Begin) {
         d->foldingRegions.push_back(region);
@@ -196,3 +267,5 @@ void SyntaxHighlighter::applyFolding(int offset, int length, FoldingRegion regio
         d->foldingRegions.push_back(region);
     }
 }
+
+#include "moc_syntaxhighlighter.cpp"
diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/syntaxhighlighter.h b/src/libs/3rdparty/syntax-highlighting/src/lib/syntaxhighlighter.h
index a57455d9baa..c19cb798dd1 100644
--- a/src/libs/3rdparty/syntax-highlighting/src/lib/syntaxhighlighter.h
+++ b/src/libs/3rdparty/syntax-highlighting/src/lib/syntaxhighlighter.h
@@ -32,6 +32,7 @@ public:
     ~SyntaxHighlighter() override;
 
     void setDefinition(const Definition &def) override;
+    void setTheme(const Theme &theme) override;
 
     /** Returns whether there is a folding region beginning at @p startBlock.
      *  This only considers syntax-based folding regions,
diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/theme.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/theme.cpp
index b23852f337a..c54bb38b180 100644
--- a/src/libs/3rdparty/syntax-highlighting/src/lib/theme.cpp
+++ b/src/libs/3rdparty/syntax-highlighting/src/lib/theme.cpp
@@ -103,3 +103,5 @@ QRgb Theme::editorColor(EditorColorRole role) const
 {
     return m_data->editorColor(role);
 }
+
+#include "moc_theme.cpp"
diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/theme.h b/src/libs/3rdparty/syntax-highlighting/src/lib/theme.h
index 37f9de1694b..c3fb0e6b6e6 100644
--- a/src/libs/3rdparty/syntax-highlighting/src/lib/theme.h
+++ b/src/libs/3rdparty/syntax-highlighting/src/lib/theme.h
@@ -67,11 +67,6 @@ class KSYNTAXHIGHLIGHTING_EXPORT Theme
     Q_PROPERTY(QString name READ name)
     Q_PROPERTY(QString translatedName READ translatedName)
 public:
-    // TODO KF6:
-    // - make TextStyle an enum class
-    // - move out of Theme into KSyntaxHighlighting
-    // - do the same for EditorColorRole
-
     /**
      * Default styles that can be referenced from syntax definition XML files.
      * Make sure to choose readable colors with good contrast especially in
@@ -342,7 +337,7 @@ private:
     /**
      * Constructor taking a shared ThemeData instance.
      */
-    explicit Theme(ThemeData *data);
+    KSYNTAXHIGHLIGHTING_NO_EXPORT explicit Theme(ThemeData *data);
     friend class RepositoryPrivate;
     friend class ThemeData;
 
@@ -356,7 +351,7 @@ private:
 }
 
 QT_BEGIN_NAMESPACE
-Q_DECLARE_TYPEINFO(KSyntaxHighlighting::Theme, Q_MOVABLE_TYPE);
+Q_DECLARE_TYPEINFO(KSyntaxHighlighting::Theme, Q_RELOCATABLE_TYPE);
 QT_END_NAMESPACE
 
 #endif // KSYNTAXHIGHLIGHTING_THEME_H
diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/themedata.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/themedata.cpp
index 4f77dcc494f..9d42d03db03 100644
--- a/src/libs/3rdparty/syntax-highlighting/src/lib/themedata.cpp
+++ b/src/libs/3rdparty/syntax-highlighting/src/lib/themedata.cpp
@@ -18,11 +18,6 @@
 
 using namespace KSyntaxHighlighting;
 
-ThemeData *ThemeData::get(const Theme &theme)
-{
-    return theme.m_data.data();
-}
-
 ThemeData::ThemeData()
 {
     memset(m_editorColors, 0, sizeof(m_editorColors));
@@ -87,9 +82,18 @@ bool ThemeData::load(const QString &filePath)
         return false;
     }
     const QByteArray jsonData = loadFile.readAll();
+    // look for metadata object
+    int metaDataStart = jsonData.indexOf("\"metadata\"");
+    int start = jsonData.indexOf('{', metaDataStart);
+    int end = jsonData.indexOf("}", metaDataStart);
+    if (start < 0 || end < 0) {
+        qCWarning(Log) << "Failed to parse theme file" << filePath << ":"
+                       << "no metadata object found";
+        return false;
+    }
 
     QJsonParseError parseError;
-    QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData, &parseError);
+    QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData.mid(start, (end + 1) - start), &parseError);
     if (parseError.error != QJsonParseError::NoError) {
         qCWarning(Log) << "Failed to parse theme file" << filePath << ":" << parseError.errorString();
         return false;
@@ -97,13 +101,34 @@ bool ThemeData::load(const QString &filePath)
 
     m_filePath = filePath;
 
-    QJsonObject obj = jsonDoc.object();
-
     // read metadata
-    const QJsonObject metadata = obj.value(QLatin1String("metadata")).toObject();
+    QJsonObject metadata = jsonDoc.object();
     m_name = metadata.value(QLatin1String("name")).toString();
     m_revision = metadata.value(QLatin1String("revision")).toInt();
+    return true;
+}
 
+void ThemeData::loadComplete()
+{
+    if (m_completelyLoaded) {
+        return;
+    }
+    m_completelyLoaded = true;
+
+    QFile loadFile(m_filePath);
+    if (!loadFile.open(QIODevice::ReadOnly)) {
+        return;
+    }
+    const QByteArray jsonData = loadFile.readAll();
+
+    QJsonParseError parseError;
+    QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData, &parseError);
+    if (parseError.error != QJsonParseError::NoError) {
+        qCWarning(Log) << "Failed to parse theme file" << m_filePath << ":" << parseError.errorString();
+        return;
+    }
+
+    QJsonObject obj = jsonDoc.object();
     // read text styles
     const auto metaEnumStyle = QMetaEnum::fromType();
     const QJsonObject textStyles = obj.value(QLatin1String("text-styles")).toObject();
@@ -162,7 +187,7 @@ bool ThemeData::load(const QString &filePath)
         }
     }
 
-    return true;
+    return;
 }
 
 QString ThemeData::name() const
@@ -187,6 +212,9 @@ QString ThemeData::filePath() const
 
 TextStyleData ThemeData::textStyle(Theme::TextStyle style) const
 {
+    if (!m_completelyLoaded) {
+        const_cast(this)->loadComplete();
+    }
     return m_textStyles[style];
 }
 
@@ -232,12 +260,18 @@ bool ThemeData::isStrikeThrough(Theme::TextStyle style) const
 
 QRgb ThemeData::editorColor(Theme::EditorColorRole role) const
 {
+    if (!m_completelyLoaded) {
+        const_cast(this)->loadComplete();
+    }
     Q_ASSERT(static_cast(role) >= 0 && static_cast(role) <= static_cast(Theme::TemplateReadOnlyPlaceholder));
     return m_editorColors[role];
 }
 
 TextStyleData ThemeData::textStyleOverride(const QString &definitionName, const QString &attributeName) const
 {
+    if (!m_completelyLoaded) {
+        const_cast(this)->loadComplete();
+    }
     auto it = m_textStyleOverrides.find(definitionName);
     if (it != m_textStyleOverrides.end()) {
         return it->value(attributeName);
diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/themedata_p.h b/src/libs/3rdparty/syntax-highlighting/src/lib/themedata_p.h
index 4ce87f0aaf9..6ee772f172c 100644
--- a/src/libs/3rdparty/syntax-highlighting/src/lib/themedata_p.h
+++ b/src/libs/3rdparty/syntax-highlighting/src/lib/themedata_p.h
@@ -24,7 +24,10 @@ namespace KSyntaxHighlighting
 class ThemeData : public QSharedData
 {
 public:
-    static ThemeData *get(const Theme &theme);
+    static ThemeData *get(const Theme &theme)
+    {
+        return theme.m_data.data();
+    }
 
     /**
      * Default constructor, creating an uninitialized ThemeData instance.
@@ -37,6 +40,8 @@ public:
      */
     bool load(const QString &filePath);
 
+    void loadComplete();
+
     /**
      * Returns the unique name of this Theme.
      */
@@ -140,6 +145,8 @@ private:
     //! on disk (in a read-only or a writeable location).
     QString m_filePath;
 
+    bool m_completelyLoaded = false;
+
     //! TextStyles
     std::vector m_textStyles;
 
@@ -154,7 +161,7 @@ private:
 }
 
 QT_BEGIN_NAMESPACE
-Q_DECLARE_TYPEINFO(KSyntaxHighlighting::TextStyleData, Q_MOVABLE_TYPE);
+Q_DECLARE_TYPEINFO(KSyntaxHighlighting::TextStyleData, Q_RELOCATABLE_TYPE);
 QT_END_NAMESPACE
 
 #endif // KSYNTAXHIGHLIGHTING_THEMEDATA_P_H
diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/worddelimiters.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/worddelimiters.cpp
index c5401a57cc9..ce55cd4b293 100644
--- a/src/libs/3rdparty/syntax-highlighting/src/lib/worddelimiters.cpp
+++ b/src/libs/3rdparty/syntax-highlighting/src/lib/worddelimiters.cpp
@@ -16,6 +16,12 @@ WordDelimiters::WordDelimiters()
     }
 }
 
+WordDelimiters::WordDelimiters(QStringView str)
+    : asciiDelimiters{}
+{
+    append(str);
+}
+
 bool WordDelimiters::contains(QChar c) const
 {
     if (c.unicode() < 128) {
diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/worddelimiters_p.h b/src/libs/3rdparty/syntax-highlighting/src/lib/worddelimiters_p.h
index ccad679a4ef..c23670d6344 100644
--- a/src/libs/3rdparty/syntax-highlighting/src/lib/worddelimiters_p.h
+++ b/src/libs/3rdparty/syntax-highlighting/src/lib/worddelimiters_p.h
@@ -26,6 +26,11 @@ class WordDelimiters
 public:
     WordDelimiters();
 
+    /**
+     * Initialize with a default delimiters.
+     */
+    explicit WordDelimiters(QStringView str);
+
     /**
      * Returns @c true if @p c is a word delimiter; otherwise returns @c false.
      */
diff --git a/src/libs/3rdparty/syntax-highlighting/src/quick/CMakeLists.txt b/src/libs/3rdparty/syntax-highlighting/src/quick/CMakeLists.txt
index 9277c2aee7d..1fb92ad2201 100644
--- a/src/libs/3rdparty/syntax-highlighting/src/quick/CMakeLists.txt
+++ b/src/libs/3rdparty/syntax-highlighting/src/quick/CMakeLists.txt
@@ -7,11 +7,10 @@ ecm_add_qml_module(kquicksyntaxhighlightingplugin URI "org.kde.syntaxhighlightin
 target_sources(kquicksyntaxhighlightingplugin PRIVATE
     kquicksyntaxhighlightingplugin.cpp
     kquicksyntaxhighlighter.cpp
-    repositorywrapper.cpp
 )
 target_link_libraries(kquicksyntaxhighlightingplugin PRIVATE
-    KF5SyntaxHighlighting
-    Qt${QT_MAJOR_VERSION}::Quick
+    KF6SyntaxHighlighting
+    Qt6::Quick
 )
 
 ecm_finalize_qml_module(kquicksyntaxhighlightingplugin DESTINATION ${KDE_INSTALL_QMLDIR})
diff --git a/src/libs/3rdparty/syntax-highlighting/src/quick/kquicksyntaxhighlighter.cpp b/src/libs/3rdparty/syntax-highlighting/src/quick/kquicksyntaxhighlighter.cpp
index eb795b1468e..19cfbacf58c 100644
--- a/src/libs/3rdparty/syntax-highlighting/src/quick/kquicksyntaxhighlighter.cpp
+++ b/src/libs/3rdparty/syntax-highlighting/src/quick/kquicksyntaxhighlighter.cpp
@@ -49,7 +49,7 @@ QVariant KQuickSyntaxHighlighter::definition() const
 void KQuickSyntaxHighlighter::setDefinition(const QVariant &definition)
 {
     Definition def;
-    if (definition.type() == QVariant::String) {
+    if (definition.userType() == QMetaType::QString) {
         def = unwrappedRepository()->definitionForName(definition.toString());
     } else {
         def = definition.value();
@@ -73,9 +73,9 @@ QVariant KQuickSyntaxHighlighter::theme() const
 void KQuickSyntaxHighlighter::setTheme(const QVariant &theme)
 {
     Theme t;
-    if (theme.type() == QVariant::String) {
+    if (theme.userType() == QMetaType::QString) {
         t = unwrappedRepository()->theme(theme.toString());
-    } else if (theme.type() == QVariant::Int) {
+    } else if (theme.userType() == QMetaType::Int) {
         t = unwrappedRepository()->defaultTheme(static_cast(theme.toInt()));
     } else {
         t = theme.value();
@@ -89,12 +89,12 @@ void KQuickSyntaxHighlighter::setTheme(const QVariant &theme)
     }
 }
 
-RepositoryWrapper *KQuickSyntaxHighlighter::repository() const
+Repository *KQuickSyntaxHighlighter::repository() const
 {
     return m_repository;
 }
 
-void KQuickSyntaxHighlighter::setRepository(RepositoryWrapper *repository)
+void KQuickSyntaxHighlighter::setRepository(Repository *repository)
 {
     if (m_repository == repository) {
         return;
@@ -106,7 +106,9 @@ void KQuickSyntaxHighlighter::setRepository(RepositoryWrapper *repository)
 Repository *KQuickSyntaxHighlighter::unwrappedRepository() const
 {
     if (m_repository) {
-        return m_repository->m_repository;
+        return m_repository;
     }
     return defaultRepository();
 }
+
+#include "moc_kquicksyntaxhighlighter.cpp"
diff --git a/src/libs/3rdparty/syntax-highlighting/src/quick/kquicksyntaxhighlighter.h b/src/libs/3rdparty/syntax-highlighting/src/quick/kquicksyntaxhighlighter.h
index 211f80d37f5..b45c26339f2 100644
--- a/src/libs/3rdparty/syntax-highlighting/src/quick/kquicksyntaxhighlighter.h
+++ b/src/libs/3rdparty/syntax-highlighting/src/quick/kquicksyntaxhighlighter.h
@@ -8,8 +8,6 @@
 #ifndef KQUICKSYNTAXHIGHLIGHTER_H
 #define KQUICKSYNTAXHIGHLIGHTER_H
 
-#include "repositorywrapper.h"
-
 #include 
 #include 
 
@@ -29,7 +27,7 @@ class KQuickSyntaxHighlighter : public QObject
     Q_PROPERTY(QObject *textEdit READ textEdit WRITE setTextEdit NOTIFY textEditChanged)
     Q_PROPERTY(QVariant definition READ definition WRITE setDefinition NOTIFY definitionChanged)
     Q_PROPERTY(QVariant theme READ theme WRITE setTheme NOTIFY themeChanged)
-    Q_PROPERTY(RepositoryWrapper *repository READ repository WRITE setRepository NOTIFY repositoryChanged)
+    Q_PROPERTY(KSyntaxHighlighting::Repository *repository READ repository WRITE setRepository NOTIFY repositoryChanged)
 
 public:
     explicit KQuickSyntaxHighlighter(QObject *parent = nullptr);
@@ -44,8 +42,8 @@ public:
     QVariant theme() const;
     void setTheme(const QVariant &theme);
 
-    RepositoryWrapper *repository() const;
-    void setRepository(RepositoryWrapper *repository);
+    KSyntaxHighlighting::Repository *repository() const;
+    void setRepository(KSyntaxHighlighting::Repository *repository);
 
 Q_SIGNALS:
     void textEditChanged() const;
@@ -59,7 +57,7 @@ private:
     QObject *m_textEdit;
     KSyntaxHighlighting::Definition m_definition;
     KSyntaxHighlighting::Theme m_theme;
-    RepositoryWrapper *m_repository = nullptr;
+    KSyntaxHighlighting::Repository *m_repository = nullptr;
     KSyntaxHighlighting::SyntaxHighlighter *m_highlighter = nullptr;
 };
 
diff --git a/src/libs/3rdparty/syntax-highlighting/src/quick/kquicksyntaxhighlightingplugin.cpp b/src/libs/3rdparty/syntax-highlighting/src/quick/kquicksyntaxhighlightingplugin.cpp
index 9aeb503ec5d..5eb06862df8 100644
--- a/src/libs/3rdparty/syntax-highlighting/src/quick/kquicksyntaxhighlightingplugin.cpp
+++ b/src/libs/3rdparty/syntax-highlighting/src/quick/kquicksyntaxhighlightingplugin.cpp
@@ -7,7 +7,6 @@
 
 #include "kquicksyntaxhighlightingplugin.h"
 #include "kquicksyntaxhighlighter.h"
-#include "repositorywrapper.h"
 
 #include 
 #include 
@@ -30,17 +29,18 @@ void KQuickSyntaxHighlightingPlugin::registerTypes(const char *uri)
 {
     Q_ASSERT(QLatin1String(uri) == QLatin1String("org.kde.syntaxhighlighting"));
     qRegisterMetaType();
-    qRegisterMetaType>();
+    qRegisterMetaType>();
     qRegisterMetaType();
-    qRegisterMetaType>();
+    qRegisterMetaType>();
     qmlRegisterType(uri, 1, 0, "SyntaxHighlighter");
-    qmlRegisterUncreatableType(uri, 1, 0, "Definition", {});
-    qmlRegisterUncreatableType(uri, 1, 0, "Theme", {});
-    qmlRegisterSingletonType(uri, 1, 0, "Repository", [](auto engine, auto scriptEngine) {
+    qmlRegisterUncreatableMetaObject(Definition::staticMetaObject, uri, 1, 0, "Definition", {});
+    qmlRegisterUncreatableMetaObject(Theme::staticMetaObject, uri, 1, 0, "Theme", {});
+    qmlRegisterSingletonType(uri, 1, 0, "Repository", [](auto engine, auto scriptEngine) {
         (void)engine;
-        (void)scriptEngine;
-        auto repo = new RepositoryWrapper;
-        repo->m_repository = defaultRepository();
-        return repo;
+        auto repo = defaultRepository();
+        scriptEngine->setObjectOwnership(repo, QJSEngine::CppOwnership);
+        return defaultRepository();
     });
 }
+
+#include "moc_kquicksyntaxhighlightingplugin.cpp"
diff --git a/src/libs/3rdparty/syntax-highlighting/src/quick/repositorywrapper.cpp b/src/libs/3rdparty/syntax-highlighting/src/quick/repositorywrapper.cpp
deleted file mode 100644
index 733c799ed13..00000000000
--- a/src/libs/3rdparty/syntax-highlighting/src/quick/repositorywrapper.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
-    SPDX-FileCopyrightText: 2021 Volker Krause 
-
-    SPDX-License-Identifier: MIT
-*/
-
-#include "repositorywrapper.h"
-
-#include 
-#include 
-#include 
-
-using namespace KSyntaxHighlighting;
-
-RepositoryWrapper::RepositoryWrapper(QObject *parent)
-    : QObject(parent)
-{
-}
-
-Definition RepositoryWrapper::definitionForName(const QString &defName) const
-{
-    return m_repository->definitionForName(defName);
-}
-
-Definition RepositoryWrapper::definitionForFileName(const QString &fileName) const
-{
-    return m_repository->definitionForFileName(fileName);
-}
-
-QVector RepositoryWrapper::definitionsForFileName(const QString &fileName) const
-{
-    return m_repository->definitionsForFileName(fileName);
-}
-
-Definition RepositoryWrapper::definitionForMimeType(const QString &mimeType) const
-{
-    return m_repository->definitionForMimeType(mimeType);
-}
-
-QVector RepositoryWrapper::definitionsForMimeType(const QString &mimeType) const
-{
-    return m_repository->definitionsForMimeType(mimeType);
-}
-
-QVector RepositoryWrapper::definitions() const
-{
-    return m_repository->definitions();
-}
-
-QVector RepositoryWrapper::themes() const
-{
-    return m_repository->themes();
-}
-
-Theme RepositoryWrapper::theme(const QString &themeName) const
-{
-    return m_repository->theme(themeName);
-}
-
-Theme RepositoryWrapper::defaultTheme(DefaultTheme t) const
-{
-    return m_repository->defaultTheme(static_cast(t));
-}
-
-#include "moc_repositorywrapper.cpp"
diff --git a/src/libs/3rdparty/syntax-highlighting/src/quick/repositorywrapper.h b/src/libs/3rdparty/syntax-highlighting/src/quick/repositorywrapper.h
deleted file mode 100644
index d4fb8d251cc..00000000000
--- a/src/libs/3rdparty/syntax-highlighting/src/quick/repositorywrapper.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
-    SPDX-FileCopyrightText: 2021 Volker Krause 
-
-    SPDX-License-Identifier: MIT
-*/
-
-#ifndef REPOSITORYWRAPPER_H
-#define REPOSITORYWRAPPER_H
-
-#include 
-
-namespace KSyntaxHighlighting
-{
-class Definition;
-class Repository;
-class Theme;
-}
-
-// TODO KF6: merge this into KSyntaxHighlighting::Repository
-class RepositoryWrapper : public QObject
-{
-    Q_OBJECT
-    // TODO KF6: NOTIFY on reload
-    Q_PROPERTY(QVector definitions READ definitions CONSTANT)
-    Q_PROPERTY(QVector themes READ themes CONSTANT)
-public:
-    explicit RepositoryWrapper(QObject *parent = nullptr);
-
-    Q_INVOKABLE KSyntaxHighlighting::Definition definitionForName(const QString &defName) const;
-    Q_INVOKABLE KSyntaxHighlighting::Definition definitionForFileName(const QString &fileName) const;
-    Q_INVOKABLE QVector definitionsForFileName(const QString &fileName) const;
-    Q_INVOKABLE KSyntaxHighlighting::Definition definitionForMimeType(const QString &mimeType) const;
-    Q_INVOKABLE QVector definitionsForMimeType(const QString &mimeType) const;
-    QVector definitions() const;
-
-    QVector themes() const;
-    Q_INVOKABLE KSyntaxHighlighting::Theme theme(const QString &themeName) const;
-    enum DefaultTheme { LightTheme, DarkTheme };
-    Q_ENUM(DefaultTheme)
-    Q_INVOKABLE KSyntaxHighlighting::Theme defaultTheme(DefaultTheme t = LightTheme) const;
-
-    KSyntaxHighlighting::Repository *m_repository = nullptr;
-};
-
-#endif // REPOSITORYWRAPPER_H
diff --git a/src/libs/3rdparty/syntax-highlighting/syntax-highlighting.qbs b/src/libs/3rdparty/syntax-highlighting/syntax-highlighting.qbs
index 2df844c71cd..b0495897677 100644
--- a/src/libs/3rdparty/syntax-highlighting/syntax-highlighting.qbs
+++ b/src/libs/3rdparty/syntax-highlighting/syntax-highlighting.qbs
@@ -25,7 +25,7 @@ Project {
         name: "KSyntaxHighlighting_bundled"
         condition: !qtc.preferSystemSyntaxHighlighting || !Qt.KSyntaxHighlighting.present
 
-        cpp.defines: base.concat("KF5SyntaxHighlighting_EXPORTS")
+        cpp.defines: base.concat("KF6SyntaxHighlighting_EXPORTS")
         cpp.includePaths: [
             product.sourceDirectory + "/src/lib/",
             product.sourceDirectory + "/autogenerated/include/",
@@ -58,6 +58,7 @@ Project {
                 "definitiondownloader.cpp",
                 "definitiondownloader.h",
                 "definitionref_p.h",
+                "dynamicregexpcache_p.h",
                 "foldingregion.cpp",
                 "foldingregion.h",
                 "format.cpp",

From d0ae84539eaf5d3f41c94350b64104219900acbb Mon Sep 17 00:00:00 2001
From: Jarek Kobus 
Date: Thu, 15 Feb 2024 14:56:56 +0100
Subject: [PATCH 15/35] Axivion: Don't leak model on shutdown

Detected by memory analyzer.

Change-Id: I715c604f5769b958ad53da6444fd3763f3bdcc30
Reviewed-by: Christian Stenger 
---
 src/plugins/axivion/axivionoutputpane.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/plugins/axivion/axivionoutputpane.cpp b/src/plugins/axivion/axivionoutputpane.cpp
index 6cdf6121089..9bd50784f3a 100644
--- a/src/plugins/axivion/axivionoutputpane.cpp
+++ b/src/plugins/axivion/axivionoutputpane.cpp
@@ -314,7 +314,7 @@ IssuesWidget::IssuesWidget(QWidget *parent)
     m_issuesView = new BaseTreeView(this);
     m_issuesView->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
     m_issuesView->enableColumnHiding();
-    m_issuesModel = new TreeModel;
+    m_issuesModel = new TreeModel(this);
     m_issuesView->setModel(m_issuesModel);
     auto sb = m_issuesView->verticalScrollBar();
     if (QTC_GUARD(sb)) {
@@ -363,7 +363,7 @@ void IssuesWidget::setTableDto(const Dto::TableInfoDto &dto)
     m_currentTableInfo.emplace(dto);
 
     // update issues table layout - for now just simple approach
-    TreeModel<> *issuesModel = new TreeModel;
+    TreeModel<> *issuesModel = new TreeModel(this);
     QStringList columnHeaders;
     QStringList hiddenColumns;
     for (const Dto::ColumnInfoDto &column : dto.columns) {

From 8ab6b94c480336cc6e2c951b2986f617ca8a5083 Mon Sep 17 00:00:00 2001
From: hjk 
Date: Wed, 14 Feb 2024 08:13:02 +0100
Subject: [PATCH 16/35] Debugger: Move string length annotation to type column

... and make it clear what it is.

Fixes: QTCREATORBUG-30065
Change-Id: Iccbe0f069569ef2682363eb889f34081e2c2b4d7
Reviewed-by: 
Reviewed-by: David Schulz 
---
 src/plugins/debugger/watchhandler.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp
index 841dc4d0156..1c73cf33b58 100644
--- a/src/plugins/debugger/watchhandler.cpp
+++ b/src/plugins/debugger/watchhandler.cpp
@@ -826,8 +826,6 @@ static QString formattedValue(const WatchItem *item)
             v.chop(1);
             v.append("...\"");
         }
-        if (item->valuelen > 0)
-            v += QString(" (%1)").arg(item->valuelen);
         return v;
     }
 
@@ -961,6 +959,8 @@ static QString displayType(const WatchItem *item)
         result += QString(":%1").arg(item->bitsize);
     result.remove('\'');
     result = watchModel(item)->removeNamespaces(result);
+    if (item->valuelen > 0)
+        result = Tr::tr("%1 of length %2").arg(result).arg(item->valuelen);
     return result;
 }
 

From 7b198ea3ce738a65f8385de0fb055cbe56ae2074 Mon Sep 17 00:00:00 2001
From: hjk 
Date: Thu, 15 Feb 2024 18:07:38 +0100
Subject: [PATCH 17/35] Debugger: Select C++ debugger if there is nothing else
 selected

We want one-or-more debuggers enabled. This was accidentally not
done if the python debugger was the last one to unselect.

Change-Id: I1bcdb43a66dc110dc213eba0db079e6d02c00170
Reviewed-by: Jarek Kobus 
---
 src/plugins/debugger/debuggerrunconfigurationaspect.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/plugins/debugger/debuggerrunconfigurationaspect.cpp b/src/plugins/debugger/debuggerrunconfigurationaspect.cpp
index 1b44afd821b..53eaab1df9c 100644
--- a/src/plugins/debugger/debuggerrunconfigurationaspect.cpp
+++ b/src/plugins/debugger/debuggerrunconfigurationaspect.cpp
@@ -128,7 +128,7 @@ DebuggerRunConfigurationAspect::DebuggerRunConfigurationAspect(Target *target)
         if (Utils::allOf({&m_cppAspect, &m_qmlAspect, &m_pythonAspect}, &isDisabled))
             m_cppAspect.setValue(TriState::Default);
     });
-    connect(&m_qmlAspect, &TriStateAspect::changed, this, [this] {
+    connect(&m_pythonAspect, &TriStateAspect::changed, this, [this] {
         if (Utils::allOf({&m_cppAspect, &m_qmlAspect, &m_pythonAspect}, &isDisabled))
             m_cppAspect.setValue(TriState::Default);
     });

From 7201fa0e4d202c94794b4d68629aa113ce8aa769 Mon Sep 17 00:00:00 2001
From: hjk 
Date: Thu, 15 Feb 2024 18:22:53 +0100
Subject: [PATCH 18/35] Debugger: Create more uniform summary for debugger
 selection

Change-Id: I82ddcae84e4ff8d4776aa5fa988bb49b943b8d6f
Reviewed-by: Jarek Kobus 
---
 .../debuggerrunconfigurationaspect.cpp        | 33 ++++++++++---------
 1 file changed, 17 insertions(+), 16 deletions(-)

diff --git a/src/plugins/debugger/debuggerrunconfigurationaspect.cpp b/src/plugins/debugger/debuggerrunconfigurationaspect.cpp
index 53eaab1df9c..cff934e398d 100644
--- a/src/plugins/debugger/debuggerrunconfigurationaspect.cpp
+++ b/src/plugins/debugger/debuggerrunconfigurationaspect.cpp
@@ -53,12 +53,12 @@ DebuggerRunConfigurationAspect::DebuggerRunConfigurationAspect(Target *target)
     setConfigWidgetCreator([this] {
         Layouting::Grid builder;
         builder.addRow({m_cppAspect});
-        builder.addRow({m_pythonAspect});
         auto info = new QLabel(
             Tr::tr("What are the prerequisites?"));
         builder.addRow({m_qmlAspect, info});
+        builder.addRow({m_pythonAspect});
         connect(info, &QLabel::linkActivated, [](const QString &link) {
             Core::HelpManager::showHelpUrl(link);
         });
@@ -76,26 +76,28 @@ DebuggerRunConfigurationAspect::DebuggerRunConfigurationAspect(Target *target)
         builder.attachTo(innerPane);
 
         const auto setSummaryText = [this, details] {
-            QStringList items;
-            if (m_cppAspect() == TriState::Enabled)
-                items.append(Tr::tr("Enable C++ debugger."));
-            else if (m_cppAspect() == TriState::Default)
-                items.append(Tr::tr("Try to determine need for C++ debugger."));
+            const auto describe = [](const TriStateAspect &aspect, const QString &name) {
+                if (aspect() == TriState::Enabled)
+                    return Tr::tr("Enable %1 debugger.").arg(name);
+                if (aspect() == TriState::Disabled)
+                    return Tr::tr("Disable %1 debugger.").arg(name);
+                return Tr::tr("Try to determine need for %1 debugger.").arg(name);
+            };
 
-            if (m_qmlAspect() == TriState::Enabled)
-                items.append(Tr::tr("Enable QML debugger."));
-            else if (m_qmlAspect() == TriState::Default)
-                items.append(Tr::tr("Try to determine need for QML debugger."));
-
-            items.append(m_overrideStartupAspect().isEmpty()
-                             ? Tr::tr("Without additional startup commands.")
-                             : Tr::tr("With additional startup commands."));
-            details->setSummaryText(items.join(" "));
+            details->setSummaryText(QStringList{
+                describe(m_cppAspect, "C++"),
+                describe(m_qmlAspect, "QML"),
+                describe(m_pythonAspect, "Python"),
+                m_overrideStartupAspect().isEmpty()
+                                 ? Tr::tr("No additional startup commands.")
+                                 : Tr::tr("Use additional startup commands.")
+            }.join(" "));
         };
         setSummaryText();
 
         connect(&m_cppAspect, &BaseAspect::changed, this, setSummaryText);
         connect(&m_qmlAspect, &BaseAspect::changed, this, setSummaryText);
+        connect(&m_pythonAspect, &BaseAspect::changed, this, setSummaryText);
         connect(&m_overrideStartupAspect, &BaseAspect::changed, this, setSummaryText);
 
         return details;
@@ -179,7 +181,6 @@ bool DebuggerRunConfigurationAspect::useQmlDebugger() const
         if (!languages.contains(ProjectExplorer::Constants::QMLJS_LANGUAGE_ID))
             return projectHasQmlDefines(m_target->project());
 
-        //
         // Try to find a build configuration to check whether qml debugging is enabled there
         if (BuildConfiguration *bc = m_target->activeBuildConfiguration()) {
             if (const auto aspect = bc->aspect())

From 198251db9b031dd0d4f604dfe4ccb1035455a660 Mon Sep 17 00:00:00 2001
From: Eike Ziller 
Date: Thu, 15 Feb 2024 14:59:19 +0100
Subject: [PATCH 19/35] Bump version to 13.0.0-beta2

Change-Id: Ia03b43a4e3906350d79a2ba4dbfd800c5f80f77d
Reviewed-by: David Schulz 
Reviewed-by: 
---
 cmake/QtCreatorIDEBranding.cmake | 6 +++---
 qbs/modules/qtc/qtc.qbs          | 6 +++---
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/cmake/QtCreatorIDEBranding.cmake b/cmake/QtCreatorIDEBranding.cmake
index 275454a6684..6890a1ef957 100644
--- a/cmake/QtCreatorIDEBranding.cmake
+++ b/cmake/QtCreatorIDEBranding.cmake
@@ -1,6 +1,6 @@
-set(IDE_VERSION "12.0.82")                            # The IDE version.
-set(IDE_VERSION_COMPAT "12.0.82")                     # The IDE Compatibility version.
-set(IDE_VERSION_DISPLAY "13.0.0-beta1")               # The IDE display version.
+set(IDE_VERSION "12.0.83")                            # The IDE version.
+set(IDE_VERSION_COMPAT "12.0.83")                     # The IDE Compatibility version.
+set(IDE_VERSION_DISPLAY "13.0.0-beta2")               # The IDE display version.
 set(IDE_COPYRIGHT_YEAR "2024")                        # The IDE current copyright year.
 
 set(IDE_SETTINGSVARIANT "QtProject")                  # The IDE settings variation.
diff --git a/qbs/modules/qtc/qtc.qbs b/qbs/modules/qtc/qtc.qbs
index 1fe9fe91354..cb40782268e 100644
--- a/qbs/modules/qtc/qtc.qbs
+++ b/qbs/modules/qtc/qtc.qbs
@@ -4,16 +4,16 @@ import qbs.FileInfo
 import qbs.Utilities
 
 Module {
-    property string qtcreator_display_version: '13.0.0-beta1'
+    property string qtcreator_display_version: '13.0.0-beta2'
     property string ide_version_major: '12'
     property string ide_version_minor: '0'
-    property string ide_version_release: '82'
+    property string ide_version_release: '83'
     property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.'
                                        + ide_version_release
 
     property string ide_compat_version_major: '12'
     property string ide_compat_version_minor: '0'
-    property string ide_compat_version_release: '82'
+    property string ide_compat_version_release: '83'
     property string qtcreator_compat_version: ide_compat_version_major + '.'
             + ide_compat_version_minor + '.' + ide_compat_version_release
 

From 8f23a64ac3df859557b2882b85eb6993fce94649 Mon Sep 17 00:00:00 2001
From: Jarek Kobus 
Date: Fri, 16 Feb 2024 08:50:09 +0100
Subject: [PATCH 20/35] DocumentClangToolRunner: Fix isEmpty() condition

Since we were adding the parallel item unconditionally to the
tasks list, the if(tasks.isEmpty()) condition was always false.
The intention was to check whether any call to addClangTool()
added at least one task.

The fix is to add parallel item after the condition is checked.

Change-Id: Iafdf21f1ac0f8fdd547a462990313e09a2dc46fd
Reviewed-by: David Schulz 
---
 src/plugins/clangtools/documentclangtoolrunner.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/plugins/clangtools/documentclangtoolrunner.cpp b/src/plugins/clangtools/documentclangtoolrunner.cpp
index 06cdb8cdd5a..d503f80d63b 100644
--- a/src/plugins/clangtools/documentclangtoolrunner.cpp
+++ b/src/plugins/clangtools/documentclangtoolrunner.cpp
@@ -191,7 +191,7 @@ void DocumentClangToolRunner::run()
     vfso().update();
     const ClangDiagnosticConfig config = diagnosticConfig(runSettings.diagnosticConfigId());
     const Environment env = projectBuildEnvironment(project);
-    QList tasks{parallel};
+    QList tasks;
     const auto addClangTool = [this, &runSettings, &config, &env, &tasks](ClangToolType tool) {
         if (!toolEnabled(tool, config, runSettings))
             return;
@@ -204,7 +204,7 @@ void DocumentClangToolRunner::run()
         if (includeDir.isEmpty() || clangVersion.isEmpty())
             return;
         const AnalyzeUnits units{{m_fileInfo, includeDir, clangVersion}};
-        auto diagnosticFilter = [mappedPath = vfso().autoSavedFilePath(m_document)](
+        const auto diagnosticFilter = [mappedPath = vfso().autoSavedFilePath(m_document)](
                                     const FilePath &path) { return path == mappedPath; };
         const AnalyzeInputData input{tool,
                                      runSettings,
@@ -225,7 +225,7 @@ void DocumentClangToolRunner::run()
         return;
 
     cleanup.dismiss();
-    m_taskTreeRunner.start(tasks);
+    m_taskTreeRunner.start({parallel, tasks});
 }
 
 static void updateLocation(Debugger::DiagnosticLocation &location)

From 2abe04ff34173a1c25b2adc7dc11760a8b4b2ed7 Mon Sep 17 00:00:00 2001
From: Christian Kandeler 
Date: Thu, 15 Feb 2024 13:52:12 +0100
Subject: [PATCH 21/35] CppEditor: Do not duplicate minimum clangd version

Amends 55161882900b459da6bc76e2d5c48e3c32ea4b34.

Change-Id: I1de7249c06c0e262d0c36f980cc687f0e792f755
Reviewed-by: 
Reviewed-by: David Schulz 
Reviewed-by: Qt CI Bot 
---
 src/plugins/cppeditor/cppcodemodelsettings.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/plugins/cppeditor/cppcodemodelsettings.cpp b/src/plugins/cppeditor/cppcodemodelsettings.cpp
index bac28694f52..29516c62189 100644
--- a/src/plugins/cppeditor/cppcodemodelsettings.cpp
+++ b/src/plugins/cppeditor/cppcodemodelsettings.cpp
@@ -273,7 +273,7 @@ ClangdSettings::ClangdSettings()
 
 bool ClangdSettings::useClangd() const
 {
-    return m_data.useClangd && Utils::clangdVersion(clangdFilePath()) >= QVersionNumber(14);
+    return m_data.useClangd && clangdVersion(clangdFilePath()) >= minimumClangdVersion();
 }
 
 void ClangdSettings::setUseClangd(bool use) { instance().m_data.useClangd = use; }

From 64393a714d032455948002cb7649dc7f8a92b38f Mon Sep 17 00:00:00 2001
From: Christian Kandeler 
Date: Thu, 15 Feb 2024 15:28:51 +0100
Subject: [PATCH 22/35] QbsProjectManager: Fix potential freeze when importing
 projects

We forgot to quit the event loop in the case of an incompatible build
graph, causing each such operation to take ten seconds instead of
fractions of a second. In directories with lots of qbs builds, this
could result in Qt Creator freezing for several minutes.

Change-Id: I9f3de2e23fd67a87e9f487eb2a1b6e45fbde6f31
Reviewed-by: Christian Stenger 
Reviewed-by: 
Reviewed-by: Qt CI Bot 
---
 src/plugins/qbsprojectmanager/qbssession.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/plugins/qbsprojectmanager/qbssession.cpp b/src/plugins/qbsprojectmanager/qbssession.cpp
index 69dd6a7b2e1..4bbdbb6ebc7 100644
--- a/src/plugins/qbsprojectmanager/qbssession.cpp
+++ b/src/plugins/qbsprojectmanager/qbssession.cpp
@@ -413,6 +413,7 @@ QbsSession::BuildGraphInfo QbsSession::getBuildGraphInfo(const FilePath &bgFileP
     QTimer::singleShot(10000, &session, [&session] { session.d->eventLoop.exit(1); });
     connect(&session, &QbsSession::errorOccurred, [&] {
         bgInfo.error = ErrorInfo(Tr::tr("Failed to load qbs build graph."));
+        session.d->eventLoop.quit();
     });
     connect(&session, &QbsSession::projectResolved, [&](const ErrorInfo &error) {
         bgInfo.error = error;

From 718b4b60b08518efb45587f145176163b76c961b Mon Sep 17 00:00:00 2001
From: Eike Ziller 
Date: Fri, 16 Feb 2024 10:02:14 +0100
Subject: [PATCH 23/35] Add missing license file
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Amends 2ceb1e2ad7be8b4d6ec2856da97530723cde7eb8

Change-Id: I3e6c1d1e1878a4502b6871cc5ea45b54f52327f8
Reviewed-by: David Schulz 
Reviewed-by: 
Reviewed-by: Robert Löhning 
---
 .../src/overview/license-LGPLv2.0.txt         | 408 ++++++++++++++++++
 1 file changed, 408 insertions(+)
 create mode 100644 doc/qtcreator/src/overview/license-LGPLv2.0.txt

diff --git a/doc/qtcreator/src/overview/license-LGPLv2.0.txt b/doc/qtcreator/src/overview/license-LGPLv2.0.txt
new file mode 100644
index 00000000000..6c972cf1596
--- /dev/null
+++ b/doc/qtcreator/src/overview/license-LGPLv2.0.txt
@@ -0,0 +1,408 @@
+GNU LIBRARY GENERAL PUBLIC LICENSE
+
+Version 2, June 1991
+
+Copyright (C) 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth
+Floor, Boston, MA 02110-1301, USA
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is numbered 2
+because it goes with version 2 of the ordinary GPL.]
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to
+share and change it. By contrast, the GNU General Public Licenses are
+intended to guarantee your freedom to share and change free software--to
+make sure the software is free for all its users.
+
+This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any other
+libraries whose authors decide to use it. You can use it for your
+libraries, too.
+
+When we speak of free software, we are referring to freedom, not price.
+Our General Public Licenses are designed to make sure that you have the
+freedom to distribute copies of free software (and charge for this
+service if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone
+to deny you these rights or to ask you to surrender the rights. These
+restrictions translate to certain responsibilities for you if you
+distribute copies of the library, or if you modify it.
+
+For example, if you distribute copies of the library, whether gratis or
+for a fee, you must give the recipients all the rights that we gave you.
+You must make sure that they, too, receive or can get the source code.
+If you link a program with the library, you must provide complete object
+files to the recipients so that they can relink them with the library,
+after making changes to the library and recompiling it. And you must
+show them these terms so they know their rights.
+
+Our method of protecting your rights has two steps: (1) copyright the
+library, and (2) offer you this license which gives you legal permission
+to copy, distribute and/or modify the library.
+
+Also, for each distributor's protection, we want to make certain that
+everyone understands that there is no warranty for this free library. If
+the library is modified by someone else and passed on, we want its
+recipients to know that what they have is not the original version, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+Finally, any free program is threatened constantly by software patents.
+We wish to avoid the danger that companies distributing free software
+will individually obtain patent licenses, thus in effect transforming
+the program into proprietary software. To prevent this, we have made it
+clear that any patent must be licensed for everyone's free use or not
+licensed at all.
+
+Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs.
+This license, the GNU Library General Public License, applies to certain
+designated libraries. This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to
+a program and simply using it. Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program. However,
+in a textual and legal sense, the linked executable is a combined work,
+a derivative of the original library, and the ordinary General Public
+License treats it as such.
+
+Because of this blurred distinction, using the ordinary General Public
+License for libraries did not effectively promote software sharing,
+because most developers did not use the libraries. We concluded that
+weaker conditions might promote sharing better.
+
+However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves. This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them. (We have not seen how to
+achieve this as regards changes in header files, but we have achieved it
+as regards changes in the actual functions of the Library.) The hope is
+that this will lead to faster development of free libraries.
+
+The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+    0. This License Agreement applies to any software library which
+    contains a notice placed by the copyright holder or other authorized
+    party saying it may be distributed under the terms of this Library
+    General Public License (also called "this License"). Each licensee
+    is addressed as "you".
+
+    A "library" means a collection of software functions and/or data
+    prepared so as to be conveniently linked with application programs
+    (which use some of those functions and data) to form executables.
+
+    The "Library", below, refers to any such software library or work
+    which has been distributed under these terms. A "work based on the
+    Library" means either the Library or any derivative work under
+    copyright law: that is to say, a work containing the Library or a
+    portion of it, either verbatim or with modifications and/or
+    translated straightforwardly into another language. (Hereinafter,
+    translation is included without limitation in the term
+    "modification".)
+
+    "Source code" for a work means the preferred form of the work for
+    making modifications to it. For a library, complete source code
+    means all the source code for all modules it contains, plus any
+    associated interface definition files, plus the scripts used to
+    control compilation and installation of the library.
+
+    Activities other than copying, distribution and modification are not
+    covered by this License; they are outside its scope. The act of
+    running a program using the Library is not restricted, and output
+    from such a program is covered only if its contents constitute a
+    work based on the Library (independent of the use of the Library in
+    a tool for writing it). Whether that is true depends on what the
+    Library does and what the program that uses the Library does. 1. You
+    may copy and distribute verbatim copies of the Library's complete
+    source code as you receive it, in any medium, provided that you
+    conspicuously and appropriately publish on each copy an appropriate
+    copyright notice and disclaimer of warranty; keep intact all the
+    notices that refer to this License and to the absence of any
+    warranty; and distribute a copy of this License along with the
+    Library.
+
+    You may charge a fee for the physical act of transferring a copy,
+    and you may at your option offer warranty protection in exchange for
+    a fee. 2. You may modify your copy or copies of the Library or any
+    portion of it, thus forming a work based on the Library, and copy
+    and distribute such modifications or work under the terms of Section
+    1 above, provided that you also meet all of these conditions: a) The
+    modified work must itself be a software library. b) You must cause
+    the files modified to carry prominent notices stating that you
+    changed the files and the date of any change. c) You must cause the
+    whole of the work to be licensed at no charge to all third parties
+    under the terms of this License. d) If a facility in the modified
+    Library refers to a function or a table of data to be supplied by an
+    application program that uses the facility, other than as an
+    argument passed when the facility is invoked, then you must make a
+    good faith effort to ensure that, in the event an application does
+    not supply such function or table, the facility still operates, and
+    performs whatever part of its purpose remains meaningful.
+
+        (For example, a function in a library to compute square roots
+        has a purpose that is entirely well-defined independent of the
+        application. Therefore, Subsection 2d requires that any
+        application-supplied function or table used by this function
+        must be optional: if the application does not supply it, the
+        square root function must still compute square roots.)
+
+    These requirements apply to the modified work as a whole. If
+    identifiable sections of that work are not derived from the Library,
+    and can be reasonably considered independent and separate works in
+    themselves, then this License, and its terms, do not apply to those
+    sections when you distribute them as separate works. But when you
+    distribute the same sections as part of a whole which is a work
+    based on the Library, the distribution of the whole must be on the
+    terms of this License, whose permissions for other licensees extend
+    to the entire whole, and thus to each and every part regardless of
+    who wrote it.
+
+    Thus, it is not the intent of this section to claim rights or
+    contest your rights to work written entirely by you; rather, the
+    intent is to exercise the right to control the distribution of
+    derivative or collective works based on the Library.
+
+    In addition, mere aggregation of another work not based on the
+    Library with the Library (or with a work based on the Library) on a
+    volume of a storage or distribution medium does not bring the other
+    work under the scope of this License. 3. You may opt to apply the
+    terms of the ordinary GNU General Public License instead of this
+    License to a given copy of the Library. To do this, you must alter
+    all the notices that refer to this License, so that they refer to
+    the ordinary GNU General Public License, version 2, instead of to
+    this License. (If a newer version than version 2 of the ordinary GNU
+    General Public License has appeared, then you can specify that
+    version instead if you wish.) Do not make any other change in these
+    notices.
+
+    Once this change is made in a given copy, it is irreversible for
+    that copy, so the ordinary GNU General Public License applies to all
+    subsequent copies and derivative works made from that copy.
+
+    This option is useful when you wish to copy part of the code of the
+    Library into a program that is not a library. 4. You may copy and
+    distribute the Library (or a portion or derivative of it, under
+    Section 2) in object code or executable form under the terms of
+    Sections 1 and 2 above provided that you accompany it with the
+    complete corresponding machine-readable source code, which must be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange.
+
+    If distribution of object code is made by offering access to copy
+    from a designated place, then offering equivalent access to copy the
+    source code from the same place satisfies the requirement to
+    distribute the source code, even though third parties are not
+    compelled to copy the source along with the object code. 5. A
+    program that contains no derivative of any portion of the Library,
+    but is designed to work with the Library by being compiled or linked
+    with it, is called a "work that uses the Library". Such a work, in
+    isolation, is not a derivative work of the Library, and therefore
+    falls outside the scope of this License.
+
+    However, linking a "work that uses the Library" with the Library
+    creates an executable that is a derivative of the Library (because
+    it contains portions of the Library), rather than a "work that uses
+    the library". The executable is therefore covered by this License.
+    Section 6 states terms for distribution of such executables.
+
+    When a "work that uses the Library" uses material from a header file
+    that is part of the Library, the object code for the work may be a
+    derivative work of the Library even though the source code is not.
+    Whether this is true is especially significant if the work can be
+    linked without the Library, or if the work is itself a library. The
+    threshold for this to be true is not precisely defined by law.
+
+    If such an object file uses only numerical parameters, data
+    structure layouts and accessors, and small macros and small inline
+    functions (ten lines or less in length), then the use of the object
+    file is unrestricted, regardless of whether it is legally a
+    derivative work. (Executables containing this object code plus
+    portions of the Library will still fall under Section 6.)
+
+    Otherwise, if the work is a derivative of the Library, you may
+    distribute the object code for the work under the terms of Section
+    6. Any executables containing that work also fall under Section 6,
+    whether or not they are linked directly with the Library itself. 6.
+    As an exception to the Sections above, you may also compile or link
+    a "work that uses the Library" with the Library to produce a work
+    containing portions of the Library, and distribute that work under
+    terms of your choice, provided that the terms permit modification of
+    the work for the customer's own use and reverse engineering for
+    debugging such modifications.
+
+    You must give prominent notice with each copy of the work that the
+        Library is used in it and that the Library and its use are
+        covered by this License. You must supply a copy of this License.
+        If the work during execution displays copyright notices, you
+        must include the copyright notice for the Library among them, as
+        well as a reference directing the user to the copy of this
+        License. Also, you must do one of these things: a) Accompany the
+        work with the complete corresponding machine-readable source
+        code for the Library including whatever changes were used in the
+        work (which must be distributed under Sections 1 and 2 above);
+        and, if the work is an executable linked with the Library, with
+        the complete machine-readable "work that uses the Library", as
+        object code and/or source code, so that the user can modify the
+        Library and then relink to produce a modified executable
+        containing the modified Library. (It is understood that the user
+        who changes the contents of definitions files in the Library
+        will not necessarily be able to recompile the application to use
+        the modified definitions.) b) Accompany the work with a written
+        offer, valid for at least three years, to give the same user the
+        materials specified in Subsection 6a, above, for a charge no
+        more than the cost of performing this distribution. c) If
+        distribution of the work is made by offering access to copy from
+        a designated place, offer equivalent access to copy the above
+        specified materials from the same place. d) Verify that the user
+        has already received a copy of these materials or that you have
+        already sent this user a copy.
+
+    For an executable, the required form of the "work that uses the
+    Library" must include any data and utility programs needed for
+    reproducing the executable from it. However, as a special exception,
+    the source code distributed need not include anything that is
+    normally distributed (in either source or binary form) with the
+    major components (compiler, kernel, and so on) of the operating
+    system on which the executable runs, unless that component itself
+    accompanies the executable.
+
+    It may happen that this requirement contradicts the license
+    restrictions of other proprietary libraries that do not normally
+    accompany the operating system. Such a contradiction means you
+    cannot use both them and the Library together in an executable that
+    you distribute. 7. You may place library facilities that are a work
+    based on the Library side-by-side in a single library together with
+    other library facilities not covered by this License, and distribute
+    such a combined library, provided that the separate distribution of
+    the work based on the Library and of the other library facilities is
+    otherwise permitted, and provided that you do these two things: a)
+    Accompany the combined library with a copy of the same work based on
+    the Library, uncombined with any other library facilities. This must
+    be distributed under the terms of the Sections above. b) Give
+    prominent notice with the combined library of the fact that part of
+    it is a work based on the Library, and explaining where to find the
+    accompanying uncombined form of the same work. 8. You may not copy,
+    modify, sublicense, link with, or distribute the Library except as
+    expressly provided under this License. Any attempt otherwise to
+    copy, modify, sublicense, link with, or distribute the Library is
+    void, and will automatically terminate your rights under this
+    License. However, parties who have received copies, or rights, from
+    you under this License will not have their licenses terminated so
+    long as such parties remain in full compliance. 9. You are not
+    required to accept this License, since you have not signed it.
+    However, nothing else grants you permission to modify or distribute
+    the Library or its derivative works. These actions are prohibited by
+    law if you do not accept this License. Therefore, by modifying or
+    distributing the Library (or any work based on the Library), you
+    indicate your acceptance of this License to do so, and all its terms
+    and conditions for copying, distributing or modifying the Library or
+    works based on it. 10. Each time you redistribute the Library (or
+    any work based on the Library), the recipient automatically receives
+    a license from the original licensor to copy, distribute, link with
+    or modify the Library subject to these terms and conditions. You may
+    not impose any further restrictions on the recipients' exercise of
+    the rights granted herein. You are not responsible for enforcing
+    compliance by third parties to this License. 11. If, as a
+    consequence of a court judgment or allegation of patent infringement
+    or for any other reason (not limited to patent issues), conditions
+    are imposed on you (whether by court order, agreement or otherwise)
+    that contradict the conditions of this License, they do not excuse
+    you from the conditions of this License. If you cannot distribute so
+    as to satisfy simultaneously your obligations under this License and
+    any other pertinent obligations, then as a consequence you may not
+    distribute the Library at all. For example, if a patent license
+    would not permit royalty-free redistribution of the Library by all
+    those who receive copies directly or indirectly through you, then
+    the only way you could satisfy both it and this License would be to
+    refrain entirely from distribution of the Library.
+
+    If any portion of this section is held invalid or unenforceable
+    under any particular circumstance, the balance of the section is
+    intended to apply, and the section as a whole is intended to apply
+    in other circumstances.
+
+    It is not the purpose of this section to induce you to infringe any
+    patents or other property right claims or to contest validity of any
+    such claims; this section has the sole purpose of protecting the
+    integrity of the free software distribution system which is
+    implemented by public license practices. Many people have made
+    generous contributions to the wide range of software distributed
+    through that system in reliance on consistent application of that
+    system; it is up to the author/donor to decide if he or she is
+    willing to distribute software through any other system and a
+    licensee cannot impose that choice.
+
+    This section is intended to make thoroughly clear what is believed
+    to be a consequence of the rest of this License. 12. If the
+    distribution and/or use of the Library is restricted in certain
+    countries either by patents or by copyrighted interfaces, the
+    original copyright holder who places the Library under this License
+    may add an explicit geographical distribution limitation excluding
+    those countries, so that distribution is permitted only in or among
+    countries not thus excluded. In such case, this License incorporates
+    the limitation as if written in the body of this License. 13. The
+    Free Software Foundation may publish revised and/or new versions of
+    the Library General Public License from time to time. Such new
+    versions will be similar in spirit to the present version, but may
+    differ in detail to address new problems or concerns.
+
+    Each version is given a distinguishing version number. If the
+    Library specifies a version number of this License which applies to
+    it and "any later version", you have the option of following the
+    terms and conditions either of that version or of any later version
+    published by the Free Software Foundation. If the Library does not
+    specify a license version number, you may choose any version ever
+    published by the Free Software Foundation. 14. If you wish to
+    incorporate parts of the Library into other free programs whose
+    distribution conditions are incompatible with these, write to the
+    author to ask for permission. For software which is copyrighted by
+    the Free Software Foundation, write to the Free Software Foundation;
+    we sometimes make exceptions for this. Our decision will be guided
+    by the two goals of preserving the free status of all derivatives of
+    our free software and of promoting the sharing and reuse of software
+    generally.
+
+    NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE,
+    THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY
+    APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE
+    COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS"
+    WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+    INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+    MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE
+    RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU.
+    SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
+    NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS
+    REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY
+    COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+    REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR
+    DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL
+    DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY
+    (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
+    INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE
+    OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH
+    HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+    DAMAGES.
+
+END OF TERMS AND CONDITIONS

From 1bd3c7d9e5b93b23fc642700a34933780db52a48 Mon Sep 17 00:00:00 2001
From: Christian Kandeler 
Date: Fri, 16 Feb 2024 13:15:17 +0100
Subject: [PATCH 24/35] Wizards: Stop chasing The Current Thing in string
 construction

Guard against random deprecations by using a robust solution that works
across all Qt versions.

Fixes: QTCREATORBUG-30325
Change-Id: I00428d2454fcd6abffd3a25631946ea5d27cc4ae
Reviewed-by: Qt CI Bot 
Reviewed-by: 
Reviewed-by: Alessandro Portale 
---
 .../wizards/projects/qtquick2-extension/example/example.cpp     | 2 +-
 .../templates/wizards/projects/qtquickapplication/main.cpp      | 2 +-
 .../wizards/projects/qtquickapplication_compat/main.cpp         | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/share/qtcreator/templates/wizards/projects/qtquick2-extension/example/example.cpp b/share/qtcreator/templates/wizards/projects/qtquick2-extension/example/example.cpp
index b7b83acf554..5787dfa4953 100644
--- a/share/qtcreator/templates/wizards/projects/qtquick2-extension/example/example.cpp
+++ b/share/qtcreator/templates/wizards/projects/qtquick2-extension/example/example.cpp
@@ -11,7 +11,7 @@ int main(int argc, char *argv[])
     QQmlApplicationEngine engine;
     // The first subfolder is the libraryName followed by the regular
     // folder structure: LibraryName/Subfolder
-    const QUrl url(u"qrc:/ExampleProjectApp/example/example.qml"_qs);
+    const QUrl url(QStringLiteral("qrc:/ExampleProjectApp/example/example.qml"));
     QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
         &app, [url](QObject *obj, const QUrl &objUrl) {
             if (!obj && url == objUrl)
diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication/main.cpp b/share/qtcreator/templates/wizards/projects/qtquickapplication/main.cpp
index 155667fb122..07725874746 100644
--- a/share/qtcreator/templates/wizards/projects/qtquickapplication/main.cpp
+++ b/share/qtcreator/templates/wizards/projects/qtquickapplication/main.cpp
@@ -11,7 +11,7 @@ int main(int argc, char *argv[])
 
     QQmlApplicationEngine engine;
 @if !%{HasLoadFromModule}
-    const QUrl url(u"qrc:/%{JS: value('ProjectName')}/Main.qml"_qs);
+    const QUrl url(QStringLiteral("qrc:/%{JS: value('ProjectName')}/Main.qml"));
 @endif
 @if %{HasFailureSignal}
     QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed,
diff --git a/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/main.cpp b/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/main.cpp
index 08698bb6bea..9c5b49e9f00 100644
--- a/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/main.cpp
+++ b/share/qtcreator/templates/wizards/projects/qtquickapplication_compat/main.cpp
@@ -43,7 +43,7 @@ int main(int argc, char *argv[])
 
     QQmlApplicationEngine engine;
 @if %{IsQt6}
-    const QUrl url(u"qrc:/%{JS: value('ProjectName')}/main.qml"_qs);
+    const QUrl url(QStringLiteral("qrc:/%{JS: value('ProjectName')}/main.qml"));
 @else
     const QUrl url(QStringLiteral("qrc:/main.qml"));
 @endif

From d13a7dc9b51fcdfb1d7686c753aa1a2d4070cbf0 Mon Sep 17 00:00:00 2001
From: Cristian Adam 
Date: Fri, 9 Feb 2024 14:32:33 +0100
Subject: [PATCH 25/35] CMakePM: Update cmake conan for auto-setup

Update to https://github.com/conan-io/cmake-conan/commit/
f6464d1e13ef7a47c569f5061f9607ea63339d39

Task-number: QTCREATORBUG-30169
Change-Id: Ibb8f3d353117c5c8ce21b8686cb6e2e5ee146698
Reviewed-by: Alessandro Portale 
Reviewed-by: Marcus Tillmanns 
---
 .../package-manager/conan_provider.cmake      | 253 +++++++++++++-----
 .../cmakeprojectmanager/conan/CMakeLists.txt  |   1 +
 2 files changed, 183 insertions(+), 71 deletions(-)

diff --git a/src/share/3rdparty/package-manager/conan_provider.cmake b/src/share/3rdparty/package-manager/conan_provider.cmake
index d94a9d811f8..e5fa9cec190 100644
--- a/src/share/3rdparty/package-manager/conan_provider.cmake
+++ b/src/share/3rdparty/package-manager/conan_provider.cmake
@@ -1,5 +1,5 @@
 # https://github.com/conan-io/cmake-conan/blob/develop2/conan_provider.cmake
-# commit: 451fa97d2c59c07b13fb4812a64b2a6391f9e781
+# commit: f6464d1e13ef7a47c569f5061f9607ea63339d39
 #
 # The MIT License (MIT)
 #
@@ -30,22 +30,26 @@ function(detect_os OS OS_API_LEVEL OS_SDK OS_SUBSYSTEM OS_VERSION)
     # it could be cross compilation
     message(STATUS "CMake-Conan: cmake_system_name=${CMAKE_SYSTEM_NAME}")
     if(CMAKE_SYSTEM_NAME AND NOT CMAKE_SYSTEM_NAME STREQUAL "Generic")
-        if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
+        if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
             set(${OS} Macos PARENT_SCOPE)
-        elseif(${CMAKE_SYSTEM_NAME} STREQUAL "QNX")
+        elseif(CMAKE_SYSTEM_NAME STREQUAL "QNX")
             set(${OS} Neutrino PARENT_SCOPE)
-        elseif(${CMAKE_SYSTEM_NAME} STREQUAL "CYGWIN")
+        elseif(CMAKE_SYSTEM_NAME STREQUAL "CYGWIN")
             set(${OS} Windows PARENT_SCOPE)
             set(${OS_SUBSYSTEM} cygwin PARENT_SCOPE)
-        elseif(${CMAKE_SYSTEM_NAME} MATCHES "^MSYS")
+        elseif(CMAKE_SYSTEM_NAME MATCHES "^MSYS")
             set(${OS} Windows PARENT_SCOPE)
             set(${OS_SUBSYSTEM} msys2 PARENT_SCOPE)
         else()
             set(${OS} ${CMAKE_SYSTEM_NAME} PARENT_SCOPE)
         endif()
-        if(${CMAKE_SYSTEM_NAME} STREQUAL "Android")
-            string(REGEX MATCH "[0-9]+" _OS_API_LEVEL ${ANDROID_PLATFORM})
-            message(STATUS "CMake-Conan: android_platform=${ANDROID_PLATFORM}")
+        if(CMAKE_SYSTEM_NAME STREQUAL "Android")
+            if(DEFINED ANDROID_PLATFORM)
+                string(REGEX MATCH "[0-9]+" _OS_API_LEVEL ${ANDROID_PLATFORM})
+            elseif(DEFINED CMAKE_SYSTEM_VERSION)
+                set(_OS_API_LEVEL ${CMAKE_SYSTEM_VERSION})
+            endif()
+            message(STATUS "CMake-Conan: android api level=${_OS_API_LEVEL}")
             set(${OS_API_LEVEL} ${_OS_API_LEVEL} PARENT_SCOPE)
         endif()
         if(CMAKE_SYSTEM_NAME MATCHES "Darwin|iOS|tvOS|watchOS")
@@ -91,15 +95,22 @@ function(detect_arch ARCH)
             message(WARNING "CMake-Conan: Multiple architectures detected, this will only work if Conan recipe(s) produce fat binaries.")
         endif()
     endif()
-    if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|ARM64|arm64" OR CMAKE_OSX_ARCHITECTURES MATCHES arm64)
+    if(CMAKE_SYSTEM_NAME MATCHES "Darwin|iOS|tvOS|watchOS" AND NOT CMAKE_OSX_ARCHITECTURES STREQUAL "")
+        set(host_arch ${CMAKE_OSX_ARCHITECTURES})
+    elseif(MSVC)
+        set(host_arch ${CMAKE_CXX_COMPILER_ARCHITECTURE_ID})
+    else()
+        set(host_arch ${CMAKE_SYSTEM_PROCESSOR})
+    endif()
+    if(host_arch MATCHES "aarch64|arm64|ARM64")
         set(_ARCH armv8)
-    elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "armv7-a|armv7l" OR CMAKE_OSX_ARCHITECTURES MATCHES armv7)
+    elseif(host_arch MATCHES "armv7|armv7-a|armv7l|ARMV7")
         set(_ARCH armv7)
-    elseif(CMAKE_OSX_ARCHITECTURES MATCHES armv7s)
+    elseif(host_arch MATCHES armv7s)
         set(_ARCH armv7s)
-    elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i686" OR CMAKE_OSX_ARCHITECTURES MATCHES i386)
+    elseif(host_arch MATCHES "i686|i386|X86")
         set(_ARCH x86)
-    elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "AMD64|amd64|x86_64" OR CMAKE_OSX_ARCHITECTURES MATCHES x86_64)
+    elseif(host_arch MATCHES "AMD64|amd64|x86_64|x64")
         set(_ARCH x86_64)
     endif()
     message(STATUS "CMake-Conan: cmake_system_processor=${_ARCH}")
@@ -114,6 +125,7 @@ function(detect_cxx_standard CXX_STANDARD)
     endif()
 endfunction()
 
+
 macro(detect_gnu_libstdcxx)
     # _CONAN_IS_GNU_LIBSTDCXX true if GNU libstdc++
     check_cxx_source_compiles("
@@ -136,6 +148,7 @@ macro(detect_gnu_libstdcxx)
     unset (_CONAN_GNU_LIBSTDCXX_IS_CXX11_ABI)
 endmacro()
 
+
 macro(detect_libcxx)
     # _CONAN_IS_LIBCXX true if LLVM libc++
     check_cxx_source_compiles("
@@ -147,10 +160,10 @@ macro(detect_libcxx)
 endmacro()
 
 
-function(detect_lib_cxx OS LIB_CXX)
-    if(${OS} STREQUAL "Android")
-        message(STATUS "CMake-Conan: android_stl=${ANDROID_STL}")
-        set(${LIB_CXX} ${ANDROID_STL} PARENT_SCOPE)
+function(detect_lib_cxx LIB_CXX)
+    if(CMAKE_SYSTEM_NAME STREQUAL "Android")
+        message(STATUS "CMake-Conan: android_stl=${CMAKE_ANDROID_STL_TYPE}")
+        set(${LIB_CXX} ${CMAKE_ANDROID_STL_TYPE} PARENT_SCOPE)
         return()
     endif()
 
@@ -207,37 +220,42 @@ function(detect_compiler COMPILER COMPILER_VERSION COMPILER_RUNTIME COMPILER_RUN
         string(SUBSTRING ${MSVC_VERSION} 0 3 _COMPILER_VERSION)
         # Configure compiler.runtime and compiler.runtime_type settings for MSVC
         if(CMAKE_MSVC_RUNTIME_LIBRARY)
-            set(_KNOWN_MSVC_RUNTIME_VALUES "")
-            list(APPEND _KNOWN_MSVC_RUNTIME_VALUES MultiThreaded MultiThreadedDLL)
-            list(APPEND _KNOWN_MSVC_RUNTIME_VALUES MultiThreadedDebug MultiThreadedDebugDLL)
-            list(APPEND _KNOWN_MSVC_RUNTIME_VALUES MultiThreaded$<$:Debug> MultiThreaded$<$:Debug>DLL)
-
-            # only accept the 6 possible values, otherwise we don't don't know to map this
-            if(NOT CMAKE_MSVC_RUNTIME_LIBRARY IN_LIST _KNOWN_MSVC_RUNTIME_VALUES)
-                message(FATAL_ERROR "CMake-Conan: unable to map MSVC runtime: ${CMAKE_MSVC_RUNTIME_LIBRARY} to Conan settings")
-            endif()
-
-            # Runtime is "dynamic" in all cases if it ends in DLL
-            if(CMAKE_MSVC_RUNTIME_LIBRARY MATCHES ".*DLL$")
-                set(_COMPILER_RUNTIME "dynamic")
-            else()
-                set(_COMPILER_RUNTIME "static")
-            endif()
-
-            # Only define compiler.runtime_type when explicitly requested
-            # If a generator expression is used, let Conan handle it conditional on build_type
-            get_property(_IS_MULTI_CONFIG_GENERATOR GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
-            if(NOT CMAKE_MSVC_RUNTIME_LIBRARY MATCHES ":Debug>")
-                if(CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "Debug")
-                    set(_COMPILER_RUNTIME_TYPE "Debug")
-                else()
-                    set(_COMPILER_RUNTIME_TYPE "Release")
-                endif()
-            endif()
-
-            unset(_KNOWN_MSVC_RUNTIME_VALUES)
-            unset(_IS_MULTI_CONFIG_GENERATOR)
+            set(_msvc_runtime_library ${CMAKE_MSVC_RUNTIME_LIBRARY})
+        else()
+            set(_msvc_runtime_library MultiThreaded$<$:Debug>DLL) # default value documented by CMake
         endif()
+
+        set(_KNOWN_MSVC_RUNTIME_VALUES "")
+        list(APPEND _KNOWN_MSVC_RUNTIME_VALUES MultiThreaded MultiThreadedDLL)
+        list(APPEND _KNOWN_MSVC_RUNTIME_VALUES MultiThreadedDebug MultiThreadedDebugDLL)
+        list(APPEND _KNOWN_MSVC_RUNTIME_VALUES MultiThreaded$<$:Debug> MultiThreaded$<$:Debug>DLL)
+
+        # only accept the 6 possible values, otherwise we don't don't know to map this
+        if(NOT _msvc_runtime_library IN_LIST _KNOWN_MSVC_RUNTIME_VALUES)
+            message(FATAL_ERROR "CMake-Conan: unable to map MSVC runtime: ${_msvc_runtime_library} to Conan settings")
+        endif()
+
+        # Runtime is "dynamic" in all cases if it ends in DLL
+        if(_msvc_runtime_library MATCHES ".*DLL$")
+            set(_COMPILER_RUNTIME "dynamic")
+        else()
+            set(_COMPILER_RUNTIME "static")
+        endif()
+        message(STATUS "CMake-Conan: CMake compiler.runtime=${_COMPILER_RUNTIME}")
+
+        # Only define compiler.runtime_type when explicitly requested
+        # If a generator expression is used, let Conan handle it conditional on build_type
+        if(NOT _msvc_runtime_library MATCHES ":Debug>")
+            if(_msvc_runtime_library MATCHES "Debug")
+                set(_COMPILER_RUNTIME_TYPE "Debug")
+            else()
+                set(_COMPILER_RUNTIME_TYPE "Release")
+            endif()
+            message(STATUS "CMake-Conan: CMake compiler.runtime_type=${_COMPILER_RUNTIME_TYPE}")
+        endif()
+
+        unset(_KNOWN_MSVC_RUNTIME_VALUES)
+
     elseif(_COMPILER MATCHES AppleClang)
         set(_COMPILER "apple-clang")
         string(REPLACE "." ";" VERSION_LIST ${CMAKE_CXX_COMPILER_VERSION})
@@ -267,6 +285,7 @@ function(detect_compiler COMPILER COMPILER_VERSION COMPILER_RUNTIME COMPILER_RUN
     set(${COMPILER_RUNTIME_TYPE} ${_COMPILER_RUNTIME_TYPE} PARENT_SCOPE)
 endfunction()
 
+
 function(detect_build_type BUILD_TYPE)
     get_property(_MULTICONFIG_GENERATOR GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
     if(NOT _MULTICONFIG_GENERATOR)
@@ -276,23 +295,43 @@ function(detect_build_type BUILD_TYPE)
     endif()
 endfunction()
 
+macro(set_conan_compiler_if_appleclang lang command output_variable)
+    if(CMAKE_${lang}_COMPILER_ID STREQUAL "AppleClang")
+        execute_process(COMMAND xcrun --find ${command}
+            OUTPUT_VARIABLE _xcrun_out OUTPUT_STRIP_TRAILING_WHITESPACE)
+        cmake_path(GET _xcrun_out PARENT_PATH _xcrun_toolchain_path)
+        cmake_path(GET CMAKE_${lang}_COMPILER PARENT_PATH _compiler_parent_path)
+        if ("${_xcrun_toolchain_path}" STREQUAL "${_compiler_parent_path}")
+            set(${output_variable} "")
+        endif()
+        unset(_xcrun_out)
+        unset(_xcrun_toolchain_path)
+        unset(_compiler_parent_path)
+    endif()
+endmacro()
+
+
 macro(append_compiler_executables_configuration)
     set(_conan_c_compiler "")
     set(_conan_cpp_compiler "")
     if(CMAKE_C_COMPILER)
         set(_conan_c_compiler "\"c\":\"${CMAKE_C_COMPILER}\",")
+        set_conan_compiler_if_appleclang(C cc _conan_c_compiler)
     else()
         message(WARNING "CMake-Conan: The C compiler is not defined. "
                         "Please define CMAKE_C_COMPILER or enable the C language.")
     endif()
     if(CMAKE_CXX_COMPILER)
         set(_conan_cpp_compiler "\"cpp\":\"${CMAKE_CXX_COMPILER}\"")
+        set_conan_compiler_if_appleclang(CXX c++ _conan_cpp_compiler)
     else()
         message(WARNING "CMake-Conan: The C++ compiler is not defined. "
                         "Please define CMAKE_CXX_COMPILER or enable the C++ language.")
     endif()
 
-    string(APPEND PROFILE "tools.build:compiler_executables={${_conan_c_compiler}${_conan_cpp_compiler}}\n")
+    if(NOT "x${_conan_c_compiler}${_conan_cpp_compiler}" STREQUAL "x")
+        string(APPEND PROFILE "tools.build:compiler_executables={${_conan_c_compiler}${_conan_cpp_compiler}}\n")
+    endif()
     unset(_conan_c_compiler)
     unset(_conan_cpp_compiler)
 endmacro()
@@ -303,7 +342,7 @@ function(detect_host_profile output_file)
     detect_arch(MYARCH)
     detect_compiler(MYCOMPILER MYCOMPILER_VERSION MYCOMPILER_RUNTIME MYCOMPILER_RUNTIME_TYPE)
     detect_cxx_standard(MYCXX_STANDARD)
-    detect_lib_cxx(MYOS MYLIB_CXX)
+    detect_lib_cxx(MYLIB_CXX)
     detect_build_type(MYBUILD_TYPE)
 
     set(PROFILE "")
@@ -360,7 +399,7 @@ function(detect_host_profile output_file)
     # propagate compilers via profile
     append_compiler_executables_configuration()
 
-    if(${MYOS} STREQUAL "Android")
+    if(MYOS STREQUAL "Android")
         string(APPEND PROFILE "tools.android:ndk_path=${CMAKE_ANDROID_NDK}\n")
     endif()
 
@@ -398,12 +437,26 @@ function(conan_install)
     # Invoke "conan install" with the provided arguments
     set(CONAN_ARGS ${CONAN_ARGS} -of=${CONAN_OUTPUT_FOLDER})
     message(STATUS "CMake-Conan: conan install ${CMAKE_SOURCE_DIR} ${CONAN_ARGS} ${ARGN}")
+
+
+    # In case there was not a valid cmake executable in the PATH, we inject the
+    # same we used to invoke the provider to the PATH
+    if(DEFINED PATH_TO_CMAKE_BIN)
+        set(_OLD_PATH $ENV{PATH})
+        set(ENV{PATH} "$ENV{PATH}:${PATH_TO_CMAKE_BIN}")
+    endif()
+
     execute_process(COMMAND ${CONAN_COMMAND} install ${CMAKE_SOURCE_DIR} ${CONAN_ARGS} ${ARGN} --format=json
                     RESULT_VARIABLE return_code
                     OUTPUT_VARIABLE conan_stdout
                     ERROR_VARIABLE conan_stderr
                     ECHO_ERROR_VARIABLE    # show the text output regardless
                     WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
+
+    if(DEFINED PATH_TO_CMAKE_BIN)
+        set(ENV{PATH} "${_OLD_PATH}")
+    endif()
+
     if(NOT "${return_code}" STREQUAL "0")
         message(FATAL_ERROR "Conan install failed='${return_code}'")
     else()
@@ -411,6 +464,7 @@ function(conan_install)
         # one is specified, but we don't know a priori where this is.
         # TODO: this can be made more robust if Conan can provide this in the json output
         string(JSON CONAN_GENERATORS_FOLDER GET ${conan_stdout} graph nodes 0 generators_folder)
+        cmake_path(CONVERT ${CONAN_GENERATORS_FOLDER} TO_CMAKE_PATH_LIST CONAN_GENERATORS_FOLDER)
         # message("conan stdout: ${conan_stdout}")
         message(STATUS "CMake-Conan: CONAN_GENERATORS_FOLDER=${CONAN_GENERATORS_FOLDER}")
         set_property(GLOBAL PROPERTY CONAN_GENERATORS_FOLDER "${CONAN_GENERATORS_FOLDER}")
@@ -459,6 +513,7 @@ function(conan_version_check)
     endif()
 endfunction()
 
+
 macro(construct_profile_argument argument_variable profile_list)
     set(${argument_variable} "")
     if("${profile_list}" STREQUAL "CONAN_HOST_PROFILE")
@@ -479,8 +534,8 @@ endmacro()
 
 macro(conan_provide_dependency method package_name)
     set_property(GLOBAL PROPERTY CONAN_PROVIDE_DEPENDENCY_INVOKED TRUE)
-    get_property(CONAN_INSTALL_SUCCESS GLOBAL PROPERTY CONAN_INSTALL_SUCCESS)
-    if(NOT CONAN_INSTALL_SUCCESS)
+    get_property(_conan_install_success GLOBAL PROPERTY CONAN_INSTALL_SUCCESS)
+    if(NOT _conan_install_success)
         find_program(CONAN_COMMAND "conan" REQUIRED)
         conan_get_version(${CONAN_COMMAND} CONAN_CURRENT_VERSION)
         conan_version_check(MINIMUM ${CONAN_MINIMUM_VERSION} CURRENT ${CONAN_CURRENT_VERSION})
@@ -493,21 +548,39 @@ macro(conan_provide_dependency method package_name)
         endif()
         construct_profile_argument(_host_profile_flags CONAN_HOST_PROFILE)
         construct_profile_argument(_build_profile_flags CONAN_BUILD_PROFILE)
-        get_property(_MULTICONFIG_GENERATOR GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
-        if(NOT _MULTICONFIG_GENERATOR)
+        if(EXISTS "${CMAKE_SOURCE_DIR}/conanfile.py")
+            file(READ "${CMAKE_SOURCE_DIR}/conanfile.py" outfile)
+            if(NOT "${outfile}" MATCHES ".*CMakeDeps.*")
+                message(WARNING "Cmake-conan: CMakeDeps generator was not defined in the conanfile")
+            endif()
+            set(generator "")
+        elseif (EXISTS "${CMAKE_SOURCE_DIR}/conanfile.txt")
+            file(READ "${CMAKE_SOURCE_DIR}/conanfile.txt" outfile)
+            if(NOT "${outfile}" MATCHES ".*CMakeDeps.*")
+                message(WARNING "Cmake-conan: CMakeDeps generator was not defined in the conanfile. "
+                        "Please define the generator as it will be mandatory in the future")
+            endif()
+            set(generator "-g;CMakeDeps")
+        endif()
+        get_property(_multiconfig_generator GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
+        if(NOT _multiconfig_generator)
             message(STATUS "CMake-Conan: Installing single configuration ${CMAKE_BUILD_TYPE}")
-            conan_install(${_host_profile_flags} ${_build_profile_flags} --build=missing -g CMakeDeps)
+            conan_install(${_host_profile_flags} ${_build_profile_flags} ${CONAN_INSTALL_ARGS} ${generator})
         else()
             message(STATUS "CMake-Conan: Installing both Debug and Release")
-            conan_install(${_host_profile_flags} ${_build_profile_flags} -s build_type=Release --build=missing -g CMakeDeps)
-            conan_install(${_host_profile_flags} ${_build_profile_flags} -s build_type=Debug --build=missing -g CMakeDeps)
+            conan_install(${_host_profile_flags} ${_build_profile_flags} -s build_type=Release ${CONAN_INSTALL_ARGS} ${generator})
+            conan_install(${_host_profile_flags} ${_build_profile_flags} -s build_type=Debug ${CONAN_INSTALL_ARGS} ${generator})
         endif()
-        unset(_MULTICONFIG_GENERATOR)
+        unset(_host_profile_flags)
+        unset(_build_profile_flags)
+        unset(_multiconfig_generator)
+        unset(_conan_install_success)
     else()
         message(STATUS "CMake-Conan: find_package(${ARGV1}) found, 'conan install' already ran")
+        unset(_conan_install_success)
     endif()
 
-    get_property(CONAN_GENERATORS_FOLDER GLOBAL PROPERTY CONAN_GENERATORS_FOLDER)
+    get_property(_conan_generators_folder GLOBAL PROPERTY CONAN_GENERATORS_FOLDER)
 
     # Ensure that we consider Conan-provided packages ahead of any other,
     # irrespective of other settings that modify the search order or search paths
@@ -517,28 +590,66 @@ macro(conan_provide_dependency method package_name)
     #       find_package ()
 
     # Filter out `REQUIRED` from the argument list, as the first call may fail
-    set(_find_args "${ARGN}")
-    list(REMOVE_ITEM _find_args "REQUIRED")
-    if(NOT "MODULE" IN_LIST _find_args)
-        find_package(${package_name} ${_find_args} BYPASS_PROVIDER PATHS "${CONAN_GENERATORS_FOLDER}" NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
+    set(_find_args_${package_name} "${ARGN}")
+    list(REMOVE_ITEM _find_args_${package_name} "REQUIRED")
+    if(NOT "MODULE" IN_LIST _find_args_${package_name})
+        find_package(${package_name} ${_find_args_${package_name}} BYPASS_PROVIDER PATHS "${_conan_generators_folder}" NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
+        unset(_find_args_${package_name})
     endif()
 
     # Invoke find_package a second time - if the first call succeeded,
     # this will simply reuse the result. If not, fall back to CMake default search
     # behaviour, also allowing modules to be searched.
-    set(_cmake_module_path_orig "${CMAKE_MODULE_PATH}")
-    list(PREPEND CMAKE_MODULE_PATH "${CONAN_GENERATORS_FOLDER}")
     if(NOT ${package_name}_FOUND)
+        list(FIND CMAKE_MODULE_PATH "${_conan_generators_folder}" _index)
+        if(_index EQUAL -1)
+            list(PREPEND CMAKE_MODULE_PATH "${_conan_generators_folder}")
+        endif()
+        unset(_index)
         find_package(${package_name} ${ARGN} BYPASS_PROVIDER)
+        list(REMOVE_ITEM CMAKE_MODULE_PATH "${_conan_generators_folder}")
     endif()
-
-    set(CMAKE_MODULE_PATH "${_cmake_module_path_orig}")
-    unset(_find_args)
-    unset(_cmake_module_path_orig)
-    unset(_host_profile_flags)
-    unset(_build_profile_flags)
 endmacro()
 
+#[=[ not needed by Qt Creator, and if not commented it would break the auto-setup feature
+
+cmake_language(
+    SET_DEPENDENCY_PROVIDER conan_provide_dependency
+    SUPPORTED_METHODS FIND_PACKAGE
+)
+
+
+macro(conan_provide_dependency_check)
+    set(_CONAN_PROVIDE_DEPENDENCY_INVOKED FALSE)
+    get_property(_CONAN_PROVIDE_DEPENDENCY_INVOKED GLOBAL PROPERTY CONAN_PROVIDE_DEPENDENCY_INVOKED)
+    if(NOT _CONAN_PROVIDE_DEPENDENCY_INVOKED)
+        message(WARNING "Conan is correctly configured as dependency provider, "
+                        "but Conan has not been invoked. Please add at least one "
+                        "call to `find_package()`.")
+        if(DEFINED CONAN_COMMAND)
+            # supress warning in case `CONAN_COMMAND` was specified but unused.
+            set(_CONAN_COMMAND ${CONAN_COMMAND})
+            unset(_CONAN_COMMAND)
+        endif()
+    endif()
+    unset(_CONAN_PROVIDE_DEPENDENCY_INVOKED)
+endmacro()
+
+
+# Add a deferred call at the end of processing the top-level directory
+# to check if the dependency provider was invoked at all.
+cmake_language(DEFER DIRECTORY "${CMAKE_SOURCE_DIR}" CALL conan_provide_dependency_check)
+
+]=]
+
 # Configurable variables for Conan profiles
 set(CONAN_HOST_PROFILE "default;auto-cmake" CACHE STRING "Conan host profile")
 set(CONAN_BUILD_PROFILE "default" CACHE STRING "Conan build profile")
+set(CONAN_INSTALL_ARGS "--build=missing" CACHE STRING "Command line arguments for conan install")
+
+find_program(_cmake_program NAMES cmake NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH NO_CMAKE_FIND_ROOT_PATH)
+if(NOT _cmake_program)
+    get_filename_component(PATH_TO_CMAKE_BIN "${CMAKE_COMMAND}" DIRECTORY)
+    set(PATH_TO_CMAKE_BIN "${PATH_TO_CMAKE_BIN}" CACHE INTERNAL "Path where the CMake executable is")
+endif()
+
diff --git a/tests/manual/cmakeprojectmanager/conan/CMakeLists.txt b/tests/manual/cmakeprojectmanager/conan/CMakeLists.txt
index 0892c9be4d2..1179a388ab9 100644
--- a/tests/manual/cmakeprojectmanager/conan/CMakeLists.txt
+++ b/tests/manual/cmakeprojectmanager/conan/CMakeLists.txt
@@ -1,5 +1,6 @@
 cmake_minimum_required(VERSION 3.15)
 
+set(CMAKE_CXX_STANDARD 14)
 project(conan-libfmt)
 
 find_package(fmt REQUIRED)

From 0a2b6a910acd8d75bb14c1860c60c248aa5e073e Mon Sep 17 00:00:00 2001
From: David Schulz 
Date: Fri, 16 Feb 2024 08:40:37 +0100
Subject: [PATCH 26/35] Debugger: make last locals command debuggable in the
 cdbengine

Change-Id: I4d06cecbd23bdb2f16697b3713be5bca0a695fdb
Reviewed-by: Christian Stenger 
---
 src/plugins/debugger/cdb/cdbengine.cpp | 7 +++++++
 src/plugins/debugger/cdb/cdbengine.h   | 3 +++
 2 files changed, 10 insertions(+)

diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp
index 31c57af0c1c..d292028050a 100644
--- a/src/plugins/debugger/cdb/cdbengine.cpp
+++ b/src/plugins/debugger/cdb/cdbengine.cpp
@@ -1078,6 +1078,8 @@ void CdbEngine::doUpdateLocals(const UpdateParameters &updateParameters)
         };
 
         runCommand(cmd);
+        cmd.arg("passexceptions", true);
+        m_lastDebuggableCommand = cmd;
     } else {
 
         const bool partialUpdate = !updateParameters.partialVariable.isEmpty();
@@ -2968,6 +2970,11 @@ BreakpointParameters CdbEngine::parseBreakPoint(const GdbMi &gdbmi)
     return result;
 }
 
+void CdbEngine::debugLastCommand()
+{
+    runCommand(m_lastDebuggableCommand);
+}
+
 void CdbEngine::handleBreakPoints(const DebuggerResponse &response)
 {
     if (debugBreakpoints) {
diff --git a/src/plugins/debugger/cdb/cdbengine.h b/src/plugins/debugger/cdb/cdbengine.h
index 2721429a308..b8afe1e2d91 100644
--- a/src/plugins/debugger/cdb/cdbengine.h
+++ b/src/plugins/debugger/cdb/cdbengine.h
@@ -171,6 +171,9 @@ private:
     void checkQtSdkPdbFiles(const QString &module);
     BreakpointParameters parseBreakPoint(const GdbMi &gdbmi);
 
+    void debugLastCommand() final;
+    DebuggerCommand m_lastDebuggableCommand;
+
     const QString m_tokenPrefix;
     void handleSetupFailure(const QString &errorMessage);
 

From 95bad0c91d22b6c1ded3c957f94b02be549ae5ed Mon Sep 17 00:00:00 2001
From: David Schulz 
Date: Fri, 16 Feb 2024 08:41:47 +0100
Subject: [PATCH 27/35] Debugger: add more debug output to the python cdbext
 module

Change-Id: I48b4fb6a65eb486b190238ff161ea358bf4d3bf5
Reviewed-by: 
Reviewed-by: Christian Stenger 
---
 src/libs/qtcreatorcdbext/pycdbextmodule.cpp | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/src/libs/qtcreatorcdbext/pycdbextmodule.cpp b/src/libs/qtcreatorcdbext/pycdbextmodule.cpp
index bf3c379272d..68b9eb334c9 100644
--- a/src/libs/qtcreatorcdbext/pycdbextmodule.cpp
+++ b/src/libs/qtcreatorcdbext/pycdbextmodule.cpp
@@ -101,6 +101,9 @@ static PyObject *cdbext_resolveSymbol(PyObject *, PyObject *args) // -> Value
     if (!PyArg_ParseTuple(args, "s", &pattern))
         Py_RETURN_NONE;
 
+    if (debugPyCdbextModule)
+        DebugPrint() << "resolve symbol: " << pattern;
+
     CIDebugSymbols *symbols = ExtensionCommandContext::instance()->symbols();
     auto rc = PyList_New(0);
 
@@ -132,6 +135,9 @@ static PyObject *cdbext_getNameByAddress(PyObject *, PyObject *args)
     if (!PyArg_ParseTuple(args, "K", &address))
         Py_RETURN_NONE;
 
+    if (debugPyCdbextModule)
+        DebugPrint() << "name by address: " << address;
+
     CIDebugSymbols *symbols = ExtensionCommandContext::instance()->symbols();
 
     PyObject* ret = NULL;
@@ -153,6 +159,9 @@ static PyObject *cdbext_getAddressByName(PyObject *, PyObject *args)
     if (!PyArg_ParseTuple(args, "s", &name))
         Py_RETURN_NONE;
 
+    if (debugPyCdbextModule)
+        DebugPrint() << "address by name: " << name;
+
     CIDebugSymbols *symbols = ExtensionCommandContext::instance()->symbols();
 
     ULONG64 address = 0;
@@ -177,6 +186,14 @@ static PyObject *cdbext_listOfLocals(PyObject *, PyObject *args) // -> [ Value ]
         Py_RETURN_NONE;
 
     const std::string partialVariable(partialVariablesC);
+
+    if (debugPyCdbextModule) {
+        if (partialVariable.empty())
+            DebugPrint() << "list of locals";
+        else
+            DebugPrint() << "list of locals with partial variable: " << partialVariable;
+    }
+
     IDebugSymbolGroup2 *symbolGroup = nullptr;
     auto locals = PyList_New(0);
     if (partialVariable.empty()) {

From c4abbef0a8de2346e08bad9c5f46db7c44f24efc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Robert=20L=C3=B6hning?= 
Date: Fri, 16 Feb 2024 22:16:19 +0100
Subject: [PATCH 28/35] SquishTests: Stabilize adding documentation

I noticed that Creator built on Qt 6.6.0 never needed longer than
two seconds to update the documentation after adding qtcreator.qch.
The same sources of Creator built on Qt 6.6.2 needed up to four
seconds. This subtle difference can lead to the situation that the
documentation was not yet updated when clicking "Getting Started"
in tst_WELP01, which then just displays an empty page.

Change-Id: I11ab2a902825190ed8ae27dad55a847f01ba44dc
Reviewed-by: Christian Stenger 
---
 tests/system/shared/utils.py | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/tests/system/shared/utils.py b/tests/system/shared/utils.py
index d424bd72021..853c5f6fde0 100644
--- a/tests/system/shared/utils.py
+++ b/tests/system/shared/utils.py
@@ -269,6 +269,8 @@ def addHelpDocumentation(which):
         clickButton(waitForObject("{type='QPushButton' name='addButton' visible='1' text='Add...'}"))
         selectFromFileDialog(qch)
     clickButton(waitForObject(":Options.OK_QPushButton"))
+    progressBarWait(10000)  # Wait for "Update Documentation"
+
 
 def addCurrentCreatorDocumentation():
     currentCreatorPath = currentApplicationContext().cwd
@@ -297,6 +299,8 @@ def addCurrentCreatorDocumentation():
     except:
         test.fail("Added Qt Creator's documentation explicitly.")
     clickButton(waitForObject(":Options.OK_QPushButton"))
+    progressBarWait(10000)  # Wait for "Update Documentation"
+
 
 def verifyOutput(string, substring, outputFrom, outputIn):
     index = string.find(substring)

From cfb26a06a7fc63363ffc61e4f3e12c0efd440b48 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Robert=20L=C3=B6hning?= 
Date: Thu, 15 Feb 2024 17:16:32 +0100
Subject: [PATCH 29/35] SquishTests: Improve toggling filter names in "Issues"
 view

- Explicitly set a shorter timeout. After the menu appears, it
  should not take that long until the item is there, too.

- Warn when an item can't be found. This should not go unnoticed,
  because it either means that the GUI changed or that there's a
  bug in the test. Both require a fix.

Change-Id: Id7faa2b91926c392bd0d894214f498d8ba8edaa1
Reviewed-by: Jukka Nokso 
Reviewed-by: 
Reviewed-by: Christian Stenger 
---
 tests/system/shared/build_utils.py | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/tests/system/shared/build_utils.py b/tests/system/shared/build_utils.py
index c26634f61db..fbc89c5920f 100644
--- a/tests/system/shared/build_utils.py
+++ b/tests/system/shared/build_utils.py
@@ -9,7 +9,7 @@ def toggleIssuesFilter(filterName, checked):
         filterMenu = waitForObject("{type='QMenu' unnamed='1' visible='1'}")
         waitFor("filterMenu.visible", 1000)
 
-        filterCategory = waitForObjectItem(filterMenu, filterName)
+        filterCategory = waitForObjectItem(filterMenu, filterName, 1000)
         waitFor("filterCategory.visible", 2000)
         if filterCategory.checked == checked:
             test.log("Filter '%s' has already check state %s - not toggling."
@@ -20,8 +20,8 @@ def toggleIssuesFilter(filterName, checked):
             test.log("Filter '%s' check state changed to %s." % (filterName, checked))
     except:
         t,v = sys.exc_info()[:2]
-        test.log("Exception while toggling filter '%s'" % filterName,
-                 "%s: %s" % (t.__name__, str(v)))
+        test.warning("Exception while toggling filter '%s'" % filterName,
+                     "%s: %s" % (t.__name__, str(v)))
 
 
 def getBuildIssues(ignoreCodeModel=True):

From 8a532af3af4a000d0044a69f232c748ad6c1a1ea Mon Sep 17 00:00:00 2001
From: Eike Ziller 
Date: Mon, 19 Feb 2024 12:05:17 +0100
Subject: [PATCH 30/35] Markdown: Fix the Show Editor/Preview buttons

Calling QToolButton::setCheckable on a button with a defaultAction
doesn't work as expected. It needs to be called on the action itself.

Amends acedf93ba32467a9848cebe25da35c096a5993ae

Fixes: QTCREATORBUG-30382
Change-Id: Icbddb1d331fe6547622bf0428d890012fef0d9c5
Reviewed-by: David Schulz 
---
 src/plugins/texteditor/markdowneditor.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/plugins/texteditor/markdowneditor.cpp b/src/plugins/texteditor/markdowneditor.cpp
index 6d91225dbcd..dbfdcda2b42 100644
--- a/src/plugins/texteditor/markdowneditor.cpp
+++ b/src/plugins/texteditor/markdowneditor.cpp
@@ -138,12 +138,12 @@ public:
         agg->add(m_widget.get());
 
         m_togglePreviewVisible = Command::createToolButtonWithShortcutToolTip(TOGGLEPREVIEW_ACTION);
-        m_togglePreviewVisible->setCheckable(true);
+        m_togglePreviewVisible->defaultAction()->setCheckable(true);
         m_togglePreviewVisible->setChecked(showPreview);
         m_previewWidget->setVisible(showPreview);
 
         m_toggleEditorVisible = Command::createToolButtonWithShortcutToolTip(TOGGLEEDITOR_ACTION);
-        m_toggleEditorVisible->setCheckable(true);
+        m_toggleEditorVisible->defaultAction()->setCheckable(true);
         m_toggleEditorVisible->setChecked(showEditor);
         m_textEditorWidget->setVisible(showEditor);
 

From 4b042f1aeb7e18ba2af30acea2e1caec73b3ace8 Mon Sep 17 00:00:00 2001
From: Christian Kandeler 
Date: Fri, 16 Feb 2024 14:07:40 +0100
Subject: [PATCH 31/35] Update qbs submodule to HEAD of 2.3 branch

Change-Id: Id0bdf4a85008f11de34953832cd02d2e0b46b3bd
Reviewed-by: 
Reviewed-by: Christian Stenger 
---
 src/shared/qbs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/shared/qbs b/src/shared/qbs
index a30e54c2e7f..bd0c59e572f 160000
--- a/src/shared/qbs
+++ b/src/shared/qbs
@@ -1 +1 @@
-Subproject commit a30e54c2e7fb7d9735a364497914a5df452dd1ad
+Subproject commit bd0c59e572f95953337177e68fa32cb0c4aa1e29

From eea7fae890e6e1fb0219faa5f2b3f132fc1ce944 Mon Sep 17 00:00:00 2001
From: Christian Kandeler 
Date: Tue, 13 Feb 2024 15:09:08 +0100
Subject: [PATCH 32/35] RemoteLinux: Announce initial connection attempt

So if the device turns out to be unresponsive, users will not be
confused about the temporary freeze.

Task-number: QTCREATORBUG-30319
Change-Id: If65d6ea2777232239c8fb324b06352d92ad451c6
Reviewed-by: 
Reviewed-by: Marcus Tillmanns 
---
 src/plugins/remotelinux/linuxdevice.cpp | 46 +++++++++++++++++++++----
 1 file changed, 40 insertions(+), 6 deletions(-)

diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp
index b166b702d34..0872ff54d3d 100644
--- a/src/plugins/remotelinux/linuxdevice.cpp
+++ b/src/plugins/remotelinux/linuxdevice.cpp
@@ -38,6 +38,7 @@
 #include 
 #include 
 
+#include 
 #include 
 #include 
 #include 
@@ -312,8 +313,11 @@ public:
     explicit LinuxDevicePrivate(LinuxDevice *parent);
     ~LinuxDevicePrivate();
 
-    bool setupShell(const SshParameters &sshParameters);
+    bool setupShell(const SshParameters &sshParameters, bool announce);
     RunResult runInShell(const CommandLine &cmd, const QByteArray &stdInData = {});
+    void announceConnectionAttempt();
+    void unannounceConnectionAttempt();
+    Id announceId() const { return q->id().withPrefix("announce_"); }
 
     void attachToSharedConnection(SshConnectionHandle *connectionHandle,
                                   const SshParameters &sshParameters);
@@ -1166,18 +1170,24 @@ void LinuxDevicePrivate::checkOsType()
 }
 
 // Call me with shell mutex locked
-bool LinuxDevicePrivate::setupShell(const SshParameters &sshParameters)
+bool LinuxDevicePrivate::setupShell(const SshParameters &sshParameters, bool announce)
 {
     if (m_handler->isRunning(sshParameters))
         return true;
 
     invalidateEnvironmentCache();
 
+    if (announce)
+        announceConnectionAttempt();
+
     bool ok = false;
     QMetaObject::invokeMethod(m_handler, [this, sshParameters] {
         return m_handler->start(sshParameters);
     }, Qt::BlockingQueuedConnection, &ok);
 
+    if (announce)
+        unannounceConnectionAttempt();
+
     if (ok) {
         setDisconnected(false);
         queryOsType([this](const CommandLine &cmd) { return m_handler->runInShell(cmd); });
@@ -1194,24 +1204,48 @@ RunResult LinuxDevicePrivate::runInShell(const CommandLine &cmd, const QByteArra
     DEBUG(cmd.toUserOutput());
     if (checkDisconnectedWithWarning())
         return {};
-    const bool isSetup = setupShell(q->sshParameters());
+    const bool isSetup = setupShell(q->sshParameters(), true);
     if (checkDisconnectedWithWarning())
         return {};
     QTC_ASSERT(isSetup, return {});
     return m_handler->runInShell(cmd, data);
 }
 
+void LinuxDevicePrivate::announceConnectionAttempt()
+{
+    const auto announce = [id = announceId(), name = q->displayName()] {
+        Core::ICore::infoBar()->addInfo(
+            InfoBarEntry(id,
+                         Tr::tr("Establishing initial connection to device \"%1\". "
+                                "This might take a moment.")
+                             .arg(name)));
+        QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
+        QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); // Yes, twice.
+    };
+    if (QThread::currentThread() == qApp->thread())
+        announce();
+    else
+        QMetaObject::invokeMethod(Core::ICore::infoBar(), announce, Qt::BlockingQueuedConnection);
+}
+
+void LinuxDevicePrivate::unannounceConnectionAttempt()
+{
+    QMetaObject::invokeMethod(Core::ICore::infoBar(),
+                              [id = announceId()] { Core::ICore::infoBar()->removeInfo(id); });
+}
+
 bool LinuxDevicePrivate::checkDisconnectedWithWarning()
 {
     if (!disconnected())
         return false;
 
     QMetaObject::invokeMethod(Core::ICore::infoBar(), [id = q->id(), name = q->displayName()] {
-        if (!Core::ICore::infoBar()->canInfoBeAdded(id))
+        const Id errorId = id.withPrefix("error_");
+        if (!Core::ICore::infoBar()->canInfoBeAdded(errorId))
             return;
         const QString warnStr
             = Tr::tr("Device \"%1\" is currently marked as disconnected.").arg(name);
-        InfoBarEntry info(id, warnStr, InfoBarEntry::GlobalSuppression::Enabled);
+        InfoBarEntry info(errorId, warnStr, InfoBarEntry::GlobalSuppression::Enabled);
         info.setDetailsWidgetCreator([] {
             const auto label = new QLabel(Tr::tr(
                 "The device was not available when trying to connect previously.
" @@ -1638,7 +1672,7 @@ QFuture LinuxDevice::tryToConnect() { return Utils::asyncRun([this] { QMutexLocker locker(&d->m_shellMutex); - return d->setupShell(sshParameters()); + return d->setupShell(sshParameters(), false); }); } From c28a388b1f6259686c625cd285588c7ecad9e5af Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 13 Feb 2024 11:14:41 +0100 Subject: [PATCH 33/35] Doc: Turn "Running on Multiple Platforms" into how-to topics - Update screenshots of kit selector and Devices preferences, which now show the device status - Turn running on QML and Linux into their own topics - Remove conditions because the projects folder is excluded from QDS Manual Task-number: QTCREATORBUG-30209 Task-number: QTCREATORBUG-29361 Change-Id: I869f6b577016c6712c6b37170dbee2249ded1f8e Reviewed-by: Christian Kandeler --- doc/qtcreator/images/icons/build.png | Bin 0 -> 159 bytes doc/qtcreator/images/icons/cancel-build.png | Bin 0 -> 167 bytes .../images/qtcreator-android-avd-manager.png | Bin 14237 -> 0 bytes .../images/qtcreator-android-avd-manager.webp | Bin 0 -> 9784 bytes .../images/qtcreator-kit-selector.png | Bin 10480 -> 0 bytes .../images/qtcreator-kit-selector.webp | Bin 0 -> 6202 bytes doc/qtcreator/src/android/androiddev.qdoc | 2 +- .../src/baremetal/creator-baremetal-dev.qdoc | 2 +- .../creator-only/creator-debugger.qdoc | 2 +- .../src/debugger/qtquick-debugging.qdoc | 2 +- .../creator-embedded-platforms.qdoc | 4 +- ...or-projects-how-to-run-generic-linux.qdoc} | 22 +++-- .../creator-mobile-platforms.qdoc | 4 +- .../creator-only/creator-reference.qdoc | 19 +++- .../creator-projects-building-running.qdoc | 2 +- .../creator-projects-building.qdoc | 19 ++-- .../projects/creator-projects-running.qdoc | 86 ++++++++++-------- ...c => creator-projects-how-to-run-qnx.qdoc} | 34 +++---- doc/qtcreator/src/qtcreator-toc.qdoc | 1 - doc/qtcreator/src/qtcreator.qdoc | 1 - .../creator-only/qtquick-states-scxml.qdocinc | 2 +- .../src/user-interface/creator-ui.qdoc | 2 +- .../src/webassembly/creator-webassembly.qdoc | 2 +- 23 files changed, 114 insertions(+), 92 deletions(-) create mode 100644 doc/qtcreator/images/icons/build.png create mode 100644 doc/qtcreator/images/icons/cancel-build.png delete mode 100644 doc/qtcreator/images/qtcreator-android-avd-manager.png create mode 100644 doc/qtcreator/images/qtcreator-android-avd-manager.webp delete mode 100644 doc/qtcreator/images/qtcreator-kit-selector.png create mode 100644 doc/qtcreator/images/qtcreator-kit-selector.webp rename doc/qtcreator/src/linux-mobile/{creator-projects-running-generic-linux.qdocinc => creator-projects-how-to-run-generic-linux.qdoc} (55%) rename doc/qtcreator/src/qnx/{creator-projects-running-qnx.qdocinc => creator-projects-how-to-run-qnx.qdoc} (65%) diff --git a/doc/qtcreator/images/icons/build.png b/doc/qtcreator/images/icons/build.png new file mode 100644 index 0000000000000000000000000000000000000000..590e9b052c39cba751609d910be46bff914291c0 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4i*LmhONKMUokK+q?O;E$xAgpvpMk8 zJY|!7v_jkPt%CC#N89RB*WTUkkv{};c=GxjP0kc#8WikPxbcQ9JV$rQC9Rcz85kHC NJYD@<);T3K0RZbkIwk-B literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/icons/cancel-build.png b/doc/qtcreator/images/icons/cancel-build.png new file mode 100644 index 0000000000000000000000000000000000000000..a3773413a88d810aeccdb46258fad914a6ebeecc GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4i*LmhONKMUokK+rr;B4q#jUql&h9<^qU84ad>wn z?o8Gbjjdh%3E8O|j@`TQK0v#D?-%DA_4m%(8n528>eHv%K*zMyXO@+p)}PY%pX>AF z|K!`-^X;p?ytuhJz5T9Zly>g4Y4>-PzUE_axc{?LBi}^o?pvu#X_-IW}`fY+bI#yonRenMGZyINY;#RqvMDb8=(zU5}bw z?Vfsfj_OK@pU?J3nc6ia^>1#QRs5zmEQ@W~yG1J}=M`y(#Gb!W6tegK$K&6(_N_j( z?B0co5}`l-?XBG)>gD$&P~+*%@AvoLYgyTQR!jZplC!IxcC9@fVrBoUM9Xzo*qSLb z*1UMdHF5p-m*#&3SNxt)^WvL~kF8Gd>Q#Me!YOU*K5Ur~6&8Kl^l;Qd%V2e_6*?{7 zX5F&6?XvB+;q3|MJ+sZWCU34>@;G;I*yDB9Ca>edLtYv!i~Cx|K*u48J<~ zu03Nve`(Y?k=ee_Uf)o@w(ybf_m#$~Hk+q>{M&!aqVbclU0m1;H@+)d7O(hoF1#*1 zYj4!vip}2ww@!QGzpXU?dEwb*Wu4a~9tW7M%(cDM_}z5Zp3^g;GUu5(J@}o{%Qn^Z zp3dr?y?=h(+J5(#`>`)lbBhhWZt#)auUmDX(%hmvcTwEZHMVI<;{DG<_Wz4Ge5G|k zXsC8`|Izbble{EbL-v0;rT;sr;@8$kCA%vQf7{5$D-yihd`DccwZDK@`AxoyM!k`V zb8gx3XUw1eSme_$_vMfGOe~*L`fj>DM{kUl$9d6H_oRxqY^;79#J23+dyB2v2dp+$ zJo^+BY`yD3=YiR>e*<`zWgPv={B!2#@?GT@jIB!!AD#V9eO5DD?wjD~W#_^#Z;LZ( zxp2c`Yt_6^-luOwZda`rs$9IL^x&24chlbgHCQK+QT!s9|II!A)Rx1qnA|7LJNs;B z=HbQi@8q^9{c`ikEmwWx{cx^P>86=UAHJ8~wAgy@=DM2JwHphw-s)uXw_MrrWcwA1 z(y;oCvf-bd)@pR`S-fU*T6%=kKJW8+-e&B<{4eUVVi&&RXseofVb_L?E6K5eJ?W9B zXB%$)nR{mc$#dO)`!4e5o^g@Ei32S)&7b! zpExbtaO>aHl2XGn&KLJB%6RD}`S1+3x*EEjN8JQd@TH%38zH-!C8D z*T|}U?s#O?aY&Xe_4l>i6Oov8;L40yZHZanT>S0el^Syc(`9kS16SF)6!cCB(m3a@ z?CJI7rAk=&|<*ipX-MZB$ zd8~{{epUPx@t+>PyY_JG-KVi?QG~(&=k;OPCieP&ANO?~dn}NDPvmu~@#9WaGMf3TvHGi+@H1e!Q8p&p>&yY25A3is<~bsJZWAFR%WZbDg6}a^~BbpNWe% zm1R{`FDt8i>&+LJo7V5M_Kf}PrBUZX=0Xa`b&u+T?W@1N`8=mk|6f;sD`_-$U#EF)?$a7E|C_hJZapVVR^Y0VDS7pbsEpj- z3(r~H?R(sg*%oDM_pNOe_vAe_!S`0hZoyM4-8&ubwC!1S;YQ!q%%>)yB4@7`vmN@Z zDPp?QYv$(|O;Z={;+Q|t77X<3jVsan?LUVb-S97b+%sK_x;yy z50yO_uwE!iT&%ZhjdoY}m6=n0bGLYJboyi`zHXUk>cl)>*H!2G_NC3v+5LI->X}

uXjZ)u-o0~ViUvv4&x!Bd4W7AWn1S=-I;+=8p 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 S_!a{L1B0ilpUXO@geCxPMKMAE diff --git a/doc/qtcreator/images/qtcreator-android-avd-manager.webp b/doc/qtcreator/images/qtcreator-android-avd-manager.webp new file mode 100644 index 0000000000000000000000000000000000000000..88c4f1bd0b36d8139d7f03c4b19bf8f2a7f3512a GIT binary patch literal 9784 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 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/images/qtcreator-kit-selector.png b/doc/qtcreator/images/qtcreator-kit-selector.png deleted file mode 100644 index e2635364c1c258135538d85b389f73dc8a0d48df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10480 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 diff --git a/doc/qtcreator/images/qtcreator-kit-selector.webp b/doc/qtcreator/images/qtcreator-kit-selector.webp new file mode 100644 index 0000000000000000000000000000000000000000..a9b44fd822cfed1cfae33f5af2d842fdfd137b21 GIT binary patch literal 6202 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 literal 0 HcmV?d00001 diff --git a/doc/qtcreator/src/android/androiddev.qdoc b/doc/qtcreator/src/android/androiddev.qdoc index 69947c4fc03..7e172f0650a 100644 --- a/doc/qtcreator/src/android/androiddev.qdoc +++ b/doc/qtcreator/src/android/androiddev.qdoc @@ -195,7 +195,7 @@ To view the available AVDs, select \preferences > \uicontrol Devices. You can add more AVDs. - \image qtcreator-android-avd-manager.png {Android device in Devices} + \image qtcreator-android-avd-manager.webp {Android device in Devices} You can see the status of the selected device in \uicontrol {Current state}. To update the status information, select \uicontrol Refresh. diff --git a/doc/qtcreator/src/baremetal/creator-baremetal-dev.qdoc b/doc/qtcreator/src/baremetal/creator-baremetal-dev.qdoc index 368e313851a..dfde42b473e 100644 --- a/doc/qtcreator/src/baremetal/creator-baremetal-dev.qdoc +++ b/doc/qtcreator/src/baremetal/creator-baremetal-dev.qdoc @@ -262,7 +262,7 @@ You can build applications for and run them on bare metal devices in the same way as for and on the desktop. For more information, see - \l{Building for Multiple Platforms} and \l{Running on Multiple Platforms}. + \l{Building for Multiple Platforms} and \l{Run on many platforms}. \sa {Enable and disable plugins} */ diff --git a/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc b/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc index 101bd3a1889..0676655ec52 100644 --- a/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc +++ b/doc/qtcreator/src/debugger/creator-only/creator-debugger.qdoc @@ -1985,7 +1985,7 @@ \li Select the \inlineimage icons/run_small.png (\uicontrol Run) button to verify that the - \l {Running on Multiple Platforms}{build and run kit selector} + \l {Run on many platforms}{build and run kit selector} picked a runnable target and you can run the application. \li Make sure the debugger is \l{Setting Up Debugger}{set up properly}. diff --git a/doc/qtcreator/src/debugger/qtquick-debugging.qdoc b/doc/qtcreator/src/debugger/qtquick-debugging.qdoc index a9d297419cd..c888927e022 100644 --- a/doc/qtcreator/src/debugger/qtquick-debugging.qdoc +++ b/doc/qtcreator/src/debugger/qtquick-debugging.qdoc @@ -80,7 +80,7 @@ \li To debug applications on \l{glossary-device}{devices}, check that Qt 5.0, or later, libraries are installed on the device and - \l{Running on Multiple Platforms}{select the corresponding kit for the device} + \l{Run on many platforms}{select the corresponding kit for the device} before you start debugging. \endlist diff --git a/doc/qtcreator/src/linux-mobile/creator-embedded-platforms.qdoc b/doc/qtcreator/src/linux-mobile/creator-embedded-platforms.qdoc index 1d1c863befc..14f642e38ba 100644 --- a/doc/qtcreator/src/linux-mobile/creator-embedded-platforms.qdoc +++ b/doc/qtcreator/src/linux-mobile/creator-embedded-platforms.qdoc @@ -76,7 +76,7 @@ \li \l{Connecting Remote Linux Devices} \li \l{Deploying to Remote Linux} \li \l{Remote Linux Run Settings} - \li \l{Running on Remote Linux Devices} + \li \l{Run on remote Linux devices} \li \l{https://doc.qt.io/qtcreator/creator-overview-qtasam.html} {Qt Creator Plugin for Qt Application Manager} \endlist @@ -110,7 +110,7 @@ \li \l{Connecting QNX Devices} \li \l{Deploying to QNX Neutrino} \li \l{QNX Run Settings} - \li \l{Running on QNX Devices} + \li \l{Run on QNX devices} \li \l{Qt for QNX} \endlist diff --git a/doc/qtcreator/src/linux-mobile/creator-projects-running-generic-linux.qdocinc b/doc/qtcreator/src/linux-mobile/creator-projects-how-to-run-generic-linux.qdoc similarity index 55% rename from doc/qtcreator/src/linux-mobile/creator-projects-running-generic-linux.qdocinc rename to doc/qtcreator/src/linux-mobile/creator-projects-how-to-run-generic-linux.qdoc index 995ad8ce4b9..b78dcd5ca20 100644 --- a/doc/qtcreator/src/linux-mobile/creator-projects-running-generic-linux.qdocinc +++ b/doc/qtcreator/src/linux-mobile/creator-projects-how-to-run-generic-linux.qdoc @@ -1,24 +1,25 @@ -// Copyright (C) 2017 The Qt Company Ltd. +// Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only /*! -//! [running on embedded linux] + \page creator-how-to-run-on-remote-linux.html + \previouspage creator-how-tos.html - \section1 Running on Remote Linux Devices + \ingroup creator-how-to-run - To build the application and run it on a device: + \title Run on remote Linux devices + + To build an application and run it on a device: \list 1 - \li Specify a connection to the device. For more information, see - \l{Connecting Remote Linux Devices}. + \li Specify a connection to the device. - \li Click the \uicontrol Run button. + \li Select \inlineimage icons/run_small.png (\uicontrol Run). \endlist - \QC uses the compiler specified in the project build settings - (tool chain) to build the application. + \QC uses the compiler from the kit (tool chain) to build the application. \QC copies the application files to the connected device and runs the application. The application views are @@ -33,5 +34,6 @@ Debugging works transparently if GDB server is installed on the device and it is compatible with the GDB on the host. -//! [running on embedded linux] + \sa {Connecting Remote Linux Devices}, {Run on many platforms}, {Compilers}, + {Embedded Platforms}, {kit-preferences}{Kits} */ diff --git a/doc/qtcreator/src/overview/creator-only/creator-mobile-platforms.qdoc b/doc/qtcreator/src/overview/creator-only/creator-mobile-platforms.qdoc index 21e648dcfba..fef448c3f15 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-mobile-platforms.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-mobile-platforms.qdoc @@ -44,7 +44,7 @@ \list \li \l{Connecting Android Devices} \li \l{Deploying to Android} - \li \l{Running on Multiple Platforms} + \li \l{Run on many platforms} \li \l{Creating a Mobile Application} \li \l{Debugging on Android Devices} \li \l{Qt for Android} @@ -64,7 +64,7 @@ \list \li \l{Connecting iOS Devices} - \li \l{Running on Multiple Platforms} + \li \l{Run on many platforms} \li \l{Creating a Mobile Application} \li \l{Qt for iOS} \endlist diff --git a/doc/qtcreator/src/overview/creator-only/creator-reference.qdoc b/doc/qtcreator/src/overview/creator-only/creator-reference.qdoc index 8ad2729814e..c26df6eb3e5 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-reference.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-reference.qdoc @@ -21,12 +21,12 @@ \section1 Build Configurations + Build configurations have everything you need to compile the sources into + binaries. Build configurations use the tools and settings defined in their + corresponding kit. + \annotatedlist creator-reference-build-configurations - \section1 Run Configurations - - \annotatedlist creator-reference-run-configurations - \section1 Editors \annotatedlist creator-reference-editors @@ -59,6 +59,17 @@ \annotatedlist creator-reference-preferences-text-editor + \section1 Run Configurations + + Run configurations start the application in the location where the + \e {deploy configuration} copied it. By default, when you select + \uicontrol Run, \QC builds the project, deploys it to the device + defined in the kit, and runs it there. If you did not make changes + to the project since you last built and deployed it, \QC simply runs + it again. + + \annotatedlist creator-reference-run-configurations + \section1 UI Design Design UIs with either \l{User Interfaces}{Qt Quick or Qt Widgets}. diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-building-running.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-building-running.qdoc index 25951a3e804..32f2fdc5880 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-building-running.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-building-running.qdoc @@ -37,7 +37,7 @@ the sources into binaries. Build configurations use the tools and settings defined in their corresponding kit. - \li \l{Running on Multiple Platforms} + \li \l{Run on many platforms} \e {Run configurations} start the application in the location where it was copied by the \e{deploy configuration}. By default, diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-building.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-building.qdoc index 6071c329274..13b7d6eb9a9 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-building.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-building.qdoc @@ -1,4 +1,4 @@ -// Copyright (C) 2020 The Qt Company Ltd. +// Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only // ********************************************************************** @@ -30,25 +30,28 @@ \list 1 - \li Click the \uicontrol {Build and Run Kit Selector} icon (1) or select + \li Select the \uicontrol {Build and Run Kit Selector} icon or go to \uicontrol Build > \uicontrol {Open Build and Run Kit Selector} to select the build and run \l{glossary-buildandrun-kit}{kit} or an \l{Managing Android Virtual Devices (AVD)}{Android device}. - \image qtcreator-kit-selector.png "Kit selector" + \image qtcreator-kit-selector.webp {Kit selector} \li Choose \uicontrol Build > \uicontrol {Build Project} or press \key {Ctrl+B}. - You can also select the \uicontrol Run button (2) to also deploy and run - the application after building it. + Or, select \inlineimage icons/run_small.png (\uicontrol Run) to + deploy and run the application after building it. \endlist - While the application is being built, the \uicontrol Build button (3) - changes to a \uicontrol {Cancel Build} button. To cancel the build, select + While the application is being built, the \inlineimage icons/build.png + (\uicontrol Build) button changes to a \inlineimage icons/cancel-build.png + (\uicontrol {Cancel Build}) button. To cancel the build, select the button, press \key {Alt+Backspace}, or select \uicontrol Build > - \uicontrol {Cancel Build}. If you selected a build command and + \uicontrol {Cancel Build}. + + If you selected a build command and decide you would also like to run the application, you can select the \uicontrol Run button to schedule running the project after building is done. diff --git a/doc/qtcreator/src/projects/creator-projects-running.qdoc b/doc/qtcreator/src/projects/creator-projects-running.qdoc index 9c833bf8e7e..80eb0650e4e 100644 --- a/doc/qtcreator/src/projects/creator-projects-running.qdoc +++ b/doc/qtcreator/src/projects/creator-projects-running.qdoc @@ -1,4 +1,4 @@ -// Copyright (C) 2021 The Qt Company Ltd. +// Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only // ********************************************************************** @@ -9,68 +9,76 @@ /*! \page creator-running-targets.html - \if defined(qtdesignstudio) - \previouspage studio-live-preview.html - \else - \previouspage creator-building-targets.html - \endif - \nextpage creator-deployment.html + \previouspage creator-how-tos.html - \title Running on Multiple Platforms + \ingroup creator-how-to-run + + \title Run on many platforms By default, running an application also builds it and deploys it to a - location from where it can be run on the desktop, on a device emulator or + location from where it can run on the desktop, on a device emulator or simulator, or on a \l{glossary-device}{device} that is connected to - the development PC. + the computer. - To run executable files without deploying them first, select \uicontrol Build > - \uicontrol {Run Without Deployment}. To make this the default option, deselect the - \preferences > \uicontrol {Build & Run} > - \uicontrol General > \uicontrol {Always deploy project before running it} - check box. + \section1 Run applications To run applications: \list 1 - \li Click the \uicontrol {Build and Run Kit Selector} icon (1) or select + \li Select the \uicontrol {Build and Run Kit Selector} icon or go to \uicontrol Build > \uicontrol {Open Build and Run Kit Selector} to select the build and run \l{glossary-buildandrun-kit}{kit}. - \image qtcreator-kit-selector.png "Kit selector" + \image qtcreator-kit-selector.webp {Kit selector} - \li Click the \uicontrol Run button (2). + \li Select \inlineimage icons/run_small.png (\uicontrol Run). \endlist + \section1 Run on mobile and embedded devices + + If you have connected \l{Mobile Platforms}{mobile devices} or + \l{Embedded Platforms}{embedded devices} to the computer + or added virtual devices, such as \l{Managing Android Virtual Devices (AVD)} + {Android Virtual Devices (AVD)}, you can select them in the kit selector. + + Select \uicontrol Manage to manage device settings. For example, you can add + AVDs or manually start disconnected AVDs. + + \section1 Select run targets + If your project has several run targets defined, such as \l{Running Autotests}{tests}, you can select them in the kit selector. - \image qtcreator-kit-selector-run-targets.png "Run targets in the kit selector" + \image qtcreator-kit-selector-run-targets.png {Run targets in the kit selector} - If you have connected \l{Mobile Platforms}{mobile devices} or - \l{Embedded Platforms}{embedded devices} to the development PC - or added virtual devices, such as \l{Managing Android Virtual Devices (AVD)} - {Android Virtual Devices (AVD)}, you can select them in the kit selector. - Select \uicontrol Manage to manage device settings. For example, you can add - AVDs or manually start disconnected AVDs. + \section1 Run without deploying - \l {Application Output} displays the status of the - application while it is running. You can select the \uicontrol Run button - to re-run applications without building them first. This is - useful when developing Qt Quick applications because the QML files are - interpreted at runtime. Therefore, the application does not need to be + To run executable files without deploying them first, select \uicontrol Build > + \uicontrol {Run Without Deployment}. + + To make this the default option, go to \preferences > + \uicontrol {Build & Run} > \uicontrol General, and clear + \uicontrol {Always deploy project before running it}. + + \section1 Run without building + + \l {Application Output} displays the status of the application while it is + running. + + \image qtcreator-application-output.webp {Application Output view} + + Select \inlineimage icons/run_small.png (\uicontrol Run) + to re-run applications without building them first. + + This is useful when developing Qt Quick applications because the QML files + are interpreted at runtime. Therefore, the application does not need to be built again if you edited only QML files. This saves time especially if the application has large image files that would need to be bundled into the resource file before running the application. - \image qtcreator-application-output.webp {Application Output view} - - \include linux-mobile/creator-projects-running-generic-linux.qdocinc running on embedded linux - - \if defined(qtcreator) - - \include qnx/creator-projects-running-qnx.qdocinc running on qnx - \sa {Configure projects for running}, {Run Python applications} - \endif + \sa {Configure projects for running}, {Customizing the Build Process}, + {Run on QNX devices}, {Run on remote Linux devices}, + {Run Python applications}, {Supported Platforms} */ diff --git a/doc/qtcreator/src/qnx/creator-projects-running-qnx.qdocinc b/doc/qtcreator/src/qnx/creator-projects-how-to-run-qnx.qdoc similarity index 65% rename from doc/qtcreator/src/qnx/creator-projects-running-qnx.qdocinc rename to doc/qtcreator/src/qnx/creator-projects-how-to-run-qnx.qdoc index 0d9bc2c43d5..364ee316bcc 100644 --- a/doc/qtcreator/src/qnx/creator-projects-running-qnx.qdocinc +++ b/doc/qtcreator/src/qnx/creator-projects-how-to-run-qnx.qdoc @@ -1,22 +1,21 @@ -// Copyright (C) 2022 The Qt Company Ltd. +// Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only /*! -//! [running on qnx] + \page creator-how-to-run-on-qnx.html + \previouspage creator-how-tos.html - \section1 Running on QNX Devices + \ingroup creator-how-to-run + + \title Run on QNX devices + + To build an application and run it on a device: \list 1 - - \li Connect the device to the development PC or to the Wi-Fi network. - - \li Configure the device and specify a connection to it. For more - information, see \l{Connecting QNX Devices}. - + \li Connect the device to the computer or to the Wi-Fi network. + \li Configure the device and specify a connection to it. \li Make sure that your kit has your QNX device set. - - \li Click the \uicontrol Run button. - + \li Select \inlineimage icons/run_small.png (\uicontrol Run). \endlist \QC uses the compiler specified in the QNX tool chain to build the @@ -25,23 +24,23 @@ \note Debugging is currently only fully supported on Linux and \macos. It is not possible to insert breakpoints during runtime on Windows. - \section2 Troubleshooting Errors + \section1 Troubleshoot errors To support running, debugging, and stopping applications from \QC, the QNX Neutrino RTOS has additional command-line tools and services, as described in \l {Qt for QNX}. - \section3 Debug Output Cannot Be Shown + \section2 Debug output cannot be shown For the command-line output to show up in the \uicontrol{Application Output}, - \QC needs to be able to establish an SSH connection to the device. + \QC has to create an SSH connection to the device. This is only possible if QNX Momentics is not running, and the SSH key configured for the device is a 4096-bit key. If these conditions are not met, you will get an error message saying debug output cannot be shown. - \section3 Cannot Run, Debug, or Stop Applications + \section2 Cannot run, debug, or stop applications The board support package (BSP) for the QNX device might be missing some of the following applications that \QC needs to run, debug, and stop @@ -49,5 +48,6 @@ \c printf, \c ps, \c read, \c sed, \c sleep, \c uname, \c slog2info, and \c cat. -//! [running on qnx] + \sa {Connecting QNX Devices}, {Run on many platforms}, {Compilers}, + {Embedded Platforms}, {kit-preferences}{Kits} */ diff --git a/doc/qtcreator/src/qtcreator-toc.qdoc b/doc/qtcreator/src/qtcreator-toc.qdoc index 60f8248b38c..26fb9aa33fa 100644 --- a/doc/qtcreator/src/qtcreator-toc.qdoc +++ b/doc/qtcreator/src/qtcreator-toc.qdoc @@ -49,7 +49,6 @@ \li \l{Previewing in Browsers} \endlist \li \l{Building for Multiple Platforms} - \li \l{Running on Multiple Platforms} \li \l{Deploying to Devices} \list \li \l{Deploying to Android} diff --git a/doc/qtcreator/src/qtcreator.qdoc b/doc/qtcreator/src/qtcreator.qdoc index aefa86c3946..85c60896ac7 100644 --- a/doc/qtcreator/src/qtcreator.qdoc +++ b/doc/qtcreator/src/qtcreator.qdoc @@ -57,7 +57,6 @@ \list \li \l{Validating with Target Hardware} \li \l{Building for Multiple Platforms} - \li \l{Running on Multiple Platforms} \li \l{Deploying to Devices} \li \l{Connecting Devices} \endlist diff --git a/doc/qtcreator/src/qtquick/creator-only/qtquick-states-scxml.qdocinc b/doc/qtcreator/src/qtquick/creator-only/qtquick-states-scxml.qdocinc index 0195f0e1cf2..1f0fd5a8e01 100644 --- a/doc/qtcreator/src/qtquick/creator-only/qtquick-states-scxml.qdocinc +++ b/doc/qtcreator/src/qtquick/creator-only/qtquick-states-scxml.qdocinc @@ -19,7 +19,7 @@ If you add animation to the states, you can \l{Validating with Target Hardware}{preview} - or \l{Running on Multiple Platforms}{run} + or \l{Run on many platforms}{run} the application to test the animation. //! [scxml state machines] diff --git a/doc/qtcreator/src/user-interface/creator-ui.qdoc b/doc/qtcreator/src/user-interface/creator-ui.qdoc index bf4bb2c455d..d70c94d90ee 100644 --- a/doc/qtcreator/src/user-interface/creator-ui.qdoc +++ b/doc/qtcreator/src/user-interface/creator-ui.qdoc @@ -40,7 +40,7 @@ \li \inlineimage numbers/03.png \li Run button \li Run the application on the selected target platform. - \li \l{Running on Multiple Platforms} + \li \l{Run on many platforms} \row \li \inlineimage numbers/04.png \li Debug button diff --git a/doc/qtcreator/src/webassembly/creator-webassembly.qdoc b/doc/qtcreator/src/webassembly/creator-webassembly.qdoc index f53830d29f8..e0ab35464c3 100644 --- a/doc/qtcreator/src/webassembly/creator-webassembly.qdoc +++ b/doc/qtcreator/src/webassembly/creator-webassembly.qdoc @@ -110,7 +110,7 @@ You can now build Qt applications in WebAssembly format and run them in a web browser as described in \l {Building for Multiple Platforms} and - \l{Running on Multiple Platforms}. + \l{Run on many platforms}. \sa {Enable and disable plugins} */ From 5a05044c0c037905a85a11961be1cb5776195817 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 13 Feb 2024 14:12:14 +0100 Subject: [PATCH 34/35] Doc: Turn Customizing the Build Process into a how-to topic - Update the screenshot of Preferences > Build & Run > General (there is a new option that will be described in another change) Task-number: QTCREATORBUG-29361 Task-number: QTCREATORBUG-30209 Change-Id: I62eaeef96b2d40dfec42022a4430da15c1590050 Reviewed-by: Christian Kandeler --- ...creator-preferences-build-run-general.webp | Bin 0 -> 13754 bytes .../qtcreator-project-options-deploy.png | Bin 21686 -> 0 bytes .../creator-projects-building-running.qdoc | 22 +------- .../creator-projects-builds-customizing.qdoc | 51 +++++++++++------- .../projects/creator-projects-running.qdoc | 2 +- doc/qtcreator/src/qtcreator-toc.qdoc | 1 - 6 files changed, 34 insertions(+), 42 deletions(-) create mode 100644 doc/qtcreator/images/qtcreator-preferences-build-run-general.webp delete mode 100644 doc/qtcreator/images/qtcreator-project-options-deploy.png diff --git a/doc/qtcreator/images/qtcreator-preferences-build-run-general.webp b/doc/qtcreator/images/qtcreator-preferences-build-run-general.webp new file mode 100644 index 0000000000000000000000000000000000000000..c7636894960c309e228f59a43e02407c7a07034b GIT binary patch literal 13754 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 \uicontrol {Build & Run} > \uicontrol General. - \image qtcreator-project-options-deploy.png "Project General preferences" + \image qtcreator-preferences-build-run-general.webp {Build & Run General preferences} - By default, the \uicontrol {Always deploy project before running it} (1) and - \uicontrol {Build the Whole Project} (2) options are enabled. Therefore, - when you select the \uicontrol Run function, \QC checks for changes in the - project files and also builds and deploys the project if necessary. + By default, \uicontrol {Always deploy project before running it} (1) and + \uicontrol {Build the Whole Project} (2) are selected. Therefore, when + you select \inlineimage icons/run_small.png (\uicontrol Run), \QC checks + for changes in the project files and also builds and deploys the project if + necessary. To deploy applications without building them or to just build the application that you want to run, select the appropriate options - in the \uicontrol {Build before deploying} field. + in \uicontrol {Build before deploying}. + + \section1 Stop applications before building By default, the applications that the project contains are stopped - before rebuilding the project. To stop just the current application, - the applications in the same build directory, all applications, - or no applications, select the appropriate option in the - \uicontrol {Stop applications before building} field. + before rebuilding the project. + + To stop just the current application, the applications in the same build + directory, all applications, or no applications, select the appropriate + option in \uicontrol {Stop applications before building}. + + \section1 Use jom On Windows, you can use \c jom instead of \c nmake for building the project - to distribute the compilation process to multiple CPU cores. You can download - \c jom from \l{http://download.qt.io/official_releases/jom}{Qt Downloads}. - To use \c jom, select the \uicontrol {Use jom instead of nmake} check box. - Deselect the check box if you experience build problems. + to distribute the compilation process to multiple CPU cores. + To use \c jom: + + \list 1 + \li Download \c jom from \l{http://download.qt.io/official_releases/jom} + {Qt Downloads}. + \li Select \uicontrol {Use jom instead of nmake}. + \endlist + + Clear the check box if builds fail. */ diff --git a/doc/qtcreator/src/projects/creator-projects-running.qdoc b/doc/qtcreator/src/projects/creator-projects-running.qdoc index 80eb0650e4e..43d80f08c8d 100644 --- a/doc/qtcreator/src/projects/creator-projects-running.qdoc +++ b/doc/qtcreator/src/projects/creator-projects-running.qdoc @@ -78,7 +78,7 @@ the application has large image files that would need to be bundled into the resource file before running the application. - \sa {Configure projects for running}, {Customizing the Build Process}, + \sa {Configure projects for running}, {Customize the build process}, {Run on QNX devices}, {Run on remote Linux devices}, {Run Python applications}, {Supported Platforms} */ diff --git a/doc/qtcreator/src/qtcreator-toc.qdoc b/doc/qtcreator/src/qtcreator-toc.qdoc index 26fb9aa33fa..9038a168073 100644 --- a/doc/qtcreator/src/qtcreator-toc.qdoc +++ b/doc/qtcreator/src/qtcreator-toc.qdoc @@ -68,7 +68,6 @@ \li \l{Connecting Remote Linux Devices} \li \l{Building Applications for the Web} \endlist - \li \l{Customizing the Build Process} \endlist \li \l{Testing} \list From 04d7f63186a0f7958990630f0c51f9b6230cf564 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 16 Feb 2024 10:47:40 +0100 Subject: [PATCH 35/35] Debugger: Fix Attach to QML Port This does not yet fix the reported problem but at least attaches and gives a working QML inspector in a QML-only debugging session. Task-number: QTCREATORBUG-30263 Change-Id: Ieac517c2b7c5dde24792f3bbcffe0058073ddbd1 Reviewed-by: Christian Stenger --- src/plugins/debugger/debuggerruncontrol.cpp | 5 +---- src/plugins/debugger/qml/qmlengine.cpp | 5 +++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/plugins/debugger/debuggerruncontrol.cpp b/src/plugins/debugger/debuggerruncontrol.cpp index 4a0f20b8d64..8ef76e7a75b 100644 --- a/src/plugins/debugger/debuggerruncontrol.cpp +++ b/src/plugins/debugger/debuggerruncontrol.cpp @@ -176,8 +176,8 @@ void DebuggerRunTool::setBreakOnMainNextTime() void DebuggerRunTool::setStartMode(DebuggerStartMode startMode) { + m_runParameters.startMode = startMode; if (startMode == AttachToQmlServer) { - m_runParameters.startMode = AttachToRemoteProcess; m_runParameters.cppEngineType = NoEngineType; m_runParameters.isQmlDebugging = true; m_runParameters.closeMode = KillAtClose; @@ -194,9 +194,6 @@ void DebuggerRunTool::setStartMode(DebuggerStartMode startMode) m_runParameters.projectSourceFiles.append(project->files(Project::SourceFiles)); if (!projects.isEmpty()) m_runParameters.projectSourceDirectory = projects.first()->projectDirectory(); - - } else { - m_runParameters.startMode = startMode; } } diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp index d271d15c5a5..2ffe5bf313a 100644 --- a/src/plugins/debugger/qml/qmlengine.cpp +++ b/src/plugins/debugger/qml/qmlengine.cpp @@ -547,9 +547,10 @@ void QmlEngine::setupEngine() if (isPrimaryEngine()) { // QML only. - if (runParameters().startMode == AttachToRemoteServer) + const DebuggerStartMode startMode = runParameters().startMode; + if (startMode == AttachToQmlServer || startMode == AttachToRemoteServer) tryToConnect(); - else if (runParameters().startMode == AttachToRemoteProcess) + else if (startMode == AttachToRemoteProcess) beginConnection(); else startProcess();