LanguageClient: enable commit characters for completion items

While a completion is currently active a commit character can
automatically apply the current item and close the current completion
widget.

Change-Id: Ia962eed69684f8f13f54b88934c63700532103e7
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
David Schulz
2019-05-06 08:25:30 +02:00
parent 38c166ab74
commit d28a452053
2 changed files with 12 additions and 2 deletions

View File

@@ -191,6 +191,7 @@ static ClientCapabilities generateClientCapabilities()
TextDocumentClientCapabilities::CompletionCapabilities::CompletionItemCapbilities TextDocumentClientCapabilities::CompletionCapabilities::CompletionItemCapbilities
completionItemCapbilities; completionItemCapbilities;
completionItemCapbilities.setSnippetSupport(false); completionItemCapbilities.setSnippetSupport(false);
completionItemCapbilities.setCommitCharacterSupport(true);
completionCapabilities.setCompletionItem(completionItemCapbilities); completionCapabilities.setCompletionItem(completionItemCapbilities);
documentCapabilities.setCompletion(completionCapabilities); documentCapabilities.setCompletion(completionCapabilities);

View File

@@ -76,6 +76,7 @@ public:
private: private:
CompletionItem m_item; CompletionItem m_item;
mutable QChar m_triggeredCommitCharacter;
mutable QString m_sortText; mutable QString m_sortText;
}; };
@@ -89,8 +90,14 @@ QString LanguageClientCompletionItem::text() const
bool LanguageClientCompletionItem::implicitlyApplies() const bool LanguageClientCompletionItem::implicitlyApplies() const
{ return false; } { return false; }
bool LanguageClientCompletionItem::prematurelyApplies(const QChar &/*typedCharacter*/) const bool LanguageClientCompletionItem::prematurelyApplies(const QChar &typedCharacter) const
{ return false; } {
if (m_item.commitCharacters().has_value() && m_item.commitCharacters().value().contains(typedCharacter)) {
m_triggeredCommitCharacter = typedCharacter;
return true;
}
return false;
}
void LanguageClientCompletionItem::apply(TextDocumentManipulatorInterface &manipulator, void LanguageClientCompletionItem::apply(TextDocumentManipulatorInterface &manipulator,
int /*basePosition*/) const int /*basePosition*/) const
@@ -110,6 +117,8 @@ void LanguageClientCompletionItem::apply(TextDocumentManipulatorInterface &manip
for (const auto &edit : *additionalEdits) for (const auto &edit : *additionalEdits)
applyTextEdit(manipulator, edit); applyTextEdit(manipulator, edit);
} }
if (!m_triggeredCommitCharacter.isNull())
manipulator.insertCodeSnippet(manipulator.currentPosition(), m_triggeredCommitCharacter);
} }
QIcon LanguageClientCompletionItem::icon() const QIcon LanguageClientCompletionItem::icon() const