aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/qml/qmllint/lintplugin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/qml/qmllint/lintplugin.cpp')
-rw-r--r--tests/auto/qml/qmllint/lintplugin.cpp131
1 files changed, 131 insertions, 0 deletions
diff --git a/tests/auto/qml/qmllint/lintplugin.cpp b/tests/auto/qml/qmllint/lintplugin.cpp
new file mode 100644
index 0000000000..65795c103c
--- /dev/null
+++ b/tests/auto/qml/qmllint/lintplugin.cpp
@@ -0,0 +1,131 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include "lintplugin.h"
+
+using namespace Qt::StringLiterals;
+
+static constexpr QQmlSA::LoggerWarningId plugin{ "testPlugin.test" };
+
+class ElementTest : public QQmlSA::ElementPass
+{
+public:
+ ElementTest(QQmlSA::PassManager *manager) : QQmlSA::ElementPass(manager)
+ {
+ m_rectangle = resolveType(u"QtQuick", u"Rectangle");
+ }
+
+ bool shouldRun(const QQmlSA::Element &element) override
+ {
+ return element.baseType() == m_rectangle;
+ }
+
+ void run(const QQmlSA::Element &element) override
+ {
+ auto property = element.property(u"radius"_s);
+ if (!property.isValid() || element.property(u"radius"_s).typeName() != u"qreal") {
+ emitWarning(u"Failed to verify radius property", plugin, element.sourceLocation());
+ return;
+ }
+
+ auto bindings = element.propertyBindings(u"radius"_s);
+ if (bindings.isEmpty() || bindings.constFirst().numberValue() != 5) {
+ emitWarning(u"Failed to verify radius property binding", plugin,
+ element.sourceLocation());
+ return;
+ }
+
+ emitWarning(u"ElementTest OK", plugin, element.sourceLocation());
+ }
+
+private:
+ QQmlSA::Element m_rectangle;
+};
+
+class PropertyTest : public QQmlSA::PropertyPass
+{
+public:
+ PropertyTest(QQmlSA::PassManager *manager) : QQmlSA::PropertyPass(manager) { }
+
+ void onBinding(const QQmlSA::Element &element, const QString &propertyName,
+ const QQmlSA::Binding &binding, const QQmlSA::Element &bindingScope,
+ const QQmlSA::Element &value) override
+ {
+ emitWarning(u"Saw binding on %1 property %2 with value %3 (and type %4) in scope %5"_s
+ .arg(element.baseTypeName(), propertyName,
+ value.isNull()
+ ? u"NULL"_s
+ : (value.name().isNull() ? value.baseTypeName()
+ : value.name()))
+ .arg(qToUnderlying(binding.bindingType()))
+ .arg(bindingScope.baseTypeName()),
+ plugin, bindingScope.sourceLocation());
+ }
+
+ void onRead(const QQmlSA::Element &element, const QString &propertyName,
+ const QQmlSA::Element &readScope, QQmlSA::SourceLocation location) override
+ {
+ emitWarning(u"Saw read on %1 property %2 in scope %3"_s.arg(
+ element.baseTypeName(), propertyName, readScope.baseTypeName()),
+ plugin, location);
+ }
+
+ void onWrite(const QQmlSA::Element &element, const QString &propertyName,
+ const QQmlSA::Element &value, const QQmlSA::Element &writeScope,
+ QQmlSA::SourceLocation location) override
+ {
+ emitWarning(u"Saw write on %1 property %2 with value %3 in scope %4"_s.arg(
+ element.baseTypeName(), propertyName,
+ (value.name().isNull() ? value.baseTypeName()
+ : value.name()),
+ writeScope.baseTypeName()),
+ plugin, location);
+ }
+};
+
+class HasImportedModuleTest : public QQmlSA::ElementPass
+{
+public:
+ HasImportedModuleTest(QQmlSA::PassManager *manager, QString message)
+ : QQmlSA::ElementPass(manager), m_message(message)
+ {
+ }
+
+ bool shouldRun(const QQmlSA::Element &element) override
+ {
+ Q_UNUSED(element)
+ return true;
+ }
+
+ void run(const QQmlSA::Element &element) override
+ {
+ Q_UNUSED(element)
+ emitWarning(m_message, plugin);
+ }
+
+private:
+ QString m_message;
+};
+
+void LintPlugin::registerPasses(QQmlSA::PassManager *manager, const QQmlSA::Element &rootElement)
+{
+ if (!rootElement.filePath().endsWith(u"_pluginTest.qml"))
+ return;
+
+ manager->registerElementPass(std::make_unique<ElementTest>(manager));
+ manager->registerPropertyPass(std::make_unique<PropertyTest>(manager), "QtQuick", "Text",
+ "text");
+ manager->registerPropertyPass(std::make_unique<PropertyTest>(manager), "", "", "x");
+ manager->registerPropertyPass(std::make_unique<PropertyTest>(manager), "QtQuick", "ListView");
+ if (manager->hasImportedModule("QtQuick.Controls")) {
+ if (manager->hasImportedModule("QtQuick")) {
+ if (manager->hasImportedModule("QtQuick.Window")) {
+ manager->registerElementPass(std::make_unique<HasImportedModuleTest>(
+ manager, "QtQuick.Controls, QtQuick and QtQuick.Window present"));
+ }
+ } else {
+ manager->registerElementPass(std::make_unique<HasImportedModuleTest>(
+ manager, "QtQuick.Controls and NO QtQuick present"));
+ }
+ }
+}