QML静态分析1 - 基本设置

本章介绍了qmllint扩展插件的基本结构,以及如何与qmllint一起使用。

要创建我们的插件,我们首先需要使QmlCompiler模块可用

find_package(Qt6 REQUIRED COMPONENTS QmlCompiler)

然后创建一个插件,并将其链接到QmlCompiler模块。

qt_add_plugin(HelloWorldPlugin)

target_sources(HelloWorldPlugin
    PRIVATE
        helloplugin.h
        helloplugin.cpp
)

target_link_libraries(HelloWorldPlugin PRIVATE Qt::QmlCompiler)

实现遵循扩展Qt的插件模式:通过插件扩展Qt:我们子类了QQmlSA::LintPlugin,

class HelloWorldPlugin : 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;
};

插件引用了一个plugin.json文件,其中包含一些重要信息

{
    "name": "HelloWorld",
    "author": "Qt Example",
    "description": "Demonstrates how to write a qmllint plugin",
    "version": "1.0",
    "loggingCategories": [
        {
            "name": "hello-world",
            "settingsName": "HelloWorld",
            "description": "Used to create test messages"
        }
    ]
}

nameauthorversiondescription是描述插件的元数据。

每个插件可以有一个或多个日志分类,它们用于主题性地分组警告。loggingCategories接受一个分类数组,每个分类由以下内容组成

  • name,用于标识分类,并在qmllint中作为标志名称使用
  • settingsName,用于在qmllint.ini中配置分类
  • description,应描述与该分类标记的警告消息类型

在我们的例子中,我们只有一个日志分类,hello-world。对于每个分类,我们在我们的插件中必须创建一个LoggerWarningId对象。

static constexpr QQmlSA::LoggerWarningId helloWorld { "Plugin.HelloWorld.hello-world" };

我们用字符串字面量构造它,该字面量应具有格式Plugin.<插件名称>.<分类名称>

最后,为了使我们的插件真正有用,我们必须实现registerPasses函数。

void HelloWorldPlugin::registerPasses(QQmlSA::PassManager *manager, const QQmlSA::Element &rootElement)
{
    const bool pluginIsEnabled = manager->isCategoryEnabled(helloWorld);
    qDebug() << "Hello World plugin is" << (pluginIsEnabled ? "enabled" : "disabled");
    if (!pluginIsEnabled)
        return; // skip registration if the plugin is disabled anyway
    // here we will later register our passes
}

我们检查我们的分类是否启用,并通过qDebug打印出一个表示其状态的诊断信息。请注意,当前的插件还没有做什么有用的事情,因为我们没有注册任何Pass。这将在本教程的下一部分完成。

但是,我们可以验证我们的插件是否已被正确检测。我们使用以下命令进行检查

qmllint -P /path/to/the/directory/containing/the/plugin --Plugin.HelloWorld.hello-world info test.qml

-P选项告诉qmllint在指定的文件夹中查找插件。为了避免与Qt内部分类冲突,插件分类始终以"Plugin"开头,然后跟一个点,插件名称,另一个点和该分类。运行该命令应打印出Hello World Plugin is enabled

© 2024 The Qt Company Ltd. 嵌入本文档的内容均为各自所有者的版权。本提供的文档根据自由软件基金会发布的条款,受GNU自由文档许可证版本1.3 许可。Qt及其相关标志是芬兰及/或其他国家/地区The Qt Company Ltd.的商标。商标。其他所有商标归其各自所有者所有。