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
83
85
88{
89public:
91 void loadSettingsFrom(const QStringList &buildPaths, UpdatePolicy policy = NormalUpdate);
92 QStringList importPathsFor(const QString &filePath);
93 QStringList resourceFilesFor(const QString &filePath);
94 ModuleSetting settingFor(const QString &filePath);
95
96 void addModuleSetting(const ModuleSetting &moduleSetting);
97 void writeQmllsBuildIniContent(const QString &file) const;
98
99private:
100 QString m_docDir;
101 ModuleSettings m_moduleSettings;
102 QSet<QString> m_seenSettings;
103};
104
105class QQmlCodeModel : public QObject
106{
108public:
110 enum class State { Running, Stopping };
111
112 static constexpr QLatin1String s_maxCMakeJobs = "max"_L1;
113 static constexpr int s_defaultCMakeJobs = 1;
114
115 explicit QQmlCodeModel(const QByteArray &rootUrl = {}, QObject *parent = nullptr,
116 QQmlToolingSharedSettings *settings = nullptr);
117 ~QQmlCodeModel();
118 void prepareForShutdown();
119
120 QQmlJS::Dom::DomItem currentEnv() const { return m_currentEnv; };
121 QQmlJS::Dom::DomItem validEnv() const { return m_validEnv; };
122 OpenDocumentSnapshot snapshotByUrl(const QByteArray &url);
123 OpenDocument openDocumentByUrl(const QByteArray &url);
124 bool isEmpty() const;
125
126 void addOpenToUpdate(const QByteArray &, UpdatePolicy policy);
127 void removeDirectory(const QByteArray &);
128 // void updateDocument(const OpenDocument &doc);
129 void newOpenFile(const QByteArray &url, int version, const QString &docText);
130 void closeOpenFile(const QByteArray &url);
131 QByteArray rootUrl() const;
133 QStringList buildPathsForFileUrl(const QByteArray &url);
134 void setBuildPaths(const QStringList &paths);
136 QStringList importPathsForUrl(const QByteArray &);
137 QStringList importPaths() const;
138 void setImportPaths(const QStringList &paths);
140 void setResourceFiles(const QStringList &resourceFiles);
141 QQmlToolingSharedSettings *settings() const { return m_settings; }
142 QStringList findFilePathsFromFileNames(const QStringList &fileNames,
143 const QSet<QString> &alreadyWatchedFiles);
144 static QStringList fileNamesToWatch(const QQmlJS::Dom::DomItem &qmlFile);
145 void disableCMakeCalls();
146 void tryEnableCMakeCalls(QProcessScheduler *scheduler);
147
151 {
152 QMutexLocker l(&m_mutex);
153 return m_documentationRootPath;
154 }
155 void setDocumentationRootPath(const QString &path);
156
158 {
159 QMutexLocker guard(&m_mutex);
160 return m_ignoreForWatching;
161 }
162 HelpManager *helpManager() { return &m_helpManager; }
163
164 void setVerbose(bool verbose)
165 {
166 QMutexLocker guard(&m_mutex);
167 m_verbose = verbose;
168 }
169 bool verbose() const
170 {
171 QMutexLocker guard(&m_mutex);
172 return m_verbose;
173 }
174 void setCMakeJobs(int jobs) { m_cmakeJobs = jobs; }
175 int cmakeJobs() const { return m_cmakeJobs; }
176
179 void documentationRootPathChanged(const QString &path);
181
182private:
183 void addDirectory(const QString &path, int leftDepth);
184
185 // only to be called from the openUpdateThread
186 void newDocForOpenFile(const QByteArray &url, int version, const QString &docText,
187 UpdatePolicy policy);
188 bool openUpdateSome();
189 void openUpdate(const QByteArray &, UpdatePolicy policy);
190
191 void openUpdateStart();
192 void openUpdateEnd();
193 void openNeedUpdate();
194 QString url2Path(const QByteArray &url, UrlLookup options = UrlLookup::Caching);
195
196 void callCMakeBuild(QProcessScheduler *scheduler);
197 void onCMakeProcessFinished(const QByteArray &id);
198
199 void addFileWatches(const QQmlJS::Dom::DomItem &qmlFile);
200
201 enum CMakeStatus { RequiresInitialization, HasCMake, DoesNotHaveCMake };
202 CMakeStatus cmakeStatus() const
203 {
204 QMutexLocker guard(&m_mutex);
205 return m_cmakeStatus;
206 }
207 void setCMakeStatus(CMakeStatus status)
208 {
209 QMutexLocker guard(&m_mutex);
210 m_cmakeStatus = status;
211 }
212
213 mutable QMutex m_mutex;
214 const QByteArray m_rootUrl; // note: access without m_mutex, is const
215
216 QQmlJS::Dom::DomItem m_currentEnv; // note: access without m_mutex, has thread-safe API
217 QQmlJS::Dom::DomItem m_validEnv; // note: access without m_mutex, has thread-safe API
218 QQmlToolingSharedSettings *m_settings; // note: access without m_mutex. has thread-safe API
219 HelpManager m_helpManager; // note: access without m_mutex, has thread-safe API
220
221 QThread* m_openUpdateThread = nullptr; // needed for asserts
222 QHash<QByteArray, UpdatePolicy> m_openDocumentsToUpdate;
223 QStringList m_buildPaths;
224 QStringList m_importPaths;
225 QStringList m_resourceFiles;
226 QHash<QByteArray, QString> m_url2path;
227 QHash<QString, QByteArray> m_path2url;
228 QHash<QByteArray, OpenDocument> m_openDocuments;
229 QFileSystemWatcher m_cppFileWatcher;
231 QString m_documentationRootPath;
232 QSet<QString> m_ignoreForWatching;
233 int m_nUpdateInProgress = 0;
234 CMakeStatus m_cmakeStatus = RequiresInitialization;
235 int m_cmakeJobs = 1;
237 bool m_verbose = false;
238};
239
240} // namespace QmlLsp
241QT_END_NAMESPACE
242#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 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)
@ VersionLowerThanSnapshot
@ VersionLowerThanDocument
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)
QmlHighlighting::HighlightsContainer highlights