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
4#ifndef QMLJSLINTER_P_H
5#define QMLJSLINTER_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16
17#include <qtqmlcompilerexports.h>
18
19#include <QtQmlCompiler/private/qqmljslogger_p.h>
20#include <QtQmlCompiler/private/qqmljsimporter_p.h>
21#include <QtQmlCompiler/private/qqmljscontextproperties_p.h>
22
23#include <QtQml/private/qqmljssourcelocation_p.h>
24
25#include <QtCore/qjsonarray.h>
26#include <QtCore/qstring.h>
27#include <QtCore/qmap.h>
28#include <QtCore/qscopedpointer.h>
29
30#include <vector>
31
32QT_BEGIN_NAMESPACE
33
34class QPluginLoader;
35struct QStaticPlugin;
36
37namespace QQmlSA {
38class LintPlugin;
39}
40
41class Q_QMLCOMPILER_EXPORT QQmlJSLinter
42{
43public:
44 QQmlJSLinter(const QStringList &importPaths, const QStringList &extraPluginPaths = {},
45 bool useAbsolutePath = false);
46
47 enum LintResult { FailedToOpen, FailedToParse, HasWarnings, HasErrors, LintSuccess };
48 enum FixResult { NothingToFix, FixError, FixSuccess };
49
50 class Q_QMLCOMPILER_EXPORT Plugin
51 {
52 Q_DISABLE_COPY(Plugin)
53 public:
54 Plugin() = default;
55 Plugin(Plugin &&plugin) noexcept;
56
57#if QT_CONFIG(library)
58 Plugin(QString path);
59#endif
60 Plugin(const QStaticPlugin &plugin);
61 ~Plugin();
62
63 const QString &name() const { return m_name; }
64 const QString &description() const { return m_description; }
65 const QString &version() const { return m_version; }
66 const QString &author() const { return m_author; }
67 const QList<QQmlJS::LoggerCategory> categories() const
68 {
69 return m_categories;
70 }
71 bool isBuiltin() const { return m_isBuiltin; }
72 bool isValid() const { return m_isValid; }
73 bool isInternal() const
74 {
75 return m_isInternal;
76 }
77
78 bool isEnabled() const
79 {
80 return m_isEnabled;
81 }
82 void setEnabled(bool isEnabled)
83 {
84 m_isEnabled = isEnabled;
85 }
86
87 private:
88 friend class QQmlJSLinter;
89
90 bool parseMetaData(const QJsonObject &metaData, QString pluginName);
91
92 QString m_name;
93 QString m_description;
94 QString m_version;
95 QString m_author;
96
97 QList<QQmlJS::LoggerCategory> m_categories;
98 QQmlSA::LintPlugin *m_instance;
99 std::unique_ptr<QPluginLoader> m_loader;
100 bool m_isBuiltin = false;
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::ContextProperties &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
122 std::vector<Plugin> &plugins()
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 void parseComments(QQmlJSLogger *logger, const QList<QQmlJS::SourceLocation> &comments);
135 void processMessages(QJsonArray &warnings);
136
137 bool m_useAbsolutePath;
138 bool m_enablePlugins;
139 QQmlJSImporter m_importer;
140 QScopedPointer<QQmlJSLogger> m_logger;
141 QString m_fileContents;
142 std::vector<Plugin> m_plugins;
143};
144
145QT_END_NAMESPACE
146
147#endif // QMLJSLINTER_P_H
148

source code of qtdeclarative/src/qmlcompiler/qqmljslinter_p.h