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
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
3
5#include "qqmldompath_p.h"
6#include "qqmldomitem_p.h"
7#include "QtCore/qglobal.h"
8
10
11namespace QQmlJS {
12namespace Dom {
13
43{
44 QString fieldFilterStr;
45 {
46 auto it = m_fieldFilterRemove.begin();
47 while (it != m_fieldFilterRemove.end()) {
48 if (!fieldFilterStr.isEmpty())
49 fieldFilterStr.append(u",");
50 fieldFilterStr.append(QLatin1String("-%1:%2").arg(it.key(), it.value()));
51 ++it;
52 }
53 }
54 {
55 auto it = m_fieldFilterAdd.begin();
56 while (it != m_fieldFilterAdd.end()) {
57 if (!fieldFilterStr.isEmpty())
58 fieldFilterStr.append(u",");
59 fieldFilterStr.append(QLatin1String("+%1:%2").arg(it.key(), it.value()));
60 ++it;
61 }
62 }
63 return fieldFilterStr;
64}
65
66bool FieldFilter::operator()(const DomItem &obj, const Path &p, const DomItem &i) const
67{
68 if (p)
69 return this->operator()(obj, p.component(0), i);
70 else
71 return this->operator()(obj, PathEls::Empty(), i);
72}
73
75{
76 DomType baseK = base.internalKind();
77 if (c.kind() == Path::Kind::Field) {
78 DomType objK = obj.internalKind();
79 if (!m_filtredTypes.contains(baseK) && !m_filtredTypes.contains(objK)
80 && !m_filtredFields.contains(qHash(c.stringView())))
81 return m_filtredDefault;
83 QList<QString> tVals = m_fieldFilterRemove.values(typeStr);
84 QString name = c.name();
85 if (tVals.contains(name))
86 return false;
87 if (tVals.contains(QString())
88 || m_fieldFilterRemove.values(domTypeToString(objK)).contains(QString())
89 || m_fieldFilterRemove.values(QString()).contains(name)) {
90 return m_fieldFilterAdd.values(typeStr).contains(name);
91 }
92 } else if (m_filtredTypes.contains(baseK)) {
94 QList<QString> tVals = m_fieldFilterRemove.values(typeStr);
95 return !tVals.contains(QString());
96 }
97 return true;
98}
99
100bool FieldFilter::addFilter(const QString &fFields)
101{
102 // parses a base filter of the form <op><typeName>:<fieldName> or <op><fieldName>
103 // as described in this class documentation
105 uR"((?<op>[-+])?(?:(?<type>[a-zA-Z0-9_]*):)?(?<field>[a-zA-Z0-9_]*))")));
106 for (const QString &fField : fFields.split(QLatin1Char(','))) {
107 QRegularExpressionMatch m = fieldRe.matchView(fField);
108 if (m.hasMatch()) {
109 if (m.capturedView(u"op") == u"+") {
110 m_fieldFilterRemove.remove(m.captured(u"type"), m.captured(u"field"));
111 m_fieldFilterAdd.insert(m.captured(u"type"), m.captured(u"field"));
112 } else {
113 m_fieldFilterRemove.insert(m.captured(u"type"), m.captured(u"field"));
114 m_fieldFilterAdd.remove(m.captured(u"type"), m.captured(u"field"));
115 }
116 } else {
117 qCWarning(domLog) << "could not extract filter from" << fField;
118 return false;
119 }
120 }
121 return true;
122}
123
125{
126 return FieldFilter{ {}, {} };
127}
128
130{
131 QMultiMap<QString, QString> fieldFilterAdd { { QLatin1String("ScriptExpression"),
132 QLatin1String("code") } };
133 QMultiMap<QString, QString> fieldFilterRemove {
134 { QString(), QString::fromUtf16(Fields::code) },
135 { QString(), QString::fromUtf16(Fields::postCode) },
136 { QString(), QString::fromUtf16(Fields::preCode) },
137 { QString(), QString::fromUtf16(Fields::importScope) },
138 { QString(), QString::fromUtf16(Fields::fileLocationsTree) },
139 { QString(), QString::fromUtf16(Fields::astComments) },
140 { QString(), QString::fromUtf16(Fields::comments) },
141 { QString(), QString::fromUtf16(Fields::exports) },
142 { QString(), QString::fromUtf16(Fields::propertyInfos) },
143 { QLatin1String("AttachedInfo"), QString::fromUtf16(Fields::parent) }
144 };
146}
147
149{
150 QMultiMap<QString, QString> fieldFilterAdd {};
151 QMultiMap<QString, QString> fieldFilterRemove {
152 { QString(), QLatin1String("code") },
153 { QString(), QLatin1String("propertyInfos") },
154 { QString(), QLatin1String("fileLocationsTree") },
155 { QString(), QLatin1String("location") },
156 { QLatin1String("ScriptExpression"), QLatin1String("localOffset") },
157 { QLatin1String("ScriptExpression"), QLatin1String("preCode") },
158 { QLatin1String("ScriptExpression"), QLatin1String("postCode") },
159 { QLatin1String("AttachedInfo"), QLatin1String("parent") },
160 { QLatin1String("Reference"), QLatin1String("get") },
161 { QLatin1String("QmlComponent"), QLatin1String("ids") },
162 { QLatin1String("QmlObject"), QLatin1String("prototypes") }
163 };
164 return FieldFilter { fieldFilterAdd, fieldFilterRemove };
165}
166
168{
169 QMultiMap<QString, QString> fieldFilterAdd {};
170 QMultiMap<QString, QString> fieldFilterRemove {
171 { QString(), QLatin1String("propertyInfos") },
172 { QLatin1String("ScriptExpression"), QLatin1String("localOffset") },
173 { QLatin1String("FileLocations"), QLatin1String("regions") },
174 { QLatin1String("AttachedInfo"), QLatin1String("parent") },
175 { QLatin1String("QmlComponent"), QLatin1String("ids") },
176 { QLatin1String("QmlObject"), QLatin1String("prototypes") },
177 { QLatin1String("Reference"), QLatin1String("get") }
178 };
180}
181
183{
184 QMultiMap<QString, QString> fieldFilterAdd {};
185 QMultiMap<QString, QString> fieldFilterRemove {
186 { QString(), QLatin1String("propertyInfos") },
187 { QLatin1String("FileLocations"), QLatin1String("regions") },
188 { QLatin1String("Reference"), QLatin1String("get") },
189 { QLatin1String("QmlComponent"), QLatin1String("ids") },
190 { QLatin1String("QmlObject"), QLatin1String("prototypes") },
191 { QLatin1String(), QLatin1String("code") },
192 { QLatin1String("ScriptExpression"), QLatin1String("localOffset") },
193 { QLatin1String("AttachedInfo"), QLatin1String("parent") },
194 { QString(), QLatin1String("fileLocationsTree") },
195 { QString(), QLatin1String("preCode") },
196 { QString(), QLatin1String("postCode") },
197 { QString(), QLatin1String("comments") },
198 { QString(), QLatin1String("preCommentLocations") },
199 { QString(), QLatin1String("postCommentLocations") },
200 { QString(), QLatin1String("astComments") },
201 { QString(), QLatin1String("location") }
202 };
204}
205
207{
208 auto types = domTypeToStringMap();
209 QSet<QString> filtredFieldStrs;
210 QSet<QString> filtredTypeStrs;
211 static QHash<QString, DomType> fieldToId = []() {
212 QHash<QString, DomType> res;
213 auto reverseMap = domTypeToStringMap();
214 auto it = reverseMap.cbegin();
215 auto end = reverseMap.cend();
216 while (it != end) {
217 res[it.value()] = it.key();
218 ++it;
219 }
220 return res;
221 }();
222 auto addFilteredOfMap = [&](const QMultiMap<QString, QString> &map) {
223 auto it = map.cbegin();
224 auto end = map.cend();
225 while (it != end) {
226 filtredTypeStrs.insert(it.key());
227 ++it;
228 }
229 for (auto f : map.values(QString()))
230 filtredFieldStrs.insert(f);
231 };
232 addFilteredOfMap(m_fieldFilterAdd);
233 addFilteredOfMap(m_fieldFilterRemove);
234 m_filtredDefault = true;
235 if (m_fieldFilterRemove.values(QString()).contains(QString()))
236 m_filtredDefault = false;
237 m_filtredFields.clear();
238 for (auto s : filtredFieldStrs)
239 if (!s.isEmpty())
240 m_filtredFields.insert(qHash(QStringView(s)));
241 m_filtredTypes.clear();
242 for (auto s : filtredTypeStrs) {
243 if (s.isEmpty())
244 continue;
245 if (fieldToId.contains(s)) {
246 m_filtredTypes.insert(fieldToId.value(s));
247 } else {
248 qCWarning(domLog) << "Filter on unknown type " << s << " will be ignored";
249 }
250 }
251}
252
253} // end namespace Dom
254} // end namespace QQmlJS
255
257
258#include "moc_qqmldomfieldfilter_p.cpp"
const_iterator cend() const
Definition qmap.h:605
const_iterator cbegin() const
Definition qmap.h:601
iterator end()
Definition qmap.h:1327
iterator insert(const Key &key, const T &value)
Definition qmap.h:1452
size_type remove(const Key &key)
Definition qmap.h:971
iterator begin()
Definition qmap.h:1323
QList< T > values() const
Definition qmap.h:1105
DomItem component(GoTo option=GoTo::Strict) const
const QMultiMap< QString, QString > & fieldFilterAdd() const
bool operator()(const DomItem &, const Path &, const DomItem &) const
bool addFilter(const QString &f)
static FieldFilter defaultFilter()
static FieldFilter noLocationFilter()
static FieldFilter compareFilter()
static FieldFilter noFilter()
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
static QString anchoredPattern(const QString &expression)
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:78
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
static QString fromUtf16(const char16_t *, qsizetype size=-1)
Definition qstring.cpp:6045
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]
GLdouble s
[6]
Definition qopenglext.h:235
GLuint res
const GLubyte * c
GLfloat GLfloat p
[1]
static QLatin1StringView typeStr(QShaderDescription::VariableType t)
SSL_CTX int void * arg
QLatin1StringView QLatin1String
Definition qstringfwd.h:31
#define QStringLiteral(str)
static const uint base
Definition qurlidna.cpp:20
if(qFloatDistance(a, b)<(1<< 7))
[0]
\inmodule QtCore \reentrant
Definition qchar.h:18
bool contains(const AT &t) const noexcept
Definition qlist.h:45