2018-04-01 19:33:43 +02:00
|
|
|
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
|
|
|
|
{-# LANGUAGE TypeApplications #-}
|
|
|
|
|
2018-03-30 23:08:38 +02:00
|
|
|
module Nix where
|
|
|
|
|
2018-04-01 19:33:43 +02:00
|
|
|
import Control.Monad.Fix
|
|
|
|
import Control.Monad.IO.Class
|
|
|
|
import Control.Monad.Reader (MonadReader)
|
|
|
|
import Control.Monad.Trans.Reader
|
2018-03-31 23:43:08 +02:00
|
|
|
import qualified Data.HashMap.Lazy as M
|
2018-03-30 23:08:38 +02:00
|
|
|
import Nix.Builtins
|
|
|
|
import Nix.Eval
|
2018-03-31 08:00:06 +02:00
|
|
|
import Nix.Expr.Types.Annotated (NExprLoc, stripAnnotation)
|
2018-03-30 23:08:38 +02:00
|
|
|
import Nix.Lint
|
2018-03-30 23:25:03 +02:00
|
|
|
import Nix.Monad
|
2018-03-30 23:08:38 +02:00
|
|
|
import Nix.Monad.Instance
|
2018-03-31 23:43:08 +02:00
|
|
|
import Nix.Scope
|
2018-03-30 23:08:38 +02:00
|
|
|
import Nix.Utils
|
|
|
|
|
|
|
|
-- | Evaluate a nix expression in the default context
|
2018-03-31 23:43:08 +02:00
|
|
|
evalTopLevelExpr :: MonadBuiltins e m
|
2018-03-31 08:00:06 +02:00
|
|
|
=> Maybe FilePath -> NExprLoc -> m (NValueNF m)
|
2018-03-30 23:08:38 +02:00
|
|
|
evalTopLevelExpr mdir expr = do
|
2018-03-30 23:55:30 +02:00
|
|
|
base <- baseEnv
|
|
|
|
(normalForm =<<) $ pushScopes base $ case mdir of
|
2018-03-31 08:00:06 +02:00
|
|
|
Nothing -> contextualExprEval expr
|
2018-03-30 23:55:30 +02:00
|
|
|
Just dir -> do
|
|
|
|
traceM $ "Setting __cwd = " ++ show dir
|
|
|
|
ref <- valueRef $ NVLiteralPath dir
|
2018-03-31 23:43:08 +02:00
|
|
|
pushScope (M.singleton "__cwd" ref) (contextualExprEval expr)
|
2018-03-30 23:08:38 +02:00
|
|
|
|
2018-04-01 19:33:43 +02:00
|
|
|
evalTopLevelExprIO :: Maybe FilePath -> NExprLoc -> IO (NValueNF (Lazy IO))
|
|
|
|
evalTopLevelExprIO mdir = runLazyIO . evalTopLevelExpr mdir
|
2018-03-30 23:08:38 +02:00
|
|
|
|
2018-03-31 08:00:06 +02:00
|
|
|
-- informativeEvalTopLevelExprIO :: Maybe FilePath -> NExpr
|
2018-04-01 19:33:43 +02:00
|
|
|
-- -> IO (NValueNF (Lazy IO))
|
2018-03-31 08:00:06 +02:00
|
|
|
-- informativeEvalTopLevelExprIO mdir expr =
|
2018-04-01 19:33:43 +02:00
|
|
|
-- runReaderT (runLazy (evalTopLevelExpr mdir expr)) []
|
2018-03-31 08:00:06 +02:00
|
|
|
|
|
|
|
tracingEvalTopLevelExprIO :: Maybe FilePath -> NExprLoc
|
2018-04-01 19:33:43 +02:00
|
|
|
-> IO (NValueNF (Lazy IO))
|
2018-03-30 23:08:38 +02:00
|
|
|
tracingEvalTopLevelExprIO mdir expr = do
|
2018-03-30 23:55:30 +02:00
|
|
|
traced <- tracingExprEval expr
|
|
|
|
case mdir of
|
|
|
|
Nothing ->
|
2018-04-01 19:33:43 +02:00
|
|
|
runLazyIO (normalForm =<< (`pushScopes` traced) =<< baseEnv)
|
2018-03-30 23:08:38 +02:00
|
|
|
Just dir -> do
|
|
|
|
traceM $ "Setting __cwd = " ++ show dir
|
2018-04-01 19:33:43 +02:00
|
|
|
ref <- runLazyIO (valueRef $ NVLiteralPath dir)
|
2018-03-31 23:43:08 +02:00
|
|
|
let m = M.singleton "__cwd" ref
|
2018-04-01 19:33:43 +02:00
|
|
|
runLazyIO (baseEnv >>= (`pushScopes` pushScope m traced)
|
2018-03-30 23:55:30 +02:00
|
|
|
>>= normalForm)
|
2018-03-30 23:08:38 +02:00
|
|
|
|
2018-04-01 19:33:43 +02:00
|
|
|
newtype Lint m a = Lint
|
|
|
|
{ runLint :: ReaderT (Context Symbolic) m a }
|
|
|
|
deriving (Functor, Applicative, Monad, MonadFix, MonadIO,
|
|
|
|
MonadReader (Context Symbolic))
|
|
|
|
|
|
|
|
runLintIO :: Lint IO a -> IO a
|
|
|
|
runLintIO = flip runReaderT (Context emptyScopes []) . runLint
|
|
|
|
|
|
|
|
symbolicBaseEnv :: Monad m => m (Scopes Symbolic)
|
|
|
|
symbolicBaseEnv = return [Scope M.empty False]
|
|
|
|
|
|
|
|
lintExprIO :: NExprLoc -> IO Symbolic
|
|
|
|
lintExprIO expr =
|
|
|
|
runLintIO (symbolicBaseEnv
|
|
|
|
>>= (`pushScopes` lintExpr (stripAnnotation expr)))
|