Skip to content

Commit 6068656

Browse files
authored
Add tag support for DocumentSymbol, SymbolInformation, and document symbol provider label (#301)
* Add tag support for DocumentSymbol, SymbolInformation, and document symbol provider label * WorkspaceSymbol tag support
1 parent cd5708b commit 6068656

File tree

6 files changed

+73
-7
lines changed

6 files changed

+73
-7
lines changed

example/Reactor.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ handle = mconcat
246246
liftIO $ debugM "reactor.handle" "Processing a textDocument/documentSymbol request"
247247
let J.DocumentSymbolParams _ _ doc = req ^. J.params
248248
loc = J.Location (doc ^. J.uri) (J.Range (J.Position 0 0) (J.Position 0 0))
249-
sym = J.SymbolInformation "lsp-hello" J.SkFunction Nothing loc Nothing
249+
sym = J.SymbolInformation "lsp-hello" J.SkFunction Nothing Nothing loc Nothing
250250
rsp = J.InR (J.List [sym])
251251
responder (Right rsp)
252252

lsp-test/test/DummyServer.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ handlers =
6868
Nothing
6969
SkObject
7070
Nothing
71+
Nothing
7172
(mkRange 0 0 3 6)
7273
(mkRange 0 0 3 6)
7374
Nothing

lsp-types/src/Language/LSP/Types/Capabilities.hs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,14 @@ capsForVersion (LSPVersion maj min) = ClientCapabilities (Just w) (Just td) (Jus
5959
symbolCapabilities = WorkspaceSymbolClientCapabilities
6060
dynamicReg
6161
(since 3 4 symbolKindCapabilities)
62+
(since 3 16 symbolTagCapabilities)
6263

6364
symbolKindCapabilities =
6465
WorkspaceSymbolKindClientCapabilities (Just sKs)
6566

67+
symbolTagCapabilities =
68+
WorkspaceSymbolTagClientCapabilities (Just (List [StDeprecated]))
69+
6670
sKs
6771
| maj >= 3 && min >= 4 = List (oldSKs ++ newSKs)
6872
| otherwise = List oldSKs
@@ -224,11 +228,16 @@ capsForVersion (LSPVersion maj min) = ClientCapabilities (Just w) (Just td) (Jus
224228
dynamicReg
225229
(since 3 4 documentSymbolKind)
226230
(since 3 10 True)
231+
(since 3 16 documentSymbolTag)
232+
(since 3 16 True)
227233

228234
documentSymbolKind =
229235
DocumentSymbolKindClientCapabilities
230236
(Just sKs) -- same as workspace symbol kinds
231237

238+
documentSymbolTag =
239+
DocumentSymbolTagClientCapabilities (Just (List [StDeprecated]))
240+
232241
foldingRangeCapability =
233242
FoldingRangeClientCapabilities
234243
dynamicReg

lsp-types/src/Language/LSP/Types/DocumentSymbol.hs

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ import Language.LSP.Types.Utils
1515

1616
-- ---------------------------------------------------------------------
1717

18-
makeExtendingDatatype "DocumentSymbolOptions" [''WorkDoneProgressOptions] []
18+
makeExtendingDatatype "DocumentSymbolOptions"
19+
[''WorkDoneProgressOptions]
20+
[ ("_label", [t| Maybe Bool |])]
1921
deriveJSON lspOptions ''DocumentSymbolOptions
2022

2123
makeExtendingDatatype "DocumentSymbolRegistrationOptions"
@@ -123,6 +125,25 @@ instance FromJSON SymbolKind where
123125
parseJSON (Number 26) = pure SkTypeParameter
124126
parseJSON (Number x) = pure (SkUnknown x)
125127
parseJSON _ = mempty
128+
129+
{-|
130+
Symbol tags are extra annotations that tweak the rendering of a symbol.
131+
132+
@since 3.16.0
133+
-}
134+
data SymbolTag =
135+
StDeprecated -- ^ Render a symbol as obsolete, usually using a strike-out.
136+
| StUnknown Scientific
137+
deriving (Read, Show, Eq)
138+
139+
instance ToJSON SymbolTag where
140+
toJSON StDeprecated = Number 1
141+
toJSON (StUnknown x) = Number x
142+
143+
instance FromJSON SymbolTag where
144+
parseJSON (Number 1) = pure StDeprecated
145+
parseJSON (Number x) = pure (StUnknown x)
146+
parseJSON _ = mempty
126147

127148
-- -------------------------------------
128149

@@ -142,18 +163,36 @@ data DocumentSymbolKindClientCapabilities =
142163

143164
deriveJSON lspOptions ''DocumentSymbolKindClientCapabilities
144165

166+
data DocumentSymbolTagClientCapabilities =
167+
DocumentSymbolTagClientCapabilities
168+
{ -- | The tags supported by the client.
169+
_valueSet :: Maybe (List SymbolTag)
170+
}
171+
deriving (Show, Read, Eq)
172+
173+
deriveJSON lspOptions ''DocumentSymbolTagClientCapabilities
174+
145175
data DocumentSymbolClientCapabilities =
146176
DocumentSymbolClientCapabilities
147177
{ -- | Whether document symbol supports dynamic registration.
148178
_dynamicRegistration :: Maybe Bool
149179
-- | Specific capabilities for the `SymbolKind`.
150180
, _symbolKind :: Maybe DocumentSymbolKindClientCapabilities
151181
, _hierarchicalDocumentSymbolSupport :: Maybe Bool
182+
-- | The client supports tags on `SymbolInformation`.
183+
-- Clients supporting tags have to handle unknown tags gracefully.
184+
--
185+
-- @since 3.16.0
186+
, _tagSupport :: Maybe DocumentSymbolTagClientCapabilities
187+
-- | The client supports an additional label presented in the UI when
188+
-- registering a document symbol provider.
189+
--
190+
-- @since 3.16.0
191+
, _labelSupport :: Maybe Bool
152192
} deriving (Show, Read, Eq)
153193

154194
deriveJSON lspOptions ''DocumentSymbolClientCapabilities
155195

156-
157196
-- ---------------------------------------------------------------------
158197

159198
-- | Represents programming constructs like variables, classes, interfaces etc.
@@ -167,7 +206,8 @@ data DocumentSymbol =
167206
-- provided the name is used.
168207
, _detail :: Maybe Text
169208
, _kind :: SymbolKind -- ^ The kind of this symbol.
170-
, _deprecated :: Maybe Bool -- ^ Indicates if this symbol is deprecated.
209+
, _tags :: Maybe (List SymbolTag) -- ^ Tags for this document symbol.
210+
, _deprecated :: Maybe Bool -- ^ Indicates if this symbol is deprecated. Deprecated, use tags instead.
171211
-- | The range enclosing this symbol not including leading/trailing
172212
-- whitespace but everything else like comments. This information is
173213
-- typically used to determine if the the clients cursor is inside the symbol
@@ -190,7 +230,8 @@ data SymbolInformation =
190230
SymbolInformation
191231
{ _name :: Text -- ^ The name of this symbol.
192232
, _kind :: SymbolKind -- ^ The kind of this symbol.
193-
, _deprecated :: Maybe Bool -- ^ Indicates if this symbol is deprecated.
233+
, _tags :: Maybe (List SymbolTag) -- ^ Tags for this symbol.
234+
, _deprecated :: Maybe Bool -- ^ Indicates if this symbol is deprecated. Deprecated, use tags instead.
194235
-- | The location of this symbol. The location's range is used by a tool
195236
-- to reveal the location in the editor. If the symbol is selected in the
196237
-- tool the range's start information is used to position the cursor. So
@@ -207,5 +248,6 @@ data SymbolInformation =
207248
-- symbols.
208249
, _containerName :: Maybe Text
209250
} deriving (Read,Show,Eq)
251+
{-# DEPRECATED _deprecated "Use tags instead" #-}
210252

211253
deriveJSON lspOptions ''SymbolInformation

lsp-types/src/Language/LSP/Types/WorkspaceSymbol.hs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,15 @@ data WorkspaceSymbolKindClientCapabilities =
2626

2727
deriveJSON lspOptions ''WorkspaceSymbolKindClientCapabilities
2828

29+
data WorkspaceSymbolTagClientCapabilities =
30+
WorkspaceSymbolTagClientCapabilities
31+
{ -- | The tags supported by the client.
32+
_valueSet :: Maybe (List SymbolTag)
33+
}
34+
deriving (Show, Read, Eq)
35+
36+
deriveJSON lspOptions ''WorkspaceSymbolTagClientCapabilities
37+
2938
instance Default WorkspaceSymbolKindClientCapabilities where
3039
def = WorkspaceSymbolKindClientCapabilities (Just $ List allKinds)
3140
where allKinds = [ SkFile
@@ -53,6 +62,11 @@ data WorkspaceSymbolClientCapabilities =
5362
{ _dynamicRegistration :: Maybe Bool -- ^Symbol request supports dynamic
5463
-- registration.
5564
, _symbolKind :: Maybe WorkspaceSymbolKindClientCapabilities -- ^ Specific capabilities for the `SymbolKind`.
65+
-- | The client supports tags on `SymbolInformation`.
66+
-- Clients supporting tags have to handle unknown tags gracefully.
67+
--
68+
-- @since 3.16.0
69+
, _tagSupport :: Maybe WorkspaceSymbolTagClientCapabilities
5670
} deriving (Show, Read, Eq)
5771

5872
deriveJSON lspOptions ''WorkspaceSymbolClientCapabilities

test/CapabilitiesSpec.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ spec :: Spec
88
spec = describe "capabilities" $ do
99
it "gives 3.10 capabilities" $
1010
let ClientCapabilities _ (Just tdcs) _ _ = capsForVersion (LSPVersion 3 10)
11-
Just (DocumentSymbolClientCapabilities _ _ mHierarchical) = _documentSymbol tdcs
11+
Just (DocumentSymbolClientCapabilities _ _ mHierarchical _ _ ) = _documentSymbol tdcs
1212
in mHierarchical `shouldBe` Just True
1313
it "gives pre 3.10 capabilities" $
1414
let ClientCapabilities _ (Just tdcs) _ _ = capsForVersion (LSPVersion 3 9)
15-
Just (DocumentSymbolClientCapabilities _ _ mHierarchical) = _documentSymbol tdcs
15+
Just (DocumentSymbolClientCapabilities _ _ mHierarchical _ _) = _documentSymbol tdcs
1616
in mHierarchical `shouldBe` Nothing

0 commit comments

Comments
 (0)