14
14
{-# LANGUAGE TupleSections #-}
15
15
{-# LANGUAGE TypeApplications #-}
16
16
{-# OPTIONS_GHC -Wno-unticked-promoted-constructors #-}
17
+ {-# LANGUAGE ScopedTypeVariables #-}
17
18
18
19
module Language.LSP.Types.Parsing where
19
20
20
21
import Language.LSP.Types.LspId
21
22
import Language.LSP.Types.Method
22
23
import Language.LSP.Types.Message
23
- import qualified Data.HashMap.Strict as HM
24
24
25
25
import Data.Aeson
26
26
import Data.Aeson.Types
@@ -90,25 +90,26 @@ Notification | jsonrpc | | method | params?
90
90
{-# INLINE parseServerMessage #-}
91
91
parseServerMessage :: LookupFunc FromClient a -> Value -> Parser (FromServerMessage' a )
92
92
parseServerMessage lookupId v@ (Object o) = do
93
- case HM. lookup " method" o of
94
- Just cmd -> do
95
- -- Request or Notification
96
- SomeServerMethod m <- parseJSON cmd
93
+ methMaybe <- o .:! " method"
94
+ idMaybe <- o .:! " id"
95
+ case methMaybe of
96
+ -- Request or Notification
97
+ Just (SomeServerMethod m) ->
97
98
case splitServerMethod m of
98
99
IsServerNot -> FromServerMess m <$> parseJSON v
99
100
IsServerReq -> FromServerMess m <$> parseJSON v
100
- IsServerEither
101
- | HM. member " id" o -- Request
102
- , SCustomMethod cm <- m ->
101
+ IsServerEither | SCustomMethod cm <- m -> do
102
+ case idMaybe of
103
+ -- Request
104
+ Just _ ->
103
105
let m' = (SCustomMethod cm :: SMethod (CustomMethod :: Method FromServer Request ))
104
- in FromServerMess m' <$> parseJSON v
105
- | SCustomMethod cm <- m ->
106
+ in FromServerMess m' <$> parseJSON v
107
+ Nothing ->
106
108
let m' = (SCustomMethod cm :: SMethod (CustomMethod :: Method FromServer Notification ))
107
- in FromServerMess m' <$> parseJSON v
109
+ in FromServerMess m' <$> parseJSON v
108
110
Nothing -> do
109
- case HM. lookup " id" o of
110
- Just i' -> do
111
- i <- parseJSON i'
111
+ case idMaybe of
112
+ Just i -> do
112
113
case lookupId i of
113
114
Just (m,res) -> clientResponseJSON m $ FromServerRsp res <$> parseJSON v
114
115
Nothing -> fail $ unwords [" Failed in looking up response type of" , show v]
@@ -118,25 +119,26 @@ parseServerMessage _ v = fail $ unwords ["parseServerMessage expected object, go
118
119
{-# INLINE parseClientMessage #-}
119
120
parseClientMessage :: LookupFunc FromServer a -> Value -> Parser (FromClientMessage' a )
120
121
parseClientMessage lookupId v@ (Object o) = do
121
- case HM. lookup " method" o of
122
- Just cmd -> do
123
- -- Request or Notification
124
- SomeClientMethod m <- parseJSON cmd
122
+ methMaybe <- o .:! " method"
123
+ idMaybe <- o .:! " id"
124
+ case methMaybe of
125
+ -- Request or Notification
126
+ Just (SomeClientMethod m) ->
125
127
case splitClientMethod m of
126
128
IsClientNot -> FromClientMess m <$> parseJSON v
127
129
IsClientReq -> FromClientMess m <$> parseJSON v
128
- IsClientEither
129
- | HM. member " id" o -- Request
130
- , SCustomMethod cm <- m ->
130
+ IsClientEither | SCustomMethod cm <- m -> do
131
+ case idMaybe of
132
+ -- Request
133
+ Just _ ->
131
134
let m' = (SCustomMethod cm :: SMethod (CustomMethod :: Method FromClient Request ))
132
- in FromClientMess m' <$> parseJSON v
133
- | SCustomMethod cm <- m ->
135
+ in FromClientMess m' <$> parseJSON v
136
+ Nothing ->
134
137
let m' = (SCustomMethod cm :: SMethod (CustomMethod :: Method FromClient Notification ))
135
- in FromClientMess m' <$> parseJSON v
138
+ in FromClientMess m' <$> parseJSON v
136
139
Nothing -> do
137
- case HM. lookup " id" o of
138
- Just i' -> do
139
- i <- parseJSON i'
140
+ case idMaybe of
141
+ Just i -> do
140
142
case lookupId i of
141
143
Just (m,res) -> serverResponseJSON m $ FromClientRsp res <$> parseJSON v
142
144
Nothing -> fail $ unwords [" Failed in looking up response type of" , show v]
0 commit comments