aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/languageserverprotocol/languagefeatures.cpp
diff options
context:
space:
mode:
authorDavid Schulz <[email protected]>2019-06-12 12:55:06 +0200
committerDavid Schulz <[email protected]>2019-06-21 08:37:11 +0000
commit307f1d8e6eb24a88c2113b6b03b3133092ff81b7 (patch)
tree33f14c95e59a902d4abab3569c6b04359ceed2c0 /src/libs/languageserverprotocol/languagefeatures.cpp
parentb6a9f0245b2aff4d9507a476203fba027ccd6cdb (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.cpp56
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