Skip to content

Commit 6402f83

Browse files
committed
Semantic tokens support
This adds support for semantic tokens. Concretely, that menas: - A bevy of new types, in `SemanticTokens.hs`. - Four new methods. - A number of utility functions for working with semantic tokens, based on what I expect any user of this functionality would need (absolute/relative token positions, encoding tokens into arrays, and producing deltas)
1 parent 6dd6ad6 commit 6402f83

File tree

15 files changed

+665
-5
lines changed

15 files changed

+665
-5
lines changed

lsp-test/src/Language/LSP/Test.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -603,7 +603,7 @@ applyEdit doc edit = do
603603

604604
let supportsDocChanges = fromMaybe False $ do
605605
let mWorkspace = caps ^. LSP.workspace
606-
C.WorkspaceClientCapabilities _ mEdit _ _ _ _ _ _ <- mWorkspace
606+
C.WorkspaceClientCapabilities _ mEdit _ _ _ _ _ _ _ <- mWorkspace
607607
C.WorkspaceEditClientCapabilities mDocChanges _ _ _ _ <- mEdit
608608
mDocChanges
609609

lsp-types/lsp-types.cabal

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ library
5555
, Language.LSP.Types.Rename
5656
, Language.LSP.Types.SelectionRange
5757
, Language.LSP.Types.ServerCapabilities
58+
, Language.LSP.Types.SemanticTokens
5859
, Language.LSP.Types.SignatureHelp
5960
, Language.LSP.Types.StaticRegistrationOptions
6061
, Language.LSP.Types.TextDocument
@@ -75,11 +76,14 @@ library
7576
, containers
7677
, data-default
7778
, deepseq
79+
, Diff
7880
, directory
81+
, dlist
7982
, filepath
8083
, hashable
8184
, hslogger
8285
, lens >= 4.15.2
86+
, mtl
8387
, network-uri
8488
, rope-utf16-splay >= 0.3.1.0
8589
, scientific

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ module Language.LSP.Types
3232
, module Language.LSP.Types.SignatureHelp
3333
, module Language.LSP.Types.StaticRegistrationOptions
3434
, module Language.LSP.Types.SelectionRange
35+
, module Language.LSP.Types.SemanticTokens
3536
, module Language.LSP.Types.TextDocument
3637
, module Language.LSP.Types.TypeDefinition
3738
, module Language.LSP.Types.Uri
@@ -74,6 +75,7 @@ import Language.LSP.Types.References
7475
import Language.LSP.Types.Registration
7576
import Language.LSP.Types.Rename
7677
import Language.LSP.Types.SelectionRange
78+
import Language.LSP.Types.SemanticTokens
7779
import Language.LSP.Types.SignatureHelp
7880
import Language.LSP.Types.StaticRegistrationOptions
7981
import Language.LSP.Types.TextDocument

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ capsForVersion (LSPVersion maj min) = ClientCapabilities (Just w) (Just td) (Jus
5151
(Just (ExecuteCommandClientCapabilities dynamicReg))
5252
(since 3 6 True)
5353
(since 3 6 True)
54+
(since 3 16 (SemanticTokensWorkspaceClientCapabilities $ Just True))
5455

5556
resourceOperations = List
5657
[ ResourceOperationCreate
@@ -103,6 +104,20 @@ capsForVersion (LSPVersion maj min) = ClientCapabilities (Just w) (Just td) (Jus
103104
, SkTypeParameter
104105
]
105106

107+
-- Only one token format for now, just list it here
108+
tfs = List [ TokenFormatRelative ]
109+
110+
semanticTokensCapabilities = SemanticTokensClientCapabilities
111+
(Just True)
112+
(SemanticTokensRequestsClientCapabilities
113+
(Just $ SemanticTokensRangeBool True)
114+
(Just (SemanticTokensFullDelta (SemanticTokensDeltaClientCapabilities $ Just True))))
115+
(List knownSemanticTokenTypes)
116+
(List knownSemanticTokenModifiers)
117+
tfs
118+
(Just True)
119+
(Just True)
120+
106121
td = TextDocumentClientCapabilities
107122
(Just sync)
108123
(Just completionCapability)
@@ -126,6 +141,8 @@ capsForVersion (LSPVersion maj min) = ClientCapabilities (Just w) (Just td) (Jus
126141
(Just publishDiagnosticsCapabilities)
127142
(since 3 10 foldingRangeCapability)
128143
(since 3 5 (SelectionRangeClientCapabilities dynamicReg))
144+
(since 3 16 semanticTokensCapabilities)
145+
129146
sync =
130147
TextDocumentSyncClientCapabilities
131148
dynamicReg

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import Language.LSP.Types.Implementation
2525
import Language.LSP.Types.References
2626
import Language.LSP.Types.Rename
2727
import Language.LSP.Types.SelectionRange
28+
import Language.LSP.Types.SemanticTokens
2829
import Language.LSP.Types.SignatureHelp
2930
import Language.LSP.Types.TextDocument
3031
import Language.LSP.Types.TypeDefinition
@@ -60,12 +61,18 @@ data WorkspaceClientCapabilities =
6061

6162
-- | The client supports `workspace/configuration` requests.
6263
, _configuration :: Maybe Bool
64+
65+
-- | Capabilities specific to the semantic token requests scoped to the
66+
-- workspace.
67+
--
68+
-- @since 3.16.0
69+
, _semanticTokens :: Maybe SemanticTokensWorkspaceClientCapabilities
6370
} deriving (Show, Read, Eq)
6471

6572
deriveJSON lspOptions ''WorkspaceClientCapabilities
6673

6774
instance Default WorkspaceClientCapabilities where
68-
def = WorkspaceClientCapabilities def def def def def def def def
75+
def = WorkspaceClientCapabilities def def def def def def def def def
6976

7077
-- -------------------------------------
7178

@@ -142,14 +149,19 @@ data TextDocumentClientCapabilities =
142149
-- | Capabilities specific to the `textDocument/selectionRange` request.
143150
-- Since LSP 3.15.0
144151
, _selectionRange :: Maybe SelectionRangeClientCapabilities
152+
153+
-- | Capabilities specific to the various semantic token requests.
154+
--
155+
-- @since 3.16.0
156+
, _semanticTokens :: Maybe SemanticTokensClientCapabilities
145157
} deriving (Show, Read, Eq)
146158

147159
deriveJSON lspOptions ''TextDocumentClientCapabilities
148160

149161
instance Default TextDocumentClientCapabilities where
150162
def = TextDocumentClientCapabilities def def def def def def def def
151163
def def def def def def def def
152-
def def def def def def
164+
def def def def def def def
153165

154166
-- ---------------------------------------------------------------------
155167

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ import Language.LSP.Types.WorkspaceEdit
5050
import Language.LSP.Types.WorkspaceFolders
5151
import Language.LSP.Types.WorkspaceSymbol
5252
import Language.LSP.Types.Message
53+
import Language.LSP.Types.SemanticTokens
5354
import Control.Lens.TH
5455

5556
-- TODO: This is out of date and very unmantainable, use TH to call all these!!
@@ -354,3 +355,15 @@ makeFieldsNoPrefix ''SignatureHelp
354355

355356
-- Static registration
356357
makeFieldsNoPrefix ''StaticRegistrationOptions
358+
359+
-- Semantic tokens
360+
makeFieldsNoPrefix ''SemanticTokensLegend
361+
makeFieldsNoPrefix ''SemanticTokensDeltaClientCapabilities
362+
makeFieldsNoPrefix ''SemanticTokensRequestsClientCapabilities
363+
makeFieldsNoPrefix ''SemanticTokensClientCapabilities
364+
makeFieldsNoPrefix ''SemanticTokens
365+
makeFieldsNoPrefix ''SemanticTokensPartialResult
366+
makeFieldsNoPrefix ''SemanticTokensEdit
367+
makeFieldsNoPrefix ''SemanticTokensDelta
368+
makeFieldsNoPrefix ''SemanticTokensDeltaPartialResult
369+
makeFieldsNoPrefix ''SemanticTokensWorkspaceClientCapabilities

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import Language.LSP.Types.Registration
4444
import Language.LSP.Types.Rename
4545
import Language.LSP.Types.References
4646
import Language.LSP.Types.SelectionRange
47+
import Language.LSP.Types.SemanticTokens
4748
import Language.LSP.Types.SignatureHelp
4849
import Language.LSP.Types.TextDocument
4950
import Language.LSP.Types.TypeDefinition
@@ -120,8 +121,13 @@ type family MessageParams (m :: Method f t) :: Type where
120121
MessageParams TextDocumentFoldingRange = FoldingRangeParams
121122
-- Selection Range
122123
MessageParams TextDocumentSelectionRange = SelectionRangeParams
124+
-- Semantic tokens
125+
MessageParams TextDocumentSemanticTokensFull = SemanticTokensParams
126+
MessageParams TextDocumentSemanticTokensFullDelta = SemanticTokensDeltaParams
127+
MessageParams TextDocumentSemanticTokensRange = SemanticTokensRangeParams
128+
MessageParams WorkspaceSemanticTokensRefresh = Empty
123129
-- Server
124-
-- Window
130+
-- Window
125131
MessageParams WindowShowMessage = ShowMessageParams
126132
MessageParams WindowShowMessageRequest = ShowMessageRequestParams
127133
MessageParams WindowLogMessage = LogMessageParams
@@ -193,6 +199,11 @@ type family ResponseResult (m :: Method f Request) :: Type where
193199
-- FoldingRange
194200
ResponseResult TextDocumentFoldingRange = List FoldingRange
195201
ResponseResult TextDocumentSelectionRange = List SelectionRange
202+
-- Semantic tokens
203+
ResponseResult TextDocumentSemanticTokensFull = Maybe SemanticTokens
204+
ResponseResult TextDocumentSemanticTokensFullDelta = Maybe (SemanticTokens |? SemanticTokensDelta)
205+
ResponseResult TextDocumentSemanticTokensRange = Maybe SemanticTokens
206+
ResponseResult WorkspaceSemanticTokensRefresh = Empty
196207
-- Custom can be either a notification or a message
197208
-- Server
198209
-- Window

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ data Method (f :: From) (t :: MethodType) where
7575
-- FoldingRange
7676
TextDocumentFoldingRange :: Method FromClient Request
7777
TextDocumentSelectionRange :: Method FromClient Request
78+
-- SemanticTokens
79+
TextDocumentSemanticTokensFull :: Method FromClient Request
80+
TextDocumentSemanticTokensFullDelta :: Method FromClient Request
81+
TextDocumentSemanticTokensRange :: Method FromClient Request
82+
WorkspaceSemanticTokensRefresh :: Method FromClient Request
7883

7984
-- ServerMethods
8085
-- Window
@@ -146,6 +151,11 @@ data SMethod (m :: Method f t) where
146151
STextDocumentFoldingRange :: SMethod TextDocumentFoldingRange
147152
STextDocumentSelectionRange :: SMethod TextDocumentSelectionRange
148153

154+
STextDocumentSemanticTokensFull :: SMethod TextDocumentSemanticTokensFull
155+
STextDocumentSemanticTokensFullDelta :: SMethod TextDocumentSemanticTokensFullDelta
156+
STextDocumentSemanticTokensRange :: SMethod TextDocumentSemanticTokensRange
157+
SWorkspaceSemanticTokensRefresh :: SMethod WorkspaceSemanticTokensRefresh
158+
149159
SWindowShowMessage :: SMethod WindowShowMessage
150160
SWindowShowMessageRequest :: SMethod WindowShowMessageRequest
151161
SWindowLogMessage :: SMethod WindowLogMessage
@@ -236,6 +246,7 @@ instance FromJSON SomeClientMethod where
236246
parseJSON (A.String "workspace/didChangeWatchedFiles") = pure $ SomeClientMethod SWorkspaceDidChangeWatchedFiles
237247
parseJSON (A.String "workspace/symbol") = pure $ SomeClientMethod SWorkspaceSymbol
238248
parseJSON (A.String "workspace/executeCommand") = pure $ SomeClientMethod SWorkspaceExecuteCommand
249+
parseJSON (A.String "workspace/semanticTokens/refresh") = pure $ SomeClientMethod SWorkspaceSemanticTokensRefresh
239250
-- Document
240251
parseJSON (A.String "textDocument/didOpen") = pure $ SomeClientMethod STextDocumentDidOpen
241252
parseJSON (A.String "textDocument/didChange") = pure $ SomeClientMethod STextDocumentDidChange
@@ -268,6 +279,9 @@ instance FromJSON SomeClientMethod where
268279
parseJSON (A.String "textDocument/prepareRename") = pure $ SomeClientMethod STextDocumentPrepareRename
269280
parseJSON (A.String "textDocument/foldingRange") = pure $ SomeClientMethod STextDocumentFoldingRange
270281
parseJSON (A.String "textDocument/selectionRange") = pure $ SomeClientMethod STextDocumentFoldingRange
282+
parseJSON (A.String "textDocument/semanticTokens/full") = pure $ SomeClientMethod STextDocumentSemanticTokensFull
283+
parseJSON (A.String "textDocument/semanticTokens/full/delta") = pure $ SomeClientMethod STextDocumentSemanticTokensFullDelta
284+
parseJSON (A.String "textDocument/semanticTokens/range") = pure $ SomeClientMethod STextDocumentSemanticTokensRange
271285
parseJSON (A.String "window/workDoneProgress/cancel") = pure $ SomeClientMethod SWindowWorkDoneProgressCancel
272286
-- Cancelling
273287
parseJSON (A.String "$/cancelRequest") = pure $ SomeClientMethod SCancelRequest
@@ -329,6 +343,7 @@ instance A.ToJSON (SMethod m) where
329343
toJSON SWorkspaceDidChangeWatchedFiles = A.String "workspace/didChangeWatchedFiles"
330344
toJSON SWorkspaceSymbol = A.String "workspace/symbol"
331345
toJSON SWorkspaceExecuteCommand = A.String "workspace/executeCommand"
346+
toJSON SWorkspaceSemanticTokensRefresh = A.String "workspace/semanticTokens/refresh"
332347
-- Document
333348
toJSON STextDocumentDidOpen = A.String "textDocument/didOpen"
334349
toJSON STextDocumentDidChange = A.String "textDocument/didChange"
@@ -359,6 +374,9 @@ instance A.ToJSON (SMethod m) where
359374
toJSON STextDocumentPrepareRename = A.String "textDocument/prepareRename"
360375
toJSON STextDocumentFoldingRange = A.String "textDocument/foldingRange"
361376
toJSON STextDocumentSelectionRange = A.String "textDocument/selectionRange"
377+
toJSON STextDocumentSemanticTokensFull = A.String "textDocument/semanticTokens/full"
378+
toJSON STextDocumentSemanticTokensFullDelta = A.String "textDocument/semanticTokens/full/delta"
379+
toJSON STextDocumentSemanticTokensRange = A.String "textDocument/semanticTokens/range"
362380
toJSON STextDocumentDocumentLink = A.String "textDocument/documentLink"
363381
toJSON SDocumentLinkResolve = A.String "documentLink/resolve"
364382
toJSON SWindowWorkDoneProgressCancel = A.String "window/workDoneProgress/cancel"

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,10 @@ splitClientMethod STextDocumentRename = IsClientReq
250250
splitClientMethod STextDocumentPrepareRename = IsClientReq
251251
splitClientMethod STextDocumentFoldingRange = IsClientReq
252252
splitClientMethod STextDocumentSelectionRange = IsClientReq
253+
splitClientMethod STextDocumentSemanticTokensFull = IsClientReq
254+
splitClientMethod STextDocumentSemanticTokensFullDelta = IsClientReq
255+
splitClientMethod STextDocumentSemanticTokensRange = IsClientReq
256+
splitClientMethod SWorkspaceSemanticTokensRefresh = IsClientReq
253257
splitClientMethod SCancelRequest = IsClientNot
254258
splitClientMethod SCustomMethod{} = IsClientEither
255259

0 commit comments

Comments
 (0)