From 280545fdf89fe92b6f2b6b28e2c4d86c862c3d71 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 11 Mar 2021 16:09:18 +0100 Subject: [PATCH 01/23] Editors: Fix soft assert about empty currentView We need to always either have a current view or a current editor. Make sure we set the current view if we end up without a current editor when closing files. Amends ee1e6ca50821ace4323a0838452dda59b1a352a2 Fixes: QTCREATORBUG-24869 Change-Id: I9e1982697700079e037695e100ef71eadaf7849f Reviewed-by: David Schulz --- src/plugins/coreplugin/editormanager/editormanager.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 36c1ae3634d..f45b49ae1b9 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -1743,10 +1743,12 @@ bool EditorManagerPrivate::closeEditors(const QList &editors, CloseFla foreach (IEditor *editor, acceptedEditors) delete editor; - if (focusView) + if (focusView) { activateView(focusView); - else + } else { + setCurrentView(currentView); setCurrentEditor(currentView->currentEditor()); + } if (!EditorManager::currentEditor()) { emit m_instance->currentEditorChanged(nullptr); From 2ec094b4192d7ab2549f83657b8479d2c8a11bf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20L=C3=B6hning?= Date: Thu, 4 Mar 2021 22:08:03 +0100 Subject: [PATCH 02/23] Squish: Prepare for clang > 9 Change-Id: I4cf6e8be63568d56388b0cf87ae692735bf4c113 Reviewed-by: Christian Stenger --- tests/system/suite_general/tst_default_settings/test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/system/suite_general/tst_default_settings/test.py b/tests/system/suite_general/tst_default_settings/test.py index 9a15e2b8fae..c8daf5a0c72 100644 --- a/tests/system/suite_general/tst_default_settings/test.py +++ b/tests/system/suite_general/tst_default_settings/test.py @@ -209,7 +209,8 @@ def __getExpectedCompilers__(): expected.extend(__getWinCompilers__()) compilers = ["g++", "gcc"] if platform.system() in ('Linux', 'Darwin'): - for c in ('clang++', 'clang', 'afl-clang', 'clang-[0-9]', 'clang-[0-9].[0-9]', + for c in ('clang++', 'clang', 'afl-clang', + 'clang-[0-9]', 'clang-[0-9].[0-9]', 'clang-1[0-9]', 'clang-1[0-9].[0-9]', '*g++*', '*gcc*'): compilers.extend(findAllFilesInPATH(c)) if platform.system() == 'Darwin': From 1f3cd3c70fb38e570f44e17b2c8e2c6bad54f11c Mon Sep 17 00:00:00 2001 From: Ivan Komissarov Date: Mon, 15 Mar 2021 17:01:57 +0300 Subject: [PATCH 03/23] Update Qbs submodule to the top of 1.18 branch Change-Id: Ifa6522e01b32c48e830c395347e891a89c9ad35a Reviewed-by: Eike Ziller --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/qbs b/src/shared/qbs index 481c2a0a47d..0d42ca4d0f8 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 481c2a0a47d9c97bfa3d09869591e47e37f75c0b +Subproject commit 0d42ca4d0f8b0866b51ac9587f68a6550ca6d3fe From 85533cce0fc3dffc71a4833dc111471c69e3443e Mon Sep 17 00:00:00 2001 From: Tuomo Pelkonen Date: Tue, 16 Mar 2021 12:08:58 +0200 Subject: [PATCH 04/23] QmlDesigner: Use correct font in Text-edit based in-place editor Task-number: QDS-2306 Change-Id: I47d886f013692be717b4dffd29d66c711b0760cf Reviewed-by: Thomas Hartmann --- .../qmldesigner/components/texttool/textedititem.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/components/texttool/textedititem.cpp b/src/plugins/qmldesigner/components/texttool/textedititem.cpp index d965c4b7fd5..e689fc4a571 100644 --- a/src/plugins/qmldesigner/components/texttool/textedititem.cpp +++ b/src/plugins/qmldesigner/components/texttool/textedititem.cpp @@ -70,15 +70,17 @@ void TextEditItem::setFormEditorItem(FormEditorItem *formEditorItem) setGeometry(rect); NodeMetaInfo metaInfo = m_formEditorItem->qmlItemNode().modelNode().metaInfo(); + auto node = m_formEditorItem->qmlItemNode(); + auto font = node.instanceValue("font").value(); if (metaInfo.isValid() && (metaInfo.isSubclassOf("QtQuick.TextEdit") || metaInfo.isSubclassOf("QtQuick.Controls.TextArea"))) { QSize maximumSize = rect.size().toSize(); + textEdit()->setFont(font); activateTextEdit(maximumSize); } else { auto lineEdit = TextEditItemWidget::lineEdit(); - auto node = m_formEditorItem->qmlItemNode(); - lineEdit->setFont(node.instanceValue("font").value()); + lineEdit->setFont(font); activateLineEdit(); } From c218f77f7e1733b9abd03c60a76d9bed782ddf4c Mon Sep 17 00:00:00 2001 From: David Schulz Date: Fri, 12 Mar 2021 13:49:13 +0100 Subject: [PATCH 05/23] LanguageClient: compress documentHighlight requests Change-Id: I98707a61a228c66966c72f6b4da2470b6f53820e Reviewed-by: Christian Stenger --- src/plugins/languageclient/client.cpp | 162 +++++++++++------- src/plugins/languageclient/client.h | 2 + .../languageclient/languageclientmanager.cpp | 13 +- 3 files changed, 108 insertions(+), 69 deletions(-) diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index ce2184d303a..39822bccb49 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -140,6 +140,8 @@ Client::~Client() } for (IAssistProcessor *processor : qAsConst(m_runningAssistProcessors)) processor->setAsyncProposalAvailable(nullptr); + qDeleteAll(m_documentHighlightsTimer); + m_documentHighlightsTimer.clear(); updateEditorToolBar(m_openedDocument.keys()); // do not handle messages while shutting down disconnect(m_clientInterface.data(), &BaseClientInterface::messageReceived, @@ -431,6 +433,64 @@ void Client::updateFunctionHintProvider(TextEditor::TextDocument *document) } } +void Client::requestDocumentHighlights(TextEditor::TextEditorWidget *widget) +{ + const auto uri = DocumentUri::fromFilePath(widget->textDocument()->filePath()); + if (m_dynamicCapabilities.isRegistered(DocumentHighlightsRequest::methodName).value_or(false)) { + TextDocumentRegistrationOptions option( + m_dynamicCapabilities.option(DocumentHighlightsRequest::methodName)); + if (!option.filterApplies(widget->textDocument()->filePath())) + return; + } else { + Utils::optional> provider + = m_serverCapabilities.documentHighlightProvider(); + if (!provider.has_value()) + return; + if (Utils::holds_alternative(*provider) && !Utils::get(*provider)) + return; + } + + auto runningRequest = m_highlightRequests.find(uri); + if (runningRequest != m_highlightRequests.end()) + cancelRequest(runningRequest.value()); + + DocumentHighlightsRequest request( + TextDocumentPositionParams(TextDocumentIdentifier(uri), Position(widget->textCursor()))); + request.setResponseCallback( + [widget = QPointer(widget), this, uri] + (const DocumentHighlightsRequest::Response &response) + { + m_highlightRequests.remove(uri); + if (!widget) + return; + + const Id &id = TextEditor::TextEditorWidget::CodeSemanticsSelection; + QList selections; + const Utils::optional &result = response.result(); + if (!result.has_value() || holds_alternative(result.value())) { + widget->setExtraSelections(id, selections); + return; + } + + const QTextCharFormat &format = + widget->textDocument()->fontSettings().toTextCharFormat(TextEditor::C_OCCURRENCES); + QTextDocument *document = widget->document(); + for (const auto &highlight : get>(result.value())) { + QTextEdit::ExtraSelection selection{widget->textCursor(), format}; + const int &start = highlight.range().start().toPositionInDocument(document); + const int &end = highlight.range().end().toPositionInDocument(document); + if (start < 0 || end < 0) + continue; + selection.cursor.setPosition(start); + selection.cursor.setPosition(end, QTextCursor::KeepAnchor); + selections << selection; + } + widget->setExtraSelections(id, selections); + }); + m_highlightRequests[uri] = request.id(); + sendContent(request); +} + void Client::activateDocument(TextEditor::TextDocument *document) { auto uri = DocumentUri::fromFilePath(document->filePath()); @@ -447,11 +507,11 @@ void Client::activateDocument(TextEditor::TextDocument *document) for (Core::IEditor *editor : Core::DocumentModel::editorsForDocument(document)) { updateEditorToolBar(editor); if (auto textEditor = qobject_cast(editor)) { - textEditor->editorWidget()->addHoverHandler(&m_hoverHandler); - if (symbolSupport().supportsRename(document)) { - textEditor->editorWidget()->addOptionalActions( - TextEditor::TextEditorActionHandler::RenameSymbol); - } + TextEditor::TextEditorWidget *widget = textEditor->editorWidget(); + widget->addHoverHandler(&m_hoverHandler); + requestDocumentHighlights(widget); + if (symbolSupport().supportsRename(document)) + widget->addOptionalActions(TextEditor::TextEditorActionHandler::RenameSymbol); } } } @@ -466,8 +526,11 @@ void Client::deactivateDocument(TextEditor::TextDocument *document) highlighter->clearAllExtraFormats(); } for (Core::IEditor *editor : Core::DocumentModel::editorsForDocument(document)) { - if (auto textEditor = qobject_cast(editor)) - textEditor->editorWidget()->removeHoverHandler(&m_hoverHandler); + if (auto textEditor = qobject_cast(editor)) { + TextEditor::TextEditorWidget *widget = textEditor->editorWidget(); + widget->removeHoverHandler(&m_hoverHandler); + widget->setExtraSelections(TextEditor::TextEditorWidget::CodeSemanticsSelection, {}); + } } } @@ -629,61 +692,38 @@ TextEditor::HighlightingResult createHighlightingResult(const SymbolInformation void Client::cursorPositionChanged(TextEditor::TextEditorWidget *widget) { - if (m_documentsToUpdate.contains(widget->textDocument())) + TextEditor::TextDocument *document = widget->textDocument(); + if (m_documentsToUpdate.contains(document)) return; // we are currently changing this document so postpone the DocumentHighlightsRequest - const auto uri = DocumentUri::fromFilePath(widget->textDocument()->filePath()); - if (m_dynamicCapabilities.isRegistered(DocumentHighlightsRequest::methodName).value_or(false)) { - TextDocumentRegistrationOptions option( - m_dynamicCapabilities.option(DocumentHighlightsRequest::methodName)); - if (!option.filterApplies(widget->textDocument()->filePath())) - return; - } else { - Utils::optional> provider - = m_serverCapabilities.documentHighlightProvider(); - if (!provider.has_value()) - return; - if (Utils::holds_alternative(*provider) && !Utils::get(*provider)) - return; + QTimer *timer = m_documentHighlightsTimer[widget]; + if (!timer) { + const auto uri = DocumentUri::fromFilePath(widget->textDocument()->filePath()); + auto runningRequest = m_highlightRequests.find(uri); + if (runningRequest != m_highlightRequests.end()) + cancelRequest(runningRequest.value()); + timer = new QTimer; + timer->setSingleShot(true); + m_documentHighlightsTimer.insert(widget, timer); + connect(timer, &QTimer::timeout, this, [this, widget]() { + requestDocumentHighlights(widget); + m_documentHighlightsTimer.take(widget)->deleteLater(); + }); + connect(widget, &QWidget::destroyed, this, [widget, this]() { + delete m_documentHighlightsTimer.take(widget); + }); } - - auto runningRequest = m_highlightRequests.find(uri); - if (runningRequest != m_highlightRequests.end()) - cancelRequest(runningRequest.value()); - - DocumentHighlightsRequest request( - TextDocumentPositionParams(TextDocumentIdentifier(uri), Position(widget->textCursor()))); - request.setResponseCallback( - [widget = QPointer(widget), this, uri] - (DocumentHighlightsRequest::Response response) - { - m_highlightRequests.remove(uri); - if (!widget) - return; - - QList selections; - const DocumentHighlightsResult result = response.result().value_or(DocumentHighlightsResult()); - if (!holds_alternative>(result)) { - widget->setExtraSelections(TextEditor::TextEditorWidget::CodeSemanticsSelection, selections); - return; - } - - const QTextCharFormat &format = - widget->textDocument()->fontSettings().toTextCharFormat(TextEditor::C_OCCURRENCES); - QTextDocument *document = widget->document(); - for (const auto &highlight : get>(result)) { - QTextEdit::ExtraSelection selection{widget->textCursor(), format}; - const int &start = highlight.range().start().toPositionInDocument(document); - const int &end = highlight.range().end().toPositionInDocument(document); - if (start < 0 || end < 0) - continue; - selection.cursor.setPosition(start); - selection.cursor.setPosition(end, QTextCursor::KeepAnchor); - selections << selection; - } - widget->setExtraSelections(TextEditor::TextEditorWidget::CodeSemanticsSelection, selections); - }); - m_highlightRequests[uri] = request.id(); - sendContent(request); + const Id selectionsId(TextEditor::TextEditorWidget::CodeSemanticsSelection); + const QList semanticSelections = widget->extraSelections(selectionsId); + if (!semanticSelections.isEmpty()) { + auto selectionContainsPos = + [pos = widget->position()](const QTextEdit::ExtraSelection &selection) { + const QTextCursor cursor = selection.cursor; + return cursor.selectionStart() <= pos && cursor.selectionEnd() >= pos; + }; + if (!Utils::anyOf(semanticSelections, selectionContainsPos)) + widget->setExtraSelections(selectionsId, {}); + } + timer->start(250); } SymbolSupport &Client::symbolSupport() @@ -887,6 +927,8 @@ bool Client::reset() for (TextEditor::IAssistProcessor *processor : qAsConst(m_runningAssistProcessors)) processor->setAsyncProposalAvailable(nullptr); m_runningAssistProcessors.clear(); + qDeleteAll(m_documentHighlightsTimer); + m_documentHighlightsTimer.clear(); return true; } diff --git a/src/plugins/languageclient/client.h b/src/plugins/languageclient/client.h index e3edbf88b52..dfb2d660659 100644 --- a/src/plugins/languageclient/client.h +++ b/src/plugins/languageclient/client.h @@ -197,6 +197,7 @@ private: void updateCompletionProvider(TextEditor::TextDocument *document); void updateFunctionHintProvider(TextEditor::TextDocument *document); + void requestDocumentHighlights(TextEditor::TextEditorWidget *widget); void rehighlight(); using ContentHandler = std::function> m_documentsToUpdate; + QMap m_documentHighlightsTimer; QTimer m_documentUpdateTimer; Utils::Id m_id; LanguageServerProtocol::ServerCapabilities m_serverCapabilities; diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp index 2f69bada526..412c3042d65 100644 --- a/src/plugins/languageclient/languageclientmanager.cpp +++ b/src/plugins/languageclient/languageclientmanager.cpp @@ -432,15 +432,10 @@ void LanguageClientManager::editorOpened(Core::IEditor *editor) if (auto client = clientForDocument(document)) client->symbolSupport().renameSymbol(document, cursor); }); - connect(widget, &TextEditorWidget::cursorPositionChanged, this, [this, widget]() { - // TODO This would better be a compressing timer - QTimer::singleShot(50, this, [widget = QPointer(widget)]() { - if (!widget) - return; - if (Client *client = clientForDocument(widget->textDocument())) - if (client->reachable()) - client->cursorPositionChanged(widget); - }); + connect(widget, &TextEditorWidget::cursorPositionChanged, this, [widget]() { + if (Client *client = clientForDocument(widget->textDocument())) + if (client->reachable()) + client->cursorPositionChanged(widget); }); updateEditorToolBar(editor); if (TextEditor::TextDocument *document = textEditor->textDocument()) { From 012edb2d77779faac336622c534066fba3efc28e Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 16 Mar 2021 09:39:56 +0100 Subject: [PATCH 06/23] Doc: Update MCU info - Use the term "component" instead of QML type - Update screenshot with the new Library layout - Link to the new topics for Library and Properties views Task-number: QDS-3778 Change-Id: I123e3c2050075b17a8944e0d6dc4e6aadc1905a8 Reviewed-by: Thomas Hartmann --- .../images/qmldesigner-mcu-support.png | Bin 61037 -> 25658 bytes .../src/mcu/qtquick-mcu-support.qdocinc | 26 +++++++++--------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/doc/qtcreator/images/qmldesigner-mcu-support.png b/doc/qtcreator/images/qmldesigner-mcu-support.png index e2dc8fd4d182673cd2d3722d33aa504facb4684c..23d3c0ce3d445ec639472da322473be265a0e5c3 100644 GIT binary patch literal 25658 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 literal 61037 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 diff --git a/doc/qtcreator/src/mcu/qtquick-mcu-support.qdocinc b/doc/qtcreator/src/mcu/qtquick-mcu-support.qdocinc index c5ce96b9d72..124f2cad227 100644 --- a/doc/qtcreator/src/mcu/qtquick-mcu-support.qdocinc +++ b/doc/qtcreator/src/mcu/qtquick-mcu-support.qdocinc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2020 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Creator documentation. @@ -28,22 +28,22 @@ \section1 Creating UIs for MCUs - \l{Qt for MCUs} enables you to use subsets of QML and Qt Quick Controls - types to create UIs for devices that are powered by microcontroller units - (MCU). The subset of supported types depends on the Qt for MCUs version - that you use for development. In this manual, we indicate which components - are supported at the time of writing. + \l{Qt for MCUs} enables you to use subsets of components to create UIs for + devices that are powered by microcontroller units (MCU). The subset of + supported components depends on the Qt for MCUs version that you use for + development. In this manual, we indicate which components are supported at + the time of writing. To develop for MCUs, \l{Using Project Wizards}{create an MCU project}. Only - the types available on MCUs are displayed in the \uicontrol {QML Types} tab - in \uicontrol Library. Only a subset of properties is supported for the - supported types. The properties that are not available on MCUs are marked - in the \uicontrol Properties view by enclosing them in square brackets. + the components available on MCUs are displayed in the \uicontrol Components + tab in \l Library. Only a subset of properties is supported for the + supported components. The properties that are not available on MCUs are + marked in the \l Properties view by enclosing them in square brackets. - \image qmldesigner-mcu-support.png "QML types and Image type properties supported for MCUs" + \image qmldesigner-mcu-support.png "Components and Image properties supported for MCUs" - For more information about the supported QML types and their properties, see - \l{Qt for MCUs - All QML Types}. + For more information about the supported components and their properties, + see \l{Qt for MCUs - All QML Types}. //! [mcu qtquick components] */ From 65d2f87f6c577f51d9324075dd4cb5cfa2e99028 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 16 Mar 2021 13:10:53 +0100 Subject: [PATCH 07/23] Editors: Fix another soft assert about current view Task-number: QTCREATORBUG-24869 Change-Id: I575153a909f398ade4dce4edbb4927ea0d35c20f Reviewed-by: Christian Stenger --- src/plugins/coreplugin/editormanager/editormanager.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index f45b49ae1b9..ff4902457cb 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -1730,6 +1730,11 @@ bool EditorManagerPrivate::closeEditors(const QList &editors, CloseFla if (IDocument *document = documents.last()->document) { activateEditorForDocument(view, document, flags); } + } else { + // no documents left - set current view since view->removeEditor can + // trigger a focus change, context change, and updateActions, which + // requests the current EditorView + setCurrentView(currentView); } } } From 5b942b9e887e5afbe3bcc57a7f8933c7a966021a Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 16 Mar 2021 10:59:44 +0100 Subject: [PATCH 08/23] QmlDesigner: Fix compilation for Qt 6 For Qt versions below 5.15 and Qt 6 we can continue to use the internal version. Change-Id: Ia314fe9db323b0d5ea6acbb70bf1cb1098b4ae93 Reviewed-by: Christian Stenger Reviewed-by: Eike Ziller --- .../qml/qmlpuppet/qmlprivategate/qmlprivategate_56.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate_56.cpp b/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate_56.cpp index 467e85c3b15..7e5af01944c 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate_56.cpp +++ b/share/qtcreator/qml/qmlpuppet/qmlprivategate/qmlprivategate_56.cpp @@ -58,6 +58,8 @@ bool isPropertyBlackListed(const QmlDesigner::PropertyName &propertyName) return QQuickDesignerSupportProperties::isPropertyBlackListed(propertyName); } +#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) && (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)) + static void addToPropertyNameListIfNotBlackListed( PropertyNameList *propertyNameList, const QQuickDesignerSupport::PropertyName &propertyName) { @@ -132,12 +134,19 @@ PropertyNameList allPropertyNamesInline(QObject *object, return propertyNameList; } +#endif PropertyNameList allPropertyNames(QObject *object, const PropertyName &baseName, QObjectList *inspectedObjects) { +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + return QQuickDesignerSupportProperties::allPropertyNames(object, baseName, inspectedObjects); +#elif QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) return allPropertyNamesInline(object, baseName, inspectedObjects); +#else + return QQuickDesignerSupportProperties::allPropertyNames(object, baseName, inspectedObjects); +#endif } PropertyNameList propertyNameListForWritableProperties(QObject *object, From 2bcc33e0109419d1e977fc4b2c8f060ccbfae5e4 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 16 Mar 2021 15:39:51 +0100 Subject: [PATCH 09/23] Bump version to 4.15 beta2 Change-Id: I29436ee542d1f35e8117d670ea5cadd172432b94 Reviewed-by: Eike Ziller --- cmake/QtCreatorIDEBranding.cmake | 6 +++--- qbs/modules/qtc/qtc.qbs | 6 +++--- qtcreator_ide_branding.pri | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cmake/QtCreatorIDEBranding.cmake b/cmake/QtCreatorIDEBranding.cmake index 65002029f78..d34d26a90a6 100644 --- a/cmake/QtCreatorIDEBranding.cmake +++ b/cmake/QtCreatorIDEBranding.cmake @@ -1,6 +1,6 @@ -set(IDE_VERSION "4.14.82") # The IDE version. -set(IDE_VERSION_COMPAT "4.14.82") # The IDE Compatibility version. -set(IDE_VERSION_DISPLAY "4.15.0-beta1") # The IDE display version. +set(IDE_VERSION "4.14.83") # The IDE version. +set(IDE_VERSION_COMPAT "4.14.83") # The IDE Compatibility version. +set(IDE_VERSION_DISPLAY "4.15.0-beta2") # The IDE display version. set(IDE_COPYRIGHT_YEAR "2021") # 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 3c7857e4e22..c96195ce756 100644 --- a/qbs/modules/qtc/qtc.qbs +++ b/qbs/modules/qtc/qtc.qbs @@ -3,16 +3,16 @@ import qbs.Environment import qbs.FileInfo Module { - property string qtcreator_display_version: '4.15.0-beta1' + property string qtcreator_display_version: '4.15.0-beta2' property string ide_version_major: '4' property string ide_version_minor: '14' - 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: '4' property string ide_compat_version_minor: '14' - 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 diff --git a/qtcreator_ide_branding.pri b/qtcreator_ide_branding.pri index ca4794bd1ad..35fa061c2b2 100644 --- a/qtcreator_ide_branding.pri +++ b/qtcreator_ide_branding.pri @@ -1,6 +1,6 @@ -QTCREATOR_VERSION = 4.14.82 -QTCREATOR_COMPAT_VERSION = 4.14.82 -QTCREATOR_DISPLAY_VERSION = 4.15.0-beta1 +QTCREATOR_VERSION = 4.14.83 +QTCREATOR_COMPAT_VERSION = 4.14.83 +QTCREATOR_DISPLAY_VERSION = 4.15.0-beta2 QTCREATOR_COPYRIGHT_YEAR = 2021 IDE_DISPLAY_NAME = Qt Creator From d41d59774a7ca003fce131b23ff3b0cce487eff4 Mon Sep 17 00:00:00 2001 From: Knud Dollereder Date: Mon, 15 Mar 2021 15:31:52 +0100 Subject: [PATCH 10/23] Apply new theming colors to the curveeditor Change-Id: Ia919bfda4db1205b9c30ece247d2e3d49a6362ed Reviewed-by: Thomas Hartmann --- .../curveeditor/curveeditormodel.cpp | 6 +-- .../curveeditor/detail/graphicsview.cpp | 8 +++ .../timelineeditor/preseteditor.cpp | 50 ++++++++++++------- .../components/timelineeditor/preseteditor.h | 13 ++++- 4 files changed, 55 insertions(+), 22 deletions(-) diff --git a/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.cpp b/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.cpp index ab3caa3966e..6b52b3d1db1 100644 --- a/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.cpp @@ -63,9 +63,9 @@ CurveEditorStyle CurveEditorModel::style() const { // Pseudo auto generated. See: CurveEditorStyleDialog CurveEditorStyle out; - out.backgroundBrush = QBrush(QColor(21, 21, 21)); - out.backgroundAlternateBrush = QBrush(QColor(32, 32, 32)); - out.fontColor = QColor(255, 255, 255); + out.backgroundBrush = QmlDesigner::Theme::getColor(QmlDesigner::Theme::DSsectionHeadBackground); + out.backgroundAlternateBrush = QmlDesigner::Theme::getColor(QmlDesigner::Theme::DSpanelBackground); + out.fontColor = QmlDesigner::Theme::getColor(QmlDesigner::Theme::DStextColor); out.gridColor = QColor(114, 116, 118); out.canvasMargin = 15; out.zoomInWidth = 99; diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp index b27015aa97f..9324059cf79 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp @@ -31,6 +31,9 @@ #include "treeitem.h" #include "utils.h" +#include +#include + #include #include #include @@ -84,6 +87,11 @@ GraphicsView::GraphicsView(CurveEditorModel *model, QWidget *parent) applyZoom(m_zoomX, m_zoomY); update(); + + const QString css = Theme::replaceCssColors(QString::fromUtf8( + Utils::FileReader::fetchQrc(QLatin1String(":/qmldesigner/scrollbar.css")))); + horizontalScrollBar()->setStyleSheet(css); + verticalScrollBar()->setStyleSheet(css); } GraphicsView::~GraphicsView() diff --git a/src/plugins/qmldesigner/components/timelineeditor/preseteditor.cpp b/src/plugins/qmldesigner/components/timelineeditor/preseteditor.cpp index 2ef68f24b48..f755e4863e5 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/preseteditor.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/preseteditor.cpp @@ -55,11 +55,10 @@ constexpr int spacingg = 5; const QColor background = Qt::white; -const QColor labelBackground = qRgb(0x70, 0x70, 0x70); -const QColor canvasBackground = qRgb(0x46, 0x46, 0x46); -const QColor curveLine = qRgb(0xe6, 0xe7, 0xe8); - -PresetItemDelegate::PresetItemDelegate() = default; +PresetItemDelegate::PresetItemDelegate(const QColor& background) + : QStyledItemDelegate() + , m_background(background) +{} void PresetItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &opt, @@ -80,10 +79,10 @@ void PresetItemDelegate::paint(QPainter *painter, option.font.setPixelSize(Theme::instance()->smallFontPixelSize()); painter->save(); - painter->fillRect(option.rect, canvasBackground); + painter->fillRect(option.rect, m_background); if (option.text.isEmpty()) - painter->fillRect(textRect, canvasBackground); + painter->fillRect(textRect, m_background); else painter->fillRect(textRect, Theme::instance()->qmlDesignerButtonColor()); @@ -118,23 +117,25 @@ QSize PresetItemDelegate::sizeHint(const QStyleOptionViewItem &opt, const QModel return size; } -QIcon paintPreview() +QIcon paintPreview(const QColor& background) { QPixmap pm(iconWidth, iconHeight); - pm.fill(canvasBackground); + pm.fill(background); return QIcon(pm); } -QIcon paintPreview(const EasingCurve &curve) +QIcon paintPreview(const EasingCurve &curve, const QColor& background, const QColor& curveColor) { + const QColor curveLine = Theme::getColor(Theme::DStextColor); + QPixmap pm(iconWidth, iconHeight); - pm.fill(canvasBackground); + pm.fill(background); QPainter painter(&pm); painter.setRenderHint(QPainter::Antialiasing, true); Canvas canvas(iconWidth, iconHeight, 2, 2, 9, 6, 0, 1); - canvas.paintCurve(&painter, curve, curveLine); + canvas.paintCurve(&painter, curve, curveColor); return QIcon(pm); } @@ -159,6 +160,8 @@ PresetList::PresetList(QSettings::Scope scope, QWidget *parent) , m_scope(scope) , m_index(-1) , m_filename(Internal::settingsFullFilePath(scope)) + , m_background(Theme::getColor(Theme::DSsectionHeadBackground )) + , m_curveColor(Theme::getColor(Theme::DStextColor)) { int magic = 4; int scrollBarWidth = this->style()->pixelMetric(QStyle::PM_ScrollBarExtent); @@ -168,7 +171,7 @@ PresetList::PresetList(QSettings::Scope scope, QWidget *parent) setModel(new QStandardItemModel); - setItemDelegate(new PresetItemDelegate); + setItemDelegate(new PresetItemDelegate(m_background)); setSpacing(spacingg); @@ -260,6 +263,16 @@ bool PresetList::isEditable(const QModelIndex &index) const return flags.testFlag(Qt::ItemIsEditable); } +QColor PresetList::backgroundColor() const +{ + return m_background; +} + +QColor PresetList::curveColor() const +{ + return m_curveColor; +} + void PresetList::initialize(int index) { m_index = index; @@ -278,7 +291,7 @@ void PresetList::readPresets() for (int i = 0; i < curves.size(); ++i) { QVariant curveData = QVariant::fromValue(curves[i].curve()); - auto *item = new QStandardItem(paintPreview(curves[i].curve()), curves[i].name()); + auto *item = new QStandardItem(paintPreview(curves[i].curve(), m_background, m_curveColor), curves[i].name()); item->setData(curveData, ItemRole_Data); item->setEditable(m_scope == QSettings::UserScope); item->setToolTip(curves[i].name()); @@ -320,7 +333,7 @@ void PresetList::revert(const QModelIndex &index) for (const auto &curve : curves) { if (curve.name() == name) { item->setData(false, ItemRole_Dirty); - item->setData(paintPreview(curve.curve()), Qt::DecorationRole); + item->setData(paintPreview(curve.curve(), m_background, m_curveColor), Qt::DecorationRole); item->setData(QVariant::fromValue(curve.curve()), ItemRole_Data); item->setToolTip(name); return; @@ -334,7 +347,7 @@ void PresetList::updateCurve(const EasingCurve &curve) if (!selectionModel()->hasSelection()) return; - QVariant icon = QVariant::fromValue(paintPreview(curve)); + QVariant icon = QVariant::fromValue(paintPreview(curve, m_background, m_curveColor)); QVariant curveData = QVariant::fromValue(curve); for (const auto &index : selectionModel()->selectedIndexes()) @@ -382,7 +395,7 @@ void PresetList::createItem() void PresetList::createItem(const QString &name, const EasingCurve &curve) { - auto *item = new QStandardItem(paintPreview(curve), name); + auto *item = new QStandardItem(paintPreview(curve, m_background, m_curveColor), name); item->setData(QVariant::fromValue(curve), ItemRole_Data); item->setToolTip(name); @@ -507,7 +520,8 @@ void PresetEditor::update(const EasingCurve &curve) m_presets->selectionModel()->clear(); else { if (m_customs->selectionModel()->hasSelection()) { - QVariant icon = QVariant::fromValue(paintPreview(curve)); + QVariant icon = QVariant::fromValue( + paintPreview(curve, m_presets->backgroundColor(), m_presets->curveColor())); QVariant curveData = QVariant::fromValue(curve); for (const QModelIndex &index : m_customs->selectionModel()->selectedIndexes()) m_customs->setItemData(index, curveData, icon); diff --git a/src/plugins/qmldesigner/components/timelineeditor/preseteditor.h b/src/plugins/qmldesigner/components/timelineeditor/preseteditor.h index 6fab3e7adbb..4e805fcf2b2 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/preseteditor.h +++ b/src/plugins/qmldesigner/components/timelineeditor/preseteditor.h @@ -43,13 +43,16 @@ class PresetItemDelegate : public QStyledItemDelegate Q_OBJECT public: - PresetItemDelegate(); + PresetItemDelegate(const QColor& background); void paint(QPainter *painter, const QStyleOptionViewItem &opt, const QModelIndex &index) const override; QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override; + +private: + QColor m_background; }; class PresetList : public QListView @@ -80,6 +83,10 @@ public: bool isEditable(const QModelIndex &index) const; + QColor backgroundColor() const; + + QColor curveColor() const; + void initialize(int index); void readPresets(); @@ -118,6 +125,10 @@ private: int m_index; QString m_filename; + + QColor m_background; + + QColor m_curveColor; }; class PresetEditor : public QStackedWidget From f0983a08c9d3825dbf902dc694d97ff024bf0d9a Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Tue, 16 Mar 2021 11:54:53 +0100 Subject: [PATCH 11/23] QmlDesigner: Replace CSS color role * Replace color role in CSS * Add hover and focus state in CSS * Fix hex color value in creator themes Change-Id: I59626f369e2c02089f22bd51557d8226e2dc3631 Reviewed-by: Thomas Hartmann --- share/qtcreator/themes/default.creatortheme | 2 +- share/qtcreator/themes/design-light.creatortheme | 2 +- share/qtcreator/themes/flat-light.creatortheme | 2 +- .../qmldesigner/components/resources/stylesheet.css | 12 +++++++++++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/share/qtcreator/themes/default.creatortheme b/share/qtcreator/themes/default.creatortheme index dcca311d9e7..6b856d7f34e 100644 --- a/share/qtcreator/themes/default.creatortheme +++ b/share/qtcreator/themes/default.creatortheme @@ -96,7 +96,7 @@ DSdockWidgetSplitter=ff595959 DSdockWidgetTitleBar=ffeaeaea DStitleBarText=ffdadada -DStitleBarIcon=f4f5052 +DStitleBarIcon=ff4f5052 DStitleBarButtonHover=40ffffff DStitleBarButtonPress=60ffffff diff --git a/share/qtcreator/themes/design-light.creatortheme b/share/qtcreator/themes/design-light.creatortheme index 44b4109dd24..17783db3c0c 100644 --- a/share/qtcreator/themes/design-light.creatortheme +++ b/share/qtcreator/themes/design-light.creatortheme @@ -110,7 +110,7 @@ DSdockWidgetSplitter=ff595959 DSdockWidgetTitleBar=ffeaeaea DStitleBarText=ffdadada -DStitleBarIcon=f4f5052 +DStitleBarIcon=ff4f5052 DStitleBarButtonHover=40ffffff DStitleBarButtonPress=60ffffff diff --git a/share/qtcreator/themes/flat-light.creatortheme b/share/qtcreator/themes/flat-light.creatortheme index 21be06f7eef..123c680fc6a 100644 --- a/share/qtcreator/themes/flat-light.creatortheme +++ b/share/qtcreator/themes/flat-light.creatortheme @@ -105,7 +105,7 @@ DSdockWidgetSplitter=ff595959 DSdockWidgetTitleBar=ffeaeaea DStitleBarText=ffdadada -DStitleBarIcon=f4f5052 +DStitleBarIcon=ff4f5052 DStitleBarButtonHover=40ffffff DStitleBarButtonPress=60ffffff diff --git a/src/plugins/qmldesigner/components/resources/stylesheet.css b/src/plugins/qmldesigner/components/resources/stylesheet.css index dfc80a5b594..501e9ab1d5d 100644 --- a/src/plugins/qmldesigner/components/resources/stylesheet.css +++ b/src/plugins/qmldesigner/components/resources/stylesheet.css @@ -81,7 +81,17 @@ QTabBar::tab:selected { QLineEdit { color: creatorTheme.DStextColor; - background-color: creatorTheme.DSdockAreaBackground; + background-color: creatorTheme.DScontrolBackground; + border: 1px solid creatorTheme.DScontrolOutline; selection-color: creatorTheme.DStextSelectedTextColor; selection-background-color: creatorTheme.DStextSelectionColor; } + +QLineEdit:hover { + background-color: creatorTheme.DScontrolBackgroundHover; +} + +QLineEdit:focus { + background-color: creatorTheme.DScontrolBackgroundInteraction; + border-color: creatorTheme.DScontrolOutlineInteraction; +} From 9b1f4f7c2969c6f5cdb6fe20a88e89ae11552b07 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 10 Mar 2021 12:02:15 +0100 Subject: [PATCH 12/23] Sqlite: Update documentation Change-Id: I0c6a7fc82ee3ae22c4c4f74567b3198c71dc592b Reviewed-by: Thomas Hartmann --- src/libs/sqlite/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/libs/sqlite/README.md b/src/libs/sqlite/README.md index 88944dcd42c..c5b13ee68e4 100644 --- a/src/libs/sqlite/README.md +++ b/src/libs/sqlite/README.md @@ -4,8 +4,7 @@ Minimum version is the same as the sqlite version in the source tree. We compile SQLite with the flowing settings: * SQLITE_THREADSAFE=2 -* SQLITE_ENABLE_FTS4 -* SQLITE_ENABLE_FTS3_PARENTHESIS +* SQLITE_ENABLE_FTS5 * SQLITE_ENABLE_UNLOCK_NOTIFY * SQLITE_ENABLE_COLUMN_METADATA * SQLITE_ENABLE_JSON1 From d187022892bad0591dd8d8e2a2d44bcddac1995d Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 16 Mar 2021 11:30:15 +0100 Subject: [PATCH 13/23] TextEditor: update codeStyle after setting language id This updates the tab settings to the correct one for the specific language like C++ or QML. Only observable if the file is not part of a project. Otherwise the project code style settings will set the language specific tab settings. Fixes: QTCREATORBUG-25485 Change-Id: I736646557a213369903fe495e3b5a3a950141961 Reviewed-by: Christian Stenger --- src/plugins/texteditor/texteditor.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index e5b5a2b2ea5..8a435d3ede4 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -6010,6 +6010,7 @@ void TextEditorWidgetPrivate::toggleBlockVisible(const QTextBlock &block) void TextEditorWidget::setLanguageSettingsId(Id settingsId) { d->m_tabSettingsId = settingsId; + setCodeStyle(TextEditorSettings::codeStyle(settingsId)); } Id TextEditorWidget::languageSettingsId() const From d4c4f8c00753abaa37517f6d5c36dcbc008bb658 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 16 Mar 2021 17:57:55 +0100 Subject: [PATCH 14/23] Highlighting: update KSyntaxHighlighting to v5.80.0 Task-number: QTCREATORBUG-22558 Change-Id: I57d782397f88842edbd08b1008b2d88706c6ab52 Reviewed-by: Eike Ziller --- .../3rdparty/syntax-highlighting/.gitignore | 1 + .../3rdparty/syntax-highlighting/README.md | 64 +- .../ksyntaxhighlighting_version.h | 6 +- .../syntax-highlighting/data/CMakeLists.txt | 43 +- .../data/generators/cmake.xml.tpl | 232 +- .../data/generators/cmake.yaml | 97 +- .../data/generators/generate-cmake-syntax.py | 51 +- .../data/generators/generate-php.pl | 21 +- .../data/schema/language.xsd | 32 +- .../syntax-highlighting/data/syntax/alert.xml | 3 +- .../syntax-highlighting/data/syntax/bash.xml | 1591 ++++++--- .../syntax-highlighting/data/syntax/cmake.xml | 363 +-- .../syntax-highlighting/data/syntax/css.xml | 6 +- .../data/syntax/doxygen.xml | 23 +- .../syntax-highlighting/data/syntax/dtd.xml | 7 +- .../syntax-highlighting/data/syntax/html.xml | 13 +- .../syntax-highlighting/data/syntax/ini.xml | 8 +- .../syntax-highlighting/data/syntax/java.xml | 180 +- .../data/syntax/javadoc.xml | 102 +- .../syntax-highlighting/data/syntax/json.xml | 5 +- .../data/syntax/makefile.xml | 12 +- .../data/syntax/markdown.xml | 131 +- .../syntax-highlighting/data/syntax/perl.xml | 81 +- .../data/syntax/powershell.xml | 18 +- .../data/syntax/python.xml | 139 +- .../data/syntax/qdocconf.xml | 5 +- .../syntax-highlighting/data/syntax/ruby.xml | 76 +- .../data/syntax/valgrind-suppression.xml | 7 +- .../syntax-highlighting/data/syntax/xml.xml | 109 +- .../syntax-highlighting/data/syntax/yacc.xml | 12 +- .../data/themes/atom-one-dark.theme | 352 ++ .../data/themes/atom-one-light.theme | 359 +++ .../data/themes/ayu-dark.theme | 29 +- .../data/themes/ayu-mirage.theme | 29 +- .../data/themes/breeze-dark.theme | 10 +- .../data/themes/breeze-light.theme | 8 +- .../data/themes/dracula.theme | 590 +++- .../data/themes/github-dark.theme | 216 ++ .../data/themes/github-light.theme | 216 ++ .../data/themes/monokai.theme | 394 +++ .../data/themes/oblivion.theme | 179 + .../data/themes/solarized-dark.theme | 42 +- .../data/themes/solarized-light.theme | 16 +- .../data/themes/theme-data.qrc | 6 + .../src/cli/CMakeLists.txt | 2 +- .../src/cli/kate-syntax-highlighter.cpp | 62 +- .../src/indexer/CMakeLists.txt | 2 +- .../src/indexer/katehighlightingindexer.cpp | 2869 +++++++++++++---- .../src/lib/CMakeLists.txt | 4 +- .../src/lib/abstracthighlighter.cpp | 6 +- .../src/lib/abstracthighlighter_p.h | 4 + .../src/lib/ansihighlighter.cpp | 1351 ++++---- .../src/lib/ansihighlighter.h | 21 +- .../syntax-highlighting/src/lib/context.cpp | 6 +- .../src/lib/contextswitch.cpp | 2 +- .../src/lib/contextswitch_p.h | 2 +- .../src/lib/definition.cpp | 54 +- .../syntax-highlighting/src/lib/definition.h | 2 + .../src/lib/definition_p.h | 2 +- .../src/lib/definitiondownloader.cpp | 24 +- .../syntax-highlighting/src/lib/format.cpp | 25 +- .../src/lib/htmlhighlighter.cpp | 50 +- .../src/lib/keywordlist.cpp | 10 +- .../src/lib/keywordlist_p.h | 9 +- .../src/lib/repository.cpp | 56 +- .../syntax-highlighting/src/lib/repository.h | 26 +- .../syntax-highlighting/src/lib/rule.cpp | 139 +- .../syntax-highlighting/src/lib/rule_p.h | 20 +- .../syntax-highlighting/src/lib/state.cpp | 2 +- .../syntax-highlighting/src/lib/state_p.h | 4 + .../syntax-highlighting/src/lib/theme.cpp | 2 +- .../syntax-highlighting/src/lib/themedata.cpp | 4 +- .../src/lib/worddelimiters.cpp | 26 +- .../src/lib/worddelimiters_p.h | 8 +- .../syntax-highlighting/src/lib/xml_p.h | 4 +- 75 files changed, 7772 insertions(+), 2910 deletions(-) create mode 100644 src/libs/3rdparty/syntax-highlighting/data/themes/atom-one-dark.theme create mode 100644 src/libs/3rdparty/syntax-highlighting/data/themes/atom-one-light.theme create mode 100644 src/libs/3rdparty/syntax-highlighting/data/themes/github-dark.theme create mode 100644 src/libs/3rdparty/syntax-highlighting/data/themes/github-light.theme create mode 100644 src/libs/3rdparty/syntax-highlighting/data/themes/monokai.theme create mode 100644 src/libs/3rdparty/syntax-highlighting/data/themes/oblivion.theme diff --git a/src/libs/3rdparty/syntax-highlighting/.gitignore b/src/libs/3rdparty/syntax-highlighting/.gitignore index 7df2675d19f..4d50e82c2dc 100644 --- a/src/libs/3rdparty/syntax-highlighting/.gitignore +++ b/src/libs/3rdparty/syntax-highlighting/.gitignore @@ -11,3 +11,4 @@ heaptrack.* *.unc-backup* .clang-format .cmake/ +*.code-workspace \ No newline at end of file diff --git a/src/libs/3rdparty/syntax-highlighting/README.md b/src/libs/3rdparty/syntax-highlighting/README.md index c090d061635..2acff73b185 100644 --- a/src/libs/3rdparty/syntax-highlighting/README.md +++ b/src/libs/3rdparty/syntax-highlighting/README.md @@ -6,12 +6,15 @@ Syntax highlighting engine for Kate syntax definitions 1. [Introduction](#introduction) 2. [Out of scope](#out-of-scope) -3. [Syntax Definition Files](#syntax-definition-files) -4. [Build it](#build-it) -5. [How to contribute](#how-to-contribute) -6. [Adding unit tests for a syntax definition](#adding-unit-tests-for-a-syntax-definition) +3. [Syntax definition files](#syntax-definition-files) +4. [Color theme files](#color-theme-files) +5. [Build it](#build-it) +6. [How to contribute](#how-to-contribute) + * [Licensing](#licensing) + * [Tips for contributing to syntax definition files](#tips-for-contributing-to-syntax-definition-files) + * [Adding unit tests for a syntax definition](#adding-unit-tests-for-a-syntax-definition) 7. [Report bug or help to fix them](#report-bug-or-help-to-fix-them) -8. [Updating the kate-editor.org/syntax website](#updating-the-kate-editororgsyntax-website) +8. [Updating the syntax & themes pages of the kate-editor.org website](#updating-the-kate-editororgsyntax-website) ## Introduction @@ -33,7 +36,7 @@ out of scope: If you need any of this, check out [KTextEditor](https://api.kde.org/frameworks/ktexteditor/html/). -## Syntax Definition Files +## Syntax definition files This library uses Kate syntax definition files for the actual highlighting, the file format is documented [here](https://docs.kde.org/?application=katepart&branch=trunk5&path=highlight.html). @@ -62,7 +65,7 @@ Usually it is: On Windows® - %USERPROFILE%\AppData\Local\org.kde.syntax-highlighting\syntax\ + %USERPROFILE%\AppData\Local\org.kde.syntax-highlighting\syntax\ @@ -71,6 +74,30 @@ For more details, see ["The Highlight Definition XML Format" (Working with Synta Also, in **data/schema/** there is a script to validate the syntax definiton XML files. Use the command `validatehl.sh mySyntax.xml`. +## Color theme files + +This library includes the color themes, the theme files use the **JSON** +format and are located in **data/themes/** with the **.theme** extension. + +Additional ones are also picked up from the file system if present, +in the **org.kde.syntax-highlighting/themes/** folder of your user directory, +allowing you to easily add custom color theme files. +The location of **org.kde.syntax-highlighting/themes/** is the same +as shown in the table of the [previous section](#syntax-definition-files), +replacing the **syntax** folder with **themes**. + +The [KTextEditor](https://api.kde.org/frameworks/ktexteditor/html/) library +(used by Kate, Kile and KDevelop, for example) provides +a user interface for editing and creating KSyntaxHighlighting color themes, including +a tool for exporting and importing the JSON theme files. +The tool **utils/schema-converter/** and the script **utils/kateschema_to_theme_converter.py** +convert the old Kate schemas to KSyntaxHighlighting themes. + +For more information, see: + +* [Kate - Color Themes with Frameworks 5.75 (Kate Editor Website)](https://kate-editor.org/post/2020/2020-09-13-kate-color-themes-5.75/) +* [Submit a KSyntaxHighlighting Color Theme (Kate Editor Website)](https://kate-editor.org/post/2020/2020-09-18-submit-a-ksyntaxhighlighting-color-theme/) + ## Build it 1. Create and change into a build directory. Usually, a folder called **build** @@ -88,6 +115,16 @@ files. Use the command `validatehl.sh mySyntax.xml`. make ``` + For example: + + ```bash + git clone git@invent.kde.org:frameworks/syntax-highlighting.git + mkdir ./syntax-highlighting/build + cd ./syntax-highlighting/build + cmake ../ + make + ``` + For more details see ["Building Kate from Sources on Linux" (Kate Editor Website)](https://kate-editor.org/build-it/). **NOTE:** If running *cmake* shows an error related to your version of KDE @@ -126,7 +163,7 @@ All files shall contain a proper "SPDX-License-Identifier: MIT" identifier insid */ ``` -### What you should know before working with syntax definition files and sending a patch +### Tips for contributing to syntax definition files * If you are modifying an existing syntax definition XML file, you must increase the version number of the language. @@ -139,15 +176,15 @@ All files shall contain a proper "SPDX-License-Identifier: MIT" identifier insid * [Available Default Styles (Working with Syntax Highlighting, KDE Documentation)](https://docs.kde.org/?application=katepart&branch=trunk5&path=highlight.html#kate-highlight-default-styles) * [Kate Part (KF5): New Default Styles for better Color Schemes (Kate Editor Website)](https://kate-editor.org/2014/03/07/kate-part-kf5-new-default-styles-for-better-color-schemes/) -* Important: add test files, these are found in **autotests/input/**. +* Add test files, these are found in **autotests/input/**. If you are going to add a new syntax XML file, create a new test file; if you are going to modify a XML file, adds examples to existing test files. Then, it is necessary to generate and update the files in **autotests/folding/**, **autotests/html/** and **autotests/reference/**, which must be included in the - patches. The instructions are in the [next section](#adding-unit-tests-for-a-syntax-definition). + patches. Instructions are [below](#adding-unit-tests-for-a-syntax-definition). -## Adding unit tests for a syntax definition +### Adding unit tests for a syntax definition 1. Add an input file into the **autotests/input/** folder, lets call it **test.<language-extension>**. @@ -184,9 +221,10 @@ However, some users often report bugs related to syntax highlighting in [kate/syntax](https://bugs.kde.org/buglist.cgi?component=syntax&product=kate&resolution=---) and [kile/editor](https://bugs.kde.org/buglist.cgi?component=editor&product=kile&resolution=---). -## Updating the kate-editor.org/syntax website +## Updating the syntax & themes pages of the kate-editor.org website -To update the [kate-editor.org/syntax](https://kate-editor.org/syntax/) website +To update the [kate-editor.org/syntax](https://kate-editor.org/syntax/) and +[kate-editor.org/themes](https://kate-editor.org/themes/) websites including the update site & all linked examples/files, please run after successful **build** & **test** the following make target: diff --git a/src/libs/3rdparty/syntax-highlighting/autogenerated/ksyntaxhighlighting_version.h b/src/libs/3rdparty/syntax-highlighting/autogenerated/ksyntaxhighlighting_version.h index df0317ed7cf..32e5aa62a75 100644 --- a/src/libs/3rdparty/syntax-highlighting/autogenerated/ksyntaxhighlighting_version.h +++ b/src/libs/3rdparty/syntax-highlighting/autogenerated/ksyntaxhighlighting_version.h @@ -3,10 +3,10 @@ #ifndef SyntaxHighlighting_VERSION_H #define SyntaxHighlighting_VERSION_H -#define SyntaxHighlighting_VERSION_STRING "5.75.0" +#define SyntaxHighlighting_VERSION_STRING "5.80.0" #define SyntaxHighlighting_VERSION_MAJOR 5 -#define SyntaxHighlighting_VERSION_MINOR 75 +#define SyntaxHighlighting_VERSION_MINOR 80 #define SyntaxHighlighting_VERSION_PATCH 0 -#define SyntaxHighlighting_VERSION ((5<<16)|(75<<8)|(0)) +#define SyntaxHighlighting_VERSION ((5<<16)|(80<<8)|(0)) #endif diff --git a/src/libs/3rdparty/syntax-highlighting/data/CMakeLists.txt b/src/libs/3rdparty/syntax-highlighting/data/CMakeLists.txt index cab8c885dcd..8b923c47952 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/CMakeLists.txt +++ b/src/libs/3rdparty/syntax-highlighting/data/CMakeLists.txt @@ -1,9 +1,27 @@ +# create a directory for generated definitions +execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/generated/syntax) + +macro(generate_syntax_definition generator targetFile srcFile) + add_custom_target( + ${targetFile} ALL + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/generated/syntax/${targetFile} + ) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated/syntax/${targetFile} + COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/generators/${generator} + ${CMAKE_CURRENT_SOURCE_DIR}/syntax/${srcFile} + ${CMAKE_CURRENT_BINARY_DIR}/generated/syntax/${targetFile} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/generators/${generator} + ${CMAKE_CURRENT_SOURCE_DIR}/syntax/${srcFile} + ${ARGN} + VERBATIM + ) + set(gen_defs ${gen_defs} ${CMAKE_CURRENT_BINARY_DIR}/generated/syntax/${targetFile}) +endmacro() + # generate PHP definitions macro(generate_php_syntax_definition targetFile srcFile) - execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/generated/syntax) - execute_process(COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/generators/generate-php.pl - INPUT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/syntax/${srcFile} - OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/generated/syntax/${targetFile}) + generate_syntax_definition(generate-php.pl ${targetFile} ${srcFile} ${CMAKE_CURRENT_SOURCE_DIR}/syntax/php.xml) endmacro() generate_php_syntax_definition(javascript-php.xml javascript.xml) @@ -13,17 +31,12 @@ generate_php_syntax_definition(javascript-react-php.xml javascript-react.xml) generate_php_syntax_definition(typescript-php.xml typescript.xml) generate_php_syntax_definition(mustache-php.xml mustache.xml) +# generate DoxygenLua definition +generate_syntax_definition(generate-doxygenlua.pl doxygenlua.xml doxygen.xml) + # find all definitions file(GLOB src_defs "${CMAKE_CURRENT_SOURCE_DIR}/syntax/*.xml") -set(defs - ${src_defs} - ${CMAKE_CURRENT_BINARY_DIR}/generated/syntax/html-php.xml - ${CMAKE_CURRENT_BINARY_DIR}/generated/syntax/css-php.xml - ${CMAKE_CURRENT_BINARY_DIR}/generated/syntax/javascript-php.xml - ${CMAKE_CURRENT_BINARY_DIR}/generated/syntax/javascript-react-php.xml - ${CMAKE_CURRENT_BINARY_DIR}/generated/syntax/typescript-php.xml - ${CMAKE_CURRENT_BINARY_DIR}/generated/syntax/mustache-php.xml -) +set(defs ${src_defs} ${gen_defs}) # theme data resource qt5_add_resources(themes_QRC ${CMAKE_CURRENT_SOURCE_DIR}/themes/theme-data.qrc) @@ -43,7 +56,7 @@ if (QRC_SYNTAX) # generate the index file add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/index.katesyntax" COMMAND katehighlightingindexer "${CMAKE_CURRENT_BINARY_DIR}/index.katesyntax" "${CMAKE_CURRENT_SOURCE_DIR}/schema/language.xsd" "${CMAKE_CURRENT_BINARY_DIR}/syntax-data.qrc" - DEPENDS ${defs} ${CMAKE_CURRENT_SOURCE_DIR}/schema/language.xsd ${CMAKE_CURRENT_BINARY_DIR}/syntax-data.qrc + DEPENDS katehighlightingindexer ${defs} ${CMAKE_CURRENT_SOURCE_DIR}/schema/language.xsd ${CMAKE_CURRENT_BINARY_DIR}/syntax-data.qrc ) # generate the qrc file manually, to make dependencies on generated files work... @@ -57,7 +70,7 @@ if (QRC_SYNTAX) add_library(SyntaxHighlightingData OBJECT ${themes_QRC} ${CMAKE_CURRENT_BINARY_DIR}/qrc_syntax-data.cpp) else() # install the syntax files as normal files into the prefix - install (FILES ${defs} DESTINATION share/org.kde.syntax-highlighting/syntax) + install (FILES ${defs} DESTINATION ${KDE_INSTALL_DATADIR}/org.kde.syntax-highlighting/syntax) # object library to make cross-folder dependencies work, only themes add_library(SyntaxHighlightingData OBJECT ${themes_QRC}) 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 be60d199595..8e8d37d266c 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/generators/cmake.xml.tpl +++ b/src/libs/3rdparty/syntax-highlighting/data/generators/cmake.xml.tpl @@ -14,9 +14,15 @@ SPDX-License-Identifier: LGPL-2.0-or-later --> + + - {%- for command in commands %} - {{command.name}} - {%- endfor %} + + + - {% for command in commands -%} - {%- if command.named_args and command.named_args.kw %} - - {%- for arg in command.named_args.kw %} - {{arg}} - {%- endfor %} + + + + + + - {%- endif %} - {%- if command.special_args and command.special_args.kw %} - - {%- for arg in command.special_args.kw %} - {{arg}} - {%- endfor %} + + + + + + - {%- endif %} - {%- endfor %} + + - {%- for var in variables.kw %} - {{var}} - {%- endfor %} + + + - {%- for var in deprecated_or_internal_variables.kw %} - {{var}} - {%- endfor %} + + + - {%- for var in environment_variables.kw %} - {{var}} - {%- endfor %} + + + - {%- for kind in properties.kinds %} - - {%- for prop in properties[kind].kw %} - {{prop}} - {%- endfor %} + + + + + - {%- endfor %} + - {%- for expr in generator_expressions %} - {{ expr }} - {%- endfor %} + + + - {% for command in commands -%} - - {% endfor -%} + + beginRegion="" endRegion="" /> + @@ -95,71 +101,64 @@ - {% for command in commands -%} - {# - - -#} - - + + + - - {%- if command.nested_parentheses %} - - {%- endif %} + + + + - {%- if command.named_args and command.named_args.kw %} - - {%- endif %} - {%- if command.special_args and command.special_args.kw %} - - {%- endif %} - {%- if command.property_args and command.property_args.kw %} - {%- for kind in command.property_args.kw %} - - {%- if properties[kind|replace('-', '_')].re %} - - {%- endif %} - {%- endfor %} - {%- endif %} - {%- if command is not nulary %} + + + + + + + + + + + + + + + - {%- if command.name == 'cmake_policy' %} + - {%- endif %} - {%- endif %} + + - {%- if command.nested_parentheses %} - + + - {%- if command.named_args and command.named_args.kw %} - - {%- endif %} - {%- if command.special_args and command.special_args.kw %} - - {%- endif %} - {%- if command.property_args and command.property_args.kw %} - {%- for kind in command.property_args.kw %} - - {%- if properties[kind|replace('-', '_')].re %} - - {%- endif %} - {%- endfor %} - {%- endif %} + + + + + + + + + + + + + + - {%- endif %} - {% endfor -%} + + - {% for kind in properties.kinds if properties[kind].re -%} - - {%- for prop in properties[kind].re %} - - {%- endfor %} - {{ '\n' }} - {% endfor -%} + + + + + @@ -187,12 +186,12 @@ - {%- for var in deprecated_or_internal_variables.re %} - - {%- endfor %} - {%- for var in variables.re %} - - {%- endfor %} + + + + + + @@ -204,9 +203,9 @@ - {%- for var in environment_variables.re %} - - {%- endfor %} + + + @@ -248,10 +247,20 @@ - - - - + + + + + + + + + + + + + + @@ -273,8 +282,7 @@ - - + @@ -286,8 +294,7 @@ - - + @@ -331,6 +338,7 @@ + @@ -354,7 +362,7 @@ - + diff --git a/src/libs/3rdparty/syntax-highlighting/data/generators/cmake.yaml b/src/libs/3rdparty/syntax-highlighting/data/generators/cmake.yaml index e776c2508f6..7d4f113cba7 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/generators/cmake.yaml +++ b/src/libs/3rdparty/syntax-highlighting/data/generators/cmake.yaml @@ -232,6 +232,9 @@ target-properties: - INTERPROCEDURAL_OPTIMIZATION_ - INTERPROCEDURAL_OPTIMIZATION - IOS_INSTALL_COMBINED + - ISPC_HEADER_DIRECTORY # Since 3.19 + - ISPC_HEADER_SUFFIX # Since 3.19.2 + - ISPC_INSTRUCTION_SETS # Since 3.19 - JOB_POOL_COMPILE - JOB_POOL_LINK - LABELS @@ -274,6 +277,14 @@ target-properties: - NAME - NO_SONAME - NO_SYSTEM_FROM_IMPORTED + - OBJC_EXTENSIONS # Since 3.16 + - OBJC_STANDARD # Since 3.16 + - OBJC_STANDARD_REQUIRED # Since 3.16 + - OBJCXX_EXTENSIONS # Since 3.16 + - OBJCXX_STANDARD # Since 3.16 + - OBJCXX_STANDARD_REQUIRED # Since 3.16 + - OPTIMIZE_DEPENDENCIES # Since 3.19 + - OBJC_STANDARD - OSX_ARCHITECTURES_ - OSX_ARCHITECTURES - OSX_CURRENT_VERSION # Since 3.17 @@ -281,6 +292,7 @@ target-properties: - OUTPUT_NAME_ - OUTPUT_NAME - PCH_WARN_INVALID # Since 3.18 + - PCH_INSTANTIATE_TEMPLATES # Since 3.19 - PDB_NAME_ - PDB_NAME - PDB_OUTPUT_DIRECTORY_ @@ -362,6 +374,7 @@ target-properties: - XCODE_ATTRIBUTE_ - XCODE_EXPLICIT_FILE_TYPE - XCODE_GENERATE_SCHEME # Since 3.15 + - XCODE_LINK_BUILD_PHASE_MODE # Since 3.19 - XCODE_PRODUCT_TYPE - XCODE_SCHEME_ADDRESS_SANITIZER # Since 3.13 - XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN # Since 3.13 @@ -669,9 +682,12 @@ variables: - CMAKE_VS_PLATFORM_TOOLSET_CUDA - CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE - CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION - - CMAKE_XCODE_GENERATE_SCHEME + - CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION_MAXIMUM # Since 3.19 + - CMAKE_XCODE_BUILD_SYSTEM # Since 3.19 - CMAKE_XCODE_PLATFORM_TOOLSET - _BINARY_DIR + - _DESCRIPTION # Since 3.12 + - _HOMEPAGE_URL # Since 3.12 - _SOURCE_DIR - _VERSION - _VERSION_MAJOR @@ -679,7 +695,7 @@ variables: - _VERSION_PATCH - _VERSION_TWEAK - PROJECT_BINARY_DIR - - PROJECT_DESCRIPTION + - PROJECT_DESCRIPTION # Since 3.9 - PROJECT_HOMEPAGE_URL # Since 3.12 - PROJECT_NAME - PROJECT_SOURCE_DIR @@ -695,6 +711,7 @@ variables: - CMAKE_AUTOMOC_RELAXED_MODE - CMAKE_BACKWARDS_COMPATIBILITY - CMAKE_BUILD_TYPE + - CMAKE_CLANG_VFS_OVERLAY # Since 3.19 - CMAKE_CODEBLOCKS_COMPILER_ID # Since 3.11 - CMAKE_CODEBLOCKS_EXCLUDE_EXTERNAL_FILES # Since 3.10 - CMAKE_CODELITE_USE_TARGETS @@ -777,7 +794,9 @@ variables: - CMAKE_USER_MAKE_RULES_OVERRIDE - CMAKE_WARN_DEPRECATED - CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION + - CMAKE_XCODE_GENERATE_SCHEME - CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY # Since 3.13 + - CMAKE_XCODE_LINK_BUILD_PHASE_MODE # Since 3.19 - CMAKE_XCODE_SCHEME_ADDRESS_SANITIZER # Since 3.13 - CMAKE_XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN # Since 3.13 - CMAKE_XCODE_SCHEME_WORKING_DIRECTORY # Since 3.17 @@ -869,6 +888,7 @@ variables: - CMAKE_ANDROID_SKIP_ANT_STEP - CMAKE_ANDROID_STANDALONE_TOOLCHAIN - CMAKE_ANDROID_STL_TYPE + - CMAKE_APPLE_SILICON_PROCESSOR # Since 3.19.2 - CMAKE_ARCHIVE_OUTPUT_DIRECTORY - CMAKE_ARCHIVE_OUTPUT_DIRECTORY_ - CMAKE_AUTOGEN_ORIGIN_DEPENDS # Since 3.14 @@ -951,10 +971,12 @@ variables: - CMAKE_NINJA_OUTPUT_PATH_PREFIX - CMAKE_NO_BUILTIN_CHRPATH - CMAKE_NO_SYSTEM_FROM_IMPORTED + - CMAKE_OPTIMIZE_DEPENDENCIES # Since 3.19 - CMAKE_OSX_ARCHITECTURES - CMAKE_OSX_DEPLOYMENT_TARGET - CMAKE_OSX_SYSROOT - CMAKE_PCH_WARN_INVALID # Since 3.18 + - CMAKE_PCH_INSTANTIATE_TEMPLATES # Since 3.19 - CMAKE_PDB_OUTPUT_DIRECTORY - CMAKE_PDB_OUTPUT_DIRECTORY_ - CMAKE_POSITION_INDEPENDENT_CODE @@ -1015,6 +1037,9 @@ variables: - CMAKE_Fortran_MODDIR_DEFAULT - CMAKE_Fortran_MODDIR_FLAG - CMAKE_Fortran_MODOUT_FLAG + - CMAKE_ISPC_HEADER_DIRECTORY # Since 3.19 + - CMAKE_ISPC_HEADER_SUFFIX # Since 3.19.2 + - CMAKE_ISPC_INSTRUCTION_SETS # Since 3.19 - CMAKE__ANDROID_TOOLCHAIN_MACHINE - CMAKE__ANDROID_TOOLCHAIN_PREFIX - CMAKE__ANDROID_TOOLCHAIN_SUFFIX @@ -1063,6 +1088,12 @@ variables: - CMAKE__SOURCE_FILE_EXTENSIONS - CMAKE__STANDARD_INCLUDE_DIRECTORIES - CMAKE__STANDARD_LIBRARIES + - CMAKE_OBJC_EXTENSIONS # Since 3.16 + - CMAKE_OBJC_STANDARD # Since 3.16 + - CMAKE_OBJC_STANDARD_REQUIRED # Since 3.16 + - CMAKE_OBJCXX_EXTENSIONS # Since 3.16 + - CMAKE_OBJCXX_STANDARD # Since 3.16 + - CMAKE_OBJCXX_STANDARD_REQUIRED # Since 3.16 - CMAKE_Swift_LANGUAGE_VERSION - CMAKE_USER_MAKE_RULES_OVERRIDE_ # Variables for CTest @@ -1190,8 +1221,11 @@ variables: - _UNPARSED_ARGUMENTS - _KEYWORDS_MISSING_VALUES # Well known CMake's official module's variables + # - CheckCompilerFlag # - CheckCCompilerFlag + # - CheckSourceCompiles # - CheckCSourceCompiles + # - CheckSourceRuns # - CheckCSourceRuns # - CheckCxxCompilerFlag # - CheckCxxSourceCompiles @@ -1337,6 +1371,7 @@ variables: - CPACK_EXTERNAL_REQUESTED_VERSIONS - CPACK_EXTERNAL_ENABLE_STAGING - CPACK_EXTERNAL_PACKAGE_SCRIPT + - CPACK_EXTERNAL_BUILT_PACKAGES # Since 3.19 # - CPackIFW - CPACK_IFW_ROOT - QTIFWDIR @@ -1597,6 +1632,9 @@ variables: - CPACK_PACKAGE_INSTALL_REGISTRY_KEY - CPACK_CREATE_DESKTOP_LINKS - CPACK_BINARY_ + - CPACK_PRE_BUILD_SCRIPTS # Since 3.19 + - CPACK_POST_BUILD_SCRIPTS # Since 3.19 + - CPACK_PACKAGE_FILES # Since 3.19 # - CPackWIX - CPACK_WIX_UPGRADE_GUID - CPACK_WIX_PRODUCT_GUID @@ -1621,6 +1659,7 @@ variables: - CPACK_WIX_SKIP_PROGRAM_FOLDER - CPACK_WIX_ROOT_FOLDER_ID - CPACK_WIX_ROOT + - CPACK_WIX_CUSTOM_XMLNS # Since 3.19 # - CTest # - Dart - BUILD_TESTING @@ -1750,6 +1789,7 @@ deprecated-or-internal-variables: # NOTE Added to syntax file version 14 at 3.15.0 version of CMake environment-variables: # Environment Variables that Control the Build + - CMAKE_APPLE_SILICON_PROCESSOR # Since 3.19.2 - CMAKE_BUILD_PARALLEL_LEVEL - CMAKE_CONFIG_TYPE - CMAKE_EXPORT_COMPILE_COMMANDS # Since 3.17 @@ -1837,7 +1877,19 @@ scripting-commands: ] - name: cmake_language - named-args: [CALL, EVAL, CODE] + named-args: [ + CALL + , EVAL + , CODE + # Since 3.19 + , DEFER + , DIRECTORY + , ID + , ID_VAR + , GET_CALL_IDS + , GET_CALL + , CANCEL_CALL + ] - name: cmake_minimum_required named-args: [VERSION, FATAL_ERROR] @@ -1850,7 +1902,13 @@ scripting-commands: special-args: [OLD, NEW] - name: configure_file - named-args: [COPYONLY, ESCAPE_QUOTES, "@ONLY", NEWLINE_STYLE] + named-args: [ + COPYONLY + , ESCAPE_QUOTES + , NO_SOURCE_PERMISSIONS # Since 3.19 + , "@ONLY" + , NEWLINE_STYLE + ] special-args: [UNIX, DOS, WIN32, LF, CRLF] - name: continue @@ -1934,6 +1992,7 @@ scripting-commands: , ENCODING , ECHO_OUTPUT_VARIABLE # Since 3.18 , ECHO_ERROR_VARIABLE # Since 3.18 + , COMMAND_ERROR_IS_FATAL # Since 3.19 ] special-args: [ NONE @@ -1943,6 +2002,8 @@ scripting-commands: , UTF8 , STDERR # Since 3.15: the value for `COMMAND_ECHO` , STDOUT # Since 3.15: the value for `COMMAND_ECHO` + , ANY # Since 3.19: the value for `COMMAND_ERROR_IS_FATAL` + , LAST # Since 3.19: the value for `COMMAND_ERROR_IS_FATAL` ] nested-parentheses?: true - @@ -2009,6 +2070,7 @@ scripting-commands: , INPUT , CONTENT , CONDITION + , TARGET # Since 3.19 , COPY , INSTALL , DESTINATION @@ -2040,7 +2102,8 @@ scripting-commands: , ARCHIVE_CREATE , FILES , FORMAT - , TYPE + , COMPRESSION + , COMPRESSION_LEVEL # Since 3.19 , MTIME , VERBOSE , ARCHIVE_EXTRACT @@ -2049,6 +2112,10 @@ scripting-commands: , ESCAPE_QUOTES , "@ONLY" , NEWLINE_STYLE + , CHMOD # Since 3.19 + , CHMOD_RECURSE # Since 3.19 + , REAL_PATH # Since 3.19 + , BASE_DIRECTORY # Since 3.19 ] special-args: [ UTF-8 @@ -2345,7 +2412,13 @@ scripting-commands: nulary?: true - name: separate_arguments - named-args: [NATIVE_COMMAND, UNIX_COMMAND, WINDOWS_COMMAND] + named-args: [ + NATIVE_COMMAND + , UNIX_COMMAND + , WINDOWS_COMMAND + , PROGRAM # Since 3.19 + , SEPARATE_ARGS # Since 3.19 + ] - name: set_directory_properties named-args: [PROPERTIES] @@ -2429,6 +2502,16 @@ scripting-commands: , NAME , TYPE , UPPER + # Since 3.19 + , JSON + , ERROR_VARIABLE + , GET + , TYPE + , MEMBER + , LENGTH + , REMOVE + , SET + , EQUAL ] - name: unset @@ -2532,6 +2615,7 @@ project-commands: , CSharp , CXX , CUDA + , ISPC # Since 3.19 , Java , OBJC # Since 3.16 , OBJCXX # Since 3.16 @@ -2656,6 +2740,7 @@ project-commands: , CSharp , CXX , CUDA + , ISPC # Since 3.19 , Java , OBJC # Since 3.16 , OBJCXX # Since 3.16 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 0dd04a44be2..24b1eb0d7cc 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,7 +3,7 @@ # # Generate Kate syntax file for CMake # -# SPDX-FileCopyrightText: 2017-2019 Alex Turbov +# SPDX-FileCopyrightText: 2017-2020 Alex Turbov # # To install prerequisites: # @@ -43,21 +43,29 @@ def try_transform_placeholder_string_to_regex(name): ''' m = _TEMPLATED_NAME.split(name) if 'CMAKE_MATCH_' in m: - return '\\bCMAKE_MATCH_[0-9]+\\b' + return 'CMAKE_MATCH_[0-9]+' if 'CMAKE_ARGV' in m: - return '\\bCMAKE_ARGV[0-9]+\\b' + return 'CMAKE_ARGV[0-9]+' if 'CMAKE_POLICY_DEFAULT_CMP' in m: - return '\\bCMAKE_POLICY_DEFAULT_CMP[0-9]{4}\\b' + return 'CMAKE_POLICY_DEFAULT_CMP[0-9]{4}' if 'CMAKE_POLICY_WARNING_CMP' in m: - return '\\bCMAKE_POLICY_WARNING_CMP[0-9]{4}\\b' + return 'CMAKE_POLICY_WARNING_CMP[0-9]{4}' if 'ARGV' in m: - return '\\bARGV[0-9]+\\b' + return 'ARGV[0-9]+' - return '\\b{}\\b'.format('&id_re;'.join(list(m))) if 1 < len(m) else name + return '&id_re;'.join(m) if 1 < len(m) else name + + +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' def partition_iterable(fn, iterable): @@ -73,7 +81,7 @@ def _transform_command_set(cmd, list_name): list_name = list_name.replace('-', '_') cmd[list_name] = {k: sorted(set(v)) for k, v in zip(_KW_RE_LIST, [args, args_re])} - cmd[list_name]['re'] = [*map(lambda x: try_transform_placeholder_string_to_regex(x), args_re)] + cmd[list_name]['re'] = try_placeholders_to_regex(args_re) return cmd @@ -136,12 +144,7 @@ def cli(input_yaml, template): , [*partition_iterable(lambda x: _TEMPLATED_NAME.search(x) is None, data[var_key])] ) } - data[var_key]['re'] = [ - *map( - lambda x: try_transform_placeholder_string_to_regex(x) - , data[var_key]['re'] - ) - ] + data[var_key]['re'] = try_placeholders_to_regex(data[var_key]['re']) # Transform properties and make all-properties list data['properties'] = {} @@ -153,18 +156,16 @@ def cli(input_yaml, template): data['properties'][python_prop_list_name] = { k: sorted(set(v)) for k, v in zip(_KW_RE_LIST, [props, props_re]) } - data['properties'][python_prop_list_name]['re'] = [ - *map(lambda x: try_transform_placeholder_string_to_regex(x), props_re) - ] + data['properties'][python_prop_list_name]['re'] = try_placeholders_to_regex(props_re) - data['properties']['kinds'] = [*map(lambda name: name.replace('-', '_'), _PROPERTY_KEYS)] + data['properties']['kinds'] = list(map(lambda name: name.replace('-', '_'), _PROPERTY_KEYS)) # Make all commands list - data['commands'] = [ - *map( - lambda cmd: transform_command(cmd) + data['commands'] = list( + map( + transform_command , data['scripting-commands'] + data['project-commands'] + data['ctest-commands']) - ] + ) # Fix node names to be accessible from Jinja template data['generator_expressions'] = data['generator-expressions'] @@ -177,6 +178,12 @@ def cli(input_yaml, template): env = jinja2.Environment( keep_trailing_newline=True ) + env.block_start_string = '' + env.variable_start_string = '' + env.comment_start_string = '' # Register convenience filters env.tests['nulary'] = cmd_is_nulary diff --git a/src/libs/3rdparty/syntax-highlighting/data/generators/generate-php.pl b/src/libs/3rdparty/syntax-highlighting/data/generators/generate-php.pl index 04c9fcdb360..a3b20fb5546 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/generators/generate-php.pl +++ b/src/libs/3rdparty/syntax-highlighting/data/generators/generate-php.pl @@ -19,7 +19,13 @@ my $file = ""; -while (<>) +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 .= $_; } @@ -55,12 +61,17 @@ else $file =~ s/]+)mimetype="[^"]*"/\n\n\n"; +if ($root == 1 || $ARGV[0] =~ /mustache.xml$/) +{ + $file =~ s/<(?:RegExpr (attribute="Processing Instruction" context="PI"|context="PI" attribute="Processing Instruction")|itemData name="Processing Instruction")[^\/]+\/>|//gs; +} -$file =~ s/]*)context="([^"#]*)##(?!Alerts|Doxygen|Modelines)([^"]+)"/\n\n\n"; + +$file =~ s/]*)context="([^"#]*)##(?!Alerts|Comments|Doxygen|Modelines)([^"]+)"/]*[^>\/]>)/$1\n/g; $file =~ s/(]*[^>\/])\s*\/>/$1>\n\n<\/context>/g; $file =~ s/(?=<\/contexts\s*>)/$findphp/; -print $file; -print $warning; +print $output $file; +print $output $warning; diff --git a/src/libs/3rdparty/syntax-highlighting/data/schema/language.xsd b/src/libs/3rdparty/syntax-highlighting/data/schema/language.xsd index 5fdbbb07dfd..fa510e0d147 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/schema/language.xsd +++ b/src/libs/3rdparty/syntax-highlighting/data/schema/language.xsd @@ -395,49 +395,61 @@ commonAttributes: Common attributes insensitive: Is this list case-insensitive? [boolean, optional, see note] String: Name of the list - weakDelimiter: Use weak deliminator + weakDeliminator: Add weak deliminators [optional, see note] + additionalDeliminator: Add deliminators [optional, see note] By default, case sensitivity is determined from in (default=true), but can be overridden per-list with 'insensitive'. - TODO: - - Should be weakDeliminator - - Explain deliminator - - Doesn't seem to be supported in highligh.cpp + weakDeliminator and additionalDeliminator are accumulated to those defined in + in . --> - + + + + + + + + + + - - - - + + |&;])"> + + + |&;()"> + + + + + + + + + + |&;{}\\`'"$"> + + + + + + + + + ]> - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - - - - - - + - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - + - - + - - - - - - - - + + + + + + - - - + + + + + - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + - - - - - + + + - - - - + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + + + - - - - + + + + + + + + + + - - - - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - - - - + + + + + + - - - - - + + + + + + + - - - - - - - - - + + + + + + + + - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + + + - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/cmake.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/cmake.xml index 6f3b3dc862b..7f3920bfb64 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/cmake.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/cmake.xml @@ -14,9 +14,15 @@ SPDX-License-Identifier: LGPL-2.0-or-later --> + + CALL + CANCEL_CALL CODE + DEFER + DIRECTORY EVAL + GET_CALL + GET_CALL_IDS + ID + ID_VAR FATAL_ERROR @@ -199,6 +212,7 @@ COPYONLY ESCAPE_QUOTES NEWLINE_STYLE + NO_SOURCE_PERMISSIONS CRLF @@ -242,6 +256,7 @@ COMMAND COMMAND_ECHO + COMMAND_ERROR_IS_FATAL ECHO_ERROR_VARIABLE ECHO_OUTPUT_VARIABLE ENCODING @@ -261,7 +276,9 @@ ANSI + ANY AUTO + LAST NONE OEM STDERR @@ -273,6 +290,11 @@ APPEND ARCHIVE_CREATE ARCHIVE_EXTRACT + BASE_DIRECTORY + CHMOD + CHMOD_RECURSE + COMPRESSION + COMPRESSION_LEVEL CONDITION CONFIGURE CONFIGURE_DEPENDS @@ -328,6 +350,7 @@ PERMISSIONS READ READ_SYMLINK + REAL_PATH REGEX RELATIVE RELATIVE_PATH @@ -349,6 +372,7 @@ SIZE STATUS STRINGS + TARGET TIMEOUT TIMESTAMP TLS_CAINFO @@ -357,7 +381,6 @@ TOUCH_NOCREATE TO_CMAKE_PATH TO_NATIVE_PATH - TYPE UPLOAD USERPWD USE_SOURCE_PERMISSIONS @@ -662,6 +685,8 @@ NATIVE_COMMAND + PROGRAM + SEPARATE_ARGS UNIX_COMMAND WINDOWS_COMMAND @@ -704,13 +729,16 @@ CONCAT CONFIGURE EQUAL + ERROR_VARIABLE ESCAPE_QUOTES FIND GENEX_STRIP + GET GREATER GREATER_EQUAL HEX JOIN + JSON LENGTH LESS LESS_EQUAL @@ -718,6 +746,7 @@ MATCH MATCHALL MD5 + MEMBER NAME NAMESPACE NOTEQUAL @@ -725,9 +754,11 @@ RANDOM RANDOM_SEED REGEX + REMOVE REPEAT REPLACE REVERSE + SET SHA1 SHA224 SHA256 @@ -883,6 +914,7 @@ CUDA CXX Fortran + ISPC Java OBJC OBJCXX @@ -996,6 +1028,7 @@ CUDA CXX Fortran + ISPC Java NONE OBJC @@ -1318,6 +1351,7 @@ CMAKE_ANDROID_STL_TYPE CMAKE_ANSI_CXXFLAGS CMAKE_APPBUNDLE_PATH + CMAKE_APPLE_SILICON_PROCESSOR CMAKE_AR CMAKE_ARCHIVE_OUTPUT_DIRECTORY CMAKE_ARGC @@ -1347,6 +1381,7 @@ CMAKE_CACHE_MINOR_VERSION CMAKE_CACHE_PATCH_VERSION CMAKE_CFG_INTDIR + CMAKE_CLANG_VFS_OVERLAY CMAKE_CL_64 CMAKE_CODEBLOCKS_COMPILER_ID CMAKE_CODEBLOCKS_EXCLUDE_EXTERNAL_FILES @@ -1538,6 +1573,9 @@ CMAKE_INSTALL_UCRT_LIBRARIES CMAKE_INTERPROCEDURAL_OPTIMIZATION CMAKE_IOS_INSTALL_COMBINED + CMAKE_ISPC_HEADER_DIRECTORY + CMAKE_ISPC_HEADER_SUFFIX + CMAKE_ISPC_INSTRUCTION_SETS CMAKE_JOB_POOLS CMAKE_JOB_POOL_COMPILE CMAKE_JOB_POOL_LINK @@ -1583,12 +1621,20 @@ CMAKE_NO_BUILTIN_CHRPATH CMAKE_NO_STD_NAMESPACE CMAKE_NO_SYSTEM_FROM_IMPORTED + CMAKE_OBJCXX_EXTENSIONS + CMAKE_OBJCXX_STANDARD + CMAKE_OBJCXX_STANDARD_REQUIRED + CMAKE_OBJC_EXTENSIONS + CMAKE_OBJC_STANDARD + CMAKE_OBJC_STANDARD_REQUIRED CMAKE_OBJECT_PATH_MAX + CMAKE_OPTIMIZE_DEPENDENCIES CMAKE_OSX_ARCHITECTURES CMAKE_OSX_DEPLOYMENT_TARGET CMAKE_OSX_SYSROOT CMAKE_PARENT_LIST_FILE CMAKE_PATCH_VERSION + CMAKE_PCH_INSTANTIATE_TEMPLATES CMAKE_PCH_WARN_INVALID CMAKE_PDB_OUTPUT_DIRECTORY CMAKE_POSITION_INDEPENDENT_CODE @@ -1689,12 +1735,15 @@ CMAKE_VS_SDK_REFERENCE_DIRECTORIES CMAKE_VS_SDK_SOURCE_DIRECTORIES CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION + CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION_MAXIMUM CMAKE_WARN_DEPRECATED CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION CMAKE_WIN32_EXECUTABLE CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS + CMAKE_XCODE_BUILD_SYSTEM CMAKE_XCODE_GENERATE_SCHEME CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY + CMAKE_XCODE_LINK_BUILD_PHASE_MODE CMAKE_XCODE_PLATFORM_TOOLSET CMAKE_XCODE_SCHEME_ADDRESS_SANITIZER CMAKE_XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN @@ -1782,6 +1831,7 @@ CPACK_DMG_SLA_LANGUAGES CPACK_DMG_VOLUME_NAME CPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION + CPACK_EXTERNAL_BUILT_PACKAGES CPACK_EXTERNAL_ENABLE_STAGING CPACK_EXTERNAL_PACKAGE_SCRIPT CPACK_EXTERNAL_REQUESTED_VERSIONS @@ -1883,6 +1933,7 @@ CPACK_PACKAGE_DESCRIPTION_SUMMARY CPACK_PACKAGE_DIRECTORY CPACK_PACKAGE_EXECUTABLES + CPACK_PACKAGE_FILES CPACK_PACKAGE_FILE_NAME CPACK_PACKAGE_HOMEPAGE_URL CPACK_PACKAGE_ICON @@ -1897,6 +1948,8 @@ CPACK_PACKAGING_INSTALL_PREFIX CPACK_PKGBUILD_IDENTITY_NAME CPACK_PKGBUILD_KEYCHAIN_PATH + CPACK_POST_BUILD_SCRIPTS + CPACK_PRE_BUILD_SCRIPTS CPACK_PRODUCTBUILD_BACKGROUND CPACK_PRODUCTBUILD_BACKGROUND_ALIGNMENT CPACK_PRODUCTBUILD_BACKGROUND_DARKAQUA @@ -1989,6 +2042,7 @@ CPACK_WARN_ON_ABSOLUTE_INSTALL_DESTINATION CPACK_WIX_CMAKE_PACKAGE_REGISTRY CPACK_WIX_CULTURES + CPACK_WIX_CUSTOM_XMLNS CPACK_WIX_EXTENSIONS CPACK_WIX_EXTRA_OBJECTS CPACK_WIX_EXTRA_SOURCES @@ -2181,6 +2235,7 @@ CC CFLAGS CMAKE_APPBUNDLE_PATH + CMAKE_APPLE_SILICON_PROCESSOR CMAKE_BUILD_PARALLEL_LEVEL CMAKE_CONFIG_TYPE CMAKE_EXPORT_COMPILE_COMMANDS @@ -2423,6 +2478,9 @@ INTERFACE_SYSTEM_INCLUDE_DIRECTORIES INTERPROCEDURAL_OPTIMIZATION IOS_INSTALL_COMBINED + ISPC_HEADER_DIRECTORY + ISPC_HEADER_SUFFIX + ISPC_INSTRUCTION_SETS JOB_POOL_COMPILE JOB_POOL_LINK LABELS @@ -2452,10 +2510,18 @@ NAME NO_SONAME NO_SYSTEM_FROM_IMPORTED + OBJCXX_EXTENSIONS + OBJCXX_STANDARD + OBJCXX_STANDARD_REQUIRED + OBJC_EXTENSIONS + OBJC_STANDARD + OBJC_STANDARD_REQUIRED + OPTIMIZE_DEPENDENCIES OSX_ARCHITECTURES OSX_COMPATIBILITY_VERSION OSX_CURRENT_VERSION OUTPUT_NAME + PCH_INSTANTIATE_TEMPLATES PCH_WARN_INVALID PDB_NAME PDB_OUTPUT_DIRECTORY @@ -2528,6 +2594,7 @@ WINDOWS_EXPORT_ALL_SYMBOLS XCODE_EXPLICIT_FILE_TYPE XCODE_GENERATE_SCHEME + XCODE_LINK_BUILD_PHASE_MODE XCODE_PRODUCT_TYPE XCODE_SCHEME_ADDRESS_SANITIZER XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN @@ -3785,64 +3852,19 @@ - + - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + @@ -3871,210 +3893,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -4086,11 +3906,7 @@ - - - - - + @@ -4132,10 +3948,20 @@ - - - - + + + + + + + + + + + + + + @@ -4157,8 +3983,7 @@ - - + @@ -4170,8 +3995,7 @@ - - + @@ -4215,6 +4039,7 @@ + @@ -4238,7 +4063,7 @@ - + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/css.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/css.xml index 3a2aa3dc91d..37da5ea3746 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/css.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/css.xml @@ -38,7 +38,7 @@ Changelog: --> - + @@ -822,6 +822,7 @@ Changelog: static static-position status-bar + sticky thick thin ultra-condensed @@ -1584,8 +1585,7 @@ Changelog: - - + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/doxygen.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/doxygen.xml index 6f3172570c7..d7a53a167c0 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 @@ + ]> - + - - + - + - - + @@ -335,7 +333,7 @@ - + @@ -354,7 +352,7 @@ - + @@ -498,7 +496,7 @@ - + @@ -590,8 +588,7 @@ - - + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/dtd.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/dtd.xml index be6bed734e5..8093b1c4e81 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/dtd.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/dtd.xml @@ -3,7 +3,7 @@ ]> - + @@ -45,8 +45,7 @@ - - + @@ -78,7 +77,7 @@ - + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/html.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/html.xml index 2a9a3bc4f44..312c91c5aa8 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/html.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/html.xml @@ -5,7 +5,7 @@ ]> - + @@ -79,8 +79,7 @@ - - + @@ -92,8 +91,7 @@ - - + @@ -195,7 +193,7 @@ - + @@ -206,8 +204,7 @@ - - + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/ini.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/ini.xml index 0a6730977f0..8b36a562907 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 @@ - + @@ -36,8 +36,7 @@ - - + @@ -48,8 +47,7 @@ - - + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/java.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/java.xml index 273e899f739..6091cd4ee29 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/java.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/java.xml @@ -1,10 +1,13 @@ - + + + + + ]> - + ACTIVE @@ -3704,21 +3707,11 @@ abstract - break - case - catch class - continue default - do - else enum extends false - finally - for - goto - if implements instanceof @interface @@ -3729,18 +3722,30 @@ private protected public - return super strictfp - switch synchronized this throws - throw transient true - try volatile + + + break + case + catch + continue + do + else + finally + for + goto + if + return + switch + throw + try while @@ -3759,87 +3764,127 @@ - - - - - - - - - - - - - - - - - - - - + + + - - - - - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - + + + + + + + + - + - - - - - - + + - - + + + + + - - + + + + + - - + + + + + + + + + + + + + + + + - - + - - + + + @@ -3855,8 +3900,9 @@ - + + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/javadoc.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/javadoc.xml index e72488b2214..336fedd53c1 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 @@ - + @@ -12,74 +12,52 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - + + + + + + + + + + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/json.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/json.xml index a7ab85e0bb0..686a1758c67 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/json.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/json.xml @@ -12,7 +12,7 @@ ** http://tools.ietf.org/html/rfc4627 *************************************************************************** --> - + null @@ -46,8 +46,7 @@ - - + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/makefile.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/makefile.xml index 7df18db5df7..257aac57410 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/makefile.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/makefile.xml @@ -12,7 +12,7 @@ @@ -384,6 +384,8 @@ TODO :[range] --> + + - - @@ -417,12 +417,11 @@ :Dnewval If the variable is defined newval is the value. :Unewval If the variable is undefined newval is the value. --> - - + @@ -477,8 +476,7 @@ - - + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/markdown.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/markdown.xml index d836d1c3f4c..b35397af9c9 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/markdown.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/markdown.xml @@ -90,14 +90,14 @@ ]> - + - + - + @@ -109,12 +109,12 @@ - + - + @@ -130,9 +130,9 @@ NOTE: The indentation of the lists is captured. --> - - - + + + @@ -142,33 +142,30 @@ - + - - + - - - - - - + + + + + + - - + - - + @@ -195,7 +192,7 @@ - + @@ -206,16 +203,10 @@ - - - - - - - - - - + + + + @@ -223,40 +214,40 @@ - + - - - + + + - + - + - - - + + + - + - + - - - + + + - + @@ -268,7 +259,7 @@ - + @@ -277,24 +268,17 @@ - - - - - - - - - - + + + + - - + @@ -337,7 +321,7 @@ - + @@ -465,14 +449,9 @@ - - - - - + - - + @@ -508,13 +487,13 @@ - + - + @@ -552,25 +531,23 @@ - + - + - + - + - - - + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/perl.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/perl.xml index 1b5ca943bed..fdf2266558a 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/perl.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/perl.xml @@ -39,7 +39,7 @@ Enhance tr/// and y/// support. --> - + if @@ -339,7 +339,7 @@ - + @@ -347,7 +347,7 @@ - + @@ -384,8 +384,7 @@ - - + @@ -428,15 +427,7 @@ - - - - - - - - - + @@ -465,7 +456,7 @@ - + @@ -508,7 +499,7 @@ - + @@ -605,10 +596,7 @@ - - - - + @@ -629,7 +617,6 @@ - @@ -663,13 +650,7 @@ - - - - - - - + @@ -713,17 +694,10 @@ - - - - - - - + + - - - + @@ -732,17 +706,11 @@ - - - - - - - + + + - - - + @@ -767,7 +735,7 @@ - + @@ -791,26 +759,24 @@ - - - + - + - + - + @@ -841,14 +807,13 @@ - + - - + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/powershell.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/powershell.xml index 29ec21e286e..7754c6cf340 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/powershell.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/powershell.xml @@ -1,9 +1,9 @@ - - + - - + @@ -908,14 +906,12 @@ - - + - - + @@ -931,7 +927,7 @@ - + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/python.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/python.xml index 2cdde881c9a..f1c89a54e41 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/python.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/python.xml @@ -4,6 +4,35 @@ + + + + + ]> @@ -19,7 +48,7 @@ - + import @@ -355,8 +384,7 @@ - - + @@ -393,20 +421,20 @@ - - - - + + + + - - - - + + + + @@ -417,10 +445,10 @@ - - - - + + + + @@ -448,66 +476,38 @@ - - + - + - + - + - + - - - - + @@ -517,12 +517,7 @@ - - - - - - + @@ -532,7 +527,7 @@ - + @@ -552,50 +547,50 @@ - + - + - + - + - + - + - + - + @@ -603,50 +598,50 @@ - + - + - + - + - + - + - + - + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/qdocconf.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/qdocconf.xml index 4504016d0af..b735ca9f4a9 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/qdocconf.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/qdocconf.xml @@ -1,7 +1,7 @@ - - + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/ruby.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/ruby.xml index a6d44b4246f..dc6444e7476 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/ruby.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/ruby.xml @@ -31,7 +31,7 @@ - + - + - - - + + - @@ -236,8 +234,7 @@ - - + @@ -269,21 +266,16 @@ - - - - - + + - - + - - + @@ -291,14 +283,12 @@ - - + + - - @@ -320,20 +310,20 @@ - + - + - + @@ -345,7 +335,7 @@ - + @@ -355,8 +345,7 @@ - - + @@ -390,7 +379,7 @@ - + @@ -433,8 +422,7 @@ - - + - - - + - - - + @@ -463,11 +447,11 @@ - + - + @@ -481,8 +465,8 @@ - - + + @@ -602,7 +586,7 @@ --> - + @@ -667,7 +651,7 @@ --> - + @@ -731,7 +715,7 @@ --> - + @@ -795,7 +779,7 @@ --> - + @@ -861,7 +845,7 @@ --> - + 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 d30fc775826..46d8c646f7d 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/valgrind-suppression.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/valgrind-suppression.xml @@ -1,6 +1,6 @@ - + @@ -9,7 +9,7 @@ - + @@ -25,8 +25,7 @@ - - + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/xml.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/xml.xml index bb88366c865..fbefcb6dad0 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/xml.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/xml.xml @@ -6,7 +6,7 @@ ]> - + @@ -17,10 +17,10 @@ - - - - + + + + @@ -41,37 +41,67 @@ - - + + + + + + - + + + + + + + + - + + + + + + + + + + + + + - - + + - - + + - + + + + + + + + - + @@ -86,25 +116,31 @@ + + + - - + + - + + + + - + - + @@ -115,29 +151,34 @@ - + - + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/yacc.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/yacc.xml index 996d36df627..478dc396d8c 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/yacc.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/yacc.xml @@ -32,7 +32,7 @@ This code is released under the LGPL as part of kdelibs/kate. ======================================================================== --> - + @@ -139,9 +139,9 @@ This code is released under the LGPL as part of kdelibs/kate. - + - + @@ -201,13 +201,11 @@ This code is released under the LGPL as part of kdelibs/kate. - - + - - + diff --git a/src/libs/3rdparty/syntax-highlighting/data/themes/atom-one-dark.theme b/src/libs/3rdparty/syntax-highlighting/data/themes/atom-one-dark.theme new file mode 100644 index 00000000000..dcd95114025 --- /dev/null +++ b/src/libs/3rdparty/syntax-highlighting/data/themes/atom-one-dark.theme @@ -0,0 +1,352 @@ +{ + "custom-styles": { + "Go": { + "Predeclared Identifier": { + "selected-text-color": "#d19a66", + "text-color": "#d19a66" + } + }, + "INI Files": { + "Assignment": { + "selected-text-color": "#abb2bf", + "text-color": "#abb2bf" + }, + "Section": { + "selected-text-color": "#56b6c2", + "text-color": "#56b6c2" + } + }, + "JavaScript": { + "Built-in Objects": { + "selected-text-color": "#d19a66", + "text-color": "#d19a66" + }, + "Function Declaration": { + "selected-text-color": "#56b6c2", + "text-color": "#56b6c2" + }, + "Function Name": { + "selected-text-color": "#56b6c2", + "text-color": "#56b6c2" + }, + "Module": { + "selected-text-color": "#c678dd", + "text-color": "#c678dd" + }, + "Object Member": { + "selected-text-color": "#e06c75", + "text-color": "#e06c75" + }, + "Object Method (Built-in)": { + "selected-text-color": "#56b6c2", + "text-color": "#56b6c2" + } + }, + "Markdown": { + "Code": { + "selected-text-color": "#d19a66", + "text-color": "#d19a66" + }, + "Emphasis Text": { + "selected-text-color": "#c678dd", + "text-color": "#c678dd" + }, + "Fenced Code": { + "selected-text-color": "#d19a66", + "text-color": "#d19a66" + }, + "Header H1": { + "selected-text-color": "#e06c75", + "text-color": "#e06c75" + }, + "Header H2": { + "selected-text-color": "#e06c75", + "text-color": "#e06c75" + }, + "Header H3": { + "selected-text-color": "#e06c75", + "text-color": "#e06c75" + }, + "Header H4": { + "selected-text-color": "#e06c75", + "text-color": "#e06c75" + }, + "Header H5": { + "selected-text-color": "#e06c75", + "text-color": "#e06c75" + }, + "Header H6": { + "selected-text-color": "#e06c75", + "text-color": "#e06c75" + }, + "Link": { + "selected-text-color": "#c678dd", + "text-color": "#c678dd" + }, + "Reference-Link Name": { + "selected-text-color": "#56b6c2", + "text-color": "#56b6c2" + }, + "Reference-Link Target": { + "selected-text-color": "#56b6c2", + "text-color": "#56b6c2" + }, + "Reference-Link Target: Link": { + "selected-text-color": "#c678dd", + "text-color": "#c678dd" + }, + "Reference-Link: Email": { + "selected-text-color": "#c678dd", + "text-color": "#c678dd" + }, + "Reference-Link: Link": { + "selected-text-color": "#c678dd", + "text-color": "#c678dd" + }, + "Strong Text": { + "selected-text-color": "#d19a66", + "text-color": "#d19a66" + } + }, + "Python": { + "Builtin Function": { + "selected-text-color": "#56b6c2", + "text-color": "#56b6c2" + }, + "String Substitution": { + "selected-text-color": "#d19a66", + "text-color": "#d19a66" + } + }, + "Rust": { + "Lifetime": { + "selected-text-color": "#d19a66", + "text-color": "#d19a66" + }, + "Macro": { + "selected-text-color": "#56b6c2", + "text-color": "#56b6c2" + }, + "Self": { + "selected-text-color": "#e06c75", + "text-color": "#e06c75" + }, + "Trait": { + "selected-text-color": "#d19a66", + "text-color": "#d19a66" + }, + "Type": { + "selected-text-color": "#56b6c2", + "text-color": "#56b6c2" + } + }, + "TypeScript": { + "Built-in Objects": { + "selected-text-color": "#d19a66", + "text-color": "#d19a66" + }, + "Module": { + "selected-text-color": "#c678dd", + "text-color": "#c678dd" + }, + "Object Member": { + "selected-text-color": "#e06c75", + "text-color": "#e06c75" + }, + "Object Method (Built-in)": { + "italic": false, + "selected-text-color": "#56b6c2", + "text-color": "#56b6c2" + }, + "Reserved": { + "italic": false + }, + "Types": { + "selected-text-color": "#56b6c2", + "text-color": "#56b6c2" + } + }, + "XML": { + "Attribute": { + "selected-text-color": "#d19a66", + "text-color": "#d19a66" + }, + "Element": { + "selected-text-color": "#e06c75", + "text-color": "#e06c75" + } + } + }, + "editor-colors": { + "BackgroundColor": "#282c34", + "BracketMatching": "#8e44ad", + "CodeFolding": "#363c4a", + "CurrentLine": "#0A99BBFF", + "CurrentLineNumber": "#abb2bf", + "IconBorder": "#282c34", + "IndentationLine": "#3a3f44", + "LineNumbers": "#636D83", + "MarkBookmark": "#0404bf", + "MarkBreakpointActive": "#8b0607", + "MarkBreakpointDisabled": "#820683", + "MarkBreakpointReached": "#6d6e07", + "MarkError": "#c24038", + "MarkExecution": "#4d4e50", + "MarkWarning": "#d19a66", + "ModifiedLines": "#e06c75", + "ReplaceHighlight": "#a34f56", + "SavedLines": "#98c379", + "SearchHighlight": "#3D528BFF", + "Separator": "#3f4347", + "SpellChecking": "#c24038", + "TabMarker": "#21252B", + "TemplateBackground": "#31363b", + "TemplateFocusedPlaceholder": "#123723", + "TemplatePlaceholder": "#123723", + "TemplateReadOnlyPlaceholder": "#4d1f24", + "TextSelection": "#363c4a", + "WordWrapMarker": "#3a3f44" + }, + "metadata": { + "copyright": [ + "SPDX-FileCopyrightText: 2016 GitHub Inc.", + "SPDX-FileCopyrightText: 2020 Waqar Ahmed " + ], + "license": "SPDX-License-Identifier: MIT", + "name": "Atom One Dark", + "revision": 2 + }, + "text-styles": { + "Alert": { + "background-color": "#4d1f24", + "bold": true, + "selected-text-color": "#95da4c", + "text-color": "#95da4c" + }, + "Annotation": { + "selected-text-color": "#98c379", + "text-color": "#98c379" + }, + "Attribute": { + "selected-text-color": "#c678dd", + "text-color": "#c678dd" + }, + "BaseN": { + "selected-text-color": "#d19a66", + "text-color": "#d19a66" + }, + "BuiltIn": { + "selected-text-color": "#c678dd", + "text-color": "#c678dd" + }, + "Char": { + "selected-text-color": "#98c379", + "text-color": "#98c379" + }, + "Comment": { + "italic": true, + "selected-text-color": "#5c6370", + "text-color": "#5c6370" + }, + "CommentVar": { + "italic": true, + "selected-text-color": "#e06c75", + "text-color": "#e06c75" + }, + "Constant": { + "selected-text-color": "#d19a66", + "text-color": "#d19a66" + }, + "ControlFlow": { + "selected-text-color": "#c678dd", + "text-color": "#c678dd" + }, + "DataType": { + "selected-text-color": "#c678dd", + "text-color": "#c678dd" + }, + "DecVal": { + "selected-text-color": "#d19a66", + "text-color": "#d19a66" + }, + "Documentation": { + "selected-text-color": "#da4453", + "text-color": "#a43340" + }, + "Error": { + "selected-text-color": "#f44747", + "text-color": "#f44747", + "underline": true + }, + "Extension": { + "bold": true, + "selected-text-color": "#61afef", + "text-color": "#61afef" + }, + "Float": { + "selected-text-color": "#d19a66", + "text-color": "#d19a66" + }, + "Function": { + "selected-text-color": "#61afef", + "text-color": "#61afef" + }, + "Import": { + "selected-text-color": "#98c379", + "text-color": "#98c379" + }, + "Information": { + "selected-text-color": "#e46700", + "text-color": "#c45b00" + }, + "Keyword": { + "selected-text-color": "#c678dd", + "text-color": "#c678dd" + }, + "Normal": { + "selected-text-color": "#abb2bf", + "text-color": "#abb2bf" + }, + "Operator": { + "selected-text-color": "#c678dd", + "text-color": "#c678dd" + }, + "Others": { + "selected-text-color": "#27ae60", + "text-color": "#27ae60" + }, + "Preprocessor": { + "selected-text-color": "#c678dd", + "text-color": "#c678dd" + }, + "RegionMarker": { + "background-color": "#153042", + "selected-text-color": "#3daee9", + "text-color": "#2980b9" + }, + "SpecialChar": { + "selected-text-color": "#56b6c2", + "text-color": "#56b6c2" + }, + "SpecialString": { + "selected-text-color": "#da4453", + "text-color": "#da4453" + }, + "String": { + "selected-text-color": "#98c379", + "text-color": "#98c379" + }, + "Variable": { + "selected-text-color": "#e06c75", + "text-color": "#e06c75" + }, + "VerbatimString": { + "selected-text-color": "#da4453", + "text-color": "#da4453" + }, + "Warning": { + "selected-text-color": "#da4453", + "text-color": "#da4453" + } + } +} diff --git a/src/libs/3rdparty/syntax-highlighting/data/themes/atom-one-light.theme b/src/libs/3rdparty/syntax-highlighting/data/themes/atom-one-light.theme new file mode 100644 index 00000000000..69ce7cb2b0f --- /dev/null +++ b/src/libs/3rdparty/syntax-highlighting/data/themes/atom-one-light.theme @@ -0,0 +1,359 @@ +{ + "custom-styles": { + "Go": { + "Predeclared Identifier": { + "selected-text-color": "#986801", + "text-color": "#986801" + } + }, + "INI Files": { + "Assignment": { + "selected-text-color": "#383a42", + "text-color": "#383a42" + }, + "Section": { + "selected-text-color": "#4078f2", + "text-color": "#4078f2" + } + }, + "JavaScript": { + "Built-in Objects": { + "selected-text-color": "#986801", + "text-color": "#986801" + }, + "Function Declaration": { + "selected-text-color": "#0184bc", + "text-color": "#0184bc" + }, + "Function Name": { + "selected-text-color": "#0184bc", + "text-color": "#0184bc" + }, + "Module": { + "selected-text-color": "#a626a4", + "text-color": "#a626a4" + }, + "Object Member": { + "selected-text-color": "#e45649", + "text-color": "#e45649" + }, + "Object Method (Built-in)": { + "selected-text-color": "#0184bc", + "text-color": "#0184bc" + } + }, + "Markdown": { + "Code": { + "selected-text-color": "#d19a66", + "text-color": "#d19a66" + }, + "Emphasis Text": { + "selected-text-color": "#a626a4", + "text-color": "#a626a4" + }, + "Fenced Code": { + "selected-text-color": "#d19a66", + "text-color": "#d19a66" + }, + "Header H1": { + "selected-text-color": "#e45649", + "text-color": "#e45649" + }, + "Header H2": { + "selected-text-color": "#e45649", + "text-color": "#e45649" + }, + "Header H3": { + "selected-text-color": "#e45649", + "text-color": "#e45649" + }, + "Header H4": { + "selected-text-color": "#e45649", + "text-color": "#e45649" + }, + "Header H5": { + "selected-text-color": "#e45649", + "text-color": "#e45649" + }, + "Header H6": { + "selected-text-color": "#e45649", + "text-color": "#e45649" + }, + "Line Break": { + "text-color": "#383a42" + }, + "Link": { + "selected-text-color": "#a626a4", + "text-color": "#a626a4" + }, + "Reference-Link Name": { + "selected-text-color": "#4078f2", + "text-color": "#4078f2" + }, + "Reference-Link Target": { + "selected-text-color": "#4078f2", + "text-color": "#4078f2" + }, + "Reference-Link Target: Link": { + "selected-text-color": "#a626a4", + "text-color": "#a626a4" + }, + "Reference-Link: Email": { + "selected-text-color": "#a626a4", + "text-color": "#a626a4" + }, + "Reference-Link: Link": { + "selected-text-color": "#a626a4", + "text-color": "#a626a4" + }, + "Strong Text": { + "selected-text-color": "#986801", + "text-color": "#986801" + } + }, + "Python": { + "Builtin Function": { + "selected-text-color": "#0184bc", + "text-color": "#0184bc" + }, + "Import": { + "selected-text-color": "#a626a4", + "text-color": "#a626a4" + }, + "String Substitution": { + "selected-text-color": "#986801", + "text-color": "#986801" + } + }, + "Rust": { + "Lifetime": { + "selected-text-color": "#986801", + "text-color": "#986801" + }, + "Macro": { + "selected-text-color": "#4078f2", + "text-color": "#4078f2" + }, + "Self": { + "selected-text-color": "#e45649", + "text-color": "#e45649" + }, + "Trait": { + "selected-text-color": "#986801", + "text-color": "#986801" + }, + "Type": { + "selected-text-color": "#0184bc", + "text-color": "#0184bc" + } + }, + "TypeScript": { + "Built-in Objects": { + "selected-text-color": "#986801", + "text-color": "#986801" + }, + "Module": { + "selected-text-color": "#a626a4", + "text-color": "#a626a4" + }, + "Object Member": { + "selected-text-color": "#e45649", + "text-color": "#e45649" + }, + "Object Method (Built-in)": { + "italic": false, + "selected-text-color": "#0184bc", + "text-color": "#0184bc" + }, + "Reserved": { + "italic": false + }, + "Types": { + "selected-text-color": "#4078f2", + "text-color": "#4078f2" + } + }, + "XML": { + "Attribute": { + "selected-text-color": "#986801", + "text-color": "#986801" + }, + "Element": { + "selected-text-color": "#e45649", + "text-color": "#e45649" + } + } + }, + "editor-colors": { + "BackgroundColor": "#fafafa", + "BracketMatching": "#ff6e6e", + "CodeFolding": "#e5e5e6", + "CurrentLine": "#0C383A42", + "CurrentLineNumber": "#383a42", + "IconBorder": "#fafafa", + "IndentationLine": "#626772", + "LineNumbers": "#9D9D9F", + "MarkBookmark": "#0404bf", + "MarkBreakpointActive": "#8b0607", + "MarkBreakpointDisabled": "#820683", + "MarkBreakpointReached": "#6d6e07", + "MarkError": "#c24038", + "MarkExecution": "#4d4e50", + "MarkWarning": "#ce7c2b", + "ModifiedLines": "#e06c75", + "ReplaceHighlight": "#ef747e", + "SavedLines": "#98c379", + "SearchHighlight": "#33526FFF", + "Separator": "#a6b0ba", + "SpellChecking": "#c24038", + "TabMarker": "#8894a6", + "TemplateBackground": "#31363b", + "TemplateFocusedPlaceholder": "#123723", + "TemplatePlaceholder": "#123723", + "TemplateReadOnlyPlaceholder": "#4d1f24", + "TextSelection": "#e5e5e6", + "WordWrapMarker": "#cddff1" + }, + "metadata": { + "copyright": [ + "SPDX-FileCopyrightText: 2016 GitHub Inc.", + "SPDX-FileCopyrightText: 2020 Waqar Ahmed " + ], + "license": "SPDX-License-Identifier: MIT", + "name": "Atom One Light", + "revision": 3 + }, + "text-styles": { + "Alert": { + "background-color": "#4d1f24", + "bold": true, + "selected-text-color": "#95da4c", + "text-color": "#95da4c" + }, + "Annotation": { + "selected-text-color": "#50a14f", + "text-color": "#50a14f" + }, + "Attribute": { + "selected-text-color": "#a626a4", + "text-color": "#a626a4" + }, + "BaseN": { + "selected-text-color": "#986801", + "text-color": "#986801" + }, + "BuiltIn": { + "selected-text-color": "#a626a4", + "text-color": "#a626a4" + }, + "Char": { + "selected-text-color": "#50a14f", + "text-color": "#50a14f" + }, + "Comment": { + "italic": true, + "selected-text-color": "#a0a1a7", + "text-color": "#a0a1a7" + }, + "CommentVar": { + "italic": true, + "selected-text-color": "#e45649", + "text-color": "#e45649" + }, + "Constant": { + "selected-text-color": "#986801", + "text-color": "#986801" + }, + "ControlFlow": { + "selected-text-color": "#a626a4", + "text-color": "#a626a4" + }, + "DataType": { + "selected-text-color": "#a626a4", + "text-color": "#a626a4" + }, + "DecVal": { + "selected-text-color": "#986801", + "text-color": "#986801" + }, + "Documentation": { + "selected-text-color": "#da4453", + "text-color": "#e45649" + }, + "Error": { + "selected-text-color": "#f44747", + "text-color": "#f44747", + "underline": true + }, + "Extension": { + "bold": true, + "selected-text-color": "#4078f2", + "text-color": "#4078f2" + }, + "Float": { + "selected-text-color": "#986801", + "text-color": "#986801" + }, + "Function": { + "selected-text-color": "#4078f2", + "text-color": "#4078f2" + }, + "Import": { + "selected-text-color": "#50a14f", + "text-color": "#50a14f" + }, + "Information": { + "selected-text-color": "#e46700", + "text-color": "#c45b00" + }, + "Keyword": { + "selected-text-color": "#a626a4", + "text-color": "#a626a4" + }, + "Normal": { + "selected-text-color": "#383a42", + "text-color": "#383a42" + }, + "Operator": { + "selected-text-color": "#a626a4", + "text-color": "#a626a4" + }, + "Others": { + "selected-text-color": "#27ae60", + "text-color": "#27ae60" + }, + "Preprocessor": { + "selected-text-color": "#a626a4", + "text-color": "#a626a4" + }, + "RegionMarker": { + "background-color": "#153042", + "selected-text-color": "#3daee9", + "text-color": "#2980b9" + }, + "SpecialChar": { + "selected-text-color": "#0184bc", + "text-color": "#0184bc" + }, + "SpecialString": { + "selected-text-color": "#da4453", + "text-color": "#da4453" + }, + "String": { + "selected-text-color": "#50a14f", + "text-color": "#50a14f" + }, + "Variable": { + "selected-text-color": "#e45649", + "text-color": "#e45649" + }, + "VerbatimString": { + "selected-text-color": "#da4453", + "text-color": "#da4453" + }, + "Warning": { + "selected-text-color": "#da4453", + "text-color": "#da4453" + } + } +} diff --git a/src/libs/3rdparty/syntax-highlighting/data/themes/ayu-dark.theme b/src/libs/3rdparty/syntax-highlighting/data/themes/ayu-dark.theme index 9c84e5af5d5..ebfde027973 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/themes/ayu-dark.theme +++ b/src/libs/3rdparty/syntax-highlighting/data/themes/ayu-dark.theme @@ -1,6 +1,6 @@ { "_comments": [ - "Last update: Sep 21, 2020 (revision 2)", + "Last update: Feb 22, 2021 (revision 3)", "This file has been converted from: https://github.com/dempfi/ayu", "Also see: https://github.com/ayu-theme" ], @@ -11,7 +11,7 @@ ], "license": "SPDX-License-Identifier: MIT", "name": "ayu Dark", - "revision": 2 + "revision": 3 }, "editor-colors": { "BackgroundColor": "#0a0e14", @@ -176,5 +176,30 @@ "selected-text-color": "#f07178", "text-color": "#f07178" } + }, + "custom-styles": { + "XML": { + "Attribute": { + "selected-text-color": "#ffb454", + "text-color": "#ffb454" + }, + "Element": { + "selected-text-color": "#39bae6", + "text-color": "#39bae6", + "bold": false + }, + "Element Symbols": { + "selected-text-color": "#307896", + "text-color": "#22647d" + }, + "EntityRef": { + "selected-text-color": "#95e6cb", + "text-color": "#95e6cb" + }, + "PEntityRef": { + "selected-text-color": "#95e6cb", + "text-color": "#95e6cb" + } + } } } diff --git a/src/libs/3rdparty/syntax-highlighting/data/themes/ayu-mirage.theme b/src/libs/3rdparty/syntax-highlighting/data/themes/ayu-mirage.theme index cd9ff7488e8..e389ecf2981 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/themes/ayu-mirage.theme +++ b/src/libs/3rdparty/syntax-highlighting/data/themes/ayu-mirage.theme @@ -1,6 +1,6 @@ { "_comments": [ - "Last update: Sep 21, 2020 (revision 2)", + "Last update: Feb 22, 2021 (revision 3)", "This file has been converted from: https://github.com/dempfi/ayu", "Also see: https://github.com/ayu-theme" ], @@ -11,7 +11,7 @@ ], "license": "SPDX-License-Identifier: MIT", "name": "ayu Mirage", - "revision": 2 + "revision": 3 }, "editor-colors": { "BackgroundColor": "#1f2430", @@ -176,5 +176,30 @@ "selected-text-color": "#f28779", "text-color": "#f28779" } + }, + "custom-styles": { + "XML": { + "Attribute": { + "selected-text-color": "#ffd580", + "text-color": "#ffd580" + }, + "Element": { + "selected-text-color": "#5ccfe6", + "text-color": "#5ccfe6", + "bold": false + }, + "Element Symbols": { + "selected-text-color": "#4788a2", + "text-color": "#3d7a8b" + }, + "EntityRef": { + "selected-text-color": "#95e6cb", + "text-color": "#95e6cb" + }, + "PEntityRef": { + "selected-text-color": "#95e6cb", + "text-color": "#95e6cb" + } + } } } diff --git a/src/libs/3rdparty/syntax-highlighting/data/themes/breeze-dark.theme b/src/libs/3rdparty/syntax-highlighting/data/themes/breeze-dark.theme index 93f8fa9cac7..712da4acc4a 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/themes/breeze-dark.theme +++ b/src/libs/3rdparty/syntax-highlighting/data/themes/breeze-dark.theme @@ -5,7 +5,7 @@ "SPDX-FileCopyrightText: 2016 Dominik Haumann " ], "license": "SPDX-License-Identifier: MIT", - "revision" : 2, + "revision" : 6, "name" : "Breeze Dark" }, "text-styles": { @@ -36,8 +36,8 @@ "bold" : true }, "Operator" : { - "text-color" : "#cfcfc2", - "selected-text-color" : "#cfcfc2" + "text-color" : "#3f8058", + "selected-text-color" : "#54aa75" }, "BuiltIn" : { "text-color" : "#7f8c8d", @@ -149,7 +149,7 @@ "editor-colors": { "BackgroundColor" : "#232629", "CodeFolding" : "#224e65", - "BracketMatching" : "#8e44ad", + "BracketMatching" : "#323030", "CurrentLine" : "#2A2E32", "IconBorder" : "#31363b", "IndentationLine" : "#3a3f44", @@ -167,7 +167,7 @@ "SavedLines" : "#1c8042", "SearchHighlight" : "#218058", "TextSelection" : "#2d5c76", - "Separator" : "#7a7c7d", + "Separator" : "#3f4347", "SpellChecking" : "#c0392b", "TabMarker" : "#4d4d4d", "TemplateBackground" : "#31363b", diff --git a/src/libs/3rdparty/syntax-highlighting/data/themes/breeze-light.theme b/src/libs/3rdparty/syntax-highlighting/data/themes/breeze-light.theme index 0a27e2d3548..7d0116bea95 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/themes/breeze-light.theme +++ b/src/libs/3rdparty/syntax-highlighting/data/themes/breeze-light.theme @@ -5,7 +5,7 @@ "SPDX-FileCopyrightText: 2016 Dominik Haumann " ], "license": "SPDX-License-Identifier: MIT", - "revision" : 4, + "revision" : 8, "name" : "Breeze Light" }, "text-styles": { @@ -36,8 +36,8 @@ "bold" : true }, "Operator" : { - "text-color" : "#1f1c1b", - "selected-text-color" : "#ffffff" + "text-color" : "#ca60ca", + "selected-text-color" : "#a44ea4" }, "BuiltIn" : { "text-color" : "#644a9b", @@ -167,7 +167,7 @@ "SavedLines" : "#2ecc71", "SearchHighlight" : "#ffff00", "TextSelection" : "#94caef", - "Separator" : "#a0a0a0", + "Separator" : "#d5d5d5", "SpellChecking" : "#bf0303", "TabMarker" : "#d2d2d2", "TemplateBackground" : "#d6d2d0", diff --git a/src/libs/3rdparty/syntax-highlighting/data/themes/dracula.theme b/src/libs/3rdparty/syntax-highlighting/data/themes/dracula.theme index 82786160b8f..93b1833334f 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/themes/dracula.theme +++ b/src/libs/3rdparty/syntax-highlighting/data/themes/dracula.theme @@ -1,13 +1,547 @@ { + "custom-styles": { + "Alerts": { + "Region Marker": { + "selected-text-color": "#6db8c7", + "text-color": "#6db8c7" + } + }, + "Apache Configuration": { + "Directives": { + "bold": false + } + }, + "Bash": { + "Path": { + "selected-text-color": "#f1fa8c", + "text-color": "#f1fa8c" + }, + "Redirection": { + "selected-text-color": "#ff79c6", + "text-color": "#ff79c6" + }, + "Variable": { + "selected-text-color": "#bd93f9", + "text-color": "#bd93f9" + } + }, + "C": { + "Prep. Lib": { + "selected-text-color": "#f1fa8c", + "text-color": "#f1fa8c" + } + }, + "C++": { + "Qt Macros": { + "bold": false, + "selected-text-color": "#50fa7b", + "text-color": "#50fa7b" + } + }, + "CMake": { + "Builtin Variable": { + "selected-text-color": "#ffb86c", + "text-color": "#ffb86c" + } + }, + "CSS": { + "Color": { + "bold": false + }, + "Property": { + "selected-text-color": "#8be9fd", + "text-color": "#8be9fd" + }, + "Selector Class": { + "italic": true + }, + "Selector Id": { + "bold": false, + "selected-text-color": "#50fa7b", + "text-color": "#50fa7b" + }, + "Selector Pseudo": { + "selected-text-color": "#50fa7b", + "text-color": "#50fa7b" + }, + "Selector Tag": { + "selected-text-color": "#ff79c6", + "text-color": "#ff79c6" + }, + "Unit": { + "selected-text-color": "#ff79c6", + "text-color": "#ff79c6" + } + }, + "D": { + "Attribute": { + "bold": false + }, + "Declarator": { + "bold": false + }, + "Deprecated": { + "bold": false + }, + "Expression": { + "bold": false + }, + "Module": { + "bold": false + }, + "Property": { + "bold": false + }, + "Template": { + "bold": false + } + }, + "Diff": { + "Added line": { + "selected-text-color": "#5fde38", + "text-color": "#50fa7b" + }, + "Changed line (new)": { + "background-color": "#50fa7b", + "selected-text-color": "#5fde38", + "text-color": "#50fa7b" + }, + "Changed line (old)": { + "selected-text-color": "#e66eb4", + "text-color": "#ff79c6" + }, + "Removed line": { + "selected-text-color": "#e66eb4", + "text-color": "#ff79c6" + } + }, + "Doxygen": { + "Custom Tags": { + "selected-text-color": "#d465a7", + "text-color": "#d465a7" + }, + "Description": { + "selected-text-color": "#c58e53", + "text-color": "#c58e53" + }, + "Entities": { + "bold": false + }, + "HTML Tag": { + "bold": false, + "selected-text-color": "#d465a7", + "text-color": "#d465a7" + }, + "Region": { + "selected-text-color": "#6db8c7", + "text-color": "#6db8c7" + }, + "Tags": { + "bold": false, + "selected-text-color": "#d465a7", + "text-color": "#d465a7" + }, + "Word": { + "bold": false, + "selected-text-color": "#c58e53", + "text-color": "#c58e53" + } + }, + "GNU Assembler": { + "Label": { + "underline": true + } + }, + "Go": { + "Builtin Function": { + "selected-text-color": "#50fa7b", + "text-color": "#50fa7b" + } + }, + "HTML": { + "Doctype": { + "bold": false, + "italic": false, + "selected-text-color": "#ff79c6", + "text-color": "#ff79c6" + } + }, + "ISO C++": { + "Prep. Lib": { + "selected-text-color": "#f1fa8c", + "text-color": "#f1fa8c" + }, + "Standard Suffix": { + "selected-text-color": "#ff79c6", + "text-color": "#ff79c6" + }, + "UDL Numeric Suffix": { + "selected-text-color": "#ff79c6", + "text-color": "#ff79c6" + }, + "UDL String Suffix": { + "selected-text-color": "#ff79c6", + "text-color": "#ff79c6" + } + }, + "Intel x86 (NASM)": { + "Label": { + "underline": true + }, + "Registers": { + "selected-text-color": "#ffb86c", + "text-color": "#ffb86c" + } + }, + "JSON": { + "Style_Keyword": { + "selected-text-color": "#bd93f9", + "text-color": "#bd93f9" + }, + "Style_String_Key": { + "italic": false + } + }, + "JavaScript": { + "Built-in Objects": { + "italic": true + }, + "Function (Built-in)": { + "selected-text-color": "#50fa7b", + "text-color": "#50fa7b" + }, + "Object Member": { + "selected-text-color": "#f8f8f2", + "text-color": "#f8f8f2" + } + }, + "JavaScript React (JSX)": { + "Attribute": { + "italic": true + }, + "Component Tag": { + "bold": false, + "selected-text-color": "#8be9fd", + "text-color": "#8be9fd" + } + }, + "Makefile": { + "Operator": { + "selected-text-color": "#ff79c6", + "text-color": "#ff79c6" + }, + "Prereq": { + "italic": false, + "selected-text-color": "#f1fa8c", + "text-color": "#f1fa8c" + }, + "Target": { + "selected-text-color": "#8be9fd", + "text-color": "#8be9fd" + }, + "Variable": { + "selected-text-color": "#ffb86c", + "text-color": "#ffb86c" + } + }, + "Markdown": { + "Blockquote: Link": { + "selected-text-color": "#8be9fd", + "text-color": "#8be9fd" + }, + "Email": { + "selected-text-color": "#8be9fd", + "text-color": "#8be9fd" + }, + "Emphasis Text": { + "selected-text-color": "#f1fa8c", + "text-color": "#f1fa8c" + }, + "Header H1": { + "selected-text-color": "#bd93f9", + "text-color": "#bd93f9" + }, + "Header H2": { + "selected-text-color": "#bd93f9", + "text-color": "#bd93f9" + }, + "Header H3": { + "selected-text-color": "#bd93f9", + "text-color": "#bd93f9" + }, + "Header H4": { + "selected-text-color": "#bd93f9", + "text-color": "#bd93f9" + }, + "Header H5": { + "selected-text-color": "#bd93f9", + "text-color": "#bd93f9" + }, + "Header H6": { + "selected-text-color": "#bd93f9", + "text-color": "#bd93f9" + }, + "Inline Image": { + "selected-text-color": "#ffb86c", + "text-color": "#ffb86c" + }, + "Inline Image: Link": { + "selected-text-color": "#8be9fd", + "text-color": "#8be9fd" + }, + "Link": { + "selected-text-color": "#8be9fd", + "text-color": "#8be9fd" + }, + "List: Emphasis Text": { + "selected-text-color": "#f1fa8c", + "text-color": "#f1fa8c" + }, + "List: Link": { + "selected-text-color": "#8be9fd", + "text-color": "#8be9fd" + }, + "List: Strong Text": { + "selected-text-color": "#ffb86c", + "text-color": "#ffb86c" + }, + "Normal Text: Link": { + "selected-text-color": "#8be9fd", + "text-color": "#8be9fd" + }, + "Reference Image": { + "selected-text-color": "#ffb86c", + "text-color": "#ffb86c" + }, + "Reference-Link": { + "selected-text-color": "#8be9fd", + "text-color": "#8be9fd" + }, + "Reference-Link Name": { + "selected-text-color": "#ff79c6", + "text-color": "#ff79c6", + "underline": false + }, + "Reference-Link Target": { + "selected-text-color": "#ff79c6", + "text-color": "#ff79c6" + }, + "Reference-Link Target: Link": { + "selected-text-color": "#8be9fd", + "text-color": "#8be9fd" + }, + "Reference-Link: Link": { + "selected-text-color": "#8be9fd", + "text-color": "#8be9fd" + }, + "Strong Text": { + "selected-text-color": "#ffb86c", + "text-color": "#ffb86c" + } + }, + "Modelines": { + "Variable": { + "selected-text-color": "#c58e53", + "text-color": "#c58e53" + } + }, + "PHP/PHP": { + "Backslash Code": { + "bold": false, + "selected-text-color": "#ff79c6", + "text-color": "#ff79c6" + }, + "Control Structures": { + "selected-text-color": "#ff79c6", + "text-color": "#ff79c6" + }, + "Library Constant": { + "bold": false, + "selected-text-color": "#bd93f9", + "text-color": "#bd93f9" + }, + "Special Variable": { + "bold": false, + "selected-text-color": "#f8f8f2", + "text-color": "#f8f8f2" + }, + "Variable": { + "selected-text-color": "#f8f8f2", + "text-color": "#f8f8f2" + } + }, + "Python": { + "Builtin Function": { + "selected-text-color": "#50fa7b", + "text-color": "#50fa7b" + }, + "Special Variable": { + "selected-text-color": "#bd93f9", + "text-color": "#bd93f9" + } + }, + "QMake": { + "Backslash Code": { + "bold": false + }, + "Predefined Variable": { + "bold": false, + "selected-text-color": "#ffb86c", + "text-color": "#ffb86c" + } + }, + "Ruby": { + "Access Control": { + "bold": false, + "selected-text-color": "#50fa7b", + "text-color": "#50fa7b" + }, + "Default globals": { + "bold": false + }, + "Definition": { + "selected-text-color": "#50fa7b", + "text-color": "#50fa7b" + }, + "Global Constant": { + "bold": false, + "italic": true, + "selected-text-color": "#8be9fd", + "text-color": "#8be9fd" + }, + "Kernel methods": { + "bold": false, + "selected-text-color": "#8be9fd", + "text-color": "#8be9fd" + }, + "Message": { + "selected-text-color": "#50fa7b", + "text-color": "#50fa7b" + }, + "Module mixin methods": { + "bold": false + }, + "Pseudo variable": { + "selected-text-color": "#50fa7b", + "text-color": "#50fa7b" + } + }, + "Rust": { + "Attribute": { + "selected-text-color": "#f8f8f2", + "text-color": "#f8f8f2" + }, + "CConstant": { + "bold": false + }, + "CType": { + "italic": true, + "selected-text-color": "#8be9fd", + "text-color": "#8be9fd" + }, + "Constant": { + "bold": false + }, + "Definition": { + "selected-text-color": "#50fa7b", + "text-color": "#50fa7b" + }, + "Lifetime": { + "selected-text-color": "#ff79c6", + "text-color": "#ff79c6" + }, + "Macro": { + "selected-text-color": "#8be9fd", + "text-color": "#8be9fd" + }, + "Scope": { + "selected-text-color": "#f8f8f2", + "text-color": "#f8f8f2" + }, + "Self": { + "italic": true, + "selected-text-color": "#bd93f9", + "text-color": "#bd93f9" + }, + "Trait": { + "selected-text-color": "#f8f8f2", + "text-color": "#f8f8f2" + } + }, + "SPDX-Comments": { + "SPDX Deprecated License": { + "selected-text-color": "#d465a7", + "text-color": "#d465a7" + }, + "SPDX Deprecated License Exception": { + "selected-text-color": "#d465a7", + "text-color": "#d465a7" + }, + "SPDX License": { + "selected-text-color": "#d465a7", + "text-color": "#d465a7" + }, + "SPDX License Exception": { + "selected-text-color": "#d465a7", + "text-color": "#d465a7" + }, + "SPDX Tag": { + "selected-text-color": "#d465a7", + "text-color": "#d465a7" + }, + "SPDX Value": { + "selected-text-color": "#d465a7", + "text-color": "#d465a7" + } + }, + "TypeScript": { + "Built-in Objects": { + "italic": true + }, + "Function (Built-in)": { + "selected-text-color": "#50fa7b", + "text-color": "#50fa7b" + }, + "Object Member": { + "selected-text-color": "#f8f8f2", + "text-color": "#f8f8f2" + } + }, + "TypeScript React (TSX)": { + "Attribute": { + "italic": true + }, + "Component Tag": { + "bold": false, + "selected-text-color": "#8be9fd", + "text-color": "#8be9fd" + } + }, + "YAML": { + "Attribute": { + "selected-text-color": "#f1fa8c", + "text-color": "#f1fa8c" + }, + "Key": { + "bold": false, + "selected-text-color": "#8be9fd", + "text-color": "#8be9fd" + }, + "List": { + "selected-text-color": "#f1fa8c", + "text-color": "#f1fa8c" + } + } + }, "editor-colors": { "BackgroundColor": "#282a36", - "BracketMatching": "#55007f", - "CodeFolding": "#8be9fd", - "CurrentLine": "#282a36", + "BracketMatching": "#7c62a5", + "CodeFolding": "#44475a", + "CurrentLine": "#44475a", "CurrentLineNumber": "#f8f8f2", "IconBorder": "#282a36", "IndentationLine": "#6272a4", - "LineNumbers": "#909194", + "LineNumbers": "#6272a4", "MarkBookmark": "#8be9fd", "MarkBreakpointActive": "#ff5555", "MarkBreakpointDisabled": "#bd93f9", @@ -16,10 +550,10 @@ "MarkExecution": "#44475a", "MarkWarning": "#ffb86c", "ModifiedLines": "#ff79c6", - "ReplaceHighlight": "#50fa7b", + "ReplaceHighlight": "#2c8843", "SavedLines": "#50fa7b", - "SearchHighlight": "#b39800", - "Separator": "#909194", + "SearchHighlight": "#566591", + "Separator": "#45474e", "SpellChecking": "#ff5555", "TabMarker": "#6272a4", "TemplateBackground": "#282a36", @@ -36,7 +570,7 @@ ], "license": "SPDX-License-Identifier: MIT", "name": "Dracula", - "revision": 1 + "revision": 7 }, "text-styles": { "Alert": { @@ -49,20 +583,20 @@ "text-color": "#ff79c6" }, "Attribute": { - "selected-text-color": "#8be9fd", - "text-color": "#8be9fd" + "selected-text-color": "#ff79c6", + "text-color": "#ff79c6" }, "BaseN": { - "selected-text-color": "#ffb86c", - "text-color": "#ffb86c" + "selected-text-color": "#bd93f9", + "text-color": "#bd93f9" }, "BuiltIn": { "selected-text-color": "#8be9fd", "text-color": "#8be9fd" }, "Char": { - "selected-text-color": "#ff79c6", - "text-color": "#ff79c6" + "selected-text-color": "#f1fa8c", + "text-color": "#f1fa8c" }, "Comment": { "selected-text-color": "#6272a4", @@ -78,17 +612,17 @@ "text-color": "#bd93f9" }, "ControlFlow": { - "bold": true, - "selected-text-color": "#ffb86c", - "text-color": "#ffb86c" + "selected-text-color": "#ff79c6", + "text-color": "#ff79c6" }, "DataType": { + "italic": true, "selected-text-color": "#8be9fd", "text-color": "#8be9fd" }, "DecVal": { - "selected-text-color": "#ffb86c", - "text-color": "#ffb86c" + "selected-text-color": "#bd93f9", + "text-color": "#bd93f9" }, "Documentation": { "selected-text-color": "#ffb86c", @@ -100,13 +634,12 @@ "underline": true }, "Extension": { - "bold": true, - "selected-text-color": "#0095ff", - "text-color": "#0095ff" + "selected-text-color": "#8be9fd", + "text-color": "#8be9fd" }, "Float": { - "selected-text-color": "#ffb86c", - "text-color": "#ffb86c" + "selected-text-color": "#bd93f9", + "text-color": "#bd93f9" }, "Function": { "selected-text-color": "#50fa7b", @@ -117,11 +650,10 @@ "text-color": "#ff79c6" }, "Information": { - "selected-text-color": "#f67400", - "text-color": "#f67400" + "selected-text-color": "#f1fa8c", + "text-color": "#f1fa8c" }, "Keyword": { - "bold": true, "selected-text-color": "#ff79c6", "text-color": "#ff79c6" }, @@ -138,8 +670,8 @@ "text-color": "#50fa7b" }, "Preprocessor": { - "selected-text-color": "#50fa7b", - "text-color": "#50fa7b" + "selected-text-color": "#ff79c6", + "text-color": "#ff79c6" }, "RegionMarker": { "selected-text-color": "#8be9fd", diff --git a/src/libs/3rdparty/syntax-highlighting/data/themes/github-dark.theme b/src/libs/3rdparty/syntax-highlighting/data/themes/github-dark.theme new file mode 100644 index 00000000000..313e99f0529 --- /dev/null +++ b/src/libs/3rdparty/syntax-highlighting/data/themes/github-dark.theme @@ -0,0 +1,216 @@ +{ + "custom-styles": { + "INI Files": { + "Section": { + "selected-text-color": "#b392f0", + "text-color": "#b392f0" + } + }, + "Python": { + "Builtin Function": { + "selected-text-color": "#b392f0", + "text-color": "#b392f0" + }, + "Import": { + "selected-text-color": "#f97583", + "text-color": "#f97583" + }, + "Special Variable": { + "selected-text-color": "#79b8ff", + "text-color": "#79b8ff" + } + }, + "Rust": { + "Attribute": { + "selected-text-color": "#e1e4e8", + "text-color": "#e1e4e8" + }, + "Macro": { + "selected-text-color": "#79b8ff", + "text-color": "#79b8ff" + }, + "Self": { + "selected-text-color": "#79b8ff", + "text-color": "#79b8ff" + }, + "Trait": { + "selected-text-color": "#e1e4e8", + "text-color": "#e1e4e8" + } + }, + "XML": { + "Element": { + "selected-text-color": "#85e89d", + "text-color": "#85e89d" + } + } + }, + "editor-colors": { + "BackgroundColor": "#24292e", + "BracketMatching": "#65676a", + "CodeFolding": "#253749", + "CurrentLine": "#2b3036", + "CurrentLineNumber": "#e1e4e8", + "IconBorder": "#24292e", + "IndentationLine": "#d7dbe0", + "LineNumbers": "#444d56", + "MarkBookmark": "#8be9fd", + "MarkBreakpointActive": "#ff5555", + "MarkBreakpointDisabled": "#bd93f9", + "MarkBreakpointReached": "#f1fa8c", + "MarkError": "#b31d28", + "MarkExecution": "#44475a", + "MarkWarning": "#ffab70", + "ModifiedLines": "#f97583", + "ReplaceHighlight": "#40c661", + "SavedLines": "#28a745", + "SearchHighlight": "#404030", + "Separator": "#1b1f23", + "SpellChecking": "#ff5555", + "TabMarker": "#444d56", + "TemplateBackground": "#23241e", + "TemplateFocusedPlaceholder": "#22231d", + "TemplatePlaceholder": "#22231d", + "TemplateReadOnlyPlaceholder": "#262721", + "TextSelection": "#253749", + "WordWrapMarker": "#2f3031" + }, + "metadata": { + "copyright": [ + "SPDX-FileCopyrightText: 2020 GitHub Inc.", + "SPDX-FileCopyrightText: 2020 Waqar Ahmed " + ], + "license": "SPDX-License-Identifier: MIT", + "name": "GitHub Dark", + "revision": 2 + }, + "text-styles": { + "Alert": { + "bold": true, + "selected-text-color": "#ff5555", + "text-color": "#ff5555" + }, + "Annotation": { + "selected-text-color": "#6a737d", + "text-color": "#6a737d" + }, + "Attribute": { + "selected-text-color": "#f97583", + "text-color": "#f97583" + }, + "BaseN": { + "selected-text-color": "#79b8ff", + "text-color": "#79b8ff" + }, + "BuiltIn": { + "selected-text-color": "#f97583", + "text-color": "#f97583" + }, + "Char": { + "selected-text-color": "#9ecbff", + "text-color": "#9ecbff" + }, + "Comment": { + "selected-text-color": "#6a737d", + "text-color": "#6a737d" + }, + "CommentVar": { + "selected-text-color": "#6a737d", + "text-color": "#6a737d" + }, + "Constant": { + "selected-text-color": "#79b8ff", + "text-color": "#79b8ff" + }, + "ControlFlow": { + "selected-text-color": "#f97583", + "text-color": "#f97583" + }, + "DataType": { + "selected-text-color": "#f97583", + "text-color": "#f97583" + }, + "DecVal": { + "selected-text-color": "#79b8ff", + "text-color": "#79b8ff" + }, + "Documentation": { + "selected-text-color": "#6a737d", + "text-color": "#6a737d" + }, + "Error": { + "selected-text-color": "#ff5555", + "text-color": "#ff5555", + "underline": true + }, + "Extension": { + "bold": true, + "selected-text-color": "#f97583", + "text-color": "#f97583" + }, + "Float": { + "selected-text-color": "#79b8ff", + "text-color": "#79b8ff" + }, + "Function": { + "selected-text-color": "#b392f0", + "text-color": "#b392f0" + }, + "Import": { + "selected-text-color": "#9ecbff", + "text-color": "#9ecbff" + }, + "Information": { + "selected-text-color": "#6a737d", + "text-color": "#6a737d" + }, + "Keyword": { + "selected-text-color": "#f97583", + "text-color": "#f97583" + }, + "Normal": { + "selected-text-color": "#e1e4e8", + "text-color": "#e1e4e8" + }, + "Operator": { + "selected-text-color": "#e1e4e8", + "text-color": "#e1e4e8" + }, + "Others": { + "selected-text-color": "#b392f0", + "text-color": "#b392f0" + }, + "Preprocessor": { + "selected-text-color": "#f97583", + "text-color": "#f97583" + }, + "RegionMarker": { + "selected-text-color": "#6a737d", + "text-color": "#6a737d" + }, + "SpecialChar": { + "selected-text-color": "#79b8ff", + "text-color": "#79b8ff" + }, + "SpecialString": { + "selected-text-color": "#9ecbff", + "text-color": "#9ecbff" + }, + "String": { + "selected-text-color": "#9ecbff", + "text-color": "#9ecbff" + }, + "Variable": { + "selected-text-color": "#ffab70", + "text-color": "#ffab70" + }, + "VerbatimString": { + "selected-text-color": "#9ecbff", + "text-color": "#9ecbff" + }, + "Warning": { + "selected-text-color": "#ff5555", + "text-color": "#ff5555" + } + } +} diff --git a/src/libs/3rdparty/syntax-highlighting/data/themes/github-light.theme b/src/libs/3rdparty/syntax-highlighting/data/themes/github-light.theme new file mode 100644 index 00000000000..5f465c653ce --- /dev/null +++ b/src/libs/3rdparty/syntax-highlighting/data/themes/github-light.theme @@ -0,0 +1,216 @@ +{ + "custom-styles": { + "INI Files": { + "Section": { + "selected-text-color": "#6f42c1", + "text-color": "#6f42c1" + } + }, + "Python": { + "Builtin Function": { + "selected-text-color": "#6f42c1", + "text-color": "#6f42c1" + }, + "Import": { + "selected-text-color": "#d73a49", + "text-color": "#d73a49" + }, + "Special Variable": { + "selected-text-color": "#005cc5", + "text-color": "#005cc5" + } + }, + "Rust": { + "Attribute": { + "selected-text-color": "#24292e", + "text-color": "#24292e" + }, + "Macro": { + "selected-text-color": "#005cc5", + "text-color": "#005cc5" + }, + "Self": { + "selected-text-color": "#005cc5", + "text-color": "#005cc5" + }, + "Trait": { + "selected-text-color": "#24292e", + "text-color": "#24292e" + } + }, + "XML": { + "Element": { + "selected-text-color": "#22863a", + "text-color": "#22863a" + } + } + }, + "editor-colors": { + "BackgroundColor": "#ffffff", + "BracketMatching": "#bef5cb", + "CodeFolding": "#f6f8fa", + "CurrentLine": "#f6f8fa", + "CurrentLineNumber": "#24292e", + "IconBorder": "#ffffff", + "IndentationLine": "#d7dbe0", + "LineNumbers": "#c7c2bc", + "MarkBookmark": "#8be9fd", + "MarkBreakpointActive": "#ff5555", + "MarkBreakpointDisabled": "#bd93f9", + "MarkBreakpointReached": "#f1fa8c", + "MarkError": "#b31d28", + "MarkExecution": "#44475a", + "MarkWarning": "#e36209", + "ModifiedLines": "#d73a49", + "ReplaceHighlight": "#50fa7b", + "SavedLines": "#28a745", + "SearchHighlight": "#ffea7f", + "Separator": "#e1e4e8", + "SpellChecking": "#ff5555", + "TabMarker": "#d1d5da", + "TemplateBackground": "#23241e", + "TemplateFocusedPlaceholder": "#22231d", + "TemplatePlaceholder": "#22231d", + "TemplateReadOnlyPlaceholder": "#262721", + "TextSelection": "#dee6fc", + "WordWrapMarker": "#e1e4e8" + }, + "metadata": { + "copyright": [ + "SPDX-FileCopyrightText: 2020 GitHub Inc.", + "SPDX-FileCopyrightText: 2020 Waqar Ahmed " + ], + "license": "SPDX-License-Identifier: MIT", + "name": "GitHub Light", + "revision": 2 + }, + "text-styles": { + "Alert": { + "bold": true, + "selected-text-color": "#ff5555", + "text-color": "#ff5555" + }, + "Annotation": { + "selected-text-color": "#6a737d", + "text-color": "#6a737d" + }, + "Attribute": { + "selected-text-color": "#d73a49", + "text-color": "#d73a49" + }, + "BaseN": { + "selected-text-color": "#005cc5", + "text-color": "#005cc5" + }, + "BuiltIn": { + "selected-text-color": "#d73a49", + "text-color": "#d73a49" + }, + "Char": { + "selected-text-color": "#032f62", + "text-color": "#032f62" + }, + "Comment": { + "selected-text-color": "#6a737d", + "text-color": "#6a737d" + }, + "CommentVar": { + "selected-text-color": "#6a737d", + "text-color": "#6a737d" + }, + "Constant": { + "selected-text-color": "#005cc5", + "text-color": "#005cc5" + }, + "ControlFlow": { + "selected-text-color": "#d73a49", + "text-color": "#d73a49" + }, + "DataType": { + "selected-text-color": "#d73a49", + "text-color": "#d73a49" + }, + "DecVal": { + "selected-text-color": "#005cc5", + "text-color": "#005cc5" + }, + "Documentation": { + "selected-text-color": "#6a737d", + "text-color": "#6a737d" + }, + "Error": { + "selected-text-color": "#ff5555", + "text-color": "#ff5555", + "underline": true + }, + "Extension": { + "bold": true, + "selected-text-color": "#d73a49", + "text-color": "#d73a49" + }, + "Float": { + "selected-text-color": "#005cc5", + "text-color": "#005cc5" + }, + "Function": { + "selected-text-color": "#6f42c1", + "text-color": "#6f42c1" + }, + "Import": { + "selected-text-color": "#032f62", + "text-color": "#032f62" + }, + "Information": { + "selected-text-color": "#6a737d", + "text-color": "#6a737d" + }, + "Keyword": { + "selected-text-color": "#d73a49", + "text-color": "#d73a49" + }, + "Normal": { + "selected-text-color": "#24292e", + "text-color": "#24292e" + }, + "Operator": { + "selected-text-color": "#24292e", + "text-color": "#24292e" + }, + "Others": { + "selected-text-color": "#6f42c1", + "text-color": "#6f42c1" + }, + "Preprocessor": { + "selected-text-color": "#d73a49", + "text-color": "#d73a49" + }, + "RegionMarker": { + "selected-text-color": "#6a737d", + "text-color": "#6a737d" + }, + "SpecialChar": { + "selected-text-color": "#005cc5", + "text-color": "#005cc5" + }, + "SpecialString": { + "selected-text-color": "#032f62", + "text-color": "#032f62" + }, + "String": { + "selected-text-color": "#032f62", + "text-color": "#032f62" + }, + "Variable": { + "selected-text-color": "#e36209", + "text-color": "#e36209" + }, + "VerbatimString": { + "selected-text-color": "#032f62", + "text-color": "#032f62" + }, + "Warning": { + "selected-text-color": "#ff5555", + "text-color": "#ff5555" + } + } +} diff --git a/src/libs/3rdparty/syntax-highlighting/data/themes/monokai.theme b/src/libs/3rdparty/syntax-highlighting/data/themes/monokai.theme new file mode 100644 index 00000000000..3df8e66c005 --- /dev/null +++ b/src/libs/3rdparty/syntax-highlighting/data/themes/monokai.theme @@ -0,0 +1,394 @@ +{ + "custom-styles": { + "C": { + "Prep. Lib": { + "selected-text-color": "#e6db74", + "text-color": "#e6db74" + } + }, + "C++": { + "Qt Classes": { + "bold": false, + "selected-text-color": "#66d9ef", + "text-color": "#66d9ef" + }, + "Qt Macros": { + "bold": false, + "selected-text-color": "#f92672", + "text-color": "#f92672" + }, + "Qt Types": { + "bold": false, + "selected-text-color": "#66D9EF", + "text-color": "#66D9EF" + } + }, + "CMake": { + "Builtin Variable": { + "selected-text-color": "#f8f8f2", + "text-color": "#f8f8f2" + }, + "False Special Arg": { + "selected-text-color": "#e03232", + "text-color": "#e03232" + }, + "True Special Arg": { + "selected-text-color": "#38bd38", + "text-color": "#38bd38" + } + }, + "Doxygen": { + "Tags": { + "bold": false, + "selected-text-color": "#52afbf", + "text-color": "#52afbf" + }, + "Word": { + "bold": false, + "selected-text-color": "#7ba822", + "text-color": "#7ba822", + "underline": true + } + }, + "Diff": { + "Added line": { + "selected-text-color": "#a6e22e", + "text-color": "#a6e22e" + }, + "Changed line (new)": { + "selected-text-color": "#a6e22e", + "text-color": "#a6e22e" + }, + "Changed line (old)": { + "selected-text-color": "#f92672", + "text-color": "#f92672" + }, + "Removed line": { + "selected-text-color": "#f92672", + "text-color": "#f92672" + } + }, + "Go": { + "Builtin Function": { + "selected-text-color": "#a6e22e", + "text-color": "#a6e22e" + }, + "Predeclared Identifier": { + "selected-text-color": "#ae81ff", + "text-color": "#ae81ff" + } + }, + "ISO C++": { + "Attribute": { + "selected-text-color": "#f8f8f2", + "text-color": "#f8f8f2" + }, + "Boost Stuff": { + "bold": false + }, + "Prep. Lib": { + "selected-text-color": "#e6db74", + "text-color": "#e6db74" + }, + "Standard Attribute": { + "selected-text-color": "#f8f8f2", + "text-color": "#f8f8f2" + }, + "Standard Macros": { + "selected-text-color": "#f92672", + "text-color": "#f92672" + }, + "Standard Suffix": { + "selected-text-color": "#f92672", + "text-color": "#f92672" + }, + "UDL Numeric Suffix": { + "selected-text-color": "#f92672", + "text-color": "#f92672" + }, + "UDL String Suffix": { + "selected-text-color": "#f92672", + "text-color": "#f92672" + } + }, + "JSON": { + "Style_String_Key": { + "italic": false, + "selected-text-color": "#f92672", + "text-color": "#f92672" + } + }, + "JavaScript": { + "Object Member": { + "selected-text-color": "#f8f8f2", + "text-color": "#f8f8f2" + }, + "Substitution": { + "selected-text-color": "#f92672", + "text-color": "#f92672" + } + }, + "JavaScript React (JSX)": { + "Component Tag": { + "bold": false, + "selected-text-color": "#66d9ef", + "text-color": "#66d9ef" + } + }, + "Makefile": { + "FuncParam": { + "selected-text-color": "#fd971f", + "text-color": "#fd971f" + }, + "Target": { + "selected-text-color": "#a6e22e", + "text-color": "#a6e22e" + }, + "Variable": { + "italic": false, + "selected-text-color": "#f8f8f2", + "text-color": "#f8f8f2" + } + }, + "Markdown": { + "Emphasis Text": { + "selected-text-color": "#66D9EF", + "text-color": "#66D9EF" + }, + "Reference-Link ID": { + "selected-text-color": "#ae81ff", + "text-color": "#ae81ff" + }, + "Reference-Link Name": { + "selected-text-color": "#ae81ff", + "text-color": "#ae81ff" + }, + "Reference-Link Target": { + "selected-text-color": "#ae81ff", + "text-color": "#ae81ff" + }, + "Strong Text": { + "selected-text-color": "#66d9ef", + "text-color": "#66d9ef" + } + }, + "Python": { + "Import": { + "selected-text-color": "#f92672", + "text-color": "#f92672" + } + }, + "Rust": { + "Definition": { + "selected-text-color": "#a6e22e", + "text-color": "#a6e22e" + }, + "Lifetime": { + "selected-text-color": "#f92672", + "text-color": "#f92672" + }, + "Macro": { + "selected-text-color": "#a6e22e", + "text-color": "#a6e22e" + }, + "Self": { + "selected-text-color": "#fd971f", + "text-color": "#fd971f" + } + }, + "TypeScript": { + "Function (Built-in)": { + "selected-text-color": "#a6e22e", + "text-color": "#a6e22e" + }, + "Object Member": { + "selected-text-color": "#f8f8f2", + "text-color": "#f8f8f2" + }, + "Substitution": { + "selected-text-color": "#f92672", + "text-color": "#f92672" + } + }, + "TypeScript React (TSX)": { + "Component Tag": { + "bold": false, + "selected-text-color": "#66d9ef", + "text-color": "#66d9ef" + }, + "Substitution": { + "selected-text-color": "#f92672", + "text-color": "#f92672" + } + } + }, + "editor-colors": { + "BackgroundColor": "#272822", + "BracketMatching": "#5b5a4a", + "CodeFolding": "#3a3b32", + "CurrentLine": "#3e3d32", + "CurrentLineNumber": "#d1d931", + "IconBorder": "#272822", + "IndentationLine": "#6272a4", + "LineNumbers": "#909194", + "MarkBookmark": "#66D9EF", + "MarkBreakpointActive": "#ff5555", + "MarkBreakpointDisabled": "#bd93f9", + "MarkBreakpointReached": "#f1fa8c", + "MarkError": "#ff5555", + "MarkExecution": "#44475a", + "MarkWarning": "#ffb86c", + "ModifiedLines": "#ff473d", + "ReplaceHighlight": "#735d16", + "SavedLines": "#20e852", + "SearchHighlight": "#245676", + "Separator": "#45474e", + "SpellChecking": "#ff5555", + "TabMarker": "#6272a4", + "TemplateBackground": "#23241e", + "TemplateFocusedPlaceholder": "#22231d", + "TemplatePlaceholder": "#22231d", + "TemplateReadOnlyPlaceholder": "#262721", + "TextSelection": "#3f413e", + "WordWrapMarker": "#282a36" + }, + "metadata": { + "copyright": [ + "SPDX-FileCopyrightText: 2006 Wimer Hazenberg", + "SPDX-FileCopyrightText: 2020 Waqar Ahmed " + ], + "license": "SPDX-License-Identifier: MIT", + "name": "Monokai", + "revision": 5 + }, + "text-styles": { + "Alert": { + "bold": true, + "selected-text-color": "#ff5555", + "text-color": "#ff5555" + }, + "Annotation": { + "selected-text-color": "#75715e", + "text-color": "#75715e" + }, + "Attribute": { + "selected-text-color": "#f92672", + "text-color": "#f92672" + }, + "BaseN": { + "selected-text-color": "#ae81ff", + "text-color": "#ae81ff" + }, + "BuiltIn": { + "selected-text-color": "#66D9EF", + "text-color": "#66D9EF" + }, + "Char": { + "selected-text-color": "#e6db74", + "text-color": "#e6db74" + }, + "Comment": { + "selected-text-color": "#75715e", + "text-color": "#75715e" + }, + "CommentVar": { + "selected-text-color": "#75715e", + "text-color": "#75715e" + }, + "Constant": { + "selected-text-color": "#ae81ff", + "text-color": "#ae81ff" + }, + "ControlFlow": { + "selected-text-color": "#f92672", + "text-color": "#f92672" + }, + "DataType": { + "italic": true, + "selected-text-color": "#66d9ef", + "text-color": "#66d9ef" + }, + "DecVal": { + "selected-text-color": "#ae81ff", + "text-color": "#ae81ff" + }, + "Documentation": { + "selected-text-color": "#75715e", + "text-color": "#75715e" + }, + "Error": { + "selected-text-color": "#ff5555", + "text-color": "#ff5555", + "underline": true + }, + "Extension": { + "bold": true, + "selected-text-color": "#a6e22e", + "text-color": "#a6e22e" + }, + "Float": { + "selected-text-color": "#ae81ff", + "text-color": "#ae81ff" + }, + "Function": { + "selected-text-color": "#a6e22e", + "text-color": "#a6e22e" + }, + "Import": { + "selected-text-color": "#f92672", + "text-color": "#f92672" + }, + "Information": { + "selected-text-color": "#f1fa8c", + "text-color": "#f1fa8c" + }, + "Keyword": { + "selected-text-color": "#f92672", + "text-color": "#f92672" + }, + "Normal": { + "selected-text-color": "#f8f8f2", + "text-color": "#f8f8f2" + }, + "Operator": { + "selected-text-color": "#f8f8f2", + "text-color": "#f8f8f2" + }, + "Others": { + "selected-text-color": "#a6e22e", + "text-color": "#a6e22e" + }, + "Preprocessor": { + "selected-text-color": "#f92672", + "text-color": "#f92672" + }, + "RegionMarker": { + "selected-text-color": "#75715e", + "text-color": "#75715e" + }, + "SpecialChar": { + "selected-text-color": "#ae81ff", + "text-color": "#ae81ff" + }, + "SpecialString": { + "selected-text-color": "#e6db74", + "text-color": "#e6db74" + }, + "String": { + "selected-text-color": "#e6db74", + "text-color": "#e6db74" + }, + "Variable": { + "selected-text-color": "#f8f8f2", + "text-color": "#f8f8f2" + }, + "VerbatimString": { + "selected-text-color": "#e6db74", + "text-color": "#e6db74" + }, + "Warning": { + "selected-text-color": "#ff5555", + "text-color": "#ff5555" + } + } +} diff --git a/src/libs/3rdparty/syntax-highlighting/data/themes/oblivion.theme b/src/libs/3rdparty/syntax-highlighting/data/themes/oblivion.theme new file mode 100644 index 00000000000..a433fb883a4 --- /dev/null +++ b/src/libs/3rdparty/syntax-highlighting/data/themes/oblivion.theme @@ -0,0 +1,179 @@ +{ + "_comments": [ + "This theme has been adapted from the GtkSourceView Oblivion theme" + ], + "metadata": { + "copyright": [ + "SPDX-FileCopyrightText: 2007 Paolo Borelli , GtkSourceView team", + "SPDX-FileCopyrightText: 2020 Alexander Schlarb " + ], + "name": "Oblivion", + "revision": 2, + "license": "SPDX-License-Identifier: MIT" + }, + "text-styles": { + "Alert": { + "background-color": "#451e1a", + "bold": true, + "selected-text-color": "#e85848", + "text-color": "#e85848" + }, + "Annotation": { + "selected-text-color": "#ad7fa8", + "text-color": "#ad7fa8" + }, + "Attribute": { + "selected-text-color": "#ad7fa8", + "text-color": "#ad7fa8" + }, + "BaseN": { + "selected-text-color": "#fce94f", + "text-color": "#edd400" + }, + "BuiltIn": { + "selected-text-color": "#729fcf", + "text-color": "#729fcf" + }, + "Char": { + "selected-text-color": "#fcaf3e", + "text-color": "#ce5c00" + }, + "Comment": { + "selected-text-color": "#8ae234", + "text-color": "#30a100" + }, + "CommentVar": { + "selected-text-color": "#ad7fa8", + "text-color": "#ad7fa8" + }, + "Constant": { + "bold": true, + "selected-text-color": "#ffffff", + "text-color": "#edd400" + }, + "ControlFlow": { + "bold": true, + "selected-text-color": "#ffffff", + "text-color": "#ffffff" + }, + "DataType": { + "selected-text-color": "#508ed8", + "text-color": "#508ed8" + }, + "DecVal": { + "selected-text-color": "#fce94f", + "text-color": "#edd400" + }, + "Documentation": { + "selected-text-color": "#8ae234", + "text-color": "#4e9a06" + }, + "Error": { + "selected-text-color": "#e85848", + "text-color": "#e85848", + "underline": true + }, + "Extension": { + "bold": true, + "selected-text-color": "#508ed8", + "text-color": "#508ed8" + }, + "Float": { + "selected-text-color": "#fcaf3e", + "text-color": "#ce5c00" + }, + "Function": { + "bold": true, + "selected-text-color": "#729fcf", + "text-color": "#729fcf" + }, + "Import": { + "selected-text-color": "#ad7fa8", + "text-color": "#ad7fa8" + }, + "Information": { + "selected-text-color": "#c0a25f", + "text-color": "#c0a25f" + }, + "Keyword": { + "bold": true, + "selected-text-color": "#ffffff", + "text-color": "#ffffff" + }, + "Normal": { + "selected-text-color": "#eeeeec", + "text-color": "#d3d7c1" + }, + "Operator": { + "selected-text-color": "#eeeeec", + "text-color": "#eeeeec" + }, + "Others": { + "selected-text-color": "#fce94f", + "text-color": "#edd400" + }, + "Preprocessor": { + "selected-text-color": "#ad7fa8", + "text-color": "#ad7fa8" + }, + "RegionMarker": { + "background-color": "#1c2c3f", + "selected-text-color": "#508ed8", + "text-color": "#508ed8" + }, + "SpecialChar": { + "selected-text-color": "#fcaf3e", + "text-color": "#ce5c00" + }, + "SpecialString": { + "selected-text-color": "#fce94f", + "text-color": "#fce94f" + }, + "String": { + "selected-text-color": "#fce94f", + "text-color": "#edd400" + }, + "Variable": { + "selected-text-color": "#ce5c00", + "text-color": "#ce5c00" + }, + "VerbatimString": { + "selected-text-color": "#fce94f", + "text-color": "#c4a000" + }, + "Warning": { + "selected-text-color": "#e85848", + "text-color": "#e85848" + } + }, + "editor-colors": { + "BackgroundColor": "#201f1f", + "BracketMatching": "#8f5902", + "CodeFolding": "#19395f", + "CurrentLine": "#2e3436", + "CurrentLineNumber": "#ffffff", + "IconBorder": "#302f2f", + "IndentationLine": "#989595", + "LineNumbers": "#e0dedb", + "MarkBookmark": "#0000cc", + "MarkBreakpointActive": "#cc0000", + "MarkBreakpointDisabled": "#cc00cc", + "MarkBreakpointReached": "#00cc00", + "MarkError": "#cc0000", + "MarkExecution": "#888a85", + "MarkWarning": "#ad7fa8", + "ModifiedLines": "#451e1a", + "ReplaceHighlight": "#356703", + "SavedLines": "#23321a", + "SearchHighlight": "#4e9a06", + "Separator": "#787775", + "SpellChecking": "#e85848", + "TabMarker": "#555753", + "TemplateBackground": "#302f2f", + "TemplateFocusedPlaceholder": "#23321a", + "TemplatePlaceholder": "#23321a", + "TemplateReadOnlyPlaceholder": "#451e1a", + "TextSelection": "#184880", + "WordWrapMarker": "#3c3a3a" + } +} diff --git a/src/libs/3rdparty/syntax-highlighting/data/themes/solarized-dark.theme b/src/libs/3rdparty/syntax-highlighting/data/themes/solarized-dark.theme index 035e1db9c06..b8d13b31d3c 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/themes/solarized-dark.theme +++ b/src/libs/3rdparty/syntax-highlighting/data/themes/solarized-dark.theme @@ -9,7 +9,7 @@ "SPDX-FileCopyrightText: 2018 Andrew Crouthamel " ], "license": "SPDX-License-Identifier: MIT", - "revision" : 2, + "revision" : 5, "name" : "Solarized Dark" }, "text-styles": { @@ -23,8 +23,7 @@ }, "Keyword" : { "text-color" : "#859900", - "selected-text-color" : "#859900", - "bold" : true + "selected-text-color" : "#859900" }, "Function" : { "text-color" : "#268bd2", @@ -36,8 +35,7 @@ }, "ControlFlow" : { "text-color" : "#859900", - "selected-text-color" : "#859900", - "bold" : true + "selected-text-color" : "#859900" }, "Operator" : { "text-color" : "#859900", @@ -49,8 +47,7 @@ }, "Extension" : { "text-color" : "#268bd2", - "selected-text-color" : "#268bd2", - "bold" : true + "selected-text-color" : "#268bd2" }, "Preprocessor" : { "text-color" : "#cb4b16", @@ -86,8 +83,7 @@ }, "DataType" : { "text-color" : "#b58900", - "selected-text-color" : "#b58900", - "bold" : true + "selected-text-color" : "#b58900" }, "DecVal" : { "text-color" : "#2aa198", @@ -153,13 +149,13 @@ }, "editor-colors": { "BackgroundColor" : "#002b36", - "CodeFolding" : "#6c71c4", - "BracketMatching" : "#073642", + "CodeFolding": "#083d4a", + "BracketMatching" : "#083d4a", "CurrentLine" : "#073642", "IconBorder" : "#073642", - "IndentationLine" : "#073642", + "IndentationLine" : "#083d4a", "LineNumbers" : "#586e75", - "CurrentLineNumber" : "#586e75", + "CurrentLineNumber": "#93a1a1", "MarkBookmark" : "#268bd2", "MarkBreakpointActive" : "#dc322f", "MarkBreakpointReached" : "#b58900", @@ -168,11 +164,11 @@ "MarkWarning" : "#cb4b16", "MarkError" : "#dc322f", "ModifiedLines" : "#cb4b16", - "ReplaceHighlight" : "#859900", + "ReplaceHighlight": "#3c4300", "SavedLines" : "#2aa198", - "SearchHighlight" : "#b58900", - "TextSelection" : "#eee8d5", - "Separator" : "#002b36", + "SearchHighlight": "#0a4d5e", + "TextSelection": "#083d4a", + "Separator" : "#1c3e49", "SpellChecking" : "#dc322f", "TabMarker" : "#586e75", "TemplateBackground" : "#073642", @@ -180,5 +176,17 @@ "TemplateFocusedPlaceholder" : "#073642", "TemplateReadOnlyPlaceholder" : "#073642", "WordWrapMarker" : "#586e75" + }, + "custom-styles": { + "XML": { + "Element": { + "selected-text-color": "#839496", + "text-color": "#268bd2" + }, + "Element Symbols": { + "selected-text-color": "#586e75", + "text-color": "#657b83" + } + } } } diff --git a/src/libs/3rdparty/syntax-highlighting/data/themes/solarized-light.theme b/src/libs/3rdparty/syntax-highlighting/data/themes/solarized-light.theme index 8cab40db480..a532b128f8d 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/themes/solarized-light.theme +++ b/src/libs/3rdparty/syntax-highlighting/data/themes/solarized-light.theme @@ -9,7 +9,7 @@ "SPDX-FileCopyrightText: 2018 Andrew Crouthamel " ], "license": "SPDX-License-Identifier: MIT", - "revision" : 2, + "revision" : 4, "name" : "Solarized Light" }, "text-styles": { @@ -172,7 +172,7 @@ "SavedLines" : "#2aa198", "SearchHighlight" : "#b58900", "TextSelection" : "#073642", - "Separator" : "#fdf6e3", + "Separator" : "#e0dccc", "SpellChecking" : "#dc322f", "TabMarker" : "#93a1a1", "TemplateBackground" : "#eee8d5", @@ -180,5 +180,17 @@ "TemplateFocusedPlaceholder" : "#eee8d5", "TemplateReadOnlyPlaceholder" : "#eee8d5", "WordWrapMarker" : "#93a1a1" + }, + "custom-styles": { + "XML": { + "Element": { + "selected-text-color": "#268bd2", + "text-color": "#268bd2" + }, + "Element Symbols": { + "selected-text-color": "#93a1a1", + "text-color": "#839496" + } + } } } 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 0a6f24385ac..fe0a1627be6 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/themes/theme-data.qrc +++ b/src/libs/3rdparty/syntax-highlighting/data/themes/theme-data.qrc @@ -1,15 +1,21 @@ + 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 + 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 diff --git a/src/libs/3rdparty/syntax-highlighting/src/cli/CMakeLists.txt b/src/libs/3rdparty/syntax-highlighting/src/cli/CMakeLists.txt index 113115359e2..1a4d24d8284 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/cli/CMakeLists.txt +++ b/src/libs/3rdparty/syntax-highlighting/src/cli/CMakeLists.txt @@ -2,4 +2,4 @@ add_executable(kate-syntax-highlighter kate-syntax-highlighter.cpp) ecm_mark_nongui_executable(kate-syntax-highlighter) target_link_libraries(kate-syntax-highlighter KF5SyntaxHighlighting) -install(TARGETS kate-syntax-highlighter ${INSTALL_TARGETS_DEFAULT_ARGS}) +install(TARGETS kate-syntax-highlighter ${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/kate-syntax-highlighter.cpp index a178c1ba277..a009c4f2591 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/cli/kate-syntax-highlighter.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/cli/kate-syntax-highlighter.cpp @@ -6,10 +6,10 @@ #include "ksyntaxhighlighting_version.h" +#include #include #include #include -#include #include #include @@ -21,8 +21,14 @@ using namespace KSyntaxHighlighting; -template -static void applyHighlighter(Highlighter &highlighter, QCommandLineParser &parser, bool fromFileName, const QString &inFileName, const QCommandLineOption &stdinOption, const QCommandLineOption &outputName, const Ts &...highlightParams) +template +static void applyHighlighter(Highlighter &highlighter, + QCommandLineParser &parser, + bool fromFileName, + const QString &inFileName, + const QCommandLineOption &stdinOption, + const QCommandLineOption &outputName, + const Ts &...highlightParams) { if (parser.isSet(outputName)) highlighter.setOutputFile(parser.value(outputName)); @@ -56,16 +62,19 @@ int main(int argc, char **argv) parser.addVersionOption(); parser.addPositionalArgument(app.translate("SyntaxHighlightingCLI", "source"), app.translate("SyntaxHighlightingCLI", "The source file to highlight.")); - QCommandLineOption listDefs(QStringList() << QStringLiteral("l") << QStringLiteral("list"), app.translate("SyntaxHighlightingCLI", "List all available syntax definitions.")); + QCommandLineOption listDefs(QStringList() << QStringLiteral("l") << QStringLiteral("list"), + app.translate("SyntaxHighlightingCLI", "List all available syntax definitions.")); parser.addOption(listDefs); QCommandLineOption listThemes(QStringList() << QStringLiteral("list-themes"), app.translate("SyntaxHighlightingCLI", "List all available themes.")); parser.addOption(listThemes); - QCommandLineOption updateDefs(QStringList() << QStringLiteral("u") << QStringLiteral("update"), app.translate("SyntaxHighlightingCLI", "Download new/updated syntax definitions.")); + QCommandLineOption updateDefs(QStringList() << QStringLiteral("u") << QStringLiteral("update"), + app.translate("SyntaxHighlightingCLI", "Download new/updated syntax definitions.")); parser.addOption(updateDefs); - QCommandLineOption outputName( - QStringList() << QStringLiteral("o") << QStringLiteral("output"), app.translate("SyntaxHighlightingCLI", "File to write HTML output to (default: stdout)."), app.translate("SyntaxHighlightingCLI", "output")); + QCommandLineOption outputName(QStringList() << QStringLiteral("o") << QStringLiteral("output"), + app.translate("SyntaxHighlightingCLI", "File to write HTML output to (default: stdout)."), + app.translate("SyntaxHighlightingCLI", "output")); parser.addOption(outputName); QCommandLineOption syntaxName(QStringList() << QStringLiteral("s") << QStringLiteral("syntax"), @@ -73,18 +82,23 @@ int main(int argc, char **argv) app.translate("SyntaxHighlightingCLI", "syntax")); parser.addOption(syntaxName); - 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()); + 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()); parser.addOption(themeName); - QCommandLineOption outputFormatOption(QStringList() << QStringLiteral("f") << QStringLiteral("output-format"), - app.translate("SyntaxHighlightingCLI", "Use the specified format instead of html. Must be html, ansi or ansi256Colors."), - app.translate("SyntaxHighlightingCLI", "format"), - QStringLiteral("html")); + QCommandLineOption outputFormatOption( + QStringList() << QStringLiteral("f") << QStringLiteral("output-format"), + app.translate("SyntaxHighlightingCLI", "Use the specified format instead of html. Must be html, ansi or ansi256Colors."), + app.translate("SyntaxHighlightingCLI", "format"), + QStringLiteral("html")); parser.addOption(outputFormatOption); 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 and context."), + 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."), app.translate("SyntaxHighlightingCLI", "type")); parser.addOption(traceOption); @@ -92,12 +106,14 @@ int main(int argc, char **argv) app.translate("SyntaxHighlightingCLI", "Disable ANSI background for the default color.")); parser.addOption(noAnsiEditorBg); - 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", "title")); + 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", "title")); parser.addOption(titleOption); - QCommandLineOption stdinOption(QStringList() << QStringLiteral("stdin"), app.translate("SyntaxHighlightingCLI", "Read file from stdin. The -s option must also be used.")); + 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); @@ -117,7 +133,9 @@ int main(int argc, char **argv) if (parser.isSet(updateDefs)) { DefinitionDownloader downloader(&repo); - QObject::connect(&downloader, &DefinitionDownloader::informationMessage, [](const QString &msg) { std::cout << qPrintable(msg) << std::endl; }); + QObject::connect(&downloader, &DefinitionDownloader::informationMessage, [](const QString &msg) { + std::cout << qPrintable(msg) << std::endl; + }); QObject::connect(&downloader, &DefinitionDownloader::done, &app, &QCoreApplication::quit); downloader.start(); return app.exec(); @@ -139,7 +157,7 @@ int main(int argc, char **argv) def = repo.definitionForMimeType(syntax); if (!def.isValid()) { /* see if it's a extension instead */ - def = repo.definitionForFileName(QLatin1String("f.")+syntax); + def = repo.definitionForFileName(QLatin1String("f.") + syntax); if (!def.isValid()) /* see if it's a filename instead */ def = repo.definitionForFileName(syntax); @@ -178,13 +196,15 @@ int main(int argc, char **argv) auto debugOptions = AnsiHighlighter::TraceOptions(); if (parser.isSet(traceOption)) { const auto options = parser.values(traceOption); - for (auto const& option : options) { + for (auto const &option : options) { if (option == QStringLiteral("format")) { debugOptions |= AnsiHighlighter::TraceOption::Format; } else if (option == QStringLiteral("region")) { debugOptions |= AnsiHighlighter::TraceOption::Region; } else if (option == QStringLiteral("context")) { debugOptions |= AnsiHighlighter::TraceOption::Context; + } else if (option == QStringLiteral("stackSize")) { + debugOptions |= AnsiHighlighter::TraceOption::StackSize; } else { std::cerr << "Unknown trace name." << std::endl; return 2; diff --git a/src/libs/3rdparty/syntax-highlighting/src/indexer/CMakeLists.txt b/src/libs/3rdparty/syntax-highlighting/src/indexer/CMakeLists.txt index 9fa26b27cef..508cd276cc3 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/indexer/CMakeLists.txt +++ b/src/libs/3rdparty/syntax-highlighting/src/indexer/CMakeLists.txt @@ -27,7 +27,7 @@ elseif(CMAKE_CROSSCOMPILING) ${CMAKE_CURRENT_BINARY_DIR}/native_katehighlightingindexer-prefix/src/native_katehighlightingindexer-build/bin/katehighlightingindexer) else() # host build - add_executable(katehighlightingindexer katehighlightingindexer.cpp) + add_executable(katehighlightingindexer katehighlightingindexer.cpp ../lib/worddelimiters.cpp) if(Qt5XmlPatterns_FOUND) target_link_libraries(katehighlightingindexer Qt5::XmlPatterns) else() diff --git a/src/libs/3rdparty/syntax-highlighting/src/indexer/katehighlightingindexer.cpp b/src/libs/3rdparty/syntax-highlighting/src/indexer/katehighlightingindexer.cpp index b5d04934e6b..86b3a38b12d 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/indexer/katehighlightingindexer.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/indexer/katehighlightingindexer.cpp @@ -1,14 +1,16 @@ /* SPDX-FileCopyrightText: 2014 Christoph Cullmann + SPDX-FileCopyrightText: 2020 Jonathan Poelen SPDX-License-Identifier: MIT */ +#include #include #include #include #include -#include +#include #include #include #include @@ -18,10 +20,2300 @@ #include #endif +#include "../lib/worddelimiters_p.h" #include "../lib/xml_p.h" +#include + +using KSyntaxHighlighting::WordDelimiters; using KSyntaxHighlighting::Xml::attrToBool; +class HlFilesChecker +{ +public: + void setDefinition(const QStringRef &verStr, const QString &filename, const QString &name) + { + m_currentDefinition = &*m_definitions.insert(name, Definition{}); + m_currentDefinition->languageName = name; + m_currentDefinition->filename = filename; + m_currentDefinition->kateVersionStr = verStr.toString(); + m_currentKeywords = nullptr; + m_currentContext = nullptr; + + const auto idx = verStr.indexOf(QLatin1Char('.')); + if (idx <= 0) { + qWarning() << filename << "invalid kateversion" << verStr; + m_success = false; + } else { + m_currentDefinition->kateVersion = {verStr.left(idx).toInt(), verStr.mid(idx + 1).toInt()}; + } + } + + void processElement(QXmlStreamReader &xml) + { + if (xml.isStartElement()) { + if (m_currentContext) { + m_currentContext->rules.append(Context::Rule{}); + auto &rule = m_currentContext->rules.back(); + m_success = rule.parseElement(m_currentDefinition->filename, xml) && m_success; + } else if (m_currentKeywords) { + m_success = m_currentKeywords->items.parseElement(m_currentDefinition->filename, xml) && m_success; + } else if (xml.name() == QStringLiteral("context")) { + processContextElement(xml); + } else if (xml.name() == QStringLiteral("list")) { + processListElement(xml); + } else if (xml.name() == QStringLiteral("keywords")) { + m_success = m_currentDefinition->parseKeywords(xml) && m_success; + } else if (xml.name() == QStringLiteral("emptyLine")) { + m_success = parseEmptyLine(m_currentDefinition->filename, xml) && m_success; + } else if (xml.name() == QStringLiteral("itemData")) { + m_success = m_currentDefinition->itemDatas.parseElement(m_currentDefinition->filename, xml) && m_success; + } + } else if (xml.isEndElement()) { + if (m_currentContext && xml.name() == QStringLiteral("context")) { + m_currentContext = nullptr; + } else if (m_currentKeywords && xml.name() == QStringLiteral("list")) { + m_currentKeywords = nullptr; + } + } + } + + //! Resolve context attribute and include tag + void resolveContexts() + { + QMutableMapIterator def(m_definitions); + while (def.hasNext()) { + def.next(); + auto &definition = def.value(); + auto &contexts = definition.contexts; + + if (contexts.isEmpty()) { + qWarning() << definition.filename << "has no context"; + m_success = false; + continue; + } + + QMutableMapIterator contextIt(contexts); + while (contextIt.hasNext()) { + contextIt.next(); + auto &context = contextIt.value(); + resolveContextName(definition, context, context.lineEndContext, context.line); + resolveContextName(definition, context, context.lineEmptyContext, context.line); + resolveContextName(definition, context, context.fallthroughContext, context.line); + for (auto &rule : context.rules) { + resolveContextName(definition, context, rule.context, rule.line); + } + } + + definition.firstContext = &*definition.contexts.find(definition.firstContextName); + } + + resolveIncludeRules(); + } + + bool check() const + { + bool success = m_success; + + const auto usedContexts = extractUsedContexts(); + + QMap maxVersionByDefinitions; + + QMapIterator def(m_definitions); + while (def.hasNext()) { + def.next(); + const auto &definition = def.value(); + const auto &filename = definition.filename; + + auto *maxDef = maxKateVersionDefinition(definition, maxVersionByDefinitions); + if (maxDef != &definition) { + qWarning() << definition.filename << "depends on a language" << maxDef->languageName << "in version" << maxDef->kateVersionStr + << ". Please, increase kateversion."; + success = false; + } + + QSet referencedKeywords; + QSet usedAttributeNames; + success = checkKeywordsList(definition, referencedKeywords) && success; + success = checkContexts(definition, referencedKeywords, usedAttributeNames, usedContexts) && success; + + // search for non-existing or unreferenced keyword lists. + for (const auto &keywords : definition.keywordsList) { + if (!referencedKeywords.contains(&keywords)) { + qWarning() << filename << "line" << keywords.line << "unused keyword:" << keywords.name; + } + } + + // search for non-existing itemDatas. + const auto invalidNames = usedAttributeNames - definition.itemDatas.styleNames; + for (const auto &styleName : invalidNames) { + qWarning() << filename << "line" << styleName.line << "reference of non-existing itemData attributes:" << styleName.name; + success = false; + } + + // search for unused itemDatas. + const auto unusedNames = definition.itemDatas.styleNames - usedAttributeNames; + for (const auto &styleName : unusedNames) { + qWarning() << filename << "line" << styleName.line << "unused itemData:" << styleName.name; + success = false; + } + } + + return success; + } + +private: + enum class XmlBool { + Unspecified, + False, + True, + }; + + struct Context; + + struct ContextName { + QString name; + int popCount = 0; + bool stay = false; + + const Context *context = nullptr; + }; + + struct Parser { + const QString &filename; + QXmlStreamReader &xml; + QXmlStreamAttribute &attr; + bool success; + + //! Read a string type attribute, \c sucess = \c false when \p str is not empty + //! \return \c true when attr.name() == attrName, otherwise false + bool extractString(QString &str, const QString &attrName) + { + if (attr.name() != attrName) + return false; + + str = attr.value().toString(); + if (str.isEmpty()) { + qWarning() << filename << "line" << xml.lineNumber() << attrName << "attribute is empty"; + success = false; + } + + return true; + } + + //! Read a bool type attribute, \c sucess = \c false when \p xmlBool is not \c XmlBool::Unspecified. + //! \return \c true when attr.name() == attrName, otherwise false + bool extractXmlBool(XmlBool &xmlBool, const QString &attrName) + { + if (attr.name() != attrName) + return false; + + xmlBool = attr.value().isNull() ? XmlBool::Unspecified : attrToBool(attr.value()) ? XmlBool::True : XmlBool::False; + + return true; + } + + //! Read a positive integer type attribute, \c sucess = \c false when \p positive is already greater than or equal to 0 + //! \return \c true when attr.name() == attrName, otherwise false + bool extractPositive(int &positive, const QString &attrName) + { + if (attr.name() != attrName) + return false; + + bool ok = true; + positive = attr.value().toInt(&ok); + + if (!ok || positive < 0) { + qWarning() << filename << "line" << xml.lineNumber() << attrName << "should be a positive integer:" << attr.value(); + success = false; + } + + return true; + } + + //! Read a color, \c sucess = \c false when \p color is already greater than or equal to 0 + //! \return \c true when attr.name() == attrName, otherwise false + bool checkColor(const QString &attrName) + { + if (attr.name() != attrName) + return false; + + const auto value = attr.value().toString(); + if (value.isEmpty() /*|| QColor(value).isValid()*/) { + qWarning() << filename << "line" << xml.lineNumber() << attrName << "should be a color:" << attr.value(); + success = false; + } + + return true; + } + + //! Read a QChar, \c sucess = \c false when \p c is not \c '\0' or does not have one char + //! \return \c true when attr.name() == attrName, otherwise false + bool extractChar(QChar &c, const QString &attrName) + { + if (attr.name() != attrName) + return false; + + if (attr.value().size() == 1) + c = attr.value()[0]; + else { + c = QLatin1Char('_'); + qWarning() << filename << "line" << xml.lineNumber() << attrName << "must contain exactly one char:" << attr.value(); + success = false; + } + + return true; + } + + //! \return parsing status when \p isExtracted is \c true, otherwise \c false + bool checkIfExtracted(bool isExtracted) + { + if (isExtracted) + return success; + + qWarning() << filename << "line" << xml.lineNumber() << "unknown attribute:" << attr.name(); + return false; + } + }; + + struct Keywords { + struct Items { + struct Item { + QString content; + int line; + + friend uint qHash(const Item &item, uint seed = 0) + { + return qHash(item.content, seed); + } + + friend bool operator==(const Item &item0, const Item &item1) + { + return item0.content == item1.content; + } + }; + + QVector keywords; + QSet includes; + + bool parseElement(const QString &filename, QXmlStreamReader &xml) + { + bool success = true; + + const int line = xml.lineNumber(); + QString content = xml.readElementText(); + + if (content.isEmpty()) { + qWarning() << filename << "line" << line << "is empty:" << xml.name(); + success = false; + } + + if (xml.name() == QStringLiteral("include")) { + includes.insert({content, line}); + } else if (xml.name() == QStringLiteral("item")) { + keywords.append({content, line}); + } else { + qWarning() << filename << "line" << line << "invalid element:" << xml.name(); + success = false; + } + + return success; + } + }; + + QString name; + Items items; + int line; + + bool parseElement(const QString &filename, QXmlStreamReader &xml) + { + line = xml.lineNumber(); + + bool success = true; + for (auto &attr : xml.attributes()) { + Parser parser{filename, xml, attr, success}; + + const bool isExtracted = parser.extractString(name, QStringLiteral("name")); + + success = parser.checkIfExtracted(isExtracted); + } + return success; + } + }; + + struct Context { + struct Rule { + enum class Type { + Unknown, + AnyChar, + Detect2Chars, + DetectChar, + DetectIdentifier, + DetectSpaces, + Float, + HlCChar, + HlCHex, + HlCOct, + HlCStringChar, + IncludeRules, + Int, + LineContinue, + RangeDetect, + RegExpr, + StringDetect, + WordDetect, + keyword, + }; + + Type type{}; + + bool isDotRegex = false; + int line = -1; + + // commonAttributes + QString attribute; + ContextName context; + QString beginRegion; + QString endRegion; + int column = -1; + XmlBool lookAhead{}; + XmlBool firstNonSpace{}; + + // StringDetect, WordDetect, keyword + XmlBool insensitive{}; + + // DetectChar, StringDetect, RegExpr, keyword + XmlBool dynamic{}; + + // Regex + XmlBool minimal{}; + + // DetectChar, Detect2Chars, LineContinue, RangeDetect + QChar char0; + // Detect2Chars, RangeDetect + QChar char1; + + // AnyChar, DetectChar, StringDetect, RegExpr, WordDetect, keyword + QString string; + + // Float, HlCHex, HlCOct, Int, WordDetect, keyword + QString additionalDeliminator; + QString weakDeliminator; + + // rules included by IncludeRules + QVector includedRules; + + // IncludeRules included by IncludeRules + QSet includedIncludeRules; + + QString filename; + + bool parseElement(const QString &filename, QXmlStreamReader &xml) + { + this->filename = filename; + + line = xml.lineNumber(); + + using Pair = QPair; + static const auto pairs = { + Pair{QStringLiteral("AnyChar"), Type::AnyChar}, + Pair{QStringLiteral("Detect2Chars"), Type::Detect2Chars}, + Pair{QStringLiteral("DetectChar"), Type::DetectChar}, + Pair{QStringLiteral("DetectIdentifier"), Type::DetectIdentifier}, + Pair{QStringLiteral("DetectSpaces"), Type::DetectSpaces}, + Pair{QStringLiteral("Float"), Type::Float}, + Pair{QStringLiteral("HlCChar"), Type::HlCChar}, + Pair{QStringLiteral("HlCHex"), Type::HlCHex}, + Pair{QStringLiteral("HlCOct"), Type::HlCOct}, + Pair{QStringLiteral("HlCStringChar"), Type::HlCStringChar}, + Pair{QStringLiteral("IncludeRules"), Type::IncludeRules}, + Pair{QStringLiteral("Int"), Type::Int}, + Pair{QStringLiteral("LineContinue"), Type::LineContinue}, + Pair{QStringLiteral("RangeDetect"), Type::RangeDetect}, + Pair{QStringLiteral("RegExpr"), Type::RegExpr}, + Pair{QStringLiteral("StringDetect"), Type::StringDetect}, + Pair{QStringLiteral("WordDetect"), Type::WordDetect}, + Pair{QStringLiteral("keyword"), Type::keyword}, + }; + + for (auto pair : pairs) { + if (xml.name() == pair.first) { + type = pair.second; + bool success = parseAttributes(filename, xml); + success = checkMandoryAttributes(filename, xml) && success; + if (success && type == Type::RegExpr) { + // ., (.) followed by *, +, {1} or nothing + static const QRegularExpression isDot(QStringLiteral(R"(^\(?\.(?:[*+][*+?]?|[*+]|\{1\})?\$?$)")); + // remove "(?:" and ")" + static const QRegularExpression removeParentheses(QStringLiteral(R"(\((?:\?:)?|\))")); + // remove parentheses on a double from the string + auto reg = QString(string).replace(removeParentheses, QString()); + isDotRegex = reg.contains(isDot); + } + return success; + } + } + + qWarning() << filename << "line" << xml.lineNumber() << "unknown element:" << xml.name(); + return false; + } + + private: + bool parseAttributes(const QString &filename, QXmlStreamReader &xml) + { + bool success = true; + + for (auto &attr : xml.attributes()) { + Parser parser{filename, xml, attr, success}; + XmlBool includeAttrib{}; + + // clang-format off + const bool isExtracted + = parser.extractString(attribute, QStringLiteral("attribute")) + || parser.extractString(context.name, QStringLiteral("context")) + || parser.extractXmlBool(lookAhead, QStringLiteral("lookAhead")) + || parser.extractXmlBool(firstNonSpace, QStringLiteral("firstNonSpace")) + || parser.extractString(beginRegion, QStringLiteral("beginRegion")) + || parser.extractString(endRegion, QStringLiteral("endRegion")) + || parser.extractPositive(column, QStringLiteral("column")) + || ((type == Type::RegExpr + || type == Type::StringDetect + || type == Type::WordDetect + || type == Type::keyword + ) && parser.extractXmlBool(insensitive, QStringLiteral("insensitive"))) + || ((type == Type::DetectChar + || type == Type::RegExpr + || type == Type::StringDetect + || type == Type::keyword + ) && parser.extractXmlBool(dynamic, QStringLiteral("dynamic"))) + || ((type == Type::RegExpr) + && parser.extractXmlBool(minimal, QStringLiteral("minimal"))) + || ((type == Type::DetectChar + || type == Type::Detect2Chars + || type == Type::LineContinue + || type == Type::RangeDetect + ) && parser.extractChar(char0, QStringLiteral("char"))) + || ((type == Type::Detect2Chars + || type == Type::RangeDetect + ) && parser.extractChar(char1, QStringLiteral("char1"))) + || ((type == Type::AnyChar + || type == Type::RegExpr + || type == Type::StringDetect + || type == Type::WordDetect + || type == Type::keyword + ) && parser.extractString(string, QStringLiteral("String"))) + || ((type == Type::IncludeRules) + && parser.extractXmlBool(includeAttrib, QStringLiteral("includeAttrib"))) + || ((type == Type::Float + || type == Type::HlCHex + || type == Type::HlCOct + || type == Type::Int + || type == Type::keyword + || type == Type::WordDetect + ) && (parser.extractString(additionalDeliminator, QStringLiteral("additionalDeliminator")) + || parser.extractString(weakDeliminator, QStringLiteral("weakDeliminator")))) + ; + // clang-format on + + success = parser.checkIfExtracted(isExtracted); + + if (type == Type::LineContinue && char0 == QLatin1Char('\0')) { + char0 = QLatin1Char('\\'); + } + } + + return success; + } + + bool checkMandoryAttributes(const QString &filename, QXmlStreamReader &xml) + { + QString missingAttr; + + switch (type) { + case Type::Unknown: + return false; + + case Type::AnyChar: + case Type::RegExpr: + case Type::StringDetect: + case Type::WordDetect: + case Type::keyword: + missingAttr = string.isEmpty() ? QStringLiteral("String") : QString(); + break; + + case Type::DetectChar: + missingAttr = !char0.unicode() ? QStringLiteral("char") : QString(); + break; + + case Type::Detect2Chars: + case Type::RangeDetect: + missingAttr = !char0.unicode() && !char1.unicode() ? QStringLiteral("char and char1") + : !char0.unicode() ? QStringLiteral("char") + : !char1.unicode() ? QStringLiteral("char1") + : QString(); + break; + + case Type::IncludeRules: + missingAttr = context.name.isEmpty() ? QStringLiteral("context") : QString(); + break; + + case Type::DetectIdentifier: + case Type::DetectSpaces: + case Type::Float: + case Type::HlCChar: + case Type::HlCHex: + case Type::HlCOct: + case Type::HlCStringChar: + case Type::Int: + case Type::LineContinue: + break; + } + + if (!missingAttr.isEmpty()) { + qWarning() << filename << "line" << xml.lineNumber() << "missing attribute:" << missingAttr; + return false; + } + + return true; + } + }; + + int line; + QString name; + QString attribute; + ContextName lineEndContext; + ContextName lineEmptyContext; + ContextName fallthroughContext; + QVector rules; + XmlBool dynamic{}; + XmlBool fallthrough{}; + + bool parseElement(const QString &filename, QXmlStreamReader &xml) + { + line = xml.lineNumber(); + + bool success = true; + + for (auto &attr : xml.attributes()) { + Parser parser{filename, xml, attr, success}; + XmlBool noIndentationBasedFolding{}; + + 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(noIndentationBasedFolding, QStringLiteral("noIndentationBasedFolding")); + + success = parser.checkIfExtracted(isExtracted); + } + + if (name.isEmpty()) { + qWarning() << filename << "line" << xml.lineNumber() << "missing attribute: name"; + success = false; + } + + if (attribute.isEmpty()) { + qWarning() << filename << "line" << xml.lineNumber() << "missing attribute: attribute"; + success = false; + } + + if (lineEndContext.name.isEmpty()) { + qWarning() << filename << "line" << xml.lineNumber() << "missing attribute: lineEndContext"; + success = false; + } + + return success; + } + }; + + struct Version { + int majorRevision; + int minorRevision; + + Version(int majorRevision = 0, int minorRevision = 0) + : majorRevision(majorRevision) + , minorRevision(minorRevision) + { + } + + bool operator<(const Version &version) const + { + return majorRevision < version.majorRevision || (majorRevision == version.majorRevision && minorRevision < version.minorRevision); + } + }; + + struct ItemDatas { + struct Style { + QString name; + int line; + + friend uint qHash(const Style &style, uint seed = 0) + { + return qHash(style.name, seed); + } + + friend bool operator==(const Style &style0, const Style &style1) + { + return style0.name == style1.name; + } + }; + + QSet