Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qqmldomfieldfilter.cpp
Go to the documentation of this file.
1// Copyright (C) 2020 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
4#include "qqmldompath_p.h"
5#include "QtCore/qglobal.h"
6
8
9namespace QQmlJS {
10namespace Dom {
11
41{
42 QString fieldFilterStr;
43 {
44 auto it = m_fieldFilterRemove.begin();
45 while (it != m_fieldFilterRemove.end()) {
46 if (!fieldFilterStr.isEmpty())
47 fieldFilterStr.append(u",");
48 fieldFilterStr.append(QLatin1String("-%1:%2").arg(it.key(), it.value()));
49 ++it;
50 }
51 }
52 {
53 auto it = m_fieldFilterAdd.begin();
54 while (it != m_fieldFilterAdd.end()) {
55 if (!fieldFilterStr.isEmpty())
56 fieldFilterStr.append(u",");
57 fieldFilterStr.append(QLatin1String("+%1:%2").arg(it.key(), it.value()));
58 ++it;
59 }
60 }
61 return fieldFilterStr;
62}
63
65{
66 if (p)
67 return this->operator()(obj, p.component(0), i);
68 else
69 return this->operator()(obj, PathEls::Empty(), i);
70}
71
73{
74 DomType baseK = base.internalKind();
75 if (c.kind() == Path::Kind::Field) {
76 DomType objK = obj.internalKind();
77 if (!m_filtredTypes.contains(baseK) && !m_filtredTypes.contains(objK)
78 && !m_filtredFields.contains(qHash(c.stringView())))
79 return m_filtredDefault;
81 QList<QString> tVals = m_fieldFilterRemove.values(typeStr);
82 QString name = c.name();
83 if (tVals.contains(name))
84 return false;
85 if (tVals.contains(QString())
86 || m_fieldFilterRemove.values(domTypeToString(objK)).contains(QString())
87 || m_fieldFilterRemove.values(QString()).contains(name)) {
88 return m_fieldFilterAdd.values(typeStr).contains(name);
89 }
90 } else if (m_filtredTypes.contains(baseK)) {
92 QList<QString> tVals = m_fieldFilterRemove.values(typeStr);
93 return !tVals.contains(QString());
94 }
95 return true;
96}
97
99{
100 // parses a base filter of the form <op><typeName>:<fieldName> or <op><fieldName>
101 // as described in this class documentation
103 uR"((?<op>[-+])?(?:(?<type>[a-zA-Z0-9_]*):)?(?<field>[a-zA-Z0-9_]*))")));
104 for (const QString &fField : fFields.split(QLatin1Char(','))) {
105 QRegularExpressionMatch m = fieldRe.matchView(fField);
106 if (m.hasMatch()) {
107 if (m.capturedView(u"op") == u"+") {
108 m_fieldFilterRemove.remove(m.captured(u"type"), m.captured(u"field"));
109 m_fieldFilterAdd.insert(m.captured(u"type"), m.captured(u"field"));
110 } else {
111 m_fieldFilterRemove.insert(m.captured(u"type"), m.captured(u"field"));
112 m_fieldFilterAdd.remove(m.captured(u"type"), m.captured(u"field"));
113 }
114 } else {
115 qCWarning(domLog) << "could not extract filter from" << fField;
116 return false;
117 }
118 }
119 return true;
120}
121
123{
125 QLatin1String("code") } };
127 { QString(), QString::fromUtf16(Fields::code) },
128 { QString(), QString::fromUtf16(Fields::postCode) },
129 { QString(), QString::fromUtf16(Fields::preCode) },
130 { QString(), QString::fromUtf16(Fields::importScope) },
131 { QString(), QString::fromUtf16(Fields::fileLocationsTree) },
132 { QString(), QString::fromUtf16(Fields::astComments) },
133 { QString(), QString::fromUtf16(Fields::comments) },
134 { QString(), QString::fromUtf16(Fields::exports) },
135 { QString(), QString::fromUtf16(Fields::propertyInfos) },
136 { QLatin1String("AttachedInfo"), QString::fromUtf16(Fields::parent) }
137 };
139}
140
142{
143 QMultiMap<QString, QString> fieldFilterAdd {};
144 QMultiMap<QString, QString> fieldFilterRemove {
145 { QString(), QLatin1String("code") },
146 { QString(), QLatin1String("propertyInfos") },
147 { QString(), QLatin1String("fileLocationsTree") },
148 { QString(), QLatin1String("location") },
149 { QLatin1String("ScriptExpression"), QLatin1String("localOffset") },
150 { QLatin1String("ScriptExpression"), QLatin1String("preCode") },
151 { QLatin1String("ScriptExpression"), QLatin1String("postCode") },
152 { QLatin1String("AttachedInfo"), QLatin1String("parent") },
153 { QLatin1String("Reference"), QLatin1String("get") },
154 { QLatin1String("QmlComponent"), QLatin1String("ids") },
155 { QLatin1String("QmlObject"), QLatin1String("prototypes") }
156 };
157 return FieldFilter { fieldFilterAdd, fieldFilterRemove };
158}
159
161{
164 { QString(), QLatin1String("propertyInfos") },
165 { QLatin1String("ScriptExpression"), QLatin1String("localOffset") },
166 { QLatin1String("FileLocations"), QLatin1String("regions") },
167 { QLatin1String("AttachedInfo"), QLatin1String("parent") },
168 { QLatin1String("QmlComponent"), QLatin1String("ids") },
169 { QLatin1String("QmlObject"), QLatin1String("prototypes") },
170 { QLatin1String("Reference"), QLatin1String("get") }
171 };
173}
174
176{
179 { QString(), QLatin1String("propertyInfos") },
180 { QLatin1String("FileLocations"), QLatin1String("regions") },
181 { QLatin1String("Reference"), QLatin1String("get") },
182 { QLatin1String("QmlComponent"), QLatin1String("ids") },
183 { QLatin1String("QmlObject"), QLatin1String("prototypes") },
184 { QLatin1String(), QLatin1String("code") },
185 { QLatin1String("ScriptExpression"), QLatin1String("localOffset") },
186 { QLatin1String("AttachedInfo"), QLatin1String("parent") },
187 { QString(), QLatin1String("fileLocationsTree") },
188 { QString(), QLatin1String("preCode") },
189 { QString(), QLatin1String("postCode") },
190 { QString(), QLatin1String("comments") },
191 { QString(), QLatin1String("preCommentLocations") },
192 { QString(), QLatin1String("postCommentLocations") },
193 { QString(), QLatin1String("astComments") },
194 { QString(), QLatin1String("location") }
195 };
197}
198
200{
201 auto types = domTypeToStringMap();
202 QSet<QString> filtredFieldStrs;
203 QSet<QString> filtredTypeStrs;
204 static QHash<QString, DomType> fieldToId = []() {
206 auto reverseMap = domTypeToStringMap();
207 auto it = reverseMap.cbegin();
208 auto end = reverseMap.cend();
209 while (it != end) {
210 res[it.value()] = it.key();
211 ++it;
212 }
213 return res;
214 }();
215 auto addFilteredOfMap = [&](const QMultiMap<QString, QString> &map) {
216 auto it = map.cbegin();
217 auto end = map.cend();
218 while (it != end) {
219 filtredTypeStrs.insert(it.key());
220 ++it;
221 }
222 for (auto f : map.values(QString()))
223 filtredFieldStrs.insert(f);
224 };
225 addFilteredOfMap(m_fieldFilterAdd);
226 addFilteredOfMap(m_fieldFilterRemove);
227 m_filtredDefault = true;
228 if (m_fieldFilterRemove.values(QString()).contains(QString()))
229 m_filtredDefault = false;
230 m_filtredFields.clear();
231 for (auto s : filtredFieldStrs)
232 if (!s.isEmpty())
233 m_filtredFields.insert(qHash(QStringView(s)));
234 m_filtredTypes.clear();
235 for (auto s : filtredTypeStrs) {
236 if (s.isEmpty())
237 continue;
238 if (fieldToId.contains(s)) {
239 m_filtredTypes.insert(fieldToId.value(s));
240 } else {
241 qCWarning(domLog) << "Filter on unknown type " << s << " will be ignored";
242 }
243 }
244}
245
246} // end namespace Dom
247} // end namespace QQmlJS
248
250
251#include "moc_qqmldomfieldfilter_p.cpp"
\inmodule QtCore
Definition qhash.h:818
bool contains(const Key &key) const noexcept
Returns true if the hash contains an item with the key; otherwise returns false.
Definition qhash.h:991
T value(const Key &key) const noexcept
Definition qhash.h:1044
Definition qlist.h:74
const_iterator cend() const
Definition qmap.h:604
const_iterator cbegin() const
Definition qmap.h:600
iterator end()
Definition qmap.h:1300
iterator insert(const Key &key, const T &value)
Definition qmap.h:1425
size_type remove(const Key &key)
Definition qmap.h:944
iterator begin()
Definition qmap.h:1296
QList< T > values() const
Definition qmap.h:1078
DomItem component(GoTo option=GoTo::Strict)
const QMultiMap< QString, QString > & fieldFilterAdd() const
static FieldFilter defaultFilter()
static FieldFilter noLocationFilter()
static FieldFilter compareFilter()
bool operator()(DomItem &, Path, DomItem &) const
static FieldFilter compareNoCommentsFilter()
QMultiMap< QString, QString > fieldFilterRemove() const
Class that represent a filter on DomItem, when dumping or comparing.
\inmodule QtCore \reentrant
\inmodule QtCore \reentrant
QRegularExpressionMatch matchView(QStringView subjectView, qsizetype offset=0, MatchType matchType=NormalMatch, MatchOptions matchOptions=NoMatchOption) const
static QString anchoredPattern(const QString &expression)
Definition qset.h:18
void clear()
Definition qset.h:61
bool contains(const T &value) const
Definition qset.h:71
const_iterator cbegin() const noexcept
Definition qset.h:138
iterator insert(const T &value)
Definition qset.h:155
\inmodule QtCore
Definition qstringview.h:76
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
QStringList split(const QString &sep, Qt::SplitBehavior behavior=Qt::KeepEmptyParts, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Splits the string into substrings wherever sep occurs, and returns the list of those strings.
Definition qstring.cpp:7956
static QString fromUtf16(const char16_t *, qsizetype size=-1)
Definition qstring.cpp:5883
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:1083
QString & append(QChar c)
Definition qstring.cpp:3227
QMap< QString, QString > map
[6]
cache insert(employee->id(), employee)
QSet< QString >::iterator it
QMLDOM_EXPORT QString domTypeToString(DomType k)
QMLDOM_EXPORT QMap< DomType, QString > domTypeToStringMap()
size_t qHash(const Path &, size_t)
Combined button and popup list for selecting options.
#define qCWarning(category,...)
static bool contains(const QJsonArray &haystack, unsigned needle)
Definition qopengl.cpp:116
GLenum GLsizei GLsizei GLint * values
[15]
const GLfloat * m
GLuint GLuint end
GLsizei GLenum GLenum * types
GLfloat GLfloat f
GLuint name
GLhandleARB obj
[2]
GLuint res
const GLubyte * c
GLdouble s
[6]
Definition qopenglext.h:235
GLfloat GLfloat p
[1]
static QLatin1StringView typeStr(QShaderDescription::VariableType t)
SSL_CTX int(*) void arg)
QLatin1StringView QLatin1String
Definition qstringfwd.h:31
#define QStringLiteral(str)
if(qFloatDistance(a, b)<(1<< 7))
[0]
\inmodule QtCore \reentrant
Definition qchar.h:17
bool contains(const AT &t) const noexcept
Definition qlist.h:44