module Agda.TypeChecking.Monad.Options where
import Prelude hiding (null)
import Control.Arrow ( (&&&) )
import Control.Monad ( unless, when )
import Control.Monad.IO.Class ( MonadIO(..) )
import Control.Monad.Except
import Control.Monad.Reader
import Control.Monad.State
import Control.Monad.Writer
import qualified Data.Graph as Graph
import Data.List (sort)
import Data.Maybe
import Data.Map (Map)
import qualified Data.Map as Map
import System.Directory
import System.FilePath
import Agda.Syntax.Common
import qualified Agda.Syntax.Concrete as C
import qualified Agda.Syntax.Abstract as A
import Agda.Syntax.TopLevelModuleName
import Agda.TypeChecking.Monad.Debug (reportSDoc)
import Agda.TypeChecking.Warnings
import Agda.TypeChecking.Monad.Base
import Agda.TypeChecking.Monad.Imports
import Agda.TypeChecking.Monad.State
import Agda.TypeChecking.Monad.Benchmark
import Agda.Interaction.FindFile
import Agda.Interaction.Options
import qualified Agda.Interaction.Options.Lenses as Lens
import Agda.Interaction.Library
import Agda.Utils.FileName
import Agda.Utils.Functor
import qualified Agda.Utils.Graph.AdjacencyMap.Unidirectional as G
import Agda.Utils.List
import Agda.Utils.Maybe
import Agda.Utils.Null
import Agda.Utils.Pretty
import Agda.Utils.Tuple
import Agda.Utils.WithDefault
import Agda.Utils.Impossible
setPragmaOptions :: PragmaOptions -> TCM ()
setPragmaOptions :: PragmaOptions -> TCM ()
setPragmaOptions PragmaOptions
opts = do
Bool -> TCM () -> TCM ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (PragmaOptions -> Bool
forall a. LensSafeMode a => a -> Bool
Lens.getSafeMode PragmaOptions
opts) (TCM () -> TCM ()) -> TCM () -> TCM ()
forall a b. (a -> b) -> a -> b
$
[FilePath] -> ([FilePath] -> TCM ()) -> TCM ()
forall (m :: * -> *) a.
(Monad m, Null a) =>
a -> (a -> m ()) -> m ()
unlessNull (PragmaOptions -> [FilePath]
unsafePragmaOptions PragmaOptions
opts) (([FilePath] -> TCM ()) -> TCM ())
-> ([FilePath] -> TCM ()) -> TCM ()
forall a b. (a -> b) -> a -> b
$ \ [FilePath]
unsafe ->
Warning -> TCM ()
forall (m :: * -> *).
(HasCallStack, MonadWarning m) =>
Warning -> m ()
warning (Warning -> TCM ()) -> Warning -> TCM ()
forall a b. (a -> b) -> a -> b
$ [FilePath] -> Warning
SafeFlagPragma [FilePath]
unsafe
(PragmaOptions -> f PragmaOptions) -> TCState -> f TCState
Lens' PragmaOptions TCState
stPragmaOptions Lens' PragmaOptions TCState -> PragmaOptions -> TCM ()
forall (m :: * -> *) a.
MonadTCState m =>
Lens' a TCState -> a -> m ()
`setTCLens` PragmaOptions
opts
TCM ()
updateBenchmarkingStatus
setCommandLineOptions :: CommandLineOptions -> TCM ()
setCommandLineOptions :: CommandLineOptions -> TCM ()
setCommandLineOptions CommandLineOptions
opts = do
AbsolutePath
root <- IO AbsolutePath -> TCMT IO AbsolutePath
forall a. IO a -> TCMT IO a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (FilePath -> IO AbsolutePath
absolute (FilePath -> IO AbsolutePath) -> IO FilePath -> IO AbsolutePath
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IO FilePath
getCurrentDirectory)
AbsolutePath -> CommandLineOptions -> TCM ()
setCommandLineOptions' AbsolutePath
root CommandLineOptions
opts
setCommandLineOptions'
:: AbsolutePath
-> CommandLineOptions
-> TCM ()
setCommandLineOptions' :: AbsolutePath -> CommandLineOptions -> TCM ()
setCommandLineOptions' AbsolutePath
root CommandLineOptions
opts = do
[AbsolutePath]
incs <- case CommandLineOptions -> [AbsolutePath]
optAbsoluteIncludePaths CommandLineOptions
opts of
[] -> do
CommandLineOptions
opts' <- AbsolutePath -> CommandLineOptions -> TCM CommandLineOptions
setLibraryPaths AbsolutePath
root CommandLineOptions
opts
let incs :: [FilePath]
incs = CommandLineOptions -> [FilePath]
optIncludePaths CommandLineOptions
opts'
[FilePath] -> AbsolutePath -> TCM ()
setIncludeDirs [FilePath]
incs AbsolutePath
root
TCMT IO [AbsolutePath]
forall (m :: * -> *). HasOptions m => m [AbsolutePath]
getIncludeDirs
[AbsolutePath]
incs -> [AbsolutePath] -> TCMT IO [AbsolutePath]
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [AbsolutePath]
incs
(TCState -> TCState) -> TCM ()
forall (m :: * -> *).
MonadTCState m =>
(TCState -> TCState) -> m ()
modifyTC ((TCState -> TCState) -> TCM ()) -> (TCState -> TCState) -> TCM ()
forall a b. (a -> b) -> a -> b
$ CommandLineOptions -> TCState -> TCState
forall a. LensCommandLineOptions a => CommandLineOptions -> a -> a
Lens.setCommandLineOptions CommandLineOptions
opts{ optAbsoluteIncludePaths :: [AbsolutePath]
optAbsoluteIncludePaths = [AbsolutePath]
incs }
PragmaOptions -> TCM ()
setPragmaOptions (CommandLineOptions -> PragmaOptions
optPragmaOptions CommandLineOptions
opts)
TCM ()
updateBenchmarkingStatus
libToTCM :: LibM a -> TCM a
libToTCM :: forall a. LibM a -> TCM a
libToTCM LibM a
m = do
Map FilePath ProjectConfig
cachedConfs <- Lens' (Map FilePath ProjectConfig) TCState
-> TCMT IO (Map FilePath ProjectConfig)
forall (m :: * -> *) a. ReadTCState m => Lens' a TCState -> m a
useTC (Map FilePath ProjectConfig -> f (Map FilePath ProjectConfig))
-> TCState -> f TCState
Lens' (Map FilePath ProjectConfig) TCState
stProjectConfigs
Map FilePath AgdaLibFile
cachedLibs <- Lens' (Map FilePath AgdaLibFile) TCState
-> TCMT IO (Map FilePath AgdaLibFile)
forall (m :: * -> *) a. ReadTCState m => Lens' a TCState -> m a
useTC (Map FilePath AgdaLibFile -> f (Map FilePath AgdaLibFile))
-> TCState -> f TCState
Lens' (Map FilePath AgdaLibFile) TCState
stAgdaLibFiles
((Either Doc a
z, [LibWarning]
warns), (Map FilePath ProjectConfig
cachedConfs', Map FilePath AgdaLibFile
cachedLibs')) <- IO
((Either Doc a, [LibWarning]),
(Map FilePath ProjectConfig, Map FilePath AgdaLibFile))
-> TCMT
IO
((Either Doc a, [LibWarning]),
(Map FilePath ProjectConfig, Map FilePath AgdaLibFile))
forall a. IO a -> TCMT IO a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO
((Either Doc a, [LibWarning]),
(Map FilePath ProjectConfig, Map FilePath AgdaLibFile))
-> TCMT
IO
((Either Doc a, [LibWarning]),
(Map FilePath ProjectConfig, Map FilePath AgdaLibFile)))
-> IO
((Either Doc a, [LibWarning]),
(Map FilePath ProjectConfig, Map FilePath AgdaLibFile))
-> TCMT
IO
((Either Doc a, [LibWarning]),
(Map FilePath ProjectConfig, Map FilePath AgdaLibFile))
forall a b. (a -> b) -> a -> b
$
(StateT
(Map FilePath ProjectConfig, Map FilePath AgdaLibFile)
IO
(Either Doc a, [LibWarning])
-> (Map FilePath ProjectConfig, Map FilePath AgdaLibFile)
-> IO
((Either Doc a, [LibWarning]),
(Map FilePath ProjectConfig, Map FilePath AgdaLibFile))
forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
`runStateT` (Map FilePath ProjectConfig
cachedConfs, Map FilePath AgdaLibFile
cachedLibs)) (StateT
(Map FilePath ProjectConfig, Map FilePath AgdaLibFile)
IO
(Either Doc a, [LibWarning])
-> IO
((Either Doc a, [LibWarning]),
(Map FilePath ProjectConfig, Map FilePath AgdaLibFile)))
-> StateT
(Map FilePath ProjectConfig, Map FilePath AgdaLibFile)
IO
(Either Doc a, [LibWarning])
-> IO
((Either Doc a, [LibWarning]),
(Map FilePath ProjectConfig, Map FilePath AgdaLibFile))
forall a b. (a -> b) -> a -> b
$ WriterT
[LibWarning]
(StateT (Map FilePath ProjectConfig, Map FilePath AgdaLibFile) IO)
(Either Doc a)
-> StateT
(Map FilePath ProjectConfig, Map FilePath AgdaLibFile)
IO
(Either Doc a, [LibWarning])
forall w (m :: * -> *) a. WriterT w m a -> m (a, w)
runWriterT (WriterT
[LibWarning]
(StateT (Map FilePath ProjectConfig, Map FilePath AgdaLibFile) IO)
(Either Doc a)
-> StateT
(Map FilePath ProjectConfig, Map FilePath AgdaLibFile)
IO
(Either Doc a, [LibWarning]))
-> WriterT
[LibWarning]
(StateT (Map FilePath ProjectConfig, Map FilePath AgdaLibFile) IO)
(Either Doc a)
-> StateT
(Map FilePath ProjectConfig, Map FilePath AgdaLibFile)
IO
(Either Doc a, [LibWarning])
forall a b. (a -> b) -> a -> b
$ LibM a
-> WriterT
[LibWarning]
(StateT (Map FilePath ProjectConfig, Map FilePath AgdaLibFile) IO)
(Either Doc a)
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT LibM a
m
Lens' (Map FilePath ProjectConfig) TCState
-> (Map FilePath ProjectConfig -> Map FilePath ProjectConfig)
-> TCM ()
forall (m :: * -> *) a.
MonadTCState m =>
Lens' a TCState -> (a -> a) -> m ()
modifyTCLens (Map FilePath ProjectConfig -> f (Map FilePath ProjectConfig))
-> TCState -> f TCState
Lens' (Map FilePath ProjectConfig) TCState
stProjectConfigs ((Map FilePath ProjectConfig -> Map FilePath ProjectConfig)
-> TCM ())
-> (Map FilePath ProjectConfig -> Map FilePath ProjectConfig)
-> TCM ()
forall a b. (a -> b) -> a -> b
$ Map FilePath ProjectConfig
-> Map FilePath ProjectConfig -> Map FilePath ProjectConfig
forall a b. a -> b -> a
const Map FilePath ProjectConfig
cachedConfs'
Lens' (Map FilePath AgdaLibFile) TCState
-> (Map FilePath AgdaLibFile -> Map FilePath AgdaLibFile) -> TCM ()
forall (m :: * -> *) a.
MonadTCState m =>
Lens' a TCState -> (a -> a) -> m ()
modifyTCLens (Map FilePath AgdaLibFile -> f (Map FilePath AgdaLibFile))
-> TCState -> f TCState
Lens' (Map FilePath AgdaLibFile) TCState
stAgdaLibFiles ((Map FilePath AgdaLibFile -> Map FilePath AgdaLibFile) -> TCM ())
-> (Map FilePath AgdaLibFile -> Map FilePath AgdaLibFile) -> TCM ()
forall a b. (a -> b) -> a -> b
$ Map FilePath AgdaLibFile
-> Map FilePath AgdaLibFile -> Map FilePath AgdaLibFile
forall a b. a -> b -> a
const Map FilePath AgdaLibFile
cachedLibs'
Bool -> TCM () -> TCM ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless ([LibWarning] -> Bool
forall a. Null a => a -> Bool
null [LibWarning]
warns) (TCM () -> TCM ()) -> TCM () -> TCM ()
forall a b. (a -> b) -> a -> b
$ [Warning] -> TCM ()
forall (m :: * -> *).
(HasCallStack, MonadWarning m) =>
[Warning] -> m ()
warnings ([Warning] -> TCM ()) -> [Warning] -> TCM ()
forall a b. (a -> b) -> a -> b
$ (LibWarning -> Warning) -> [LibWarning] -> [Warning]
forall a b. (a -> b) -> [a] -> [b]
map LibWarning -> Warning
LibraryWarning [LibWarning]
warns
case Either Doc a
z of
Left Doc
s -> TypeError -> TCM a
forall (m :: * -> *) a.
(HasCallStack, MonadTCError m) =>
TypeError -> m a
typeError (TypeError -> TCM a) -> TypeError -> TCM a
forall a b. (a -> b) -> a -> b
$ Doc -> TypeError
GenericDocError Doc
s
Right a
x -> a -> TCM a
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return a
x
getAgdaLibFiles
:: AbsolutePath
-> TopLevelModuleName
-> TCM [AgdaLibFile]
getAgdaLibFiles :: AbsolutePath -> TopLevelModuleName -> TCM [AgdaLibFile]
getAgdaLibFiles AbsolutePath
f TopLevelModuleName
m = do
Bool
useLibs <- CommandLineOptions -> Bool
optUseLibs (CommandLineOptions -> Bool)
-> TCM CommandLineOptions -> TCMT IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TCM CommandLineOptions
forall (m :: * -> *). HasOptions m => m CommandLineOptions
commandLineOptions
if | Bool
useLibs -> LibM [AgdaLibFile] -> TCM [AgdaLibFile]
forall a. LibM a -> TCM a
libToTCM (LibM [AgdaLibFile] -> TCM [AgdaLibFile])
-> LibM [AgdaLibFile] -> TCM [AgdaLibFile]
forall a b. (a -> b) -> a -> b
$ [AgdaLibFile] -> LibErrorIO [AgdaLibFile] -> LibM [AgdaLibFile]
forall a. [AgdaLibFile] -> LibErrorIO a -> LibM a
mkLibM [] (LibErrorIO [AgdaLibFile] -> LibM [AgdaLibFile])
-> LibErrorIO [AgdaLibFile] -> LibM [AgdaLibFile]
forall a b. (a -> b) -> a -> b
$ FilePath -> LibErrorIO [AgdaLibFile]
getAgdaLibFiles' FilePath
root
| Bool
otherwise -> [AgdaLibFile] -> TCM [AgdaLibFile]
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return []
where
root :: FilePath
root = AbsolutePath -> FilePath
filePath (AbsolutePath -> TopLevelModuleName -> AbsolutePath
projectRoot AbsolutePath
f TopLevelModuleName
m)
getLibraryOptions
:: AbsolutePath
-> TopLevelModuleName
-> TCM [OptionsPragma]
getLibraryOptions :: AbsolutePath -> TopLevelModuleName -> TCM [[FilePath]]
getLibraryOptions AbsolutePath
f TopLevelModuleName
m = (AgdaLibFile -> [FilePath]) -> [AgdaLibFile] -> [[FilePath]]
forall a b. (a -> b) -> [a] -> [b]
map AgdaLibFile -> [FilePath]
_libPragmas ([AgdaLibFile] -> [[FilePath]])
-> TCM [AgdaLibFile] -> TCM [[FilePath]]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AbsolutePath -> TopLevelModuleName -> TCM [AgdaLibFile]
getAgdaLibFiles AbsolutePath
f TopLevelModuleName
m
setLibraryPaths
:: AbsolutePath
-> CommandLineOptions
-> TCM CommandLineOptions
setLibraryPaths :: AbsolutePath -> CommandLineOptions -> TCM CommandLineOptions
setLibraryPaths AbsolutePath
root CommandLineOptions
o =
CommandLineOptions -> TCM CommandLineOptions
setLibraryIncludes (CommandLineOptions -> TCM CommandLineOptions)
-> TCM CommandLineOptions -> TCM CommandLineOptions
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< AbsolutePath -> CommandLineOptions -> TCM CommandLineOptions
addDefaultLibraries AbsolutePath
root CommandLineOptions
o
setLibraryIncludes :: CommandLineOptions -> TCM CommandLineOptions
setLibraryIncludes :: CommandLineOptions -> TCM CommandLineOptions
setLibraryIncludes CommandLineOptions
o
| Bool -> Bool
not (CommandLineOptions -> Bool
optUseLibs CommandLineOptions
o) = CommandLineOptions -> TCM CommandLineOptions
forall a. a -> TCMT IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure CommandLineOptions
o
| Bool
otherwise = do
let libs :: [FilePath]
libs = CommandLineOptions -> [FilePath]
optLibraries CommandLineOptions
o
[AgdaLibFile]
installed <- LibM [AgdaLibFile] -> TCM [AgdaLibFile]
forall a. LibM a -> TCM a
libToTCM (LibM [AgdaLibFile] -> TCM [AgdaLibFile])
-> LibM [AgdaLibFile] -> TCM [AgdaLibFile]
forall a b. (a -> b) -> a -> b
$ Maybe FilePath -> LibM [AgdaLibFile]
getInstalledLibraries (CommandLineOptions -> Maybe FilePath
optOverrideLibrariesFile CommandLineOptions
o)
[FilePath]
paths <- LibM [FilePath] -> TCM [FilePath]
forall a. LibM a -> TCM a
libToTCM (LibM [FilePath] -> TCM [FilePath])
-> LibM [FilePath] -> TCM [FilePath]
forall a b. (a -> b) -> a -> b
$ Maybe FilePath -> [AgdaLibFile] -> [FilePath] -> LibM [FilePath]
libraryIncludePaths (CommandLineOptions -> Maybe FilePath
optOverrideLibrariesFile CommandLineOptions
o) [AgdaLibFile]
installed [FilePath]
libs
CommandLineOptions -> TCM CommandLineOptions
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return CommandLineOptions
o{ optIncludePaths :: [FilePath]
optIncludePaths = [FilePath]
paths [FilePath] -> [FilePath] -> [FilePath]
forall a. [a] -> [a] -> [a]
++ CommandLineOptions -> [FilePath]
optIncludePaths CommandLineOptions
o }
addDefaultLibraries
:: AbsolutePath
-> CommandLineOptions
-> TCM CommandLineOptions
addDefaultLibraries :: AbsolutePath -> CommandLineOptions -> TCM CommandLineOptions
addDefaultLibraries AbsolutePath
root CommandLineOptions
o
| Bool -> Bool
not ([FilePath] -> Bool
forall a. Null a => a -> Bool
null ([FilePath] -> Bool) -> [FilePath] -> Bool
forall a b. (a -> b) -> a -> b
$ CommandLineOptions -> [FilePath]
optLibraries CommandLineOptions
o) Bool -> Bool -> Bool
|| Bool -> Bool
not (CommandLineOptions -> Bool
optUseLibs CommandLineOptions
o) = CommandLineOptions -> TCM CommandLineOptions
forall a. a -> TCMT IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure CommandLineOptions
o
| Bool
otherwise = do
([FilePath]
libs, [FilePath]
incs) <- LibM ([FilePath], [FilePath]) -> TCM ([FilePath], [FilePath])
forall a. LibM a -> TCM a
libToTCM (LibM ([FilePath], [FilePath]) -> TCM ([FilePath], [FilePath]))
-> LibM ([FilePath], [FilePath]) -> TCM ([FilePath], [FilePath])
forall a b. (a -> b) -> a -> b
$ FilePath -> Bool -> LibM ([FilePath], [FilePath])
getDefaultLibraries (AbsolutePath -> FilePath
filePath AbsolutePath
root) (CommandLineOptions -> Bool
optDefaultLibs CommandLineOptions
o)
CommandLineOptions -> TCM CommandLineOptions
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return CommandLineOptions
o{ optIncludePaths :: [FilePath]
optIncludePaths = [FilePath]
incs [FilePath] -> [FilePath] -> [FilePath]
forall a. [a] -> [a] -> [a]
++ CommandLineOptions -> [FilePath]
optIncludePaths CommandLineOptions
o, optLibraries :: [FilePath]
optLibraries = [FilePath]
libs }
addTrustedExecutables
:: CommandLineOptions
-> TCM CommandLineOptions
addTrustedExecutables :: CommandLineOptions -> TCM CommandLineOptions
addTrustedExecutables CommandLineOptions
o = do
Map ExeName FilePath
trustedExes <- LibM (Map ExeName FilePath) -> TCM (Map ExeName FilePath)
forall a. LibM a -> TCM a
libToTCM (LibM (Map ExeName FilePath) -> TCM (Map ExeName FilePath))
-> LibM (Map ExeName FilePath) -> TCM (Map ExeName FilePath)
forall a b. (a -> b) -> a -> b
$ LibM (Map ExeName FilePath)
getTrustedExecutables
CommandLineOptions -> TCM CommandLineOptions
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return CommandLineOptions
o{ optTrustedExecutables :: Map ExeName FilePath
optTrustedExecutables = Map ExeName FilePath
trustedExes }
setOptionsFromPragma :: OptionsPragma -> TCM ()
setOptionsFromPragma :: [FilePath] -> TCM ()
setOptionsFromPragma [FilePath]
ps = do
CommandLineOptions
opts <- TCM CommandLineOptions
forall (m :: * -> *). HasOptions m => m CommandLineOptions
commandLineOptions
let (Either FilePath PragmaOptions
z, OptionWarnings
warns) = OptM PragmaOptions
-> (Either FilePath PragmaOptions, OptionWarnings)
forall opts. OptM opts -> (Either FilePath opts, OptionWarnings)
runOptM ([FilePath] -> CommandLineOptions -> OptM PragmaOptions
parsePragmaOptions [FilePath]
ps CommandLineOptions
opts)
(OptionWarning -> TCM ()) -> OptionWarnings -> TCM ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (Warning -> TCM ()
forall (m :: * -> *).
(HasCallStack, MonadWarning m) =>
Warning -> m ()
warning (Warning -> TCM ())
-> (OptionWarning -> Warning) -> OptionWarning -> TCM ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OptionWarning -> Warning
OptionWarning) OptionWarnings
warns
case Either FilePath PragmaOptions
z of
Left FilePath
err -> TypeError -> TCM ()
forall (m :: * -> *) a.
(HasCallStack, MonadTCError m) =>
TypeError -> m a
typeError (TypeError -> TCM ()) -> TypeError -> TCM ()
forall a b. (a -> b) -> a -> b
$ FilePath -> TypeError
GenericError FilePath
err
Right PragmaOptions
opts' -> PragmaOptions -> TCM ()
setPragmaOptions PragmaOptions
opts'
enableDisplayForms :: MonadTCEnv m => m a -> m a
enableDisplayForms :: forall (m :: * -> *) a. MonadTCEnv m => m a -> m a
enableDisplayForms =
(TCEnv -> TCEnv) -> m a -> m a
forall a. (TCEnv -> TCEnv) -> m a -> m a
forall (m :: * -> *) a.
MonadTCEnv m =>
(TCEnv -> TCEnv) -> m a -> m a
localTC ((TCEnv -> TCEnv) -> m a -> m a) -> (TCEnv -> TCEnv) -> m a -> m a
forall a b. (a -> b) -> a -> b
$ \TCEnv
e -> TCEnv
e { envDisplayFormsEnabled :: Bool
envDisplayFormsEnabled = Bool
True }
disableDisplayForms :: MonadTCEnv m => m a -> m a
disableDisplayForms :: forall (m :: * -> *) a. MonadTCEnv m => m a -> m a
disableDisplayForms =
(TCEnv -> TCEnv) -> m a -> m a
forall a. (TCEnv -> TCEnv) -> m a -> m a
forall (m :: * -> *) a.
MonadTCEnv m =>
(TCEnv -> TCEnv) -> m a -> m a
localTC ((TCEnv -> TCEnv) -> m a -> m a) -> (TCEnv -> TCEnv) -> m a -> m a
forall a b. (a -> b) -> a -> b
$ \TCEnv
e -> TCEnv
e { envDisplayFormsEnabled :: Bool
envDisplayFormsEnabled = Bool
False }
displayFormsEnabled :: MonadTCEnv m => m Bool
displayFormsEnabled :: forall (m :: * -> *). MonadTCEnv m => m Bool
displayFormsEnabled = (TCEnv -> Bool) -> m Bool
forall (m :: * -> *) a. MonadTCEnv m => (TCEnv -> a) -> m a
asksTC TCEnv -> Bool
envDisplayFormsEnabled
getIncludeDirs :: HasOptions m => m [AbsolutePath]
getIncludeDirs :: forall (m :: * -> *). HasOptions m => m [AbsolutePath]
getIncludeDirs = do
[AbsolutePath]
incs <- CommandLineOptions -> [AbsolutePath]
optAbsoluteIncludePaths (CommandLineOptions -> [AbsolutePath])
-> m CommandLineOptions -> m [AbsolutePath]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m CommandLineOptions
forall (m :: * -> *). HasOptions m => m CommandLineOptions
commandLineOptions
case [AbsolutePath]
incs of
[] -> m [AbsolutePath]
forall a. HasCallStack => a
__IMPOSSIBLE__
[AbsolutePath]
_ -> [AbsolutePath] -> m [AbsolutePath]
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return [AbsolutePath]
incs
setIncludeDirs :: [FilePath]
-> AbsolutePath
-> TCM ()
setIncludeDirs :: [FilePath] -> AbsolutePath -> TCM ()
setIncludeDirs [FilePath]
incs AbsolutePath
root = do
[AbsolutePath]
oldIncs <- (TCState -> [AbsolutePath]) -> TCMT IO [AbsolutePath]
forall (m :: * -> *) a. ReadTCState m => (TCState -> a) -> m a
getsTC TCState -> [AbsolutePath]
forall a. LensIncludePaths a => a -> [AbsolutePath]
Lens.getAbsoluteIncludePaths
[FilePath]
incs <- [FilePath] -> TCM [FilePath]
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ([FilePath] -> TCM [FilePath]) -> [FilePath] -> TCM [FilePath]
forall a b. (a -> b) -> a -> b
$ if [FilePath] -> Bool
forall a. Null a => a -> Bool
null [FilePath]
incs then [FilePath
"."] else [FilePath]
incs
[AbsolutePath]
incs <- [AbsolutePath] -> TCMT IO [AbsolutePath]
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ([AbsolutePath] -> TCMT IO [AbsolutePath])
-> [AbsolutePath] -> TCMT IO [AbsolutePath]
forall a b. (a -> b) -> a -> b
$ (FilePath -> AbsolutePath) -> [FilePath] -> [AbsolutePath]
forall a b. (a -> b) -> [a] -> [b]
map (FilePath -> AbsolutePath
mkAbsolute (FilePath -> AbsolutePath)
-> (FilePath -> FilePath) -> FilePath -> AbsolutePath
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (AbsolutePath -> FilePath
filePath AbsolutePath
root FilePath -> FilePath -> FilePath
</>)) [FilePath]
incs
AbsolutePath
primdir <- IO AbsolutePath -> TCMT IO AbsolutePath
forall a. IO a -> TCMT IO a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO AbsolutePath -> TCMT IO AbsolutePath)
-> IO AbsolutePath -> TCMT IO AbsolutePath
forall a b. (a -> b) -> a -> b
$ FilePath -> AbsolutePath
mkAbsolute (FilePath -> AbsolutePath) -> IO FilePath -> IO AbsolutePath
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO FilePath
getPrimitiveLibDir
[AbsolutePath]
incs <- [AbsolutePath] -> TCMT IO [AbsolutePath]
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ([AbsolutePath] -> TCMT IO [AbsolutePath])
-> [AbsolutePath] -> TCMT IO [AbsolutePath]
forall a b. (a -> b) -> a -> b
$ (AbsolutePath -> AbsolutePath) -> [AbsolutePath] -> [AbsolutePath]
forall b a. Ord b => (a -> b) -> [a] -> [a]
nubOn AbsolutePath -> AbsolutePath
forall a. a -> a
id ([AbsolutePath] -> [AbsolutePath])
-> [AbsolutePath] -> [AbsolutePath]
forall a b. (a -> b) -> a -> b
$ [AbsolutePath]
incs [AbsolutePath] -> [AbsolutePath] -> [AbsolutePath]
forall a. [a] -> [a] -> [a]
++ [AbsolutePath
primdir]
FilePath -> VerboseLevel -> TCM Doc -> TCM ()
forall (m :: * -> *).
MonadDebug m =>
FilePath -> VerboseLevel -> TCM Doc -> m ()
reportSDoc FilePath
"setIncludeDirs" VerboseLevel
10 (TCM Doc -> TCM ()) -> TCM Doc -> TCM ()
forall a b. (a -> b) -> a -> b
$ Doc -> TCM Doc
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Doc -> TCM Doc) -> Doc -> TCM Doc
forall a b. (a -> b) -> a -> b
$ [Doc] -> Doc
forall (t :: * -> *). Foldable t => t Doc -> Doc
vcat
[ Doc
"Old include directories:"
, VerboseLevel -> Doc -> Doc
nest VerboseLevel
2 (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ [Doc] -> Doc
forall (t :: * -> *). Foldable t => t Doc -> Doc
vcat ([Doc] -> Doc) -> [Doc] -> Doc
forall a b. (a -> b) -> a -> b
$ (AbsolutePath -> Doc) -> [AbsolutePath] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map AbsolutePath -> Doc
forall a. Pretty a => a -> Doc
pretty [AbsolutePath]
oldIncs
, Doc
"New include directories:"
, VerboseLevel -> Doc -> Doc
nest VerboseLevel
2 (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ [Doc] -> Doc
forall (t :: * -> *). Foldable t => t Doc -> Doc
vcat ([Doc] -> Doc) -> [Doc] -> Doc
forall a b. (a -> b) -> a -> b
$ (AbsolutePath -> Doc) -> [AbsolutePath] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map AbsolutePath -> Doc
forall a. Pretty a => a -> Doc
pretty [AbsolutePath]
incs
]
Bool -> TCM () -> TCM ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when ([AbsolutePath] -> [AbsolutePath]
forall a. Ord a => [a] -> [a]
sort [AbsolutePath]
oldIncs [AbsolutePath] -> [AbsolutePath] -> Bool
forall a. Eq a => a -> a -> Bool
/= [AbsolutePath] -> [AbsolutePath]
forall a. Ord a => [a] -> [a]
sort [AbsolutePath]
incs) (TCM () -> TCM ()) -> TCM () -> TCM ()
forall a b. (a -> b) -> a -> b
$ do
InteractionOutputCallback
ho <- TCMT IO InteractionOutputCallback
forall (m :: * -> *). ReadTCState m => m InteractionOutputCallback
getInteractionOutputCallback
[TCWarning]
tcWarnings <- Lens' [TCWarning] TCState -> TCMT IO [TCWarning]
forall (m :: * -> *) a. ReadTCState m => Lens' a TCState -> m a
useTC ([TCWarning] -> f [TCWarning]) -> TCState -> f TCState
Lens' [TCWarning] TCState
stTCWarnings
Map FilePath ProjectConfig
projectConfs <- Lens' (Map FilePath ProjectConfig) TCState
-> TCMT IO (Map FilePath ProjectConfig)
forall (m :: * -> *) a. ReadTCState m => Lens' a TCState -> m a
useTC (Map FilePath ProjectConfig -> f (Map FilePath ProjectConfig))
-> TCState -> f TCState
Lens' (Map FilePath ProjectConfig) TCState
stProjectConfigs
Map FilePath AgdaLibFile
agdaLibFiles <- Lens' (Map FilePath AgdaLibFile) TCState
-> TCMT IO (Map FilePath AgdaLibFile)
forall (m :: * -> *) a. ReadTCState m => Lens' a TCState -> m a
useTC (Map FilePath AgdaLibFile -> f (Map FilePath AgdaLibFile))
-> TCState -> f TCState
Lens' (Map FilePath AgdaLibFile) TCState
stAgdaLibFiles
DecodedModules
decodedModules <- TCM DecodedModules
getDecodedModules
(DecodedModules
keptDecodedModules, ModuleToSource
modFile) <- [AbsolutePath]
-> DecodedModules -> TCM (DecodedModules, ModuleToSource)
modulesToKeep [AbsolutePath]
incs DecodedModules
decodedModules
TCM ()
resetAllState
Lens' [TCWarning] TCState -> [TCWarning] -> TCM ()
forall (m :: * -> *) a.
MonadTCState m =>
Lens' a TCState -> a -> m ()
setTCLens ([TCWarning] -> f [TCWarning]) -> TCState -> f TCState
Lens' [TCWarning] TCState
stTCWarnings [TCWarning]
tcWarnings
Lens' (Map FilePath ProjectConfig) TCState
-> Map FilePath ProjectConfig -> TCM ()
forall (m :: * -> *) a.
MonadTCState m =>
Lens' a TCState -> a -> m ()
setTCLens (Map FilePath ProjectConfig -> f (Map FilePath ProjectConfig))
-> TCState -> f TCState
Lens' (Map FilePath ProjectConfig) TCState
stProjectConfigs Map FilePath ProjectConfig
projectConfs
Lens' (Map FilePath AgdaLibFile) TCState
-> Map FilePath AgdaLibFile -> TCM ()
forall (m :: * -> *) a.
MonadTCState m =>
Lens' a TCState -> a -> m ()
setTCLens (Map FilePath AgdaLibFile -> f (Map FilePath AgdaLibFile))
-> TCState -> f TCState
Lens' (Map FilePath AgdaLibFile) TCState
stAgdaLibFiles Map FilePath AgdaLibFile
agdaLibFiles
InteractionOutputCallback -> TCM ()
setInteractionOutputCallback InteractionOutputCallback
ho
DecodedModules -> TCM ()
setDecodedModules DecodedModules
keptDecodedModules
Lens' ModuleToSource TCState -> ModuleToSource -> TCM ()
forall (m :: * -> *) a.
MonadTCState m =>
Lens' a TCState -> a -> m ()
setTCLens (ModuleToSource -> f ModuleToSource) -> TCState -> f TCState
Lens' ModuleToSource TCState
stModuleToSource ModuleToSource
modFile
[AbsolutePath] -> TCM ()
forall (m :: * -> *). MonadTCState m => [AbsolutePath] -> m ()
Lens.putAbsoluteIncludePaths [AbsolutePath]
incs
where
modulesToKeep
:: [AbsolutePath]
-> DecodedModules
-> TCM (DecodedModules, ModuleToSource)
modulesToKeep :: [AbsolutePath]
-> DecodedModules -> TCM (DecodedModules, ModuleToSource)
modulesToKeep [AbsolutePath]
incs DecodedModules
old = DecodedModules
-> ModuleToSource
-> [ModuleInfo]
-> TCM (DecodedModules, ModuleToSource)
process DecodedModules
forall k a. Map k a
Map.empty ModuleToSource
forall k a. Map k a
Map.empty [ModuleInfo]
modules
where
dependencyGraph :: G.Graph TopLevelModuleName ()
dependencyGraph :: Graph TopLevelModuleName ()
dependencyGraph =
[TopLevelModuleName] -> Graph TopLevelModuleName ()
forall n e. Ord n => [n] -> Graph n e
G.fromNodes
[ Interface -> TopLevelModuleName
iTopLevelModuleName (Interface -> TopLevelModuleName)
-> Interface -> TopLevelModuleName
forall a b. (a -> b) -> a -> b
$ ModuleInfo -> Interface
miInterface ModuleInfo
m
| ModuleInfo
m <- DecodedModules -> [ModuleInfo]
forall k a. Map k a -> [a]
Map.elems DecodedModules
old
]
Graph TopLevelModuleName ()
-> Graph TopLevelModuleName () -> Graph TopLevelModuleName ()
forall n e. Ord n => Graph n e -> Graph n e -> Graph n e
`G.union`
[Edge TopLevelModuleName ()] -> Graph TopLevelModuleName ()
forall n e. Ord n => [Edge n e] -> Graph n e
G.fromEdges
[ G.Edge
{ source :: TopLevelModuleName
source = Interface -> TopLevelModuleName
iTopLevelModuleName (Interface -> TopLevelModuleName)
-> Interface -> TopLevelModuleName
forall a b. (a -> b) -> a -> b
$ ModuleInfo -> Interface
miInterface ModuleInfo
m
, target :: TopLevelModuleName
target = TopLevelModuleName
d
, label :: ()
label = ()
}
| ModuleInfo
m <- DecodedModules -> [ModuleInfo]
forall k a. Map k a -> [a]
Map.elems DecodedModules
old
, (TopLevelModuleName
d, Hash
_) <- Interface -> [(TopLevelModuleName, Hash)]
iImportedModules (Interface -> [(TopLevelModuleName, Hash)])
-> Interface -> [(TopLevelModuleName, Hash)]
forall a b. (a -> b) -> a -> b
$ ModuleInfo -> Interface
miInterface ModuleInfo
m
]
modules :: [ModuleInfo]
modules :: [ModuleInfo]
modules =
(SCC TopLevelModuleName -> ModuleInfo)
-> [SCC TopLevelModuleName] -> [ModuleInfo]
forall a b. (a -> b) -> [a] -> [b]
map (\case
Graph.CyclicSCC{} ->
ModuleInfo
forall a. HasCallStack => a
__IMPOSSIBLE__
Graph.AcyclicSCC TopLevelModuleName
m ->
case TopLevelModuleName -> DecodedModules -> Maybe ModuleInfo
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup TopLevelModuleName
m DecodedModules
old of
Just ModuleInfo
m -> ModuleInfo
m
Maybe ModuleInfo
Nothing -> ModuleInfo
forall a. HasCallStack => a
__IMPOSSIBLE__) ([SCC TopLevelModuleName] -> [ModuleInfo])
-> [SCC TopLevelModuleName] -> [ModuleInfo]
forall a b. (a -> b) -> a -> b
$
Graph TopLevelModuleName () -> [SCC TopLevelModuleName]
forall n e. Ord n => Graph n e -> [SCC n]
G.sccs' Graph TopLevelModuleName ()
dependencyGraph
process ::
Map TopLevelModuleName ModuleInfo -> ModuleToSource ->
[ModuleInfo] -> TCM (DecodedModules, ModuleToSource)
process :: DecodedModules
-> ModuleToSource
-> [ModuleInfo]
-> TCM (DecodedModules, ModuleToSource)
process !DecodedModules
keep !ModuleToSource
modFile [] = (DecodedModules, ModuleToSource)
-> TCM (DecodedModules, ModuleToSource)
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return
( [(TopLevelModuleName, ModuleInfo)] -> DecodedModules
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([(TopLevelModuleName, ModuleInfo)] -> DecodedModules)
-> [(TopLevelModuleName, ModuleInfo)] -> DecodedModules
forall a b. (a -> b) -> a -> b
$
DecodedModules -> [(TopLevelModuleName, ModuleInfo)]
forall k a. Map k a -> [(k, a)]
Map.toList DecodedModules
keep
, ModuleToSource
modFile
)
process DecodedModules
keep ModuleToSource
modFile (ModuleInfo
m : [ModuleInfo]
ms) = do
let deps :: [TopLevelModuleName]
deps = ((TopLevelModuleName, Hash) -> TopLevelModuleName)
-> [(TopLevelModuleName, Hash)] -> [TopLevelModuleName]
forall a b. (a -> b) -> [a] -> [b]
map (TopLevelModuleName, Hash) -> TopLevelModuleName
forall a b. (a, b) -> a
fst ([(TopLevelModuleName, Hash)] -> [TopLevelModuleName])
-> [(TopLevelModuleName, Hash)] -> [TopLevelModuleName]
forall a b. (a -> b) -> a -> b
$ Interface -> [(TopLevelModuleName, Hash)]
iImportedModules (Interface -> [(TopLevelModuleName, Hash)])
-> Interface -> [(TopLevelModuleName, Hash)]
forall a b. (a -> b) -> a -> b
$ ModuleInfo -> Interface
miInterface ModuleInfo
m
depsKept :: Bool
depsKept = (TopLevelModuleName -> Bool) -> [TopLevelModuleName] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (TopLevelModuleName -> DecodedModules -> Bool
forall k a. Ord k => k -> Map k a -> Bool
`Map.member` DecodedModules
keep) [TopLevelModuleName]
deps
(DecodedModules
keep, ModuleToSource
modFile) <-
if Bool -> Bool
not Bool
depsKept then (DecodedModules, ModuleToSource)
-> TCM (DecodedModules, ModuleToSource)
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (DecodedModules
keep, ModuleToSource
modFile) else do
let t :: TopLevelModuleName
t = Interface -> TopLevelModuleName
iTopLevelModuleName (Interface -> TopLevelModuleName)
-> Interface -> TopLevelModuleName
forall a b. (a -> b) -> a -> b
$ ModuleInfo -> Interface
miInterface ModuleInfo
m
Either FindError SourceFile
oldF <- TopLevelModuleName -> TCM (Either FindError SourceFile)
findFile' TopLevelModuleName
t
(Either FindError SourceFile
newF, ModuleToSource
modFile) <- IO (Either FindError SourceFile, ModuleToSource)
-> TCMT IO (Either FindError SourceFile, ModuleToSource)
forall a. IO a -> TCMT IO a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Either FindError SourceFile, ModuleToSource)
-> TCMT IO (Either FindError SourceFile, ModuleToSource))
-> IO (Either FindError SourceFile, ModuleToSource)
-> TCMT IO (Either FindError SourceFile, ModuleToSource)
forall a b. (a -> b) -> a -> b
$ [AbsolutePath]
-> TopLevelModuleName
-> ModuleToSource
-> IO (Either FindError SourceFile, ModuleToSource)
findFile'' [AbsolutePath]
incs TopLevelModuleName
t ModuleToSource
modFile
(DecodedModules, ModuleToSource)
-> TCM (DecodedModules, ModuleToSource)
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ((DecodedModules, ModuleToSource)
-> TCM (DecodedModules, ModuleToSource))
-> (DecodedModules, ModuleToSource)
-> TCM (DecodedModules, ModuleToSource)
forall a b. (a -> b) -> a -> b
$ case (Either FindError SourceFile
oldF, Either FindError SourceFile
newF) of
(Right SourceFile
f1, Right SourceFile
f2) | SourceFile
f1 SourceFile -> SourceFile -> Bool
forall a. Eq a => a -> a -> Bool
== SourceFile
f2 ->
(TopLevelModuleName
-> ModuleInfo -> DecodedModules -> DecodedModules
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert TopLevelModuleName
t ModuleInfo
m DecodedModules
keep, ModuleToSource
modFile)
(Either FindError SourceFile, Either FindError SourceFile)
_ -> (DecodedModules
keep, ModuleToSource
modFile)
DecodedModules
-> ModuleToSource
-> [ModuleInfo]
-> TCM (DecodedModules, ModuleToSource)
process DecodedModules
keep ModuleToSource
modFile [ModuleInfo]
ms
isPropEnabled :: HasOptions m => m Bool
isPropEnabled :: forall (m :: * -> *). HasOptions m => m Bool
isPropEnabled = PragmaOptions -> Bool
optProp (PragmaOptions -> Bool) -> m PragmaOptions -> m Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m PragmaOptions
forall (m :: * -> *). HasOptions m => m PragmaOptions
pragmaOptions
isTwoLevelEnabled :: HasOptions m => m Bool
isTwoLevelEnabled :: forall (m :: * -> *). HasOptions m => m Bool
isTwoLevelEnabled = WithDefault 'False -> Bool
forall (b :: Bool). KnownBool b => WithDefault b -> Bool
collapseDefault (WithDefault 'False -> Bool)
-> (PragmaOptions -> WithDefault 'False) -> PragmaOptions -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PragmaOptions -> WithDefault 'False
optTwoLevel (PragmaOptions -> Bool) -> m PragmaOptions -> m Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m PragmaOptions
forall (m :: * -> *). HasOptions m => m PragmaOptions
pragmaOptions
{-# SPECIALIZE hasUniversePolymorphism :: TCM Bool #-}
hasUniversePolymorphism :: HasOptions m => m Bool
hasUniversePolymorphism :: forall (m :: * -> *). HasOptions m => m Bool
hasUniversePolymorphism = PragmaOptions -> Bool
optUniversePolymorphism (PragmaOptions -> Bool) -> m PragmaOptions -> m Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m PragmaOptions
forall (m :: * -> *). HasOptions m => m PragmaOptions
pragmaOptions
showImplicitArguments :: HasOptions m => m Bool
showImplicitArguments :: forall (m :: * -> *). HasOptions m => m Bool
showImplicitArguments = PragmaOptions -> Bool
optShowImplicit (PragmaOptions -> Bool) -> m PragmaOptions -> m Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m PragmaOptions
forall (m :: * -> *). HasOptions m => m PragmaOptions
pragmaOptions
showIrrelevantArguments :: HasOptions m => m Bool
showIrrelevantArguments :: forall (m :: * -> *). HasOptions m => m Bool
showIrrelevantArguments = PragmaOptions -> Bool
optShowIrrelevant (PragmaOptions -> Bool) -> m PragmaOptions -> m Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m PragmaOptions
forall (m :: * -> *). HasOptions m => m PragmaOptions
pragmaOptions
showIdentitySubstitutions :: HasOptions m => m Bool
showIdentitySubstitutions :: forall (m :: * -> *). HasOptions m => m Bool
showIdentitySubstitutions = PragmaOptions -> Bool
optShowIdentitySubstitutions (PragmaOptions -> Bool) -> m PragmaOptions -> m Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m PragmaOptions
forall (m :: * -> *). HasOptions m => m PragmaOptions
pragmaOptions
withShowAllArguments :: ReadTCState m => m a -> m a
withShowAllArguments :: forall (m :: * -> *) a. ReadTCState m => m a -> m a
withShowAllArguments = Bool -> m a -> m a
forall (m :: * -> *) a. ReadTCState m => Bool -> m a -> m a
withShowAllArguments' Bool
True
withShowAllArguments' :: ReadTCState m => Bool -> m a -> m a
withShowAllArguments' :: forall (m :: * -> *) a. ReadTCState m => Bool -> m a -> m a
withShowAllArguments' Bool
yes = (PragmaOptions -> PragmaOptions) -> m a -> m a
forall (m :: * -> *) a.
ReadTCState m =>
(PragmaOptions -> PragmaOptions) -> m a -> m a
withPragmaOptions ((PragmaOptions -> PragmaOptions) -> m a -> m a)
-> (PragmaOptions -> PragmaOptions) -> m a -> m a
forall a b. (a -> b) -> a -> b
$ \ PragmaOptions
opts ->
PragmaOptions
opts { optShowImplicit :: Bool
optShowImplicit = Bool
yes, optShowIrrelevant :: Bool
optShowIrrelevant = Bool
yes }
withPragmaOptions :: ReadTCState m => (PragmaOptions -> PragmaOptions) -> m a -> m a
withPragmaOptions :: forall (m :: * -> *) a.
ReadTCState m =>
(PragmaOptions -> PragmaOptions) -> m a -> m a
withPragmaOptions = Lens' PragmaOptions TCState
-> (PragmaOptions -> PragmaOptions) -> m a -> m a
forall a b. Lens' a TCState -> (a -> a) -> m b -> m b
forall (m :: * -> *) a b.
ReadTCState m =>
Lens' a TCState -> (a -> a) -> m b -> m b
locallyTCState (PragmaOptions -> f PragmaOptions) -> TCState -> f TCState
Lens' PragmaOptions TCState
stPragmaOptions
positivityCheckEnabled :: HasOptions m => m Bool
positivityCheckEnabled :: forall (m :: * -> *). HasOptions m => m Bool
positivityCheckEnabled = Bool -> Bool
not (Bool -> Bool) -> (PragmaOptions -> Bool) -> PragmaOptions -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PragmaOptions -> Bool
optDisablePositivity (PragmaOptions -> Bool) -> m PragmaOptions -> m Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m PragmaOptions
forall (m :: * -> *). HasOptions m => m PragmaOptions
pragmaOptions
{-# SPECIALIZE typeInType :: TCM Bool #-}
typeInType :: HasOptions m => m Bool
typeInType :: forall (m :: * -> *). HasOptions m => m Bool
typeInType = Bool -> Bool
not (Bool -> Bool) -> (PragmaOptions -> Bool) -> PragmaOptions -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PragmaOptions -> Bool
optUniverseCheck (PragmaOptions -> Bool) -> m PragmaOptions -> m Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m PragmaOptions
forall (m :: * -> *). HasOptions m => m PragmaOptions
pragmaOptions
etaEnabled :: HasOptions m => m Bool
etaEnabled :: forall (m :: * -> *). HasOptions m => m Bool
etaEnabled = PragmaOptions -> Bool
optEta (PragmaOptions -> Bool) -> m PragmaOptions -> m Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m PragmaOptions
forall (m :: * -> *). HasOptions m => m PragmaOptions
pragmaOptions
maxInstanceSearchDepth :: HasOptions m => m Int
maxInstanceSearchDepth :: forall (m :: * -> *). HasOptions m => m VerboseLevel
maxInstanceSearchDepth = PragmaOptions -> VerboseLevel
optInstanceSearchDepth (PragmaOptions -> VerboseLevel)
-> m PragmaOptions -> m VerboseLevel
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m PragmaOptions
forall (m :: * -> *). HasOptions m => m PragmaOptions
pragmaOptions
maxInversionDepth :: HasOptions m => m Int
maxInversionDepth :: forall (m :: * -> *). HasOptions m => m VerboseLevel
maxInversionDepth = PragmaOptions -> VerboseLevel
optInversionMaxDepth (PragmaOptions -> VerboseLevel)
-> m PragmaOptions -> m VerboseLevel
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m PragmaOptions
forall (m :: * -> *). HasOptions m => m PragmaOptions
pragmaOptions
getLanguage :: HasOptions m => m Language
getLanguage :: forall (m :: * -> *). HasOptions m => m Language
getLanguage = do
PragmaOptions
opts <- m PragmaOptions
forall (m :: * -> *). HasOptions m => m PragmaOptions
pragmaOptions
Language -> m Language
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Language -> m Language) -> Language -> m Language
forall a b. (a -> b) -> a -> b
$
if Bool -> Bool
not (WithDefault 'False -> Bool
forall (b :: Bool). KnownBool b => WithDefault b -> Bool
collapseDefault (PragmaOptions -> WithDefault 'False
optWithoutK PragmaOptions
opts)) then Language
WithK else
case PragmaOptions -> Maybe Cubical
optCubical PragmaOptions
opts of
Just Cubical
variant -> Cubical -> Language
Cubical Cubical
variant
Maybe Cubical
Nothing -> Language
WithoutK