diff options
author | David Schulz <[email protected]> | 2019-06-12 12:55:06 +0200 |
---|---|---|
committer | David Schulz <[email protected]> | 2019-06-21 08:37:11 +0000 |
commit | 307f1d8e6eb24a88c2113b6b03b3133092ff81b7 (patch) | |
tree | 33f14c95e59a902d4abab3569c6b04359ceed2c0 /src/libs/languageserverprotocol/languagefeatures.cpp | |
parent | b6a9f0245b2aff4d9507a476203fba027ccd6cdb (diff) |
LanguageClient: add support for proposed semantic highlight
implements the current proposal for the semantic highlighting
via the language server protocol.
https://github.com/microsoft/vscode-languageserver-node/pull/367
Change-Id: I857d606fcf5c782e0ea8e18e5d098edd26286aed
Reviewed-by: Nikolai Kosjar <[email protected]>
Diffstat (limited to 'src/libs/languageserverprotocol/languagefeatures.cpp')
-rw-r--r-- | src/libs/languageserverprotocol/languagefeatures.cpp | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/libs/languageserverprotocol/languagefeatures.cpp b/src/libs/languageserverprotocol/languagefeatures.cpp index cfb4cc6fabd..f66b6b7e164 100644 --- a/src/libs/languageserverprotocol/languagefeatures.cpp +++ b/src/libs/languageserverprotocol/languagefeatures.cpp @@ -48,6 +48,7 @@ constexpr const char DocumentRangeFormattingRequest::methodName[]; constexpr const char DocumentOnTypeFormattingRequest::methodName[]; constexpr const char RenameRequest::methodName[]; constexpr const char SignatureHelpRequest::methodName[]; +constexpr const char SemanticHighlightNotification::methodName[]; HoverContent LanguageServerProtocol::Hover::content() const { @@ -441,4 +442,59 @@ bool CodeAction::isValid(QStringList *error) const && checkOptional<Command>(error, commandKey); } +Utils::optional<QList<SemanticHighlightToken>> SemanticHighlightingInformation::tokens() const +{ + QList<SemanticHighlightToken> resultTokens; + + const QByteArray tokensByteArray = QByteArray::fromBase64( + typedValue<QString>(tokensKey).toLocal8Bit()); + constexpr int tokensByteSize = 8; + int index = 0; + while (index + tokensByteSize <= tokensByteArray.size()) { + resultTokens << SemanticHighlightToken(tokensByteArray.mid(index, tokensByteSize)); + index += tokensByteSize; + } + return Utils::make_optional(resultTokens); +} + +void SemanticHighlightingInformation::setTokens(const QList<SemanticHighlightToken> &tokens) +{ + QByteArray byteArray; + byteArray.reserve(8 * tokens.size()); + for (const SemanticHighlightToken &token : tokens) + token.appendToByteArray(byteArray); + insert(tokensKey, QString::fromLocal8Bit(byteArray.toBase64())); +} + +SemanticHighlightToken::SemanticHighlightToken(const QByteArray &token) +{ + QTC_ASSERT(token.size() == 8, return ); + character = ( quint32(token.at(0)) << 24 + | quint32(token.at(1)) << 16 + | quint32(token.at(2)) << 8 + | quint32(token.at(3))); + + length = quint16(token.at(4) << 8 | token.at(5)); + + scope = quint16(token.at(6) << 8 | token.at(7)); +} + +void SemanticHighlightToken::appendToByteArray(QByteArray &byteArray) const +{ + byteArray.append(char((character & 0xff000000) >> 24)); + byteArray.append(char((character & 0x00ff0000) >> 16)); + byteArray.append(char((character & 0x0000ff00) >> 8)); + byteArray.append(char((character & 0x000000ff))); + byteArray.append(char((length & 0xff00) >> 8)); + byteArray.append(char((length & 0x00ff))); + byteArray.append(char((scope & 0xff00) >> 8)); + byteArray.append(char((scope & 0x00ff))); +} + +bool SemanticHighlightingParams::isValid(QStringList *error) const +{ + return check<VersionedTextDocumentIdentifier>(error, textDocumentKey) + && checkArray<SemanticHighlightingInformation>(error, linesKey); +} + } // namespace LanguageServerProtocol |