diff options
author | Semih Yavuz <semih.yavuz@qt.io> | 2024-04-24 15:32:21 +0200 |
---|---|---|
committer | Semih Yavuz <semih.yavuz@qt.io> | 2024-05-07 13:35:49 +0200 |
commit | dcd948c0bbbef9bd9f01d6b401f466aaaa14ad84 (patch) | |
tree | cdeb2bb7a6ba161ff92b4b39af7b430ac47c4c16 /tests | |
parent | 5b43608d7b80b9cb6ed18059f837d08889cd9054 (diff) |
semantichighlighting: add highlighting for the script expressions
This is the final commit for the core functionality of the semantic
highlighting. There is still a few issues which will be taken care by
the follow up patches.
Known issues:
-- lambda expressions is not highlighted (QTBUG-124625)
-- bool literals are mapped to keywords but they deserve their own
custom color (QTBUG-124711)
-- highlighting of variable declarations inside for loops (QTBUG-124677)
Task-number: QTBUG-120000
Change-Id: Ice07a514c2ae3afaeb871e663bcc0b20624976c0
Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/qmlls/utils/data/highlights/scriptExpressions.qml | 116 | ||||
-rw-r--r-- | tests/auto/qmlls/utils/tst_qmlls_highlighting.cpp | 73 |
2 files changed, 189 insertions, 0 deletions
diff --git a/tests/auto/qmlls/utils/data/highlights/scriptExpressions.qml b/tests/auto/qmlls/utils/data/highlights/scriptExpressions.qml new file mode 100644 index 0000000000..ee0b4ff5f8 --- /dev/null +++ b/tests/auto/qmlls/utils/data/highlights/scriptExpressions.qml @@ -0,0 +1,116 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +import QtQuick + +Item { + function k() { + } + + function mafik() { + var patron = 34; + const upperLimit = 42; + do { + ++patron; + if (patron < 2) + continue; + else + ++patron; + } while (patron < upperLimit) + switch (patron) { + case 1: + return 23; + default: + break; + } + try { + {} + } catch (error) { + {} + } finally {} + for (const a in [1, 2, 3]) { + throw 2; + } + } + + enum Test { + LOG + } + + readonly property int t: 34 + signal tt + required property int k + + signal kkk(string a) + signal yyy(a: string) + + function ttt() { + + } + +function createComplexExpression(...objects) { + // Create an object that holds some data + let data = { + a: 5, + b: 10, + c: 3 + }; + + // Create a complex expression using the data object + let expression = ((data.a + data.b * data.c) / (data.a - data.b)) ** data.c; + + return expression; +} + + function set1() { + const array = [1,2,3,4]; + const [a, b] = [1,2]; + const [aa, , bb] = array; + const [aaa = 23, bbb] = array; + const [a1, b1, ...rest1] = array; + const [a2, , b2, ...rest2] = array; + const [a3, b3, ...{ pop, push }] = array; + const [a4, b4, ...[c, d]] = array; + + const obj = {_a:1,_b:2}; + const { a5, b5 } = obj; + const { a6: a_, b6: b1_ } = obj; + const { a7: a11 = 4, b11 = 34, c1: b111, d1 } = obj; + let key = a; + const { [key]: a___ } = obj; + } + + function set2(s : int) : int { + // declare first + let a, b, a1, b1, c, d, rest, pop, push; + const array = [1,2,3,4]; + [a, b] = array; + [a, , b] = array; + [a = aDefault, b] = array; + [a, b, ...rest] = array; + [a, , b, ...rest] = array; + [a, b, ...{ pop, push }] = array; + [a, b, ...[c, d]] = array; + + const obj = {_a:1,_b:2}; + ({ a, b } = obj); // brackets are required + ({ a: a1, b: b1 } = obj); + + const complicatedObject = { + a: 1, + b: { + c: 2, + d: { + e: 3, + f: [4, 5, 6] + } + }, + g: [7, 8, 9] + }; + + const { patron, b: { mafik, d: { e, f: [ , secondF, ...restF ] } }, g: [ firstG, ...restG ] } = complicatedObject; + } + + +} + diff --git a/tests/auto/qmlls/utils/tst_qmlls_highlighting.cpp b/tests/auto/qmlls/utils/tst_qmlls_highlighting.cpp index 214e581307..203f8a8390 100644 --- a/tests/auto/qmlls/utils/tst_qmlls_highlighting.cpp +++ b/tests/auto/qmlls/utils/tst_qmlls_highlighting.cpp @@ -421,6 +421,77 @@ void tst_qmlls_highlighting::highlights_data() << fileItem << Token(QQmlJS::SourceLocation(656, 9, 32, 5), int(SemanticTokenTypes::Method), 0); } + { // script expressions + const auto filePath = m_highlightingDataDir + "/scriptExpressions.qml"; + const auto fileItem = fileObject(filePath); + + QTest::addRow("var-keyword") << fileItem + << Token(QQmlJS::SourceLocation(192, 3, 11, 9), + int(SemanticTokenTypes::Keyword), 0); + QTest::addRow("const-keyword") << fileItem + << Token(QQmlJS::SourceLocation(217, 5, 12, 9), + int(SemanticTokenTypes::Keyword), 0); + const auto modifier = (1 << int(SemanticTokenModifiers::Readonly)); + QTest::addRow("const-name") << fileItem + << Token(QQmlJS::SourceLocation(223, 10, 12, 15), + int(SemanticTokenTypes::Variable), modifier); + QTest::addRow("do-keyword") << fileItem + << Token(QQmlJS::SourceLocation(248, 2, 13, 9), + int(SemanticTokenTypes::Keyword), 0); + QTest::addRow("if-keyword") << fileItem + << Token(QQmlJS::SourceLocation(287, 2, 15, 13), + int(SemanticTokenTypes::Keyword), 0); + QTest::addRow("continue-keyword") << fileItem + << Token(QQmlJS::SourceLocation(319, 8, 16, 17), + int(SemanticTokenTypes::Keyword), 0); + QTest::addRow("else-keyword") << fileItem + << Token(QQmlJS::SourceLocation(341, 4, 17, 13), + int(SemanticTokenTypes::Keyword), 0); + QTest::addRow("while-keyword") << fileItem + << Token(QQmlJS::SourceLocation(382, 5, 19, 11), + int(SemanticTokenTypes::Keyword), 0); + QTest::addRow("switch-keyword") << fileItem + << Token(QQmlJS::SourceLocation(418, 6, 20, 9), + int(SemanticTokenTypes::Keyword), 0); + QTest::addRow("case-keyword") << fileItem + << Token(QQmlJS::SourceLocation(444, 4, 21, 9), + int(SemanticTokenTypes::Keyword), 0); + QTest::addRow("return-keyword") << fileItem + << Token(QQmlJS::SourceLocation(464, 6, 22, 13), + int(SemanticTokenTypes::Keyword), 0); + QTest::addRow("default-keyword") << fileItem + << Token(QQmlJS::SourceLocation(483, 7, 23, 9), + int(SemanticTokenTypes::Keyword), 0); + QTest::addRow("break-keyword") << fileItem + << Token(QQmlJS::SourceLocation(504, 5, 24, 13), + int(SemanticTokenTypes::Keyword), 0); + QTest::addRow("try-keyword") << fileItem + << Token(QQmlJS::SourceLocation(529, 3, 26, 9), + int(SemanticTokenTypes::Keyword), 0); + QTest::addRow("catch-keyword") << fileItem + << Token(QQmlJS::SourceLocation(560, 5, 28, 11), + int(SemanticTokenTypes::Keyword), 0); + QTest::addRow("finally-keyword") << fileItem + << Token(QQmlJS::SourceLocation(601, 7, 30, 11), + int(SemanticTokenTypes::Keyword), 0); + QTest::addRow("for-keyword") << fileItem + << Token(QQmlJS::SourceLocation(620, 3, 31, 9), + int(SemanticTokenTypes::Keyword), 0); + QTest::addRow("throw-keyword") << fileItem + << Token(QQmlJS::SourceLocation(661, 5, 32, 13), + int(SemanticTokenTypes::Keyword), 0); + QTest::addRow("for-declaration") << fileItem + << Token(QQmlJS::SourceLocation(625, 5, 31, 14), + int(SemanticTokenTypes::Keyword), 0); + QTest::addRow("destructuring") + << fileItem + << Token(QQmlJS::SourceLocation(1511, 2, 73, 16), int(SemanticTokenTypes::Variable), + (1 << int(SemanticTokenModifiers::Readonly))); + QTest::addRow("obj-destructuring") + << fileItem + << Token(QQmlJS::SourceLocation(1589, 2, 76, 17), int(SemanticTokenTypes::Variable), + (1 << int(SemanticTokenModifiers::Readonly))); + } } void tst_qmlls_highlighting::highlights() @@ -436,6 +507,8 @@ void tst_qmlls_highlighting::highlights() emptyChildrenVisitor); const auto highlights = h.highlights(); + QEXPECT_FAIL("for-declaration", + "For declaration highlighting should be implemented by QTBUG-124677", Abort); QVERIFY(highlights.contains(expectedHighlightedToken.offset)); QCOMPARE(highlights.value(expectedHighlightedToken.offset), expectedHighlightedToken); } |