aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmlcompiler/doc/qtqmlcompiler-index.qdoc
diff options
context:
space:
mode:
Diffstat (limited to 'src/qmlcompiler/doc/qtqmlcompiler-index.qdoc')
-rw-r--r--src/qmlcompiler/doc/qtqmlcompiler-index.qdoc81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/qmlcompiler/doc/qtqmlcompiler-index.qdoc b/src/qmlcompiler/doc/qtqmlcompiler-index.qdoc
new file mode 100644
index 0000000000..3de06d577e
--- /dev/null
+++ b/src/qmlcompiler/doc/qtqmlcompiler-index.qdoc
@@ -0,0 +1,81 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \page qtqmlcompiler-index.html
+ \title Qt QML Compiler
+ \brief Provides tools for static analysis of QML code.
+
+ The Qt QML Compiler module contains shared functionality needed by QML
+ tooling like the \l{Qt Quick Compiler} and \l{qmllint Reference}{qmllint}.
+ It also provides the QQmlSA framework, which can be used to extend the
+ built-in analysis capabilities of the tools.
+
+ \section1 Using the Module
+
+ \include {module-use.qdocinc} {using the c++ api}
+
+ \section2 Building with CMake
+
+ \include {module-use.qdocinc} {building with cmake} {QmlCompiler}
+
+ \section2 Building with qmake
+
+ \include {module-use.qdocinc} {building_with_qmake} {QmlCompiler}
+
+ \section1 Using the QQmlSA framework
+
+ The Qt QML Compiler module offers the QQmlSA framework which provides tools
+ for static analysis of QML code. These tools can help ensure syntactic
+ validity and warn about QML anti-patterns.
+ Adding static analysis to a QML program is done by writing plugins. They
+ will run a collection of analysis passes over the elements and properties
+ of the QML code. The passes can be registered with a PassManager which
+ holds the passes and can be called to analyze an element and its children.
+ A pass is a check for a certain rule or condition evaluated on elements or
+ properties. If the condition is met, the pass can warn the user of an
+ indentified issue in the code and maybe even suggest a fix. It is called a
+ pass because the analysis performed on elements and properties happens by
+ running a collection of passes on them in succesion. Each pass should be
+ responsible for identifying one specific issue only. Combining a set of
+ passes can perform more complex analysis and, together, form a plugin.
+ Element passes are defined by two main components, namely \c shouldRun()
+ and \c run(). When performing the analysis, the pass manager will execute
+ the pass over every element it encounters while traversing the children of
+ the root element. For each element, if \c shouldRun() evaluated on that
+ element returns \c true then \c run() is executed on it.
+ Passes on properties trigger on three different events, namely when the
+ property is bound, when it is read, and when it is written to. These can be
+ implemented by overriding the \c onBinding(), \c onRead() and \c onWrite()
+ functions respectively.
+ As the code grows, so does the number of elements and properties.
+ Performing the static analysis passes on all of them can become expensive.
+ That's why it is good to be granular when deciding which elements and
+ properties to analyze. For elements, the \c shouldRun() is intended to be a
+ cheap check to determine if \c run(), which performs the real computation,
+ should be run. For properties, the selection is done when registering the
+ passes with the manager. The \c registerPropertyPass() function takes the
+ \c moduleName, \c typeName and \c propertyName strings as arguments. These
+ are used to filter down the set of properties affected by the registered
+ pass.
+
+
+ \section1 Examples
+
+ The \l{QML Static Analysis Tutorial} shows how to use the \c{QQmlSA}
+ framework to create a custom \l{qmllint Reference}{qmllint} pass.
+
+ \section1 Reference
+
+ \list
+ \li \l {Qt QML Compiler C++ Classes}
+ - the C++ API provided by the QmlCompiler module
+ \li QML tooling using the static analysis capabilities
+ \list
+ \li \l{QML script compiler}
+ \li \l{qmllint Reference}{qmllint}
+ \li \l{\QMLLS Reference}{\QMLLS}
+ \li \l{QML type compiler}
+ \endlist
+ \endlist
+ */