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
52
59
65
67{
68 auto asTuple() const { return std::make_tuple(sourceFolder, importPaths, resourceFiles); }
70 const ModuleSetting &b) noexcept
71 {
72 if (auto result = compareThreeWay(a.sourceFolder, b.sourceFolder); is_neq(result))
73 return result;
74 if (auto result = compareThreeWay(a.importPaths, b.importPaths); is_neq(result))
75 return result;
76 return compareThreeWay(a.resourceFiles, b.resourceFiles);
77 }
78 friend bool comparesEqual(const ModuleSetting &a, const ModuleSetting &b) noexcept
79 {
80 return a.asTuple() == b.asTuple();
81 }
83
87};
88
90
93{
94public:
96 void loadSettingsFrom(const QStringList &buildPaths, UpdatePolicy policy = NormalUpdate);
97 QStringList importPathsFor(const QString &filePath);
98 QStringList resourceFilesFor(const QString &filePath);
99 ModuleSetting settingFor(const QString &filePath);
100
101 void addModuleSetting(const ModuleSetting &moduleSetting);
102 void writeQmllsBuildIniContent(const QString &file) const;
103
104protected:
108};
109
110class QQmlCodeModel : public QObject
111{
113public:
115 enum class State { Running, Stopping };
116
117 static constexpr QLatin1String s_maxCMakeJobs = "max"_L1;
118 static constexpr int s_defaultCMakeJobs = 1;
119
120 explicit QQmlCodeModel(const QByteArray &rootUrl = {}, QObject *parent = nullptr,
121 QQmlToolingSharedSettings *settings = nullptr);
122 ~QQmlCodeModel();
123 void prepareForShutdown();
124
125 QQmlJS::Dom::DomItem currentEnv() const { return m_currentEnv; };
126 QQmlJS::Dom::DomItem validEnv() const { return m_validEnv; };
127 OpenDocumentSnapshot snapshotByUrl(const QByteArray &url);
128 OpenDocument openDocumentByUrl(const QByteArray &url);
129 bool isEmpty() const;
130
131 void addOpenToUpdate(const QByteArray &, UpdatePolicy policy);
132 void removeDirectory(const QByteArray &);
133 // void updateDocument(const OpenDocument &doc);
134 void newOpenFile(const QByteArray &url, int version, const QString &docText);
135 void closeOpenFile(const QByteArray &url);
136 QByteArray rootUrl() const;
138 QStringList buildPathsForFileUrl(const QByteArray &url);
139 void setBuildPaths(const QStringList &paths);
141 QStringList importPathsForUrl(const QByteArray &);
142 QStringList importPaths() const;
143 void setImportPaths(const QStringList &paths);
145 void setResourceFiles(const QStringList &resourceFiles);
146 QQmlToolingSharedSettings *settings() const { return m_settings; }
147 QStringList findFilePathsFromFileNames(const QStringList &fileNames,
148 const QSet<QString> &alreadyWatchedFiles);
149 static QStringList fileNamesToWatch(const QQmlJS::Dom::DomItem &qmlFile);
150 void disableCMakeCalls();
151 void tryEnableCMakeCalls(QProcessScheduler *scheduler);
152
156 {
157 QMutexLocker l(&m_mutex);
158 return m_documentationRootPath;
159 }
160 void setDocumentationRootPath(const QString &path);
161
163 {
164 QMutexLocker guard(&m_mutex);
165 return m_ignoreForWatching;
166 }
167 HelpManager *helpManager() { return &m_helpManager; }
168
169 void setVerbose(bool verbose)
170 {
171 QMutexLocker guard(&m_mutex);
172 m_verbose = verbose;
173 }
174 bool verbose() const
175 {
176 QMutexLocker guard(&m_mutex);
177 return m_verbose;
178 }
179 void setCMakeJobs(int jobs) { m_cmakeJobs = jobs; }
180 int cmakeJobs() const { return m_cmakeJobs; }
181 void reloadAllOpenFiles();
182
185 void documentationRootPathChanged(const QString &path);
187
188private:
189 void addDirectory(const QString &path, int leftDepth);
190
191 // only to be called from the openUpdateThread
192 void newDocForOpenFile(const QByteArray &url, int version, const QString &docText,
193 UpdatePolicy policy);
194 bool openUpdateSome();
195 void openUpdate(const QByteArray &, UpdatePolicy policy);
196
197 void openUpdateStart();
198 void openUpdateEnd();
199 void openNeedUpdate();
200 QString url2Path(const QByteArray &url, UrlLookup options = UrlLookup::Caching);
201
202 void callCMakeBuild(QProcessScheduler *scheduler);
203
204 void addFileWatches(const QQmlJS::Dom::DomItem &qmlFile);
205
206 enum CMakeStatus { RequiresInitialization, HasCMake, DoesNotHaveCMake };
207 CMakeStatus cmakeStatus() const
208 {
209 QMutexLocker guard(&m_mutex);
210 return m_cmakeStatus;
211 }
212 void setCMakeStatus(CMakeStatus status)
213 {
214 QMutexLocker guard(&m_mutex);
215 m_cmakeStatus = status;
216 }
217
218 mutable QMutex m_mutex;
219 const QByteArray m_rootUrl; // note: access without m_mutex, is const
220
221 QQmlJS::Dom::DomItem m_currentEnv; // note: access without m_mutex, has thread-safe API
222 QQmlJS::Dom::DomItem m_validEnv; // note: access without m_mutex, has thread-safe API
223 QQmlToolingSharedSettings *m_settings; // note: access without m_mutex. has thread-safe API
224 HelpManager m_helpManager; // note: access without m_mutex, has thread-safe API
225
226 QThread* m_openUpdateThread = nullptr; // needed for asserts
227 QHash<QByteArray, UpdatePolicy> m_openDocumentsToUpdate;
228 QStringList m_buildPaths;
229 QStringList m_importPaths;
230 QStringList m_resourceFiles;
231 QHash<QByteArray, QString> m_url2path;
232 QHash<QString, QByteArray> m_path2url;
233 QHash<QByteArray, OpenDocument> m_openDocuments;
234 QFileSystemWatcher m_cppFileWatcher;
236 QString m_documentationRootPath;
237 QSet<QString> m_ignoreForWatching;
238 int m_nUpdateInProgress = 0;
239 CMakeStatus m_cmakeStatus = RequiresInitialization;
240 int m_cmakeJobs = 1;
242 bool m_verbose = false;
243};
244
245} // namespace QmlLsp
246QT_END_NAMESPACE
247#endif // QQMLCODEMODEL_P_H
QDebug & dump(QDebug &dbg)
QQmlJSScope::ConstPtr scope
std::optional< int > docVersion
std::optional< int > validDocVersion
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