Skip to content

Commit 2221206

Browse files
authored
Merge pull request #362 from michaelpj/mpj/more-caps
Add `window/showDocument` and some missing capabilities
2 parents 5ac9f86 + 4980d10 commit 2221206

File tree

12 files changed

+188
-13
lines changed

12 files changed

+188
-13
lines changed

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

+1
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ loggingNotification = named "Logging notification" $ satisfy shouldSkip
198198
shouldSkip (FromServerMess SWindowLogMessage _) = True
199199
shouldSkip (FromServerMess SWindowShowMessage _) = True
200200
shouldSkip (FromServerMess SWindowShowMessageRequest _) = True
201+
shouldSkip (FromServerMess SWindowShowDocument _) = True
201202
shouldSkip _ = False
202203

203204
-- | Matches a 'Language.LSP.Types.TextDocumentPublishDiagnostics'

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

+1
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ runSessionMonad context state (Session session) = runReaderT (runStateT conduit
231231

232232
isLogNotification (ServerMessage (FromServerMess SWindowShowMessage _)) = True
233233
isLogNotification (ServerMessage (FromServerMess SWindowLogMessage _)) = True
234+
isLogNotification (ServerMessage (FromServerMess SWindowShowDocument _)) = True
234235
isLogNotification _ = False
235236

236237
watchdog :: ConduitM SessionMessage FromServerMessage (StateT SessionState (ReaderT SessionContext IO)) ()

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

+11-2
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ data LSPVersion = LSPVersion Int Int -- ^ Construct a major.minor version
3535
-- * 3.4 extended completion item and symbol item kinds
3636
-- * 3.0 dynamic registration
3737
capsForVersion :: LSPVersion -> ClientCapabilities
38-
capsForVersion (LSPVersion maj min) = ClientCapabilities (Just w) (Just td) (Just window) Nothing
38+
capsForVersion (LSPVersion maj min) = ClientCapabilities (Just w) (Just td) (Just window) (since 3 16 general) Nothing
3939
where
4040
w = WorkspaceClientCapabilities
4141
(Just True)
@@ -278,4 +278,13 @@ capsForVersion (LSPVersion maj min) = ClientCapabilities (Just w) (Just td) (Jus
278278
| maj >= x && min >= y = Just a
279279
| otherwise = Nothing
280280

281-
window = WindowClientCapabilities (since 3 15 True)
281+
window =
282+
WindowClientCapabilities
283+
(since 3 15 True)
284+
(since 3 16 $ ShowMessageRequestClientCapabilities Nothing)
285+
(since 3 16 $ ShowDocumentClientCapabilities True)
286+
287+
general = GeneralClientCapabilities
288+
(since 3 16 $ StaleRequestClientCapabilities True (List []))
289+
(since 3 16 $ RegularExpressionsClientCapabilities "" Nothing)
290+
(since 3 16 $ MarkdownClientCapabilities "" Nothing)

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

+102-6
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ module Language.LSP.Types.ClientCapabilities where
66
import Data.Aeson.TH
77
import qualified Data.Aeson as A
88
import Data.Default
9+
import Data.Text (Text)
10+
911
import Language.LSP.Types.CallHierarchy
1012
import Language.LSP.Types.CodeAction
1113
import Language.LSP.Types.CodeLens
@@ -34,6 +36,8 @@ import Language.LSP.Types.Utils
3436
import Language.LSP.Types.WatchedFiles
3537
import Language.LSP.Types.WorkspaceEdit
3638
import Language.LSP.Types.WorkspaceSymbol
39+
import Language.LSP.Types.MarkupContent (MarkdownClientCapabilities)
40+
import Language.LSP.Types.Common (List)
3741

3842

3943
data WorkspaceClientCapabilities =
@@ -170,30 +174,122 @@ instance Default TextDocumentClientCapabilities where
170174

171175
-- ---------------------------------------------------------------------
172176

177+
-- | Capabilities specific to the `MessageActionItem` type.
178+
data MessageActionItemClientCapabilities =
179+
MessageActionItemClientCapabilities
180+
{
181+
-- | Whether the client supports additional attributes which
182+
-- are preserved and sent back to the server in the
183+
-- request's response.
184+
_additionalPropertiesSupport :: Maybe Bool
185+
} deriving (Show, Read, Eq)
186+
187+
deriveJSON lspOptions ''MessageActionItemClientCapabilities
188+
189+
-- | Show message request client capabilities
190+
data ShowMessageRequestClientCapabilities =
191+
ShowMessageRequestClientCapabilities
192+
{ -- | Capabilities specific to the `MessageActionItem` type.
193+
_messageActionItem :: Maybe MessageActionItemClientCapabilities
194+
} deriving (Show, Read, Eq)
195+
196+
deriveJSON lspOptions ''ShowMessageRequestClientCapabilities
197+
198+
-- | Client capabilities for the show document request.
199+
--
200+
-- @since 3.16.0
201+
data ShowDocumentClientCapabilities =
202+
ShowDocumentClientCapabilities
203+
{ -- | The client has support for the show document request
204+
_support :: Bool
205+
} deriving (Show, Read, Eq)
206+
207+
deriveJSON lspOptions ''ShowDocumentClientCapabilities
208+
173209
-- | Window specific client capabilities.
174210
data WindowClientCapabilities =
175211
WindowClientCapabilities
176212
{ -- | Whether client supports handling progress notifications.
213+
--
214+
-- @since 3.15.0
177215
_workDoneProgress :: Maybe Bool
216+
-- | Capabilities specific to the showMessage request
217+
--
218+
-- @since 3.16.0
219+
, _showMessage :: Maybe ShowMessageRequestClientCapabilities
220+
-- | Capabilities specific to the showDocument request
221+
--
222+
-- @since 3.16.0
223+
, _showDocument :: Maybe ShowDocumentClientCapabilities
178224
} deriving (Show, Read, Eq)
179225

180226
deriveJSON lspOptions ''WindowClientCapabilities
181227

182228
instance Default WindowClientCapabilities where
183-
def = WindowClientCapabilities def
229+
def = WindowClientCapabilities def def def
230+
231+
-- ---------------------------------------------------------------------
232+
233+
-- | Client capability that signals how the client
234+
-- handles stale requests (e.g. a request
235+
-- for which the client will not process the response
236+
-- anymore since the information is outdated).
237+
-- @since 3.17.0
238+
data StaleRequestClientCapabilities =
239+
StaleRequestClientCapabilities
240+
{ _cancel :: Bool
241+
, _retryOnContentModified :: List Text
242+
} deriving (Show, Read, Eq)
243+
244+
deriveJSON lspOptions ''StaleRequestClientCapabilities
245+
246+
-- | Client capabilities specific to the used markdown parser.
247+
-- @since 3.16.0
248+
data RegularExpressionsClientCapabilities =
249+
RegularExpressionsClientCapabilities
250+
{ _engine :: Text
251+
, _version :: Maybe Text
252+
} deriving (Show, Read, Eq)
253+
254+
deriveJSON lspOptions ''RegularExpressionsClientCapabilities
255+
256+
-- | General client capabilities.
257+
-- @since 3.16.0
258+
data GeneralClientCapabilities =
259+
GeneralClientCapabilities
260+
{
261+
_staleRequestSupport :: Maybe StaleRequestClientCapabilities
262+
-- | Client capabilities specific to regular expressions.
263+
-- @since 3.16.0
264+
, _regularExpressions :: Maybe RegularExpressionsClientCapabilities
265+
-- | Client capabilities specific to the client's markdown parser.
266+
-- @since 3.16.0
267+
, _markdown :: Maybe MarkdownClientCapabilities
268+
} deriving (Show, Read, Eq)
269+
270+
deriveJSON lspOptions ''GeneralClientCapabilities
271+
272+
instance Default GeneralClientCapabilities where
273+
def = GeneralClientCapabilities def def def
274+
275+
-- ---------------------------------------------------------------------
184276

185277
data ClientCapabilities =
186278
ClientCapabilities
187-
{ _workspace :: Maybe WorkspaceClientCapabilities
279+
{ -- | Workspace specific client capabilities
280+
_workspace :: Maybe WorkspaceClientCapabilities
281+
-- | Text document specific client capabilities
188282
, _textDocument :: Maybe TextDocumentClientCapabilities
189-
-- | Capabilities specific to `window/progress` requests. Experimental.
190-
--
191-
-- @since 0.10.0.0
283+
-- | Window specific client capabilities.
192284
, _window :: Maybe WindowClientCapabilities
285+
-- | General client capabilities.
286+
-- @since 3.16.0
287+
, _general :: Maybe GeneralClientCapabilities
288+
-- | Experimental client capabilities.
193289
, _experimental :: Maybe A.Object
194290
} deriving (Show, Read, Eq)
195291

196292
deriveJSON lspOptions ''ClientCapabilities
197293

198294
instance Default ClientCapabilities where
199-
def = ClientCapabilities def def def def
295+
def = ClientCapabilities def def def def def

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

+9
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@ import Control.Lens.TH
5757
-- TODO: This is out of date and very unmantainable, use TH to call all these!!
5858

5959
-- client capabilities
60+
makeFieldsNoPrefix ''MessageActionItemClientCapabilities
61+
makeFieldsNoPrefix ''ShowMessageRequestClientCapabilities
62+
makeFieldsNoPrefix ''ShowDocumentClientCapabilities
63+
makeFieldsNoPrefix ''StaleRequestClientCapabilities
64+
makeFieldsNoPrefix ''RegularExpressionsClientCapabilities
65+
makeFieldsNoPrefix ''GeneralClientCapabilities
6066
makeFieldsNoPrefix ''WorkspaceClientCapabilities
6167
makeFieldsNoPrefix ''WindowClientCapabilities
6268
makeFieldsNoPrefix ''ClientCapabilities
@@ -115,6 +121,7 @@ makeFieldsNoPrefix ''LocationLink
115121

116122
-- Markup
117123
makeFieldsNoPrefix ''MarkupContent
124+
makeFieldsNoPrefix ''MarkdownClientCapabilities
118125

119126
-- Completion
120127
makeFieldsNoPrefix ''CompletionDoc
@@ -335,6 +342,8 @@ makeFieldsNoPrefix ''TypeDefinitionClientCapabilities
335342
makeFieldsNoPrefix ''ShowMessageParams
336343
makeFieldsNoPrefix ''MessageActionItem
337344
makeFieldsNoPrefix ''ShowMessageRequestParams
345+
makeFieldsNoPrefix ''ShowDocumentParams
346+
makeFieldsNoPrefix ''ShowDocumentResult
338347
makeFieldsNoPrefix ''LogMessageParams
339348
makeFieldsNoPrefix ''ProgressParams
340349
makeFieldsNoPrefix ''WorkDoneProgressBeginParams

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

+9
Original file line numberDiff line numberDiff line change
@@ -100,3 +100,12 @@ instance Monoid MarkupContent where
100100

101101
-- ---------------------------------------------------------------------
102102

103+
-- | Client capabilities specific to the used markdown parser.
104+
-- @since 3.16.0
105+
data MarkdownClientCapabilities =
106+
MarkdownClientCapabilities
107+
{ _parser :: Text
108+
, _version :: Maybe Text
109+
} deriving (Show, Read, Eq)
110+
111+
deriveJSON lspOptions ''MarkdownClientCapabilities

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

+2
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ type family MessageParams (m :: Method f t) :: Type where
136136
-- Window
137137
MessageParams WindowShowMessage = ShowMessageParams
138138
MessageParams WindowShowMessageRequest = ShowMessageRequestParams
139+
MessageParams WindowShowDocument = ShowDocumentParams
139140
MessageParams WindowLogMessage = LogMessageParams
140141
-- Progress
141142
MessageParams WindowWorkDoneProgressCreate = WorkDoneProgressCreateParams
@@ -219,6 +220,7 @@ type family ResponseResult (m :: Method f Request) :: Type where
219220
-- Server
220221
-- Window
221222
ResponseResult WindowShowMessageRequest = Maybe MessageActionItem
223+
ResponseResult WindowShowDocument = ShowDocumentResult
222224
ResponseResult WindowWorkDoneProgressCreate = Empty
223225
-- Capability
224226
ResponseResult ClientRegisterCapability = Empty

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

+4
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ data Method (f :: From) (t :: MethodType) where
9090
-- Window
9191
WindowShowMessage :: Method FromServer Notification
9292
WindowShowMessageRequest :: Method FromServer Request
93+
WindowShowDocument :: Method FromServer Request
9394
WindowLogMessage :: Method FromServer Notification
9495
WindowWorkDoneProgressCancel :: Method FromClient Notification
9596
WindowWorkDoneProgressCreate :: Method FromServer Request
@@ -167,6 +168,7 @@ data SMethod (m :: Method f t) where
167168

168169
SWindowShowMessage :: SMethod WindowShowMessage
169170
SWindowShowMessageRequest :: SMethod WindowShowMessageRequest
171+
SWindowShowDocument :: SMethod WindowShowDocument
170172
SWindowLogMessage :: SMethod WindowLogMessage
171173
SWindowWorkDoneProgressCreate :: SMethod WindowWorkDoneProgressCreate
172174
SWindowWorkDoneProgressCancel :: SMethod WindowWorkDoneProgressCancel
@@ -307,6 +309,7 @@ instance A.FromJSON SomeServerMethod where
307309
-- Window
308310
parseJSON (A.String "window/showMessage") = pure $ SomeServerMethod SWindowShowMessage
309311
parseJSON (A.String "window/showMessageRequest") = pure $ SomeServerMethod SWindowShowMessageRequest
312+
parseJSON (A.String "window/showDocument") = pure $ SomeServerMethod SWindowShowDocument
310313
parseJSON (A.String "window/logMessage") = pure $ SomeServerMethod SWindowLogMessage
311314
parseJSON (A.String "window/workDoneProgress/create") = pure $ SomeServerMethod SWindowWorkDoneProgressCreate
312315
parseJSON (A.String "$/progress") = pure $ SomeServerMethod SProgress
@@ -400,6 +403,7 @@ instance A.ToJSON (SMethod m) where
400403
-- Window
401404
toJSON SWindowShowMessage = A.String "window/showMessage"
402405
toJSON SWindowShowMessageRequest = A.String "window/showMessageRequest"
406+
toJSON SWindowShowDocument = A.String "window/showDocument"
403407
toJSON SWindowLogMessage = A.String "window/logMessage"
404408
toJSON SWindowWorkDoneProgressCreate = A.String "window/workDoneProgress/create"
405409
toJSON SProgress = A.String "$/progress"

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

+1
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ splitClientMethod SCustomMethod{} = IsClientEither
267267
splitServerMethod :: SServerMethod m -> ServerNotOrReq m
268268
splitServerMethod SWindowShowMessage = IsServerNot
269269
splitServerMethod SWindowShowMessageRequest = IsServerReq
270+
splitServerMethod SWindowShowDocument = IsServerReq
270271
splitServerMethod SWindowLogMessage = IsServerNot
271272
splitServerMethod SWindowWorkDoneProgressCreate = IsServerReq
272273
splitServerMethod SProgress = IsServerNot

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

+43
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import qualified Data.Aeson as A
88
import Data.Aeson.TH
99
import Data.Text (Text)
1010
import Language.LSP.Types.Utils
11+
import Language.LSP.Types.Uri
12+
import Language.LSP.Types.Location
1113

1214
-- ---------------------------------------------------------------------
1315

@@ -62,6 +64,47 @@ deriveJSON lspOptions ''ShowMessageRequestParams
6264

6365
-- ---------------------------------------------------------------------
6466

67+
-- | Params to show a document.
68+
--
69+
-- @since 3.16.0
70+
data ShowDocumentParams =
71+
ShowDocumentParams {
72+
-- | The document uri to show.
73+
_uri :: Uri
74+
75+
-- | Indicates to show the resource in an external program.
76+
-- To show for example `https://code.visualstudio.com/`
77+
-- in the default WEB browser set `external` to `true`.
78+
, _external :: Maybe Bool
79+
80+
-- | An optional property to indicate whether the editor
81+
-- showing the document should take focus or not.
82+
-- Clients might ignore this property if an external
83+
-- program is started.
84+
, _takeFocus :: Maybe Bool
85+
86+
-- | An optional selection range if the document is a text
87+
-- document. Clients might ignore the property if an
88+
-- external program is started or the file is not a text
89+
-- file.
90+
, _selection :: Maybe Range
91+
} deriving (Show, Read, Eq)
92+
93+
deriveJSON lspOptions ''ShowDocumentParams
94+
95+
-- | The result of an show document request.
96+
--
97+
-- @since 3.16.0
98+
data ShowDocumentResult =
99+
ShowDocumentResult {
100+
-- | A boolean indicating if the show was successful.
101+
_success :: Bool
102+
} deriving (Show, Read, Eq)
103+
104+
deriveJSON lspOptions ''ShowDocumentResult
105+
106+
-- ---------------------------------------------------------------------
107+
65108
data LogMessageParams =
66109
LogMessageParams {
67110
_xtype :: MessageType

lsp/src/Language/LSP/Server/Core.hs

+3-3
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,7 @@ getWorkspaceFolders :: MonadLsp config m => m (Maybe [WorkspaceFolder])
473473
getWorkspaceFolders = do
474474
clientCaps <- getClientCapabilities
475475
let clientSupportsWfs = fromMaybe False $ do
476-
let (J.ClientCapabilities mw _ _ _) = clientCaps
476+
let (J.ClientCapabilities mw _ _ _ _) = clientCaps
477477
(J.WorkspaceClientCapabilities _ _ _ _ _ _ mwf _ _) <- mw
478478
mwf
479479
if clientSupportsWfs
@@ -654,8 +654,8 @@ withProgressBase indefinite title cancellable f = do
654654
WorkDoneProgressReportParams Nothing msg percentage
655655

656656
clientSupportsProgress :: J.ClientCapabilities -> Bool
657-
clientSupportsProgress (J.ClientCapabilities _ _ wc _) = fromMaybe False $ do
658-
(J.WindowClientCapabilities mProgress) <- wc
657+
clientSupportsProgress (J.ClientCapabilities _ _ wc _ _) = fromMaybe False $ do
658+
(J.WindowClientCapabilities mProgress _ _) <- wc
659659
mProgress
660660

661661
{-# INLINE clientSupportsProgress #-}

lsp/test/CapabilitiesSpec.hs

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ import Test.Hspec
77
spec :: Spec
88
spec = describe "capabilities" $ do
99
it "gives 3.10 capabilities" $
10-
let ClientCapabilities _ (Just tdcs) _ _ = capsForVersion (LSPVersion 3 10)
10+
let ClientCapabilities _ (Just tdcs) _ _ _ = capsForVersion (LSPVersion 3 10)
1111
Just (DocumentSymbolClientCapabilities _ _ mHierarchical _ _ ) = _documentSymbol tdcs
1212
in mHierarchical `shouldBe` Just True
1313
it "gives pre 3.10 capabilities" $
14-
let ClientCapabilities _ (Just tdcs) _ _ = capsForVersion (LSPVersion 3 9)
14+
let ClientCapabilities _ (Just tdcs) _ _ _ = capsForVersion (LSPVersion 3 9)
1515
Just (DocumentSymbolClientCapabilities _ _ mHierarchical _ _) = _documentSymbol tdcs
1616
in mHierarchical `shouldBe` Nothing

0 commit comments

Comments
 (0)