qtdeclarative/tools/qmlls/qqmlcodemodel.h

129 lines
4.1 KiB
C++

// 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