aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOlivier De Cannière <[email protected]>2025-03-04 17:50:34 +0100
committerOlivier De Cannière <[email protected]>2025-03-06 19:23:04 +0100
commitd2c791c3435863087f3b47e4f1c78558b8750cdb (patch)
tree6964965ce386a23f4f5efa671d9996788621b4aa
parent2cc30828af4ffe6d9cc0c6c91d3b665366a03f81 (diff)
semantichighlighting: Add support for final property attribute
Change-Id: I0ffa565fcefb2f44b180395d58120f52463aa950 Reviewed-by: Semih Yavuz <[email protected]> Reviewed-by: Sami Shalayel <[email protected]>
-rw-r--r--src/qmldom/qqmldomastcreator.cpp5
-rw-r--r--src/qmlls/qqmlsemantictokens.cpp7
-rw-r--r--src/qmlls/qqmlsemantictokens_p.h5
-rw-r--r--tests/auto/qmlls/utils/data/highlights/properties.qml1
-rw-r--r--tests/auto/qmlls/utils/tst_qmlls_highlighting.cpp10
5 files changed, 26 insertions, 2 deletions
diff --git a/src/qmldom/qqmldomastcreator.cpp b/src/qmldom/qqmldomastcreator.cpp
index 76dee8191a..3fec3d0211 100644
--- a/src/qmldom/qqmldomastcreator.cpp
+++ b/src/qmldom/qqmldomastcreator.cpp
@@ -525,6 +525,7 @@ bool QQmlDomAstCreator::visit(AST::UiPublicMember *el)
p.isReadonly = el->isReadonly();
p.isDefaultMember = el->isDefaultMember();
p.isRequired = el->isRequired();
+ p.isFinal = el->isFinal();
p.isList = el->typeModifier == QLatin1String("list");
p.isFinal = el->isFinal();
if (!el->typeModifier.isEmpty())
@@ -562,6 +563,10 @@ bool QQmlDomAstCreator::visit(AST::UiPublicMember *el)
FileLocations::addRegion(nodeStack.last().fileLocations, DefaultKeywordRegion,
el->defaultToken());
}
+ if (p.isFinal) {
+ FileLocations::addRegion(nodeStack.last().fileLocations, FinalKeywordRegion,
+ el->finalToken());
+ }
if (p.isRequired) {
FileLocations::addRegion(nodeStack.last().fileLocations, RequiredKeywordRegion,
el->requiredToken());
diff --git a/src/qmlls/qqmlsemantictokens.cpp b/src/qmlls/qqmlsemantictokens.cpp
index 8cedb76bb9..2e8ece2096 100644
--- a/src/qmlls/qqmlsemantictokens.cpp
+++ b/src/qmlls/qqmlsemantictokens.cpp
@@ -193,6 +193,9 @@ static int fromQmlModifierKindToLspTokenType(QmlHighlightModifiers highlightModi
if (highlightModifier.testFlag(QmlHighlightModifier::QmlDefaultProperty))
addModifier(SemanticTokenModifiers::DefaultLibrary, &modifier);
+ if (highlightModifier.testFlag(QmlHighlightModifier::QmlFinalProperty))
+ addModifier(SemanticTokenModifiers::Static, &modifier);
+
if (highlightModifier.testFlag(QmlHighlightModifier::QmlRequiredProperty))
addModifier(SemanticTokenModifiers::Abstract, &modifier);
@@ -424,6 +427,10 @@ void HighlightingVisitor::highlightPropertyDefinition(const DomItem &item)
modifier |= QmlHighlightModifier::QmlDefaultProperty;
m_highlights.addHighlight(regions[DefaultKeywordRegion], QmlHighlightKind::QmlKeyword);
}
+ if (propertyDef->isFinal) {
+ modifier |= QmlHighlightModifier::QmlFinalProperty;
+ m_highlights.addHighlight(regions[FinalKeywordRegion], QmlHighlightKind::QmlKeyword);
+ }
if (propertyDef->isRequired) {
modifier |= QmlHighlightModifier::QmlRequiredProperty;
m_highlights.addHighlight(regions[RequiredKeywordRegion], QmlHighlightKind::QmlKeyword);
diff --git a/src/qmlls/qqmlsemantictokens_p.h b/src/qmlls/qqmlsemantictokens_p.h
index 5f5e5e8e0c..b5f82fad84 100644
--- a/src/qmlls/qqmlsemantictokens_p.h
+++ b/src/qmlls/qqmlsemantictokens_p.h
@@ -67,8 +67,9 @@ enum class QmlHighlightModifier {
None = 0,
QmlPropertyDefinition = 1 << 0,
QmlDefaultProperty = 1 << 1,
- QmlRequiredProperty = 1 << 2,
- QmlReadonlyProperty = 1 << 3,
+ QmlFinalProperty = 1 << 2,
+ QmlRequiredProperty = 1 << 3,
+ QmlReadonlyProperty = 1 << 4,
};
Q_DECLARE_FLAGS(QmlHighlightModifiers, QmlHighlightModifier)
Q_DECLARE_OPERATORS_FOR_FLAGS(QmlHighlightModifiers)
diff --git a/tests/auto/qmlls/utils/data/highlights/properties.qml b/tests/auto/qmlls/utils/data/highlights/properties.qml
index bde60915ca..4f8d69097f 100644
--- a/tests/auto/qmlls/utils/data/highlights/properties.qml
+++ b/tests/auto/qmlls/utils/data/highlights/properties.qml
@@ -9,5 +9,6 @@ Item {
readonly property int kk
required property int kkk
default property int kkkk
+ final property int kkkkk
}
}
diff --git a/tests/auto/qmlls/utils/tst_qmlls_highlighting.cpp b/tests/auto/qmlls/utils/tst_qmlls_highlighting.cpp
index 420449dde7..c376af4a96 100644
--- a/tests/auto/qmlls/utils/tst_qmlls_highlighting.cpp
+++ b/tests/auto/qmlls/utils/tst_qmlls_highlighting.cpp
@@ -370,6 +370,16 @@ void tst_qmlls_highlighting::highlights_data()
<< fileItem
<< Token(QQmlJS::SourceLocation(265, 4, 11, 30),
int(SemanticTokenProtocolTypes::Property), defaultModifier);
+ int finalModifier =
+ definitionModifier | (1 << int(SemanticTokenModifiers::Static));
+ QTest::addRow("final-keyword")
+ << fileItem
+ << Token(QQmlJS::SourceLocation(278, 5, 12, 9),
+ int(SemanticTokenProtocolTypes::Keyword), 0);
+ QTest::addRow("final-modifier")
+ << fileItem
+ << Token(QQmlJS::SourceLocation(297, 5, 12, 28),
+ int(SemanticTokenProtocolTypes::Property), finalModifier);
}
{
// methods and signals, lambda functions