module Futhark.LSP.State
( State (..),
emptyState,
getStaleContent,
getStaleMapping,
updateStaleContent,
updateStaleMapping,
)
where
import Data.Int (Int32)
import Data.Map qualified as M
import Futhark.Compiler.Program (LoadedProg)
import Futhark.LSP.PositionMapping (PositionMapping, StaleFile (..))
import Language.LSP.VFS (VirtualFile)
data State = State
{
State -> Maybe LoadedProg
stateProgram :: Maybe LoadedProg,
State -> Map FilePath StaleFile
staleData :: M.Map FilePath StaleFile,
State -> Maybe (FilePath, Int32)
stateFailed :: Maybe (FilePath, Int32)
}
emptyState :: State
emptyState :: State
emptyState = Maybe LoadedProg
-> Map FilePath StaleFile -> Maybe (FilePath, Int32) -> State
State Maybe LoadedProg
forall a. Maybe a
Nothing Map FilePath StaleFile
forall k a. Map k a
M.empty Maybe (FilePath, Int32)
forall a. Maybe a
Nothing
getStaleContent :: State -> FilePath -> Maybe VirtualFile
getStaleContent :: State -> FilePath -> Maybe VirtualFile
getStaleContent State
state FilePath
file_path = (VirtualFile -> Maybe VirtualFile
forall a. a -> Maybe a
Just (VirtualFile -> Maybe VirtualFile)
-> (StaleFile -> VirtualFile) -> StaleFile -> Maybe VirtualFile
forall b c a. (b -> c) -> (a -> b) -> a -> c
. StaleFile -> VirtualFile
staleContent) (StaleFile -> Maybe VirtualFile)
-> Maybe StaleFile -> Maybe VirtualFile
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< FilePath -> Map FilePath StaleFile -> Maybe StaleFile
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup FilePath
file_path (State -> Map FilePath StaleFile
staleData State
state)
getStaleMapping :: State -> FilePath -> Maybe PositionMapping
getStaleMapping :: State -> FilePath -> Maybe PositionMapping
getStaleMapping State
state FilePath
file_path = StaleFile -> Maybe PositionMapping
staleMapping (StaleFile -> Maybe PositionMapping)
-> Maybe StaleFile -> Maybe PositionMapping
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< FilePath -> Map FilePath StaleFile -> Maybe StaleFile
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup FilePath
file_path (State -> Map FilePath StaleFile
staleData State
state)
updateStaleContent :: FilePath -> VirtualFile -> LoadedProg -> State -> State
updateStaleContent :: FilePath -> VirtualFile -> LoadedProg -> State -> State
updateStaleContent FilePath
file_path VirtualFile
file_content LoadedProg
loadedProg State
state =
State
state
{ stateProgram = Just loadedProg,
staleData = M.insert file_path (StaleFile file_content Nothing) (staleData state)
}
updateStaleMapping :: Maybe FilePath -> Maybe PositionMapping -> State -> State
updateStaleMapping :: Maybe FilePath -> Maybe PositionMapping -> State -> State
updateStaleMapping (Just FilePath
file_path) Maybe PositionMapping
mapping State
state = do
case FilePath -> Map FilePath StaleFile -> Maybe StaleFile
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup FilePath
file_path (State -> Map FilePath StaleFile
staleData State
state) of
Maybe StaleFile
Nothing -> State
state
Just (StaleFile VirtualFile
file_content Maybe PositionMapping
_mapping) ->
State
state {staleData = M.insert file_path (StaleFile file_content mapping) (staleData state)}
updateStaleMapping Maybe FilePath
_ Maybe PositionMapping
_ State
state = State
state