Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qqmljslinter_p.h
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3// Qt-Security score:significant
4
5#ifndef QMLJSLINTER_P_H
6#define QMLJSLINTER_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17
18#include <private/qqmljscontextproperties_p.h>
19#include <private/qqmljsimporter_p.h>
20#include <private/qqmljslintertypepropagator_p.h>
21#include <private/qqmljslogger_p.h>
22#include <private/qqmljssourcelocation_p.h>
23#include <private/qqmljstypepropagator_p.h>
24#include <private/qqmljsusercontextproperties_p.h>
25#include <private/qqmltoolingsettings_p.h>
26
27#include <QtCore/qjsonarray.h>
28#include <QtCore/qstring.h>
29#include <QtCore/qmap.h>
30#include <QtCore/qscopedpointer.h>
31
32#include <vector>
33
34QT_BEGIN_NAMESPACE
35
36class QPluginLoader;
37struct QStaticPlugin;
38
39namespace QQmlSA {
40class LintPlugin;
41}
42
44{
45public:
46 QQmlJSLinter(const QStringList &importPaths, const QStringList &extraPluginPaths = {},
47 bool useAbsolutePath = false);
48
51
52 class Plugin
53 {
55 public:
56 Plugin() = default;
57 Plugin(Plugin &&plugin) noexcept;
58
59#if QT_CONFIG(library)
61#endif
62 Plugin(const QStaticPlugin &plugin);
63 ~Plugin();
64
65 const QString &name() const { return m_name; }
66 const QString &description() const { return m_description; }
67 const QString &version() const { return m_version; }
68 const QString &author() const { return m_author; }
70 {
71 return m_categories;
72 }
73 bool isValid() const { return m_isValid; }
74 bool isInternal() const
75 {
76 return m_isInternal;
77 }
78
79 bool isEnabled() const
80 {
81 return m_isEnabled;
82 }
83 void setEnabled(bool isEnabled)
84 {
85 m_isEnabled = isEnabled;
86 }
87
88 private:
89 friend class QQmlJSLinter;
90
91 bool parseMetaData(const QJsonObject &metaData, QString pluginName);
92
93 QString m_name;
94 QString m_description;
95 QString m_version;
96 QString m_author;
97
98 QList<QQmlJS::LoggerCategory> m_categories;
99 QQmlSA::LintPlugin *m_instance;
100 std::unique_ptr<QPluginLoader> m_loader;
101 bool m_isInternal =
102 false; // Internal plugins are those developed and maintained inside the Qt project
103 bool m_isValid = false;
104 bool m_isEnabled = true;
105 };
106
107 static std::vector<Plugin> loadPlugins(QStringList paths);
108
109 LintResult lintFile(const QString &filename, const QString *fileContents, const bool silent,
110 QJsonArray *json, const QStringList &qmlImportPaths,
111 const QStringList &qmldirFiles, const QStringList &resourceFiles,
112 const QList<QQmlJS::LoggerCategory> &categories,
113 const QQmlJS::HeuristicContextProperties &contextProperties = {});
114
115 LintResult lintModule(const QString &uri, const bool silent, QJsonArray *json,
116 const QStringList &qmlImportPaths, const QStringList &resourceFiles);
117
118 FixResult applyFixes(QString *fixedCode, bool silent);
119
120 const QQmlJSLogger *logger() const { return m_logger.get(); }
121
123 {
124 return m_plugins;
125 }
126 void setPlugins(std::vector<Plugin> plugins) { m_plugins = std::move(plugins); }
127
128 void setPluginsEnabled(bool enablePlugins) { m_enablePlugins = enablePlugins; }
129 bool pluginsEnabled() const { return m_enablePlugins; }
130
131 void clearCache() { m_importer.clearCache(); }
132
133private:
134 LintResult lintFileImpl(const QString &filename, const QString *fileContents, const bool silent,
135 QJsonArray *json, const QStringList &qmlImportPaths,
136 const QStringList &qmldirFiles, const QStringList &resourceFiles,
137 const QList<QQmlJS::LoggerCategory> &categories,
138 const QQmlJS::HeuristicContextProperties &heuristicContextProperties);
139 LintResult lintModuleImpl(const QString &uri, const bool silent, QJsonArray *json,
140 const QStringList &qmlImportPaths, const QStringList &resourceFiles);
141 void setupLoggingCategoriesInLogger(const QList<QQmlJS::LoggerCategory> &categories);
142 void parseComments(QQmlJSLogger *logger, const QList<QQmlJS::SourceLocation> &comments);
143 void processMessages(QJsonArray &warnings);
144 ContextPropertyInfo
145 contextPropertiesFor(const QString &fileName, QQmlJSResourceFileMapper *mapper,
146 const QQmlJS::HeuristicContextProperties &heuristicContextProperties);
147
148 bool m_useAbsolutePath;
149 bool m_enablePlugins;
150 QQmlJSImporter m_importer;
151 QScopedPointer<QQmlJSLogger> m_logger;
152 QString m_fileContents;
153 std::vector<Plugin> m_plugins;
154 QQmlToolingSettings m_userContextPropertySettings =
155 QQmlToolingSettings(QStringLiteral("contextProperties"));
156 QQmlToolingSettings::Searcher m_heuristicContextPropertySearcher =
157 QQmlToolingSettings::Searcher(QStringLiteral(".qt/contextPropertyDump.ini"),
158 QStringLiteral("contextPropertyDump.ini"));
159};
160
161QT_END_NAMESPACE
162
163#endif // QMLJSLINTER_P_H
void reportVarUsedBeforeDeclaration(const QString &name, const QString &fileName, QQmlJS::SourceLocation declarationLocation, QQmlJS::SourceLocation accessLocation) override
void reportFunctionUsedBeforeDeclaration(const QString &name, const QString &fileName, QQmlJS::SourceLocation declarationLocation, QQmlJS::SourceLocation accessLocation) override
UnreachableVisitor * unreachableVisitor() override
CodegenWarningInterface(QQmlJSLogger *logger)
bool visit(QQmlJS::AST::FunctionDeclaration *functionDeclaration) override
void throwRecursionDepthError() override
void setPassManager(QQmlSA::PassManager *passManager)
const QList< QQmlJS::LoggerCategory > categories() const
bool isInternal() const
Plugin(Plugin &&plugin) noexcept
Plugin(const QStaticPlugin &plugin)
const QString & name() const
const QString & version() const
const QString & author() const
void setEnabled(bool isEnabled)
const QString & description() const
FixResult applyFixes(QString *fixedCode, bool silent)
void setPluginsEnabled(bool enablePlugins)
static std::vector< Plugin > loadPlugins(QStringList paths)
const QQmlJSLogger * logger() const
QQmlJSLinter(const QStringList &importPaths, const QStringList &extraPluginPaths={}, bool useAbsolutePath=false)
std::vector< Plugin > & plugins()
void setPlugins(std::vector< Plugin > plugins)
LintResult lintModule(const QString &uri, const bool silent, QJsonArray *json, const QStringList &qmlImportPaths, const QStringList &resourceFiles)
LintResult lintFile(const QString &filename, const QString *fileContents, const bool silent, QJsonArray *json, const QStringList &qmlImportPaths, const QStringList &qmldirFiles, const QStringList &resourceFiles, const QList< QQmlJS::LoggerCategory > &categories, const QQmlJS::HeuristicContextProperties &contextProperties={})
bool pluginsEnabled() const
UnreachableVisitor(QQmlJSLogger *logger)
void throwRecursionDepthError() override
bool containsFunctionDeclaration(QQmlJS::AST::Node *node)
bool visit(QQmlJS::AST::StatementList *unreachable) override
\inmodule QtQmlCompiler
Combined button and popup list for selecting options.
static void addJsonWarning(QJsonArray &warnings, const QQmlJS::DiagnosticMessage &message, QAnyStringView id, const std::optional< QQmlJSFixSuggestion > &suggestion={})