#pragma once #include "LibLsp/JsonRpc/RequestInMessage.h" #include "LibLsp/JsonRpc/lsResponseMessage.h" #include "LibLsp/lsp/lsTextDocumentPositionParams.h" #include "LibLsp/lsp/symbol.h" #include "LibLsp/lsp/lsAny.h" /** * The {@code textDocument/typeHierarchy} request is sent from the client to the * server to retrieve a {@link TypeHierarchyItem type hierarchy item} based on * the {@link TypeHierarchyParams cursor position in the text document}. This * request would also allow to specify if the item should be resolved and * whether sub- or supertypes are to be resolved. If no type hierarchy item can * be found under the given text document position, resolves to {@code null}. * *

* Note: the {@code textDocument/typeHierarchy} * language feature is not yet part of the official LSP specification. */ enum class TypeHierarchyDirection : uint32_t{ /** * Flag for retrieving/resolving the subtypes. Value: {@code 0}. */ Children = 0, /** * Flag to use when retrieving/resolving the supertypes. Value: {@code 1}. */ Parents =1, /** * Flag for resolving both the super- and subtypes. Value: {@code 2}. */ Both=2 }; void Reflect(Reader& reader, TypeHierarchyDirection& value); void Reflect(Writer& writer, TypeHierarchyDirection& value); struct TypeHierarchyParams :public lsTextDocumentPositionParams { boost::optional resolve; boost::optional direction ; MAKE_SWAP_METHOD(TypeHierarchyParams, textDocument, position, resolve, direction) }; MAKE_REFLECT_STRUCT(TypeHierarchyParams, textDocument, position, resolve, direction); /** * Representation of an item that carries type information (such as class, interface, enumeration, etc) with additional parentage details. */ struct TypeHierarchyItem { /** * The human readable name of the hierarchy item. */ std::string name; /** * Optional detail for the hierarchy item. It can be, for instance, the signature of a function or method. */ boost::optional detail; /** * The kind of the hierarchy item. For instance, class or interface. */ SymbolKind kind; /** * {@code true} if the hierarchy item is deprecated. Otherwise, {@code false}. It is {@code false} by default. */ boost::optional deprecated; /** * The URI of the text document where this type hierarchy item belongs to. */ lsDocumentUri uri; /** * The range enclosing this type hierarchy item not including leading/trailing whitespace but everything else * like comments. This information is typically used to determine if the clients cursor is inside the type * hierarchy item to reveal in the symbol in the UI. * * @see TypeHierarchyItem#selectionRange */ lsRange range; /** * The range that should be selected and revealed when this type hierarchy item is being picked, e.g the name of a function. * Must be contained by the the {@link TypeHierarchyItem#getRange range}. * * @see TypeHierarchyItem#range */ lsRange selectionRange; /** * If this type hierarchy item is resolved, it contains the direct parents. Could be empty if the item does not have any * direct parents. If not defined, the parents have not been resolved yet. */ boost::optional< std::vector > parents; /** * If this type hierarchy item is resolved, it contains the direct children of the current item. * Could be empty if the item does not have any descendants. If not defined, the children have not been resolved. */ boost::optional< std::vector > children; /** * An boost::optional data field can be used to identify a type hierarchy item in a resolve request. */ boost::optional data; MAKE_SWAP_METHOD(TypeHierarchyItem, name, detail, kind, deprecated, uri, range, selectionRange, parents, children, data) }; MAKE_REFLECT_STRUCT(TypeHierarchyItem, name, detail, kind, deprecated, uri, range, selectionRange, parents, children, data); DEFINE_REQUEST_RESPONSE_TYPE(td_typeHierarchy, TypeHierarchyParams, TypeHierarchyItem, "textDocument/typeHierarchy");