diff options
author | Semih Yavuz <semih.yavuz@qt.io> | 2024-04-24 00:42:01 +0200 |
---|---|---|
committer | Semih Yavuz <semih.yavuz@qt.io> | 2024-05-07 13:35:43 +0200 |
commit | 5b43608d7b80b9cb6ed18059f837d08889cd9054 (patch) | |
tree | aaac76482654f2ce5bb2535153e73b59b0a7df97 /tests | |
parent | ded185c3a0f44c8bb03754b7ade81b0b8505f362 (diff) |
semantichighlighting: add highlight for identifiers
Some identifiers cannot be handled in their containing dom type if they
contains dot in their names. Js variables that are not special types
are also highlighted here. Because an identifier can represent a few
different types, semantic analysis are performed to resolve their actual
types.
Also, adapt the binding handler's highlighting. A binding identifier can
be a property or a signal handler. In those cases, it should be
colorized as methods.
Pass built-in directory while creating the dom environment so that it
will behave the same as the code model.
Task-number: QTBUG-120000
Change-Id: Ifb8dda81ca7ef6f3150e68907c036387e32f279e
Reviewed-by: Dmitrii Akshintsev <dmitrii.akshintsev@qt.io>
Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/qmlls/utils/data/highlights/Identifiers.qml | 37 | ||||
-rw-r--r-- | tests/auto/qmlls/utils/data/highlights/identifiers.qml | 37 | ||||
-rw-r--r-- | tests/auto/qmlls/utils/tst_qmlls_highlighting.cpp | 41 |
3 files changed, 112 insertions, 3 deletions
diff --git a/tests/auto/qmlls/utils/data/highlights/Identifiers.qml b/tests/auto/qmlls/utils/data/highlights/Identifiers.qml new file mode 100644 index 0000000000..7725b6d5e4 --- /dev/null +++ b/tests/auto/qmlls/utils/data/highlights/Identifiers.qml @@ -0,0 +1,37 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +import QtQuick + +Item { + readonly property int test: 34 + signal pressed() + function f() { + let sum = 0, sum2 = 0 + for(let i = 1; i < 42; i = i + 2) { + sum = test + i + { + let sum = 42; // another unrelated sum + } + } + // signal and property changed + testChanged(); + pressed(); + } + + // attached + Keys.onPressed: { + } + + // propertychanged handler + onTestChanged: { + f(); // method identifier + } + + // signal handler + onPressed: {} + + enum K { Plus} + property int tt: Identifiers.Plus // component and enum value + +} diff --git a/tests/auto/qmlls/utils/data/highlights/identifiers.qml b/tests/auto/qmlls/utils/data/highlights/identifiers.qml new file mode 100644 index 0000000000..7725b6d5e4 --- /dev/null +++ b/tests/auto/qmlls/utils/data/highlights/identifiers.qml @@ -0,0 +1,37 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +import QtQuick + +Item { + readonly property int test: 34 + signal pressed() + function f() { + let sum = 0, sum2 = 0 + for(let i = 1; i < 42; i = i + 2) { + sum = test + i + { + let sum = 42; // another unrelated sum + } + } + // signal and property changed + testChanged(); + pressed(); + } + + // attached + Keys.onPressed: { + } + + // propertychanged handler + onTestChanged: { + f(); // method identifier + } + + // signal handler + onPressed: {} + + enum K { Plus} + property int tt: Identifiers.Plus // component and enum value + +} diff --git a/tests/auto/qmlls/utils/tst_qmlls_highlighting.cpp b/tests/auto/qmlls/utils/tst_qmlls_highlighting.cpp index fb17239ecf..214e581307 100644 --- a/tests/auto/qmlls/utils/tst_qmlls_highlighting.cpp +++ b/tests/auto/qmlls/utils/tst_qmlls_highlighting.cpp @@ -9,7 +9,7 @@ #include <QtQmlDom/private/qqmldomitem_p.h> #include <QtQmlDom/private/qqmldomtop_p.h> #include <QtQmlLS/private/qqmlsemantictokens_p.h> - +#include <QtCore/qlibraryinfo.h> #include <QtLanguageServer/private/qlanguageserverspectypes_p.h> #include <qlist.h> @@ -157,11 +157,13 @@ void tst_qmlls_highlighting::highlights_data() DomCreationOptions options; options.setFlag(DomCreationOption::WithScriptExpressions); options.setFlag(DomCreationOption::WithSemanticAnalysis); + options.setFlag(DomCreationOption::WithRecovery); - auto envPtr = DomEnvironment::create( - QStringList(), + QStringList dirs = {QLibraryInfo::path(QLibraryInfo::Qml2ImportsPath)}; + auto envPtr = DomEnvironment::create(dirs, QQmlJS::Dom::DomEnvironment::Option::SingleThreaded | QQmlJS::Dom::DomEnvironment::Option::NoDependencies, options); + envPtr->loadBuiltins(); envPtr->loadFile(FileToLoad::fromMemory(envPtr, filePath, code), [&file](Path, const DomItem &, const DomItem &newIt) { file = newIt.fileObject(); @@ -386,6 +388,39 @@ void tst_qmlls_highlighting::highlights_data() << Token(QQmlJS::SourceLocation(285, 4, 12, 21), int(SemanticTokenTypes::Keyword), 0); } + { // identifiers + const auto filePath = m_highlightingDataDir + "/Identifiers.qml"; + const auto fileItem = fileObject(filePath); + QTest::addRow("js-property") << fileItem + << Token(QQmlJS::SourceLocation(222, 3, 10, 13), + int(SemanticTokenTypes::Variable), 0); + QTest::addRow("property-id") + << fileItem + << Token(QQmlJS::SourceLocation(302, 4, 12, 19), int(SemanticTokenTypes::Property), + (1 << int(SemanticTokenModifiers::Readonly))); + QTest::addRow("property-changed") << fileItem + << Token(QQmlJS::SourceLocation(451, 11, 18, 9), + int(SemanticTokenTypes::Method), 0); + QTest::addRow("signal") << fileItem + << Token(QQmlJS::SourceLocation(474, 7, 19, 9), + int(SemanticTokenTypes::Method), 0); + + QTest::addRow("attached-id") + << fileItem + << Token(QQmlJS::SourceLocation(512, 4, 23, 5), int(SemanticTokenTypes::Type), 0); + QTest::addRow("attached-signalhandler") << fileItem + << Token(QQmlJS::SourceLocation(517, 9, 23, 10), + int(SemanticTokenTypes::Method), 0); + QTest::addRow("propchanged-handler") << fileItem + << Token(QQmlJS::SourceLocation(572, 13, 27, 5), + int(SemanticTokenTypes::Method), 0); + QTest::addRow("method-id") + << fileItem + << Token(QQmlJS::SourceLocation(597, 1, 28, 9), int(SemanticTokenTypes::Method), 0); + QTest::addRow("signal-handler") + << fileItem + << Token(QQmlJS::SourceLocation(656, 9, 32, 5), int(SemanticTokenTypes::Method), 0); + } } void tst_qmlls_highlighting::highlights() |