{-# LANGUAGE ExplicitNamespaces #-}

-- | @futhark lsp@
module Futhark.CLI.LSP (main) where

import Control.Monad.IO.Class (MonadIO (liftIO))
import Data.IORef (newIORef)
import Futhark.LSP.Handlers (handlers)
import Futhark.LSP.State (emptyState)
import Language.LSP.Server
import Language.LSP.Types
  ( SaveOptions (SaveOptions),
    TextDocumentSyncKind (TdSyncIncremental),
    TextDocumentSyncOptions (..),
    type (|?) (InR),
  )

-- | Run @futhark lsp@
main :: String -> [String] -> IO ()
main :: String -> [String] -> IO ()
main String
_prog [String]
_args = do
  IORef State
state_mvar <- forall a. a -> IO (IORef a)
newIORef State
emptyState
  Int
_ <-
    forall config. ServerDefinition config -> IO Int
runServer forall a b. (a -> b) -> a -> b
$
      ServerDefinition
        { onConfigurationChange :: () -> Value -> Either Text ()
onConfigurationChange = forall a b. a -> b -> a
const forall a b. (a -> b) -> a -> b
$ forall a b. a -> b -> a
const forall a b. (a -> b) -> a -> b
$ forall a b. b -> Either a b
Right (),
          defaultConfig :: ()
defaultConfig = (),
          doInitialize :: LanguageContextEnv ()
-> Message 'Initialize
-> IO (Either ResponseError (LanguageContextEnv ()))
doInitialize = \LanguageContextEnv ()
env Message 'Initialize
_req -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall a b. b -> Either a b
Right LanguageContextEnv ()
env,
          staticHandlers :: Handlers (LspM ())
staticHandlers = IORef State -> Handlers (LspM ())
handlers IORef State
state_mvar,
          interpretHandler :: LanguageContextEnv () -> LspM () <~> IO
interpretHandler = \LanguageContextEnv ()
env -> forall {k} (m :: k -> *) (n :: k -> *).
(forall (a :: k). m a -> n a)
-> (forall (a :: k). n a -> m a) -> m <~> n
Iso (forall config (m :: * -> *) a.
LanguageContextEnv config -> LspT config m a -> m a
runLspT LanguageContextEnv ()
env) forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO,
          options :: Options
options =
            Options
defaultOptions
              { textDocumentSync :: Maybe TextDocumentSyncOptions
textDocumentSync = forall a. a -> Maybe a
Just TextDocumentSyncOptions
syncOptions
              }
        }
  forall (f :: * -> *) a. Applicative f => a -> f a
pure ()

syncOptions :: TextDocumentSyncOptions
syncOptions :: TextDocumentSyncOptions
syncOptions =
  TextDocumentSyncOptions
    { $sel:_openClose:TextDocumentSyncOptions :: Maybe Bool
_openClose = forall a. a -> Maybe a
Just Bool
True,
      $sel:_change:TextDocumentSyncOptions :: Maybe TextDocumentSyncKind
_change = forall a. a -> Maybe a
Just TextDocumentSyncKind
TdSyncIncremental,
      $sel:_willSave:TextDocumentSyncOptions :: Maybe Bool
_willSave = forall a. a -> Maybe a
Just Bool
False,
      $sel:_willSaveWaitUntil:TextDocumentSyncOptions :: Maybe Bool
_willSaveWaitUntil = forall a. a -> Maybe a
Just Bool
False,
      $sel:_save:TextDocumentSyncOptions :: Maybe (Bool |? SaveOptions)
_save = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall a b. b -> a |? b
InR forall a b. (a -> b) -> a -> b
$ Maybe Bool -> SaveOptions
SaveOptions forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just Bool
False
    }