2022-08-19 15:59:36 +02:00
|
|
|
// Copyright (C) 2018 The Qt Company Ltd.
|
|
|
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
|
2018-07-13 12:33:46 +02:00
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
2021-09-02 08:20:34 +02:00
|
|
|
#include "languageclient_global.h"
|
|
|
|
|
|
2021-06-18 16:30:03 +02:00
|
|
|
#include <languageserverprotocol/completion.h>
|
2021-09-15 15:30:50 +02:00
|
|
|
#include <texteditor/codeassist/assistproposaliteminterface.h>
|
2018-07-13 12:33:46 +02:00
|
|
|
#include <texteditor/codeassist/completionassistprovider.h>
|
2021-09-02 08:20:34 +02:00
|
|
|
#include <texteditor/codeassist/iassistprocessor.h>
|
2018-07-13 12:33:46 +02:00
|
|
|
|
2021-09-02 13:13:15 +02:00
|
|
|
#include <QPointer>
|
2022-11-07 12:02:07 +01:00
|
|
|
#include <QScopedPointer>
|
2021-09-02 13:13:15 +02:00
|
|
|
|
2021-06-18 16:30:03 +02:00
|
|
|
#include <functional>
|
2022-08-26 10:30:00 +02:00
|
|
|
#include <optional>
|
2021-06-18 16:30:03 +02:00
|
|
|
|
|
|
|
|
namespace TextEditor {
|
|
|
|
|
class IAssistProposal;
|
|
|
|
|
class TextDocumentManipulatorInterface;
|
|
|
|
|
}
|
|
|
|
|
|
2018-07-13 12:33:46 +02:00
|
|
|
namespace LanguageClient {
|
|
|
|
|
|
2019-01-31 12:15:43 +01:00
|
|
|
class Client;
|
2018-07-13 12:33:46 +02:00
|
|
|
|
2021-09-02 08:20:34 +02:00
|
|
|
class LANGUAGECLIENT_EXPORT LanguageClientCompletionAssistProvider
|
|
|
|
|
: public TextEditor::CompletionAssistProvider
|
2018-07-13 12:33:46 +02:00
|
|
|
{
|
2019-09-10 08:03:36 +02:00
|
|
|
Q_OBJECT
|
|
|
|
|
|
2018-07-13 12:33:46 +02:00
|
|
|
public:
|
2019-01-31 12:15:43 +01:00
|
|
|
LanguageClientCompletionAssistProvider(Client *client);
|
2018-07-13 12:33:46 +02:00
|
|
|
|
2021-09-15 07:04:12 +02:00
|
|
|
TextEditor::IAssistProcessor *createProcessor(const TextEditor::AssistInterface *) const override;
|
2018-07-13 12:33:46 +02:00
|
|
|
RunType runType() const override;
|
|
|
|
|
|
|
|
|
|
int activationCharSequenceLength() const override;
|
|
|
|
|
bool isActivationCharSequence(const QString &sequence) const override;
|
|
|
|
|
bool isContinuationChar(const QChar &) const override { return true; }
|
|
|
|
|
|
2022-08-26 10:30:00 +02:00
|
|
|
void setTriggerCharacters(const std::optional<QList<QString>> triggerChars);
|
2018-07-13 12:33:46 +02:00
|
|
|
|
2021-06-18 16:30:03 +02:00
|
|
|
void setSnippetsGroup(const QString &group) { m_snippetsGroup = group; }
|
|
|
|
|
|
2021-09-13 16:09:04 +02:00
|
|
|
protected:
|
|
|
|
|
Client *client() const { return m_client; }
|
|
|
|
|
|
2018-07-13 12:33:46 +02:00
|
|
|
private:
|
|
|
|
|
QList<QString> m_triggerChars;
|
2021-06-18 16:30:03 +02:00
|
|
|
QString m_snippetsGroup;
|
2018-07-13 12:33:46 +02:00
|
|
|
int m_activationCharSequenceLength = 0;
|
2019-01-29 13:20:58 +01:00
|
|
|
Client *m_client = nullptr; // not owned
|
2018-07-13 12:33:46 +02:00
|
|
|
};
|
|
|
|
|
|
2021-09-02 08:20:34 +02:00
|
|
|
class LANGUAGECLIENT_EXPORT LanguageClientCompletionAssistProcessor
|
|
|
|
|
: public TextEditor::IAssistProcessor
|
|
|
|
|
{
|
|
|
|
|
public:
|
2021-09-27 11:08:59 +02:00
|
|
|
LanguageClientCompletionAssistProcessor(Client *client, const QString &snippetsGroup);
|
2021-09-02 08:20:34 +02:00
|
|
|
~LanguageClientCompletionAssistProcessor() override;
|
|
|
|
|
TextEditor::IAssistProposal *perform(const TextEditor::AssistInterface *interface) override;
|
|
|
|
|
bool running() override;
|
|
|
|
|
bool needsRestart() const override { return true; }
|
|
|
|
|
void cancel() override;
|
|
|
|
|
|
2021-09-27 11:08:59 +02:00
|
|
|
protected:
|
|
|
|
|
QTextDocument *document() const;
|
|
|
|
|
Utils::FilePath filePath() const { return m_filePath; }
|
|
|
|
|
int basePos() const { return m_basePos; }
|
|
|
|
|
virtual QList<TextEditor::AssistProposalItemInterface *> generateCompletionItems(
|
|
|
|
|
const QList<LanguageServerProtocol::CompletionItem> &items) const;
|
|
|
|
|
|
2021-09-02 08:20:34 +02:00
|
|
|
private:
|
|
|
|
|
void handleCompletionResponse(const LanguageServerProtocol::CompletionRequest::Response &response);
|
|
|
|
|
|
2022-11-07 12:02:07 +01:00
|
|
|
QScopedPointer<const TextEditor::AssistInterface> m_assistInterface;
|
2021-09-02 08:20:34 +02:00
|
|
|
Utils::FilePath m_filePath;
|
|
|
|
|
QPointer<Client> m_client;
|
2022-08-26 10:30:00 +02:00
|
|
|
std::optional<LanguageServerProtocol::MessageId> m_currentRequest;
|
2021-09-02 08:20:34 +02:00
|
|
|
QMetaObject::Connection m_postponedUpdateConnection;
|
|
|
|
|
const QString m_snippetsGroup;
|
|
|
|
|
int m_pos = -1;
|
|
|
|
|
int m_basePos = -1;
|
|
|
|
|
};
|
|
|
|
|
|
2021-09-15 15:30:50 +02:00
|
|
|
class LANGUAGECLIENT_EXPORT LanguageClientCompletionItem
|
|
|
|
|
: public TextEditor::AssistProposalItemInterface
|
|
|
|
|
{
|
|
|
|
|
public:
|
2021-09-27 11:08:59 +02:00
|
|
|
LanguageClientCompletionItem(LanguageServerProtocol::CompletionItem item);
|
2021-09-15 15:30:50 +02:00
|
|
|
|
|
|
|
|
// AssistProposalItemInterface interface
|
|
|
|
|
QString text() const override;
|
|
|
|
|
QString filterText() const override;
|
|
|
|
|
bool implicitlyApplies() const override;
|
|
|
|
|
bool prematurelyApplies(const QChar &typedCharacter) const override;
|
|
|
|
|
void apply(TextEditor::TextDocumentManipulatorInterface &manipulator,
|
|
|
|
|
int basePosition) const override;
|
|
|
|
|
QIcon icon() const override;
|
|
|
|
|
QString detail() const override;
|
|
|
|
|
bool isSnippet() const override;
|
|
|
|
|
bool isValid() const override;
|
|
|
|
|
quint64 hash() const override;
|
|
|
|
|
|
2021-09-27 11:08:59 +02:00
|
|
|
LanguageServerProtocol::CompletionItem item() const;
|
|
|
|
|
QChar triggeredCommitCharacter() const;
|
|
|
|
|
|
2021-09-15 15:30:50 +02:00
|
|
|
const QString &sortText() const;
|
|
|
|
|
bool hasSortText() const;
|
|
|
|
|
|
|
|
|
|
bool operator <(const LanguageClientCompletionItem &other) const;
|
|
|
|
|
|
|
|
|
|
bool isPerfectMatch(int pos, QTextDocument *doc) const;
|
2022-06-17 09:48:54 +02:00
|
|
|
bool isDeprecated() const;
|
2021-09-15 15:30:50 +02:00
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
LanguageServerProtocol::CompletionItem m_item;
|
|
|
|
|
mutable QChar m_triggeredCommitCharacter;
|
|
|
|
|
mutable QString m_sortText;
|
|
|
|
|
mutable QString m_filterText;
|
|
|
|
|
};
|
|
|
|
|
|
2018-07-13 12:33:46 +02:00
|
|
|
} // namespace LanguageClient
|