diff options
Diffstat (limited to 'src/plugins/qmllint/quick/quicklintplugin.h')
-rw-r--r-- | src/plugins/qmllint/quick/quicklintplugin.h | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/src/plugins/qmllint/quick/quicklintplugin.h b/src/plugins/qmllint/quick/quicklintplugin.h new file mode 100644 index 0000000000..bdec509976 --- /dev/null +++ b/src/plugins/qmllint/quick/quicklintplugin.h @@ -0,0 +1,185 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#ifndef QUICKLINTPLUGIN_H +#define QUICKLINTPLUGIN_H + +#include <QtCore/qplugin.h> +#include <QtCore/qlist.h> +#include <QtCore/qvarlengtharray.h> +#include <QtCore/qhash.h> + +#include <QtQmlCompiler/qqmlsa.h> +#include "qqmlsaconstants.h" + +QT_BEGIN_NAMESPACE + +struct TypeDescription +{ + QString module; + QString name; +}; + +class QmlLintQuickPlugin : public QObject, public QQmlSA::LintPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID QmlLintPluginInterface_iid FILE "plugin.json") + Q_INTERFACES(QQmlSA::LintPlugin) + +public: + void registerPasses(QQmlSA::PassManager *manager, const QQmlSA::Element &rootElement) override; +}; + +class ForbiddenChildrenPropertyValidatorPass : public QQmlSA::ElementPass +{ +public: + ForbiddenChildrenPropertyValidatorPass(QQmlSA::PassManager *manager); + + void addWarning(QAnyStringView moduleName, QAnyStringView typeName, QAnyStringView propertyName, + QAnyStringView warning); + bool shouldRun(const QQmlSA::Element &element) override; + void run(const QQmlSA::Element &element) override; + +private: + struct Warning + { + QString propertyName; + QString message; + }; + + QHash<QQmlSA::Element, QVarLengthArray<Warning, 8>> m_types; +}; + +class AttachedPropertyTypeValidatorPass : public QQmlSA::PropertyPass +{ +public: + AttachedPropertyTypeValidatorPass(QQmlSA::PassManager *manager); + + QString addWarning(TypeDescription attachType, QList<TypeDescription> allowedTypes, + bool allowInDelegate, QAnyStringView warning); + + void onBinding(const QQmlSA::Element &element, const QString &propertyName, + const QQmlSA::Binding &binding, const QQmlSA::Element &bindingScope, + const QQmlSA::Element &value) override; + void onRead(const QQmlSA::Element &element, const QString &propertyName, + const QQmlSA::Element &readScope, QQmlSA::SourceLocation location) override; + void onWrite(const QQmlSA::Element &element, const QString &propertyName, + const QQmlSA::Element &value, const QQmlSA::Element &writeScope, + QQmlSA::SourceLocation location) override; + +private: + void checkWarnings(const QQmlSA::Element &element, const QQmlSA::Element &scopeUsedIn, + const QQmlSA::SourceLocation &location); + + struct Warning + { + QVarLengthArray<QQmlSA::Element, 4> allowedTypes; + bool allowInDelegate = false; + QString message; + }; + QHash<QString, Warning> m_attachedTypes; +}; + +class ControlsNativeValidatorPass : public QQmlSA::ElementPass +{ +public: + ControlsNativeValidatorPass(QQmlSA::PassManager *manager); + + bool shouldRun(const QQmlSA::Element &element) override; + void run(const QQmlSA::Element &element) override; + +private: + struct ControlElement + { + QString name; + QStringList restrictedProperties; + bool isInModuleControls = true; + bool isControl = false; + bool inheritsControl = false; + QQmlSA::Element element = {}; + }; + + QList<ControlElement> m_elements; +}; + +class AnchorsValidatorPass : public QQmlSA::ElementPass +{ +public: + AnchorsValidatorPass(QQmlSA::PassManager *manager); + + bool shouldRun(const QQmlSA::Element &element) override; + void run(const QQmlSA::Element &element) override; + +private: + QQmlSA::Element m_item; +}; + +class ControlsSwipeDelegateValidatorPass : public QQmlSA::ElementPass +{ +public: + ControlsSwipeDelegateValidatorPass(QQmlSA::PassManager *manager); + + bool shouldRun(const QQmlSA::Element &element) override; + void run(const QQmlSA::Element &element) override; + +private: + QQmlSA::Element m_swipeDelegate; +}; + +class VarBindingTypeValidatorPass : public QQmlSA::PropertyPass +{ +public: + VarBindingTypeValidatorPass(QQmlSA::PassManager *manager, + const QMultiHash<QString, TypeDescription> &expectedPropertyTypes); + + void onBinding(const QQmlSA::Element &element, const QString &propertyName, + const QQmlSA::Binding &binding, const QQmlSA::Element &bindingScope, + const QQmlSA::Element &value) override; + +private: + QMultiHash<QString, QQmlSA::Element> m_expectedPropertyTypes; +}; + +class PropertyChangesValidatorPass : public QQmlSA::ElementPass +{ +public: + PropertyChangesValidatorPass(QQmlSA::PassManager *manager); + + bool shouldRun(const QQmlSA::Element &element) override; + void run(const QQmlSA::Element &element) override; + +private: + QQmlSA::Element m_propertyChanges; +}; + +class AttachedPropertyReuse : public QQmlSA::PropertyPass +{ +public: + enum Mode { + CheckAll, + RestrictToControls + }; + + AttachedPropertyReuse(QQmlSA::PassManager *manager, QQmlSA::LoggerWarningId category) + : QQmlSA::PropertyPass(manager), category(category) + {} + + void onRead(const QQmlSA::Element &element, const QString &propertyName, + const QQmlSA::Element &readScope, QQmlSA::SourceLocation location) override; + void onWrite(const QQmlSA::Element &element, const QString &propertyName, + const QQmlSA::Element &value, const QQmlSA::Element &writeScope, + QQmlSA::SourceLocation location) override; + +private: + struct ElementAndLocation { + QQmlSA::Element element; + QQmlSA::SourceLocation location; + }; + + QMultiHash<QQmlSA::Element, ElementAndLocation> usedAttachedTypes; + QQmlSA::LoggerWarningId category; +}; + +QT_END_NAMESPACE + +#endif // QUICKLINTPLUGIN_H |