7#include <QtLanguageServer/private/qlanguageserverspectypes_p.h>
8#include <QtCore/qthreadpool.h>
9#include <QtCore/private/qduplicatetracker_p.h>
10#include <QtCore/QRegularExpression>
11#include <QtQmlDom/private/qqmldomexternalitems_p.h>
12#include <QtQmlDom/private/qqmldomtop_p.h>
13#include <QtQml/private/qqmlsignalnames_p.h>
31 std::optional<int> targetVersion;
43 :
BaseT(codeModel), m_completionEngine(codeModel->pluginLoader())
50 protocol->registerCompletionItemResolveRequestHandler(
51 [](
const QByteArray &,
const CompletionItem &cParams,
52 LSPResponse<CompletionItem> &&response) { response.sendResponse(cParams); });
57 return u
"QmlCompletionSupport"_s;
61 const QLspSpecification::InitializeParams &,
62 QLspSpecification::InitializeResult &serverCapabilities)
64 QLspSpecification::CompletionOptions cOptions;
65 if (serverCapabilities.capabilities.completionProvider)
66 cOptions = *serverCapabilities.capabilities.completionProvider;
67 cOptions.resolveProvider =
false;
68 cOptions.triggerCharacters = QList<QByteArray>({
QByteArray(
".") });
69 serverCapabilities.capabilities.completionProvider = cOptions;
98 [](
const QChar &
c) { return c == u
'\n' || c == u
'\r' || !c.isSpace(); });
100 return newline == code.
cend() || newline->isSpace();
119 <<
"Patching invalid document: adding a semicolon after '.' for "
135 result = newValue.fileObject();
137 newCurrentPtr->loadPendingDependencies();
141 qCWarning(QQmlLSCompletionLog) <<
"No valid document for completions for "
150 QList<CompletionItem>
res;
156 const bool useValidDoc =
164 if (std::shared_ptr<DomEnvironment> envPtr =
file.environment().ownerAs<
DomEnvironment>())
165 envPtr->clearReferenceCache();
172 if (itemsFound.size() > 1) {
174 for (
auto &
it : itemsFound)
175 paths.append(
it.domItem.canonicalPath().toString());
177 <<
" at the same depth:" <<
paths <<
"(using first)";
180 if (!itemsFound.isEmpty())
181 currentItem = itemsFound.first().domItem;
183 qCDebug(QQmlLSCompletionLog) <<
"No items found for completions at" <<
urlAndPos();
187 <<
"base:" <<
ctx.base() <<
"filter:" <<
ctx.filterChars()
192 auto result = completionEngine.completions(currentItem,
ctx);
qint64 size() const override
\reimp
Implements a server for the language server protocol.
Represents a consistent set of types organized in modules, it is the top level of the DOM.
void loadFile(const FileToLoad &file, const Callback &callback, std::optional< DomType > fileType=std::optional< DomType >(), const ErrorHandler &h=nullptr)
QString internalKindStr() const
DomItem fileObject(GoTo option=GoTo::Strict) const
Path canonicalPath() const
static FileToLoad fromMemory(const std::weak_ptr< DomEnvironment > &environment, const QString &path, const QString &data)
QQmlLSCompletion provides completions for all kinds of QML and JS constructs.
static QList< QQmlLSUtilsItemLocation > itemsFromTextLocation(const DomItem &file, int line, int character)
Find the DomItem representing the object situated in file at given line and character/column.
static qsizetype textOffsetFrom(const QString &code, int row, int character)
Convert a text position from (line, column) into an offset.
\macro QT_RESTRICTED_CAST_FROM_ASCII
QString sliced(qsizetype pos) const &
const_iterator cbegin() const
qsizetype size() const noexcept
Returns the number of characters in this string.
const_iterator cend() const
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
QString first(qsizetype n) const &
static QString number(int, int base=10)
This is an overloaded member function, provided for convenience. It differs from the above function o...
QString & append(QChar c)
QmlCompletionSupport(QmlLsp::QQmlCodeModel *codeModel)
QString name() const override
void registerHandlers(QLanguageServer *server, QLanguageServerProtocol *protocol) override
QQmlLSCompletion m_completionEngine
void setupCapabilities(const QLspSpecification::InitializeParams &clientInfo, QLspSpecification::InitializeResult &) override
void process(RequestPointerArgument req) override
std::optional< int > docVersion
std::optional< int > validDocVersion
QQmlJS::Dom::DomItem validDoc
std::shared_ptr< Utils::TextDocument > textDocument
OpenDocumentSnapshot snapshotByUrl(const QByteArray &url)
QSet< QString >::iterator it
Combined button and popup list for selecting options.
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
#define qCWarning(category,...)
#define qCDebug(category,...)
GLsizei const GLuint * paths
static bool positionIsFollowedBySpaces(qsizetype position, const QString &code)
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
void sendCompletions(const QList< QLspSpecification::CompletionItem > &completions)
DomItem patchInvalidFileForParser(const DomItem &file, qsizetype position) const
QString urlAndPos() const
QList< QLspSpecification::CompletionItem > completions(QmlLsp::OpenDocumentSnapshot &doc, const QQmlLSCompletion &completionEngine) const
bool fillFrom(QmlLsp::OpenDocument doc, const Parameters ¶ms, Response &&response)
decltype(auto) getRequestHandler()
QmlLsp::QQmlCodeModel * m_codeModel