Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qqmlsemantictokens_p.h
Go to the documentation of this file.
1// Copyright (C) 2024 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QQMLSEMANTICTOKENS_P_H
5#define QQMLSEMANTICTOKENS_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtLanguageServer/private/qlanguageserverspec_p.h>
19#include <QtQmlDom/private/qqmldomitem_p.h>
20#include <QtCore/qlist.h>
21#include <QtCore/qmap.h>
22
24
25Q_DECLARE_LOGGING_CATEGORY(semanticTokens)
26
27// Represents a semantic highlighting token
28// startLine and startColumn are 0-based as in LSP spec.
29struct Token
30{
31 Token() = default;
32 Token(const QQmlJS::SourceLocation &loc, int tokenType, int tokenModifier = 0)
33 : offset(loc.offset),
34 length(loc.length),
35 startLine(loc.startLine - 1),
36 startColumn(loc.startColumn - 1),
37 tokenType(tokenType),
38 tokenModifier(tokenModifier)
39 {
40 }
41
42 inline friend bool operator<(const Token &lhs, const Token &rhs)
43 {
44 return lhs.offset < rhs.offset;
45 }
46
47 inline friend bool operator==(const Token &lhs, const Token &rhs)
48 {
49 return lhs.offset == rhs.offset && lhs.length == rhs.length
50 && lhs.startLine == rhs.startLine && lhs.startColumn == rhs.startColumn
51 && lhs.tokenType == rhs.tokenType && lhs.tokenModifier == rhs.tokenModifier;
52 }
53
54 int offset;
55 int length;
60};
61
62using HighlightsContainer = QMap<int, QT_PREPEND_NAMESPACE(Token)>;
63
73
75{
76public:
77 void addHighlight(const QQmlJS::SourceLocation &loc, int tokenType, int tokenModifier = 0);
78 void addHighlight(const QMap<QQmlJS::Dom::FileLocationRegion, QQmlJS::SourceLocation> &regions,
79 QQmlJS::Dom::FileLocationRegion region, int tokenModifier = 0);
80 QList<int> collectTokens(const QQmlJS::Dom::DomItem &item,
81 const std::optional<HighlightsRange> &range);
82
83 HighlightsContainer &highlights() { return m_highlights; }
84 const HighlightsContainer &highlights() const { return m_highlights; }
85
86private:
87 HighlightsContainer m_highlights;
88};
89
91{
92 static QList<int> encodeSemanticTokens(Highlights &highlights);
93 static QList<QQmlJS::SourceLocation>
95 const QQmlJS::SourceLocation &tokenLocation);
96 static void addModifier(QLspSpecification::SemanticTokenModifiers modifier, int *baseModifier);
98 static QList<QLspSpecification::SemanticTokensEdit> computeDiff(const QList<int> &, const QList<int> &);
99 static void updateResultID(QByteArray &resultID);
100};
101
103{
104public:
105 HighlightingVisitor(Highlights &highlights, const std::optional<HighlightsRange> &range);
107
108private:
109 void highlightComment(const QQmlJS::Dom::DomItem &item);
110 void highlightImport(const QQmlJS::Dom::DomItem &item);
111 void highlightBinding(const QQmlJS::Dom::DomItem &item);
112 void highlightPragma(const QQmlJS::Dom::DomItem &item);
113 void highlightEnumItem(const QQmlJS::Dom::DomItem &item);
114 void highlightEnumDecl(const QQmlJS::Dom::DomItem &item);
115 void highlightQmlObject(const QQmlJS::Dom::DomItem &item);
116 void highlightComponent(const QQmlJS::Dom::DomItem &item);
117 void highlightPropertyDefinition(const QQmlJS::Dom::DomItem &item);
118 void highlightMethod(const QQmlJS::Dom::DomItem &item);
119 void highlightScriptLiteral(const QQmlJS::Dom::DomItem &item);
120 void highlightIdentifier(const QQmlJS::Dom::DomItem &item);
121 void highlightBySemanticAnalysis(const QQmlJS::Dom::DomItem &item, QQmlJS::SourceLocation loc);
122 void highlightScriptExpressions(const QQmlJS::Dom::DomItem &item);
123
124private:
125 Highlights &m_highlights;
126 std::optional<HighlightsRange> m_range;
127};
128
130
131#endif // QQMLSEMANTICTOKENS_P_H
HighlightingVisitor(Highlights &highlights, const std::optional< HighlightsRange > &range)
bool operator()(QQmlJS::Dom::Path, const QQmlJS::Dom::DomItem &item, bool)
const HighlightsContainer & highlights() const
void addHighlight(const QQmlJS::SourceLocation &loc, int tokenType, int tokenModifier=0)
QList< int > collectTokens(const QQmlJS::Dom::DomItem &item, const std::optional< HighlightsRange > &range)
HighlightsContainer & highlights()
\inmodule QtCore
Definition qbytearray.h:57
\inmodule QtCore
Definition qstringview.h:78
Combined button and popup list for selecting options.
#define Q_DECLARE_LOGGING_CATEGORY(name)
GLboolean r
[2]
GLenum GLuint GLenum GLsizei length
GLsizei range
GLenum GLuint GLintptr offset
QGraphicsItem * item
static QList< QQmlJS::SourceLocation > sourceLocationsFromMultiLineToken(QStringView code, const QQmlJS::SourceLocation &tokenLocation)
Returns multiple source locations for a given raw comment.
static QList< int > encodeSemanticTokens(Highlights &highlights)
static void updateResultID(QByteArray &resultID)
static QList< QLspSpecification::SemanticTokensEdit > computeDiff(const QList< int > &, const QList< int > &)
static bool rangeOverlapsWithSourceLocation(const QQmlJS::SourceLocation &loc, const HighlightsRange &r)
static void addModifier(QLspSpecification::SemanticTokenModifiers modifier, int *baseModifier)
friend bool operator==(const Token &lhs, const Token &rhs)
Token()=default
friend bool operator<(const Token &lhs, const Token &rhs)
Token(const QQmlJS::SourceLocation &loc, int tokenType, int tokenModifier=0)