Skip to content

Commit 99131d6

Browse files
committed
Tag kinds in JSON only
1 parent 5c3d374 commit 99131d6

File tree

3 files changed

+63
-35
lines changed

3 files changed

+63
-35
lines changed

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,6 @@ makeFieldsNoPrefix ''DocumentFilter
257257
makeFieldsNoPrefix ''TextEdit
258258
makeFieldsNoPrefix ''VersionedTextDocumentIdentifier
259259
makeFieldsNoPrefix ''TextDocumentEdit
260-
makeFieldsNoPrefix ''FileResourceChangeKind
261260
makeFieldsNoPrefix ''CreateFileOptions
262261
makeFieldsNoPrefix ''CreateFile
263262
makeFieldsNoPrefix ''RenameFileOptions

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

Lines changed: 60 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@
22
{-# LANGUAGE TemplateHaskell #-}
33
{-# LANGUAGE TypeOperators #-}
44
{-# LANGUAGE OverloadedStrings #-}
5+
{-# LANGUAGE RecordWildCards #-}
56

67
module Language.LSP.Types.WorkspaceEdit where
78

9+
import Control.Monad (unless)
810
import Data.Aeson
911
import Data.Aeson.TH
1012
import qualified Data.HashMap.Strict as H
13+
import Data.Maybe (catMaybes)
1114
import Data.Text (Text)
1215
import qualified Data.Text as T
1316

@@ -40,25 +43,6 @@ deriveJSON lspOptions ''TextDocumentEdit
4043

4144
-- ---------------------------------------------------------------------
4245

43-
-- | For tagging `CreateFile`/`RenameFile`/`DeleteFile`
44-
-- Should this be merged with `ResourceOperationKind` ?
45-
data FileResourceChangeKind
46-
= FileResourceChangeCreate
47-
| FileResourceChangeRename
48-
| FileResourceChangeDelete
49-
deriving (Read, Show, Eq)
50-
51-
instance ToJSON FileResourceChangeKind where
52-
toJSON FileResourceChangeCreate = String "create"
53-
toJSON FileResourceChangeRename = String "rename"
54-
toJSON FileResourceChangeDelete = String "delete"
55-
56-
instance FromJSON FileResourceChangeKind where
57-
parseJSON (String "create") = pure FileResourceChangeCreate
58-
parseJSON (String "rename") = pure FileResourceChangeRename
59-
parseJSON (String "delete") = pure FileResourceChangeDelete
60-
parseJSON _ = mempty
61-
6246
-- | Options to create a file.
6347
data CreateFileOptions =
6448
CreateFileOptions
@@ -73,14 +57,28 @@ deriveJSON lspOptions ''CreateFileOptions
7357
-- | Create file operation
7458
data CreateFile =
7559
CreateFile
76-
{ _kind :: FileResourceChangeKind
77-
-- | The resource to create.
78-
, _uri :: Text
60+
{ -- | The resource to create.
61+
_uri :: Text
7962
-- | Additional options
8063
, _options :: Maybe CreateFileOptions
8164
} deriving (Show, Read, Eq)
8265

83-
deriveJSON lspOptions ''CreateFile
66+
instance ToJSON CreateFile where
67+
toJSON CreateFile{..} =
68+
object $ catMaybes
69+
[ Just $ "kind" .= ("create" :: Text)
70+
, Just $ "uri" .= _uri
71+
, ("options" .=) <$> _options
72+
]
73+
74+
instance FromJSON CreateFile where
75+
parseJSON = withObject "CreateFile" $ \o -> do
76+
kind <- o .: "kind"
77+
unless (kind == ("create" :: Text))
78+
$ fail $ "Expected kind \"create\" but got " ++ show kind
79+
_uri <- o .: "uri"
80+
_options <- o .:? "options"
81+
pure CreateFile{..}
8482

8583
-- Rename file options
8684
data RenameFileOptions =
@@ -96,16 +94,32 @@ deriveJSON lspOptions ''RenameFileOptions
9694
-- | Rename file operation
9795
data RenameFile =
9896
RenameFile
99-
{ _kind :: FileResourceChangeKind
100-
-- | The old (existing) location.
101-
, _oldUri :: Text
97+
{ -- | The old (existing) location.
98+
_oldUri :: Text
10299
-- | The new location.
103100
, _newUri :: Text
104101
-- | Rename options.
105102
, _options :: Maybe RenameFileOptions
106103
} deriving (Show, Read, Eq)
107104

108-
deriveJSON lspOptions ''RenameFile
105+
instance ToJSON RenameFile where
106+
toJSON RenameFile{..} =
107+
object $ catMaybes
108+
[ Just $ "kind" .= ("rename" :: Text)
109+
, Just $ "oldUri" .= _oldUri
110+
, Just $ "newUri" .= _newUri
111+
, ("options" .=) <$> _options
112+
]
113+
114+
instance FromJSON RenameFile where
115+
parseJSON = withObject "RenameFile" $ \o -> do
116+
kind <- o .: "kind"
117+
unless (kind == ("rename" :: Text))
118+
$ fail $ "Expected kind \"rename\" but got " ++ show kind
119+
_oldUri <- o .: "oldUri"
120+
_newUri <- o .: "newUri"
121+
_options <- o .:? "options"
122+
pure RenameFile{..}
109123

110124
-- Delete file options
111125
data DeleteFileOptions =
@@ -121,14 +135,29 @@ deriveJSON lspOptions ''DeleteFileOptions
121135
-- | Delete file operation
122136
data DeleteFile =
123137
DeleteFile
124-
{ _kind :: FileResourceChangeKind
125-
-- | The file to delete.
126-
, _uri :: Text
138+
{ -- | The file to delete.
139+
_uri :: Text
127140
-- | Delete options.
128141
, _options :: Maybe DeleteFileOptions
129142
} deriving (Show, Read, Eq)
130143

131-
deriveJSON lspOptions ''DeleteFile
144+
instance ToJSON DeleteFile where
145+
toJSON DeleteFile{..} =
146+
object $ catMaybes
147+
[ Just $ "kind" .= ("delete" :: Text)
148+
, Just $ "uri" .= _uri
149+
, ("options" .=) <$> _options
150+
]
151+
152+
instance FromJSON DeleteFile where
153+
parseJSON = withObject "DeleteFile" $ \o -> do
154+
kind <- o .: "kind"
155+
unless (kind == ("delete" :: Text))
156+
$ fail $ "Expected kind \"delete\" but got " ++ show kind
157+
_uri <- o .: "uri"
158+
_options <- o .:? "options"
159+
pure DeleteFile{..}
160+
132161

133162
-- ---------------------------------------------------------------------
134163

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ updateVFS f vfs@VFS{vfsMap} = vfs { vfsMap = f vfsMap }
130130
-- ---------------------------------------------------------------------
131131

132132
applyCreateFile :: J.CreateFile -> VFS -> VFS
133-
applyCreateFile (J.CreateFile _ uri options) =
133+
applyCreateFile (J.CreateFile uri options) =
134134
updateVFS $ Map.insertWith
135135
(\ new old -> if shouldOverwrite then new else old)
136136
(J.toNormalizedUri (J.Uri uri))
@@ -150,7 +150,7 @@ applyCreateFile (J.CreateFile _ uri options) =
150150
Just (J.CreateFileOptions (Just False) (Just False)) -> False -- `overwrite` wins over `ignoreIfExists`
151151

152152
applyRenameFile :: J.RenameFile -> VFS -> VFS
153-
applyRenameFile (J.RenameFile _ oldUri' newUri' options) vfs =
153+
applyRenameFile (J.RenameFile oldUri' newUri' options) vfs =
154154
let oldUri = J.toNormalizedUri (J.Uri oldUri')
155155
newUri = J.toNormalizedUri (J.Uri newUri')
156156
in case Map.lookup oldUri (vfsMap vfs) of
@@ -178,7 +178,7 @@ applyRenameFile (J.RenameFile _ oldUri' newUri' options) vfs =
178178

179179
-- NOTE: we are ignoring the `recursive` option here because we don't know which file is a directory
180180
applyDeleteFile :: J.DeleteFile -> VFS -> VFS
181-
applyDeleteFile (J.DeleteFile _ uri _options) =
181+
applyDeleteFile (J.DeleteFile uri _options) =
182182
updateVFS $ Map.delete (J.toNormalizedUri (J.Uri uri))
183183

184184

0 commit comments

Comments
 (0)