Add a new --values option for selectively displaying value provenance

This commit is contained in:
John Wiegley 2018-04-25 20:46:54 -07:00
parent 5f4a4096cf
commit defc5ed66d
4 changed files with 21 additions and 5 deletions

View File

@ -89,6 +89,8 @@ main = do
<=< fromNix
| normalize opts =
liftIO . print . prettyNixValue <=< normalForm
| values opts =
liftIO . print <=< renderNValueProv
| otherwise =
liftIO . print <=< renderNValue

View File

@ -12,6 +12,7 @@ data Options = Options
{ verbose :: Verbosity
, tracing :: Bool
, thunks :: Bool
, values :: Bool
, reduce :: Maybe FilePath
, reduceSets :: Bool
, reduceLists :: Bool
@ -43,6 +44,7 @@ defaultOptions = Options
{ verbose = ErrorsOnly
, tracing = False
, thunks = False
, values = False
, reduce = Nothing
, reduceSets = False
, reduceLists = False
@ -109,6 +111,9 @@ nixOptions = Options
<*> switch
( long "thunks"
<> help "Enable reporting of thunk tracing as well as regular evaluation")
<*> switch
( long "values"
<> help "Enable reporting of value provenance in error messages")
<*> optional (strOption
( long "reduce"
<> help "When done evaluating, output the evaluated part of the expression to FILE"))

View File

@ -260,7 +260,10 @@ renderNValueF :: MonadVar m => NValueF m (NThunk m) -> m Doc
renderNValueF = fmap prettyNixValue . removeEffectsM
renderNValue :: MonadVar m => NValue m -> m Doc
renderNValue = \case
renderNValue (NValue _ v) = renderNValueF v
renderNValueProv :: MonadVar m => NValue m -> m Doc
renderNValueProv = \case
NValue [] v -> renderNValueF v
NValue ps v -> do
v' <- renderNValueF v

View File

@ -137,10 +137,16 @@ renderValueFrame level = pure . (:[]) . \case
renderExecFrame :: (MonadReader e m, Has e Options, MonadVar m, MonadFile m)
=> NixLevel -> ExecFrame m -> m [Doc]
renderExecFrame _level = fmap (:[]) . \case
Assertion v ->
-- jww (2018-04-24): Render values nicely based on the verbosity.
(text "Assertion failed:" </>) <$> renderNValue v
renderExecFrame _level f = do
opts :: Options <- asks (view hasLens)
(:[]) <$> case f of
Assertion v
| values opts ->
-- jww (2018-04-24): Render value provenance differently
-- based on the verbosity.
(text "Assertion failed:" </>) <$> renderNValueProv v
| otherwise ->
pure $ text "Assertion failed"
renderThunkLoop :: (MonadReader e m, Has e Options, MonadFile m)
=> NixLevel -> ThunkLoop -> m [Doc]