|
10 | 10 | module Server.Model.Monad |
11 | 11 | ( MonadAgdaLib (..), |
12 | 12 | useAgdaLib, |
13 | | - notificationHandlerWithAgdaLib, |
14 | 13 | MonadAgdaFile (..), |
15 | 14 | useAgdaFile, |
16 | | - requestHandlerWithAgdaFile, |
| 15 | + WithAgdaLibT, |
| 16 | + runWithAgdaLibT, |
17 | 17 | WithAgdaLibM, |
18 | 18 | runWithAgdaLib, |
| 19 | + WithAgdaFileT, |
| 20 | + runWithAgdaFileT, |
| 21 | + WithAgdaFileM, |
19 | 22 | ) |
20 | 23 | where |
21 | 24 |
|
22 | 25 | import Agda.Interaction.Options (CommandLineOptions (optPragmaOptions), PragmaOptions) |
23 | | -import Agda.TypeChecking.Monad (HasOptions (..), MonadTCEnv (..), MonadTCM (..), MonadTCState (..), PersistentTCState (stPersistentOptions), ReadTCState (..), TCEnv, TCM, TCMT (..), TCState (stPersistentState), modifyTCLens, setTCLens, stPragmaOptions, useTC) |
| 26 | +import Agda.Syntax.Common.Pretty (prettyShow) |
| 27 | +import Agda.TypeChecking.Monad (HasOptions (..), MonadTCEnv (..), MonadTCM (..), MonadTCState (..), PersistentTCState (stPersistentOptions), ReadTCState (..), TCEnv, TCM, TCMT (..), TCState (stPersistentState), catchError_, modifyTCLens, setTCLens, stPragmaOptions, useTC) |
| 28 | +import qualified Agda.TypeChecking.Monad as TCM |
| 29 | +import qualified Agda.TypeChecking.Pretty as TCM |
24 | 30 | import Agda.Utils.IORef (modifyIORef', readIORef, writeIORef) |
25 | 31 | import Agda.Utils.Lens (Lens', locally, over, use, view, (<&>), (^.)) |
26 | 32 | import Agda.Utils.Monad (bracket_) |
27 | 33 | import Control.Monad.IO.Class (MonadIO (liftIO)) |
28 | 34 | import Control.Monad.Reader (MonadReader (local), ReaderT (runReaderT), ask, asks) |
29 | 35 | import Control.Monad.Trans (MonadTrans, lift) |
| 36 | +import qualified Data.Text as Text |
30 | 37 | import qualified Language.LSP.Protocol.Lens as LSP |
31 | 38 | import qualified Language.LSP.Protocol.Message as LSP |
32 | 39 | import qualified Language.LSP.Protocol.Types as LSP |
33 | 40 | import qualified Language.LSP.Protocol.Types.Uri.More as LSP |
34 | 41 | import Language.LSP.Server (LspM) |
35 | 42 | import qualified Language.LSP.Server as LSP |
36 | | -import Monad (ServerM, ServerT, askModel, findAgdaLib) |
| 43 | +import Monad (ServerM, ServerT, askModel, catchTCError, findAgdaLib) |
37 | 44 | import Options (Config) |
38 | 45 | import qualified Server.Model as Model |
39 | 46 | import Server.Model.AgdaFile (AgdaFile) |
@@ -120,22 +127,6 @@ runWithAgdaLib uri x = do |
120 | 127 | agdaLib <- Model.getAgdaLib normUri model |
121 | 128 | runWithAgdaLibT agdaLib x |
122 | 129 |
|
123 | | -type NotificationHandlerWithAgdaLib m = |
124 | | - LSP.TNotificationMessage m -> LSP.NormalizedUri -> WithAgdaLibM () |
125 | | - |
126 | | -notificationHandlerWithAgdaLib :: |
127 | | - forall (m :: LSP.Method LSP.ClientToServer LSP.Notification) textdoc. |
128 | | - (LSP.HasTextDocument (LSP.MessageParams m) textdoc, LSP.HasUri textdoc LSP.Uri) => |
129 | | - LSP.SMethod m -> |
130 | | - NotificationHandlerWithAgdaLib m -> |
131 | | - LSP.Handlers ServerM |
132 | | -notificationHandlerWithAgdaLib m handler = LSP.notificationHandler m $ \notification -> do |
133 | | - let uri = notification ^. LSP.params . LSP.textDocument . LSP.uri |
134 | | - normUri = LSP.toNormalizedUri uri |
135 | | - |
136 | | - agdaLib <- findAgdaLib normUri |
137 | | - runWithAgdaLibT agdaLib $ handler notification normUri |
138 | | - |
139 | 130 | instance (MonadIO m) => MonadAgdaLib (WithAgdaLibT m) where |
140 | 131 | askAgdaLib = WithAgdaLibT ask |
141 | 132 | localAgdaLib f = WithAgdaLibT . local f . unWithAgdaLibT |
@@ -184,31 +175,6 @@ runWithAgdaFileT agdaLib agdaFile = |
184 | 175 |
|
185 | 176 | type WithAgdaFileM = WithAgdaFileT ServerM |
186 | 177 |
|
187 | | -type RequestHandlerWithAgdaFile m = |
188 | | - LSP.TRequestMessage m -> |
189 | | - (Either (LSP.TResponseError m) (LSP.MessageResult m) -> WithAgdaFileM ()) -> |
190 | | - WithAgdaFileM () |
191 | | - |
192 | | -requestHandlerWithAgdaFile :: |
193 | | - forall (m :: LSP.Method LSP.ClientToServer LSP.Request). |
194 | | - (LSP.HasTextDocument (LSP.MessageParams m) LSP.TextDocumentIdentifier) => |
195 | | - LSP.SMethod m -> |
196 | | - RequestHandlerWithAgdaFile m -> |
197 | | - LSP.Handlers ServerM |
198 | | -requestHandlerWithAgdaFile m handler = LSP.requestHandler m $ \req responder -> do |
199 | | - let uri = req ^. LSP.params . LSP.textDocument . LSP.uri |
200 | | - normUri = LSP.toNormalizedUri uri |
201 | | - |
202 | | - model <- askModel |
203 | | - case Model.getAgdaFile normUri model of |
204 | | - Nothing -> do |
205 | | - let message = "Request for unknown Agda file at URI: " <> LSP.getUri uri |
206 | | - responder $ Left $ LSP.TResponseError (LSP.InR LSP.ErrorCodes_InvalidParams) message Nothing |
207 | | - Just agdaFile -> do |
208 | | - agdaLib <- Model.getAgdaLib normUri model |
209 | | - let responder' = lift . responder |
210 | | - runWithAgdaFileT agdaLib agdaFile $ handler req responder' |
211 | | - |
212 | 178 | instance (MonadIO m) => MonadAgdaLib (WithAgdaFileT m) where |
213 | 179 | askAgdaLib = WithAgdaFileT $ view withAgdaFileEnvAgdaLib |
214 | 180 | localAgdaLib f = WithAgdaFileT . locally withAgdaFileEnvAgdaLib f . unWithAgdaFileT |
|
0 commit comments