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
qqmldomscriptelements_p.h
Go to the documentation of this file.
1// Copyright (C) 2023 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 QQMLDOMSCRIPTELEMENTS_P_H
5#define QQMLDOMSCRIPTELEMENTS_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 "qqmldomitem_p.h"
20#include "qqmldompath_p.h"
21#include <algorithm>
22#include <limits>
23#include <type_traits>
24#include <utility>
25#include <variant>
26
28
29namespace QQmlJS {
30namespace Dom {
31
32namespace ScriptElements {
33
34template<DomType type>
36{
37public:
38 using BaseT = ScriptElementBase<type>;
39 static constexpr DomType kindValue = type;
41
50 DomType kind() const override { return type; }
51 DomKind domKind() const override { return domKindValue; }
52
61
62 /*
63 Pretty prints the current DomItem. Currently, for script elements, this is done entirely on
64 the parser representation (via the AST classes), but it could be moved here if needed.
65 */
66 // void writeOut(const DomItem &self, OutWriter &lw) const override;
67
75 // // needed for debug
76 // void dump(const DomItem &, const Sink &sink, int indent, FilterT filter) const override;
77
78 // // just required for optimization if iterateDirectSubpaths is slow
79 // QList<QString> fields(const DomItem &self) const override;
80 // DomItem field(const DomItem &self, QStringView name) const override;
81
82 // index_type indexes(const DomItem &self) const override;
83 // DomItem index(const DomItem &self, index_type index) const override;
84
85 // QSet<QString> const keys(const DomItem &self) const override;
86 // DomItem key(const DomItem &self, const QString &name) const override;
87
89 {
90 Q_ASSERT(m_locations.size() > 0);
92
93 auto current = m_locations.front();
94 return current.second;
95 }
97 {
98 Q_ASSERT(m_locations.size() > 0);
100
101 m_locations.front().second = location;
102 }
104 {
105 Q_ASSERT_X(region != FileLocationRegion::MainRegion, "ScriptElementBase::addLocation",
106 "use the setCombinedLocation instead!");
107 m_locations.emplace_back(region, location);
108 }
109
110protected:
111 std::vector<std::pair<FileLocationRegion, QQmlJS::SourceLocation>> m_locations;
112};
113
114class ScriptList : public ScriptElementBase<DomType::List>
115{
116public:
118
119 using BaseT::BaseT;
120
121 // minimal required overload for this to be wrapped as DomItem:
122 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
123 {
124 bool cont =
125 asList(self.pathFromOwner().key(QString())).iterateDirectSubpaths(self, visitor);
126 return cont;
127 }
128 void updatePathFromOwner(const Path &p) override
129 {
130 BaseT::updatePathFromOwner(p);
131 for (int i = 0; i < m_list.size(); ++i) {
132 Q_ASSERT(m_list[i].base());
133 m_list[i].base()->updatePathFromOwner(p.index(i));
134 }
135 }
137 {
138 BaseT::createFileLocations(base);
139
140 for (int i = 0; i < m_list.size(); ++i) {
141 Q_ASSERT(m_list[i].base());
142 m_list[i].base()->createFileLocations(base);
143 }
144 }
145
146 List asList(const Path &path) const
147 {
148 auto asList = List::fromQList<ScriptElementVariant>(
149 path, m_list,
150 [](const DomItem &list, const PathEls::PathComponent &, const ScriptElementVariant &wrapped)
151 -> DomItem { return list.subScriptElementWrapperItem(wrapped); });
152
153 return asList;
154 }
155
156 void append(const ScriptElementVariant &statement) { m_list.push_back(statement); }
157 void append(const ScriptList &list) { m_list.append(list.m_list); }
158 void reverse() { std::reverse(m_list.begin(), m_list.end()); }
159 void replaceKindForGenericChildren(DomType oldType, DomType newType);
160 const QList<ScriptElementVariant> &qList() { return std::as_const(m_list); };
161
162private:
163 QList<ScriptElementVariant> m_list;
164};
165
166class GenericScriptElement : public ScriptElementBase<DomType::ScriptGenericElement>
167{
168public:
169 using BaseT::BaseT;
170 using VariantT = std::variant<ScriptElementVariant, ScriptList>;
171
172 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override;
173 void updatePathFromOwner(const Path &p) override;
174 void createFileLocations(const FileLocations::Tree &base) override;
175
176 DomType kind() const override { return m_kind; }
177 void setKind(DomType kind) { m_kind = kind; }
178
180 {
181 return m_children.insert(std::make_pair(name, v));
182 }
183
184private:
191 std::map<QQmlJS::Dom::FieldType, VariantT> m_children;
192 DomType m_kind = DomType::Empty;
193};
194
195class BlockStatement : public ScriptElementBase<DomType::ScriptBlockStatement>
196{
197public:
198 using BaseT::BaseT;
199
200 // minimal required overload for this to be wrapped as DomItem:
201 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override;
202 void updatePathFromOwner(const Path &p) override;
203 void createFileLocations(const FileLocations::Tree &base) override;
204
205 ScriptList statements() const { return m_statements; }
206 void setStatements(const ScriptList &statements) { m_statements = statements; }
207
208private:
209 ScriptList m_statements;
210};
211
212class IdentifierExpression : public ScriptElementBase<DomType::ScriptIdentifierExpression>
213{
214public:
215 using BaseT::BaseT;
216 void setName(QStringView name) { m_name = name.toString(); }
217 QString name() { return m_name; }
218
219 // minimal required overload for this to be wrapped as DomItem:
220 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override;
221
222 QCborValue value() const override { return QCborValue(m_name); }
223
224private:
225 QString m_name;
226};
227
228class Literal : public ScriptElementBase<DomType::ScriptLiteral>
229{
230public:
231 using BaseT::BaseT;
232
233 using VariantT = std::variant<QString, double, bool, std::nullptr_t>;
234
235 void setLiteralValue(VariantT value) { m_value = value; }
236 VariantT literalValue() const { return m_value; }
237
238 // minimal required overload for this to be wrapped as DomItem:
239 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override;
240
241 QCborValue value() const override
242 {
243 return std::visit([](auto &&e) -> QCborValue { return e; }, m_value);
244 }
245
246private:
247 VariantT m_value;
248};
249
250// TODO: test this method + implement foreach etc
251class ForStatement : public ScriptElementBase<DomType::ScriptForStatement>
252{
253public:
254 using BaseT::BaseT;
255
256 // minimal required overload for this to be wrapped as DomItem:
257 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override;
258 void updatePathFromOwner(const Path &p) override;
259 void createFileLocations(const FileLocations::Tree &base) override;
260
261 ScriptElementVariant initializer() const { return m_initializer; }
262 void setInitializer(const ScriptElementVariant &newInitializer)
263 {
264 m_initializer = newInitializer;
265 }
266
267 ScriptElementVariant declarations() const { return m_declarations; }
268 void setDeclarations(const ScriptElementVariant &newDeclaration)
269 {
270 m_declarations = newDeclaration;
271 }
272 ScriptElementVariant condition() const { return m_condition; }
273 void setCondition(const ScriptElementVariant &newCondition) { m_condition = newCondition; }
274 ScriptElementVariant expression() const { return m_expression; }
275 void setExpression(const ScriptElementVariant &newExpression) { m_expression = newExpression; }
276 ScriptElementVariant body() const { return m_body; }
277 void setBody(const ScriptElementVariant &newBody) { m_body = newBody; }
278
279private:
280 ScriptElementVariant m_initializer;
281 ScriptElementVariant m_declarations;
282 ScriptElementVariant m_condition;
283 ScriptElementVariant m_expression;
285};
286
287class IfStatement : public ScriptElementBase<DomType::ScriptIfStatement>
288{
289public:
290 using BaseT::BaseT;
291
292 // minimal required overload for this to be wrapped as DomItem:
293 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override;
294 void updatePathFromOwner(const Path &p) override;
295 void createFileLocations(const FileLocations::Tree &base) override;
296
297 ScriptElementVariant condition() const { return m_condition; }
298 void setCondition(const ScriptElementVariant &condition) { m_condition = condition; }
299 ScriptElementVariant consequence() { return m_consequence; }
301 ScriptElementVariant alternative() { return m_alternative; }
303
304private:
305 ScriptElementVariant m_condition;
306 ScriptElementVariant m_consequence;
307 ScriptElementVariant m_alternative;
308};
309
310class ReturnStatement : public ScriptElementBase<DomType::ScriptReturnStatement>
311{
312public:
313 using BaseT::BaseT;
314
315 // minimal required overload for this to be wrapped as DomItem:
316 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override;
317 void updatePathFromOwner(const Path &p) override;
318 void createFileLocations(const FileLocations::Tree &base) override;
319
320 ScriptElementVariant expression() const { return m_expression; }
322
323private:
324 ScriptElementVariant m_expression;
325};
326
327class BinaryExpression : public ScriptElementBase<DomType::ScriptBinaryExpression>
328{
329public:
330 using BaseT::BaseT;
331
332 enum Operator : char {
335 TO_BE_IMPLEMENTED = std::numeric_limits<char>::max(), // not required by qmlls
336 };
337
338 // minimal required overload for this to be wrapped as DomItem:
339 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override;
340 void updatePathFromOwner(const Path &p) override;
341 void createFileLocations(const FileLocations::Tree &base) override;
342
343 ScriptElementVariant left() const { return m_left; }
344 void setLeft(const ScriptElementVariant &newLeft) { m_left = newLeft; }
345 ScriptElementVariant right() const { return m_right; }
346 void setRight(const ScriptElementVariant &newRight) { m_right = newRight; }
347 int op() const { return m_operator; }
348 void setOp(Operator op) { m_operator = op; }
349
350private:
352 ScriptElementVariant m_right;
353 Operator m_operator = TO_BE_IMPLEMENTED;
354};
355
356class VariableDeclarationEntry : public ScriptElementBase<DomType::ScriptVariableDeclarationEntry>
357{
358public:
359 using BaseT::BaseT;
360
361 enum ScopeType { Var, Let, Const };
362
363 ScopeType scopeType() const { return m_scopeType; }
364 void setScopeType(ScopeType scopeType) { m_scopeType = scopeType; }
365
366 ScriptElementVariant identifier() const { return m_identifier; }
368
369 ScriptElementVariant initializer() const { return m_initializer; }
371
372 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override;
373 void updatePathFromOwner(const Path &p) override;
374 void createFileLocations(const FileLocations::Tree &base) override;
375
376private:
377 ScopeType m_scopeType;
378 ScriptElementVariant m_identifier;
379 ScriptElementVariant m_initializer;
380};
381
382class VariableDeclaration : public ScriptElementBase<DomType::ScriptVariableDeclaration>
383{
384public:
385 using BaseT::BaseT;
386
387 // minimal required overload for this to be wrapped as DomItem:
388 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override;
389 void updatePathFromOwner(const Path &p) override;
390 void createFileLocations(const FileLocations::Tree &base) override;
391
392 void setDeclarations(const ScriptList &list) { m_declarations = list; }
393 ScriptList declarations() { return m_declarations; }
394
395private:
396 ScriptList m_declarations;
397};
398
399} // namespace ScriptElements
400} // end namespace Dom
401} // end namespace QQmlJS
402
404
405#endif // QQMLDOMSCRIPTELEMENTS_P_H
\inmodule QtCore\reentrant
Definition qcborvalue.h:47
static void addRegion(const Tree &fLoc, FileLocationRegion region, SourceLocation loc)
std::shared_ptr< AttachedInfoT< FileLocations > > Tree
static Tree ensure(const Tree &base, const Path &basePath, AttachedInfo::PathType pType=AttachedInfo::PathType::Relative)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
Use this to contain any script element.
void setLeft(const ScriptElementVariant &newLeft)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
void createFileLocations(const FileLocations::Tree &base) override
void setRight(const ScriptElementVariant &newRight)
void createFileLocations(const FileLocations::Tree &base) override
void setStatements(const ScriptList &statements)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
void setInitializer(const ScriptElementVariant &newInitializer)
void setExpression(const ScriptElementVariant &newExpression)
void setCondition(const ScriptElementVariant &newCondition)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
void createFileLocations(const FileLocations::Tree &base) override
void setDeclarations(const ScriptElementVariant &newDeclaration)
void setBody(const ScriptElementVariant &newBody)
void createFileLocations(const FileLocations::Tree &base) override
std::variant< ScriptElementVariant, ScriptList > VariantT
decltype(auto) insertChild(QStringView name, VariantT v)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
void setCondition(const ScriptElementVariant &condition)
void setConsequence(const ScriptElementVariant &consequence)
void setAlternative(const ScriptElementVariant &alternative)
void createFileLocations(const FileLocations::Tree &base) override
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
std::variant< QString, double, bool, std::nullptr_t > VariantT
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
void createFileLocations(const FileLocations::Tree &base) override
void setExpression(ScriptElementVariant expression)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
void setMainRegionLocation(const QQmlJS::SourceLocation &location)
void createFileLocations(const FileLocations::Tree &base) override
ScriptElementBase(QQmlJS::SourceLocation combinedLocation=QQmlJS::SourceLocation{})
void addLocation(FileLocationRegion region, QQmlJS::SourceLocation location)
QQmlJS::SourceLocation mainRegionLocation() const
All of the following overloads are only required for optimization purposes.
std::vector< std::pair< FileLocationRegion, QQmlJS::SourceLocation > > m_locations
ScriptElementBase(QQmlJS::SourceLocation first, QQmlJS::SourceLocation last)
void createFileLocations(const FileLocations::Tree &base) override
void replaceKindForGenericChildren(DomType oldType, DomType newType)
void append(const ScriptElementVariant &statement)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
const QList< ScriptElementVariant > & qList()
void createFileLocations(const FileLocations::Tree &base) override
void setIdentifier(const ScriptElementVariant &identifier)
void setInitializer(const ScriptElementVariant &initializer)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
void createFileLocations(const FileLocations::Tree &base) override
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
\inmodule QtCore
Definition qstringview.h:78
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
Combined button and popup list for selecting options.
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
GLint location
GLsizei const GLfloat * v
[13]
GLenum condition
GLenum type
GLuint name
GLint first
GLuint res
GLsizei const GLchar *const * path
GLfloat GLfloat p
[1]
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
#define Q_ASSERT_X(cond, x, msg)
Definition qrandom.cpp:48
static const uint base
Definition qurlidna.cpp:20
QList< int > list
[14]
QCborValue(QCborTag(2), QByteArray("\x01\0\0\0\0\0\0\0\0", 9))
[0]
A common base class for all the script elements.