1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#ifndef QQMLCODEMODEL_H
#define QQMLCODEMODEL_H
#include <QObject>
#include <QHash>
#include <QtQmlDom/private/qqmldomitem_p.h>
#include <QtQmlCompiler/private/qqmljsscope_p.h>
#include "qlanguageserver_p.h"
#include "textdocument.h"
#include "../shared/qqmltoolingsettings.h"
#include <functional>
#include <memory>
QT_BEGIN_NAMESPACE
class TextSynchronization;
namespace QmlLsp {
class OpenDocumentSnapshot
{
public:
enum class DumpOption {
NoCode = 0,
LatestCode = 0x1,
ValidCode = 0x2,
AllCode = LatestCode | ValidCode
};
Q_DECLARE_FLAGS(DumpOptions, DumpOption)
QStringList searchPath;
QByteArray url;
std::optional<int> docVersion;
QQmlJS::Dom::DomItem doc;
std::optional<int> validDocVersion;
QQmlJS::Dom::DomItem validDoc;
std::optional<int> scopeVersion;
QDateTime scopeDependenciesLoadTime;
bool scopeDependenciesChanged = false;
QQmlJSScope::Ptr scope = {};
QDebug dump(QDebug dbg, DumpOptions dump = DumpOption::NoCode);
};
Q_DECLARE_OPERATORS_FOR_FLAGS(OpenDocumentSnapshot::DumpOptions)
class OpenDocument
{
public:
OpenDocumentSnapshot snapshot;
std::shared_ptr<Utils::TextDocument> textDocument;
};
struct ToIndex
{
QString path;
int leftDepth;
};
class QQmlCodeModel : public QObject
{
Q_OBJECT
public:
enum class UrlLookup { Caching, ForceLookup };
enum class State { Running, Stopping };
explicit QQmlCodeModel(QObject *parent = nullptr, QQmlToolingSettings *settings = nullptr);
~QQmlCodeModel();
QQmlJS::Dom::DomItem currentEnv();
QQmlJS::Dom::DomItem validEnv();
OpenDocumentSnapshot snapshotByUrl(const QByteArray &url);
OpenDocument openDocumentByUrl(const QByteArray &url);
void openNeedUpdate();
void indexNeedsUpdate();
void addDirectoriesToIndex(const QStringList &paths, QLanguageServer *server);
void addOpenToUpdate(const QByteArray &);
void removeDirectory(const QString &path);
// void updateDocument(const OpenDocument &doc);
QString url2Path(const QByteArray &url, UrlLookup options = UrlLookup::Caching);
void newOpenFile(const QByteArray &url, int version, const QString &docText);
void newDocForOpenFile(const QByteArray &url, int version, const QString &docText);
void closeOpenFile(const QByteArray &url);
void setRootUrls(const QList<QByteArray> &urls);
QList<QByteArray> rootUrls() const;
void addRootUrls(const QList<QByteArray> &urls);
QStringList buildPathsForRootUrl(const QByteArray &url);
QStringList buildPathsForFileUrl(const QByteArray &url);
void setBuildPathsForRootUrl(QByteArray url, const QStringList &paths);
void removeRootUrls(const QList<QByteArray> &urls);
QQmlToolingSettings *settings();
Q_SIGNALS:
void updatedSnapshot(const QByteArray &url);
private:
void indexDirectory(const QString &path, int depthLeft);
int indexEvalProgress() const; // to be called in the mutex
void indexStart(); // to be called in the mutex
void indexEnd(); // to be called in the mutex
void indexSendProgress(int progress);
bool indexCancelled();
bool indexSome();
void addDirectory(const QString &path, int leftDepth);
bool openUpdateSome();
void openUpdateStart();
void openUpdateEnd();
void openUpdate(const QByteArray &);
mutable QMutex m_mutex;
State m_state = State::Running;
int m_lastIndexProgress = 0;
int m_nIndexInProgress = 0;
QList<ToIndex> m_toIndex;
int m_indexInProgressCost = 0;
int m_indexDoneCost = 0;
int m_nUpdateInProgress = 0;
QQmlJS::Dom::DomItem m_currentEnv;
QQmlJS::Dom::DomItem m_validEnv;
QByteArray m_lastOpenDocumentUpdated;
QSet<QByteArray> m_openDocumentsToUpdate;
QHash<QByteArray, QStringList> m_buildPathsForRootUrl;
QList<QByteArray> m_rootUrls;
QHash<QByteArray, QString> m_url2path;
QHash<QString, QByteArray> m_path2url;
QHash<QByteArray, OpenDocument> m_openDocuments;
QQmlToolingSettings *m_settings;
};
} // namespace QmlLsp
QT_END_NAMESPACE
#endif // QQMLCODEMODEL_H
|