packages feed

zwirn-0.2.2.0: app/zwirnzi/LSP/Handlers/Completion.hs

module LSP.Handlers.Completion where

import Control.Concurrent (MVar)
import Control.Concurrent.MVar (readMVar)
import Control.Monad.IO.Class (liftIO)
import qualified Data.Map as Map
import qualified Data.Text as T
import LSP.Util (LSP)
import Language.LSP.Protocol.Message (SMethod (..))
import qualified Language.LSP.Protocol.Types as LSP
import Language.LSP.Server (Handlers, requestHandler)
import Zwirn.Language (Environment (..), InterpreterEnv (..))
import Zwirn.Language.Environment (AnnotatedExpression (..))
import Zwirn.Language.Pretty (ppscheme)
import Zwirn.Language.TypeCheck.Types (Scheme)

completionHandler :: MVar Environment -> Handlers LSP
completionHandler envMV = requestHandler SMethod_TextDocumentCompletion $ \_req resp -> do
  env <- liftIO $ readMVar envMV

  let ks = map (\(k, Annotated _ s _) -> (k, s)) $ Map.toList $ eExpressions $ intEnv env
      res = LSP.CompletionList True Nothing (map mkCompletionItem ks)
  resp $ Right $ LSP.InR $ LSP.InL res
  where
    mkCompletionItem :: (T.Text, Scheme) -> LSP.CompletionItem
    mkCompletionItem (k, s) =
      LSP.CompletionItem
        k
        Nothing
        (Just LSP.CompletionItemKind_Constant)
        Nothing
        (Just $ ppscheme s)
        Nothing
        Nothing
        Nothing
        Nothing
        Nothing
        Nothing
        Nothing
        Nothing
        Nothing
        Nothing
        Nothing
        Nothing
        Nothing
        Nothing