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
qqmlcodemodel_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 LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QQMLCODEMODEL_P_H
6#define QQMLCODEMODEL_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
19#include <private/qlanguageserver_p.h>
20#include <private/qtextdocument_p.h>
21#include <private/qprocessscheduler_p.h>
22#include <private/qqmllshelputils_p.h>
23#include <private/qqmlsemantictokens_p.h>
24
25#include <QObject>
26#include <QHash>
27#include <QtCore/qfilesystemwatcher.h>
28#include <QtCore/private/qfactoryloader_p.h>
29#include <QtQmlDom/private/qqmldomitem_p.h>
30#include <QtQmlCompiler/private/qqmljsscope_p.h>
31#include <QtQmlToolingSettings/private/qqmltoolingsettings_p.h>
32
33#include <functional>
34#include <memory>
35
36QT_BEGIN_NAMESPACE
37class TextSynchronization;
38namespace QmlLsp {
39
61
62Q_DECLARE_OPERATORS_FOR_FLAGS(OpenDocumentSnapshot::DumpOptions)
63
70
76
78{
79 auto asTuple() const { return std::make_tuple(sourceFolder, importPaths, resourceFiles); }
81 const ModuleSetting &b) noexcept
82 {
83 if (auto result = compareThreeWay(a.sourceFolder, b.sourceFolder); is_neq(result))
84 return result;
85 if (auto result = compareThreeWay(a.importPaths, b.importPaths); is_neq(result))
86 return result;
87 return compareThreeWay(a.resourceFiles, b.resourceFiles);
88 }
89 friend bool comparesEqual(const ModuleSetting &a, const ModuleSetting &b) noexcept
90 {
91 return a.asTuple() == b.asTuple();
92 }
94
98};
99
101
104{
105public:
107 void loadSettingsFrom(const QStringList &buildPaths, UpdatePolicy policy = NormalUpdate);
108 QStringList importPathsFor(const QString &filePath);
109 QStringList resourceFilesFor(const QString &filePath);
110 ModuleSetting settingFor(const QString &filePath);
111
112 void addModuleSetting(const ModuleSetting &moduleSetting);
113 void writeQmllsBuildIniContent(const QString &file) const;
114
115protected:
119};
120
121class QQmlCodeModel : public QObject
122{
124public:
126 enum class State { Running, Stopping };
127
128 static constexpr QLatin1String s_maxCMakeJobs = "max"_L1;
129 static constexpr int s_defaultCMakeJobs = 1;
130
131 explicit QQmlCodeModel(const QByteArray &rootUrl = {}, QObject *parent = nullptr,
132 QQmlToolingSharedSettings *settings = nullptr);
133 ~QQmlCodeModel();
134 void prepareForShutdown();
135
136 QQmlJS::Dom::DomItem currentEnv() const { return m_currentEnv; };
137 QQmlJS::Dom::DomItem validEnv() const { return m_validEnv; };
138 OpenDocumentSnapshot snapshotByUrl(const QByteArray &url);
139 OpenDocument openDocumentByUrl(const QByteArray &url);
140 bool isEmpty() const;
141
142 void addOpenToUpdate(const QByteArray &, UpdatePolicy policy);
143 void removeDirectory(const QByteArray &);
144 // void updateDocument(const OpenDocument &doc);
145 void newOpenFile(const QByteArray &url, int version, const QString &docText);
146 void closeOpenFile(const QByteArray &url);
147 QByteArray rootUrl() const;
149 QStringList buildPathsForFileUrl(const QByteArray &url);
150 void setBuildPaths(const QStringList &paths);
152 QStringList importPathsForUrl(const QByteArray &);
153 QStringList importPaths() const;
154 void setImportPaths(const QStringList &paths);
156 void setResourceFiles(const QStringList &resourceFiles);
157 QQmlToolingSharedSettings *settings() const { return m_settings; }
158 QStringList findFilePathsFromFileNames(const QStringList &fileNames,
159 const QSet<QString> &alreadyWatchedFiles);
160 static QStringList fileNamesToWatch(const QQmlJS::Dom::DomItem &qmlFile);
161 void disableCMakeCalls();
162 void tryEnableCMakeCalls(QProcessScheduler *scheduler);
163
167 {
168 QMutexLocker l(&m_mutex);
169 return m_documentationRootPath;
170 }
171 void setDocumentationRootPath(const QString &path);
172
174 {
175 QMutexLocker guard(&m_mutex);
176 return m_ignoreForWatching;
177 }
178 HelpManager *helpManager() { return &m_helpManager; }
179
180 void setVerbose(bool verbose)
181 {
182 QMutexLocker guard(&m_mutex);
183 m_verbose = verbose;
184 }
185 bool verbose() const
186 {
187 QMutexLocker guard(&m_mutex);
188 return m_verbose;
189 }
190 void setCMakeJobs(int jobs) { m_cmakeJobs = jobs; }
191 int cmakeJobs() const { return m_cmakeJobs; }
192 void reloadAllOpenFiles();
193
196 void documentationRootPathChanged(const QString &path);
198
199private:
200 void addDirectory(const QString &path, int leftDepth);
201
202 // only to be called from the openUpdateThread
203 void newDocForOpenFile(const QByteArray &url, int version, const QString &docText,
204 UpdatePolicy policy);
205 bool openUpdateSome();
206 void openUpdate(const QByteArray &, UpdatePolicy policy);
207
208 void openUpdateStart();
209 void openUpdateEnd();
210 void openNeedUpdate();
211 QString url2Path(const QByteArray &url, UrlLookup options = UrlLookup::Caching);
212
213 void callCMakeBuild(QProcessScheduler *scheduler);
214
215 void addFileWatches(const QQmlJS::Dom::DomItem &qmlFile);
216
217 enum CMakeStatus { RequiresInitialization, HasCMake, DoesNotHaveCMake };
218 CMakeStatus cmakeStatus() const
219 {
220 QMutexLocker guard(&m_mutex);
221 return m_cmakeStatus;
222 }
223 void setCMakeStatus(CMakeStatus status)
224 {
225 QMutexLocker guard(&m_mutex);
226 m_cmakeStatus = status;
227 }
228
229 mutable QMutex m_mutex;
230 const QByteArray m_rootUrl; // note: access without m_mutex, is const
231
232 QQmlJS::Dom::DomItem m_currentEnv; // note: access without m_mutex, has thread-safe API
233 QQmlJS::Dom::DomItem m_validEnv; // note: access without m_mutex, has thread-safe API
234 QQmlToolingSharedSettings *m_settings; // note: access without m_mutex. has thread-safe API
235 HelpManager m_helpManager; // note: access without m_mutex, has thread-safe API
236
237 QThread* m_openUpdateThread = nullptr; // needed for asserts
238 QHash<QByteArray, UpdatePolicy> m_openDocumentsToUpdate;
239 QStringList m_buildPaths;
240 QStringList m_importPaths;
241 QStringList m_resourceFiles;
242 QHash<QByteArray, QString> m_url2path;
243 QHash<QString, QByteArray> m_path2url;
244 QHash<QByteArray, OpenDocument> m_openDocuments;
245 QFileSystemWatcher m_cppFileWatcher;
247 QString m_documentationRootPath;
248 QSet<QString> m_ignoreForWatching;
249 int m_nUpdateInProgress = 0;
250 CMakeStatus m_cmakeStatus = RequiresInitialization;
251 int m_cmakeJobs = 1;
253 bool m_verbose = false;
254};
255
256} // namespace QmlLsp
257QT_END_NAMESPACE
258#endif // QQMLCODEMODEL_P_H
QQmlJSScope::ConstPtr scope
std::optional< int > docVersion
std::optional< int > validDocVersion
QDebug dump(QDebug dbg, DumpOptions dump=DumpOption::NoCode)
QQmlJS::Dom::DomItem validDoc
std::shared_ptr< Utils::TextDocument > textDocument
OpenDocumentSnapshot snapshot
void newOpenFile(const QByteArray &url, int version, const QString &docText)
void addOpenToUpdate(const QByteArray &, UpdatePolicy policy)
void setCMakeJobs(int jobs)
QQmlToolingSharedSettings * settings() const
static constexpr QLatin1String s_maxCMakeJobs
OpenDocumentSnapshot snapshotByUrl(const QByteArray &url)
QSet< QString > ignoreForWatching() const
static QStringList fileNamesToWatch(const QQmlJS::Dom::DomItem &qmlFile)
void tryEnableCMakeCalls(QProcessScheduler *scheduler)
HelpManager * helpManager()
void setDocumentationRootPath(const QString &path)
static constexpr int s_defaultCMakeJobs
QByteArray rootUrl() const
QStringList importPaths() const
OpenDocument openDocumentByUrl(const QByteArray &url)
QStringList findFilePathsFromFileNames(const QStringList &fileNames, const QSet< QString > &alreadyWatchedFiles)
QQmlCodeModel(const QByteArray &rootUrl={}, QObject *parent=nullptr, QQmlToolingSharedSettings *settings=nullptr)
const RegisteredSemanticTokens & registeredTokens() const
QStringList buildPathsForFileUrl(const QByteArray &url)
QStringList importPathsForUrl(const QByteArray &)
QStringList resourceFiles() const
QQmlJS::Dom::DomItem currentEnv() const
QStringList buildPathsForOpenedFiles()
void setBuildPaths(const QStringList &paths)
void documentationRootPathChanged(const QString &path)
QString documentationRootPath() const
void setVerbose(bool verbose)
void closeOpenFile(const QByteArray &url)
QQmlJS::Dom::DomItem validEnv() const
RegisteredSemanticTokens & registeredTokens()
void removeDirectory(const QByteArray &)
void setImportPaths(const QStringList &paths)
void setResourceFiles(const QStringList &resourceFiles)
QStringList importPathsFor(const QString &filePath)
QStringList resourceFilesFor(const QString &filePath)
ModuleSetting settingFor(const QString &filePath)
void writeQmllsBuildIniContent(const QString &file) const
void addModuleSetting(const ModuleSetting &moduleSetting)
void loadSettingsFrom(const QStringList &buildPaths, UpdatePolicy policy=NormalUpdate)
Combined button and popup list for selecting options.
static QStringList asStringList(const QVariant &variant)
static ModuleSetting * moduleSettingFor(const QString &sourceFolder, ModuleSettings *moduleSettings, UpdatePolicy policy)
VersionCheckResult checkVersion(const OpenDocument &doc, int version)
static QStringList withDependentBuildDirectories(QStringList &&buildPaths)
VersionCheckResultForValidDocument
@ VersionLowerThanValidSnapshot
@ VersionOkForValidDocument
static VersionCheckResultForValidDocument checkVersionForValidDocument(const OpenDocument &doc, int version)
static void loadWorkspacesV2(QSettings *settings, ModuleSettings *moduleSettings, UpdatePolicy policy)
@ VersionLowerThanSnapshot
@ VersionLowerThanDocument
static void handleArrayStartingAt0(QSettings *settings, ModuleSettings *moduleSettings, UpdatePolicy policy)
static void updateItemInSnapshot(const DomItem &item, const DomItem &validItem, const QByteArray &url, OpenDocument *doc, int version, UpdatePolicy policy)
static int cmakeJobsFromSettings(QQmlToolingSharedSettings *settings, const QString &rootPath, int defaultValue)
friend Qt::strong_ordering compareThreeWay(const ModuleSetting &a, const ModuleSetting &b) noexcept
friend bool comparesEqual(const ModuleSetting &a, const ModuleSetting &b) noexcept
QmlHighlighting::HighlightsContainer highlights