// Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #pragma once #include "jsonkeys.h" #include "jsonobject.h" #include "jsonrpcmessages.h" #include "languageserverprotocol_global.h" #include "lsptypes.h" namespace lsp { struct LANGUAGESERVERPROTOCOL_EXPORT SemanticToken { int deltaLine = 0; int deltaStart = 0; int length = 0; int tokenIndex = 0; int tokenType = 0; int rawTokenModifiers = 0; int tokenModifiers = 0; }; class LANGUAGESERVERPROTOCOL_EXPORT SemanticTokensLegend : public JsonObject { public: using JsonObject::JsonObject; // The token types a server uses. QList tokenTypes() const { return array(tokenTypesKey); } void setTokenTypes(const QList &tokenTypes) { insertArray(tokenTypesKey, tokenTypes); } // The token modifiers a server uses. QList tokenModifiers() const { return array(tokenModifiersKey); } void setTokenModifiers(const QList &value) { insertArray(tokenModifiersKey, value); } bool isValid() const override; }; enum SemanticTokenTypes { namespaceToken, typeToken, classToken, enumToken, interfaceToken, structToken, typeParameterToken, parameterToken, variableToken, propertyToken, enumMemberToken, eventToken, functionToken, methodToken, macroToken, keywordToken, modifierToken, commentToken, stringToken, numberToken, regexpToken, operatorToken }; enum SemanticTokenModifiers { declarationModifier = 0x1, definitionModifier = 0x2, readonlyModifier = 0x4, staticModifier = 0x8, deprecatedModifier = 0x10, abstractModifier = 0x20, asyncModifier = 0x40, modificationModifier = 0x80, documentationModifier = 0x100, defaultLibraryModifier = 0x200 }; class LANGUAGESERVERPROTOCOL_EXPORT SemanticTokensParams : public JsonObject { public: using JsonObject::JsonObject; TextDocumentIdentifier textDocument() const { return typedValue(textDocumentKey); } void setTextDocument(const TextDocumentIdentifier &textDocument) { insert(textDocumentKey, textDocument); } bool isValid() const override { return contains(textDocumentKey); } }; class LANGUAGESERVERPROTOCOL_EXPORT SemanticTokensDeltaParams : public SemanticTokensParams { public: using SemanticTokensParams::SemanticTokensParams; QString previousResultId() const { return typedValue(previousResultIdKey); } void setPreviousResultId(const QString &previousResultId) { insert(previousResultIdKey, previousResultId); } bool isValid() const override; }; class LANGUAGESERVERPROTOCOL_EXPORT SemanticTokensRangeParams : public SemanticTokensParams { public: using SemanticTokensParams::SemanticTokensParams; Range range() const { return typedValue(rangeKey); } void setRange(const Range &range) { insert(rangeKey, range); } bool isValid() const override; }; class LANGUAGESERVERPROTOCOL_EXPORT SemanticTokens : public JsonObject { public: using JsonObject::JsonObject; /** * An optional result id. If provided and clients support delta updating * the client will include the result id in the next semantic token request. * A server can then instead of computing all semantic tokens again simply * send a delta. */ std::optional resultId() const { return optionalValue(resultIdKey); } void setResultId(const QString &resultId) { insert(resultIdKey, resultId); } void clearResultId() { remove(resultIdKey); } /// The actual tokens. QList data() const { return array(dataKey); } void setData(const QList &value) { insertArray(dataKey, value); } bool isValid() const override { return contains(dataKey); } QList toTokens(const QList &tokenTypes, const QList &tokenModifiers) const; static QMap defaultTokenTypesMap(); static QMap defaultTokenModifiersMap(); }; class LANGUAGESERVERPROTOCOL_EXPORT SemanticTokensResult : public std::variant { public: using variant::variant; explicit SemanticTokensResult(const QJsonValue &value); }; class LANGUAGESERVERPROTOCOL_EXPORT SemanticTokensFullRequest : public Request { public: explicit SemanticTokensFullRequest(const SemanticTokensParams ¶ms); using Request::Request; constexpr static const char methodName[] = "textDocument/semanticTokens/full"; }; class SemanticTokensEdit : public JsonObject { public: using JsonObject::JsonObject; int start() const { return typedValue(startKey); } void setStart(int start) { insert(startKey, start); } int deleteCount() const { return typedValue(deleteCountKey); } void setDeleteCount(int deleteCount) { insert(deleteCountKey, deleteCount); } std::optional> data() const { return optionalArray(dataKey); } void setData(const QList &value) { insertArray(dataKey, value); } void clearData() { remove(dataKey); } int dataSize() const { return contains(dataKey) ? value(dataKey).toArray().size() : 0; } bool isValid() const override { return contains(dataKey) && contains(deleteCountKey); } }; class SemanticTokensDelta : public JsonObject { public: using JsonObject::JsonObject; QString resultId() const { return typedValue(resultIdKey); } void setResultId(const QString &resultId) { insert(resultIdKey, resultId); } QList edits() const { return array(editsKey); } void setEdits(const QList &edits) { insertArray(editsKey, edits); } bool isValid() const override { return contains(resultIdKey) && contains(editsKey); } }; class LANGUAGESERVERPROTOCOL_EXPORT SemanticTokensDeltaResult : public std::variant { public: using variant::variant; explicit SemanticTokensDeltaResult(const QJsonValue &value); }; class LANGUAGESERVERPROTOCOL_EXPORT SemanticTokensFullDeltaRequest : public Request { public: explicit SemanticTokensFullDeltaRequest(const SemanticTokensDeltaParams ¶ms); using Request::Request; constexpr static const char methodName[] = "textDocument/semanticTokens/full/delta"; }; class LANGUAGESERVERPROTOCOL_EXPORT SemanticTokensRangeRequest : public Request { public: explicit SemanticTokensRangeRequest(const SemanticTokensRangeParams ¶ms); using Request::Request; constexpr static const char methodName[] = "textDocument/semanticTokens/range"; }; class LANGUAGESERVERPROTOCOL_EXPORT SemanticTokensRefreshRequest : public Request { public: explicit SemanticTokensRefreshRequest(); using Request::Request; constexpr static const char methodName[] = "workspace/semanticTokens/refresh"; }; } // namespace lsp