10#include <qstringview.h>
14using namespace Qt::StringLiterals;
22 switch (c.category()) {
23 case QChar::Letter_Uppercase:
24 case QChar::Letter_Lowercase:
25 case QChar::Letter_Titlecase:
26 case QChar::Letter_Modifier:
27 case QChar::Letter_Other:
28 case QChar::Number_Letter:
41 switch (c.category()) {
42 case QChar::Letter_Uppercase:
43 case QChar::Letter_Lowercase:
44 case QChar::Letter_Titlecase:
45 case QChar::Letter_Modifier:
46 case QChar::Letter_Other:
47 case QChar::Number_Letter:
48 case QChar::Mark_NonSpacing:
49 case QChar::Mark_SpacingCombining:
50 case QChar::Number_DecimalDigit:
51 case QChar::Punctuation_Connector:
62 return c == u':' || c == u'|' || c == u' ' || isIdContinuation(c);
67 return !name.isEmpty() && isIdStart(name.at(0))
68 && std::all_of(name.cbegin() + 1, name.cend(), isIdContinuation);
73 return !name.isEmpty() && isIdStart(name.at(0))
74 && std::all_of(name.cbegin() + 1, name.cend(), isEnumIdContinuation);
79 return c == u':' || c == u'.' || isIdContinuation(c);
85 return c == u'<' || c == u'>' || c == u',' || c == u' ' || isClassNameContinuation(c);
90 const auto isValid = allowTemplates ? isTemplateClassNameContinuation
91 : isClassNameContinuation;
92 return !name.isEmpty() && isIdStart(name.at(0))
93 && std::all_of(name.cbegin() + 1, name.cend(), isValid);
100 return c == u'/' || c == u'\\' || c == u'.' || c == u'-' || c == u'+' || c == u':'
101 || c == u',' || c == u' ' || c == u'~' || isIdContinuation(c);
106 return !name.isEmpty() &&
std::all_of(name.cbegin(), name.cend(), isHeaderChar);
112 return c == u',' || c == u' ' || c == u'*' || c == u'&' || c == u'<' || c == u'>'
113 || c == u':' || isIdContinuation(c);
120 const qsizetype paren = name.indexOf(u'(');
121 if (paren <= 0 || !name.endsWith(u')') || !checkPropertyName(name.first(paren)))
123 const QStringView params = name.sliced(paren + 1, name.size() - paren - 2);
124 return std::all_of(params.cbegin(), params.cend(), isSignatureParameterChar);
129 return "Invalid property value: \""_L1 + name +
"\": \""_L1 + value + u'"';
134 return "Invalid property name: \""_L1 + name + u'"';
139 return "Invalid class name: \""_L1 + name + u'"';
144 return "Invalid pixmap function name: \""_L1 + name + u'"';
149 return "Invalid add page method name: \""_L1 + name + u'"';
154 return "Invalid header: \""_L1 + name + u'"';
159 return "Invalid connection: \""_L1 + connection->elementSender() +
"::"_L1
160 + connection->elementSignal() +
" -> "_L1 + connection->elementReceiver() +
"::"_L1
161 + connection->elementSlot() + u'"';
166 for (DomProperty *p : properties) {
167 const bool isDynamicProperty = p->hasAttributeStdset() && p->attributeStdset() == 0;
168 const QString &name = p->attributeName();
169 if (!isDynamicProperty && !checkPropertyName(name))
170 errors->append(msgInvalidPropertyName(name));
172 case DomProperty::Set:
173 p->setElementSet(p->elementSet().trimmed());
174 if (!checkEnumValue(p->elementSet()))
175 errors->append(msgInvalidValue(name, p->elementSet()));
177 case DomProperty::Enum:
178 p->setElementEnum(p->elementEnum().trimmed());
179 if (!checkEnumValue(p->elementEnum()))
180 errors->append(msgInvalidValue(name, p->elementEnum()));
196 if (!checkClassName(node->elementClass()))
197 m_errors.append(msgInvalidClassName(node->elementClass()));
199 if (node->hasElementPixmapFunction()) {
200 const QString &pixmapFunction = node->elementPixmapFunction();
202 if (!pixmapFunction.isEmpty() && !checkClassName(pixmapFunction))
203 m_errors.append(msgInvalidPixmapFunction(node->elementPixmapFunction()));
206 if (node->hasElementCustomWidgets())
208 if (node->hasElementIncludes())
210 if (node->hasElementConnections())
218 checkProperties(node->elementProperty(), &m_errors);
220 if (!checkClassName(node->attributeClass(),
true))
221 m_errors.append(msgInvalidClassName(node->attributeClass()));
237 checkProperties(node->elementProperty(), &m_errors);
246 checkProperties(node->elementProperty(), &m_errors);
255 checkProperties(node->elementProperty(), &m_errors);
262 if (customWidget->hasElementAddPageMethod()
263 && !checkPropertyName(customWidget->elementAddPageMethod())) {
264 m_errors.append(msgInvalidAddPageMethod(customWidget->elementAddPageMethod()));
266 if (customWidget->hasElementHeader()) {
267 const QString &header = customWidget->elementHeader()->text();
268 if (!checkHeader(header))
269 m_errors.append(msgInvalidHeader(header));
276 if (!checkHeader(incl->text()))
277 m_errors.append(msgInvalidHeader(incl->text()));
283 if (!checkConnectionSignature(connection->elementSignal())
284 || !checkConnectionSignature(connection->elementSlot())) {
285 m_errors.append(msgInvalidConnection(connection));
QString findOrInsertWidget(const DomWidget *ui_widget)
QString findOrInsertActionGroup(const DomActionGroup *ui_group)
QString findOrInsertLayoutItem(const DomLayoutItem *ui_layoutItem)
QString findOrInsertAction(const DomAction *ui_action)
QString findOrInsertLayout(const DomLayout *ui_layout)
Combined button and popup list for selecting options.
virtual void acceptAction(DomAction *action)
virtual void acceptActionGroup(DomActionGroup *actionGroup)
virtual void acceptConnection(DomConnection *connection)
virtual void acceptLayoutItem(DomLayoutItem *layoutItem)
virtual void acceptIncludes(DomIncludes *includes)
virtual void acceptInclude(DomInclude *incl)
virtual void acceptCustomWidgets(DomCustomWidgets *customWidgets)
virtual void acceptCustomWidget(DomCustomWidget *customWidget)
virtual void acceptWidget(DomWidget *widget)
virtual void acceptUI(DomUI *ui)
virtual void acceptConnections(DomConnections *connections)
virtual void acceptLayout(DomLayout *layout)
void acceptUI(DomUI *node) override
void acceptLayoutItem(DomLayoutItem *node) override
void acceptConnection(DomConnection *connection) override
void acceptCustomWidget(DomCustomWidget *customWidget) override
void acceptWidget(DomWidget *node) override
void acceptLayout(DomLayout *node) override
void acceptAction(DomAction *node) override
void acceptActionGroup(DomActionGroup *node) override
void acceptInclude(DomInclude *incl) override