{-# LANGUAGE CPP #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE ViewPatterns #-}
{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
module Nix.Pretty where
import Prelude hiding ( toList, group )
import Nix.Utils
import Control.Monad.Free ( Free(Free) )
import Data.Fix ( Fix(..)
, foldFix )
import Data.HashMap.Lazy ( toList )
import qualified Data.HashMap.Lazy as M
import qualified Data.HashSet as HashSet
import qualified Data.List.NonEmpty as NE
import Data.Text ( replace
, strip
)
import qualified Data.Text as Text
import Prettyprinter hiding ( list )
import Nix.Atoms
import Nix.Cited
import Nix.Expr
import Nix.Expr.Strings
import Nix.Normal
import Nix.Parser
import Nix.String
import Nix.Thunk
import Nix.Value
data NixDoc ann = NixDoc
{
NixDoc ann -> Doc ann
withoutParens :: Doc ann
, NixDoc ann -> OperatorInfo
rootOp :: OperatorInfo
, NixDoc ann -> Bool
wasPath :: Bool
}
mkNixDoc :: OperatorInfo -> Doc ann -> NixDoc ann
mkNixDoc :: OperatorInfo -> Doc ann -> NixDoc ann
mkNixDoc OperatorInfo
o Doc ann
d = NixDoc :: forall ann. Doc ann -> OperatorInfo -> Bool -> NixDoc ann
NixDoc { withoutParens :: Doc ann
withoutParens = Doc ann
d, rootOp :: OperatorInfo
rootOp = OperatorInfo
o, wasPath :: Bool
wasPath = Bool
False }
simpleExpr :: Doc ann -> NixDoc ann
simpleExpr :: Doc ann -> NixDoc ann
simpleExpr = OperatorInfo -> Doc ann -> NixDoc ann
forall ann. OperatorInfo -> Doc ann -> NixDoc ann
mkNixDoc (OperatorInfo -> Doc ann -> NixDoc ann)
-> OperatorInfo -> Doc ann -> NixDoc ann
forall a b. (a -> b) -> a -> b
$ Int -> NAssoc -> Text -> OperatorInfo
OperatorInfo Int
forall a. Bounded a => a
minBound NAssoc
NAssocNone Text
"simple expr"
pathExpr :: Doc ann -> NixDoc ann
pathExpr :: Doc ann -> NixDoc ann
pathExpr Doc ann
d = (Doc ann -> NixDoc ann
forall ann. Doc ann -> NixDoc ann
simpleExpr Doc ann
d) { wasPath :: Bool
wasPath = Bool
True }
leastPrecedence :: Doc ann -> NixDoc ann
leastPrecedence :: Doc ann -> NixDoc ann
leastPrecedence =
OperatorInfo -> Doc ann -> NixDoc ann
forall ann. OperatorInfo -> Doc ann -> NixDoc ann
mkNixDoc (Int -> NAssoc -> Text -> OperatorInfo
OperatorInfo Int
forall a. Bounded a => a
maxBound NAssoc
NAssocNone Text
"least precedence")
appOp :: OperatorInfo
appOp :: OperatorInfo
appOp = NBinaryOp -> OperatorInfo
getBinaryOperator NBinaryOp
NApp
appOpNonAssoc :: OperatorInfo
appOpNonAssoc :: OperatorInfo
appOpNonAssoc = (NBinaryOp -> OperatorInfo
getBinaryOperator NBinaryOp
NApp) { associativity :: NAssoc
associativity = NAssoc
NAssocNone }
selectOp :: OperatorInfo
selectOp :: OperatorInfo
selectOp = NSpecialOp -> OperatorInfo
getSpecialOperator NSpecialOp
NSelectOp
hasAttrOp :: OperatorInfo
hasAttrOp :: OperatorInfo
hasAttrOp = NSpecialOp -> OperatorInfo
getSpecialOperator NSpecialOp
NHasAttrOp
wrapParens :: OperatorInfo -> NixDoc ann -> Doc ann
wrapParens :: OperatorInfo -> NixDoc ann -> Doc ann
wrapParens OperatorInfo
op NixDoc ann
sub =
(Doc ann -> Doc ann)
-> (Doc ann -> Doc ann) -> Bool -> Doc ann -> Doc ann
forall a. a -> a -> Bool -> a
bool
(\ Doc ann
a -> Doc ann
"(" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
a Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
")")
Doc ann -> Doc ann
forall a. a -> a
id
( OperatorInfo -> Int
precedence (NixDoc ann -> OperatorInfo
forall ann. NixDoc ann -> OperatorInfo
rootOp NixDoc ann
sub) Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< OperatorInfo -> Int
precedence OperatorInfo
op
Bool -> Bool -> Bool
|| (OperatorInfo -> Int
precedence (NixDoc ann -> OperatorInfo
forall ann. NixDoc ann -> OperatorInfo
rootOp NixDoc ann
sub) Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== OperatorInfo -> Int
precedence OperatorInfo
op
Bool -> Bool -> Bool
&& OperatorInfo -> NAssoc
associativity (NixDoc ann -> OperatorInfo
forall ann. NixDoc ann -> OperatorInfo
rootOp NixDoc ann
sub) NAssoc -> NAssoc -> Bool
forall a. Eq a => a -> a -> Bool
== OperatorInfo -> NAssoc
associativity OperatorInfo
op
Bool -> Bool -> Bool
&& OperatorInfo -> NAssoc
associativity OperatorInfo
op NAssoc -> NAssoc -> Bool
forall a. Eq a => a -> a -> Bool
/= NAssoc
NAssocNone)
)
(NixDoc ann -> Doc ann
forall ann. NixDoc ann -> Doc ann
withoutParens NixDoc ann
sub)
wrapPath :: OperatorInfo -> NixDoc ann -> Doc ann
wrapPath :: OperatorInfo -> NixDoc ann -> Doc ann
wrapPath OperatorInfo
op NixDoc ann
sub =
Doc ann -> Doc ann -> Bool -> Doc ann
forall a. a -> a -> Bool -> a
bool
(OperatorInfo -> NixDoc ann -> Doc ann
forall ann. OperatorInfo -> NixDoc ann -> Doc ann
wrapParens OperatorInfo
op NixDoc ann
sub)
(Doc ann
"\"${" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> NixDoc ann -> Doc ann
forall ann. NixDoc ann -> Doc ann
withoutParens NixDoc ann
sub Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"}\"")
(NixDoc ann -> Bool
forall ann. NixDoc ann -> Bool
wasPath NixDoc ann
sub)
prettyString :: NString (NixDoc ann) -> Doc ann
prettyString :: NString (NixDoc ann) -> Doc ann
prettyString (DoubleQuoted [Antiquoted Text (NixDoc ann)]
parts) = Doc ann
"\"" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> ([Doc ann] -> Doc ann
forall a. Monoid a => [a] -> a
mconcat ([Doc ann] -> Doc ann)
-> ([Antiquoted Text (NixDoc ann)] -> [Doc ann])
-> [Antiquoted Text (NixDoc ann)]
-> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Antiquoted Text (NixDoc ann) -> Doc ann)
-> [Antiquoted Text (NixDoc ann)] -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Antiquoted Text (NixDoc ann) -> Doc ann
forall a ann. ToString a => Antiquoted a (NixDoc ann) -> Doc ann
prettyPart ([Antiquoted Text (NixDoc ann)] -> Doc ann)
-> [Antiquoted Text (NixDoc ann)] -> Doc ann
forall a b. (a -> b) -> a -> b
$ [Antiquoted Text (NixDoc ann)]
parts) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"\""
where
prettyPart :: Antiquoted a (NixDoc ann) -> Doc ann
prettyPart (Plain a
t) = [Char] -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty ([Char] -> Doc ann) -> (a -> [Char]) -> a -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> [Char]) -> [Char] -> [Char]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap Char -> [Char]
escape ([Char] -> [Char]) -> (a -> [Char]) -> a -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> [Char]
forall a. ToString a => a -> [Char]
toString (a -> Doc ann) -> a -> Doc ann
forall a b. (a -> b) -> a -> b
$ a
t
prettyPart Antiquoted a (NixDoc ann)
EscapedNewline = Doc ann
"''\\n"
prettyPart (Antiquoted NixDoc ann
r) = Doc ann
"${" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> NixDoc ann -> Doc ann
forall ann. NixDoc ann -> Doc ann
withoutParens NixDoc ann
r Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"}"
escape :: Char -> [Char]
escape Char
'"' = [Char]
"\\\""
escape Char
x =
[Char] -> (Char -> [Char]) -> Maybe Char -> [Char]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
[Char
x]
((Char
'\\' Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
:) ([Char] -> [Char]) -> (Char -> [Char]) -> Char -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
: [Char]
forall a. Monoid a => a
mempty))
(Char -> Maybe Char
toEscapeCode Char
x)
prettyString (Indented Int
_ [Antiquoted Text (NixDoc ann)]
parts) = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
group (Doc ann -> Doc ann) -> Doc ann -> Doc ann
forall a b. (a -> b) -> a -> b
$ Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
nest Int
2 (Doc ann -> Doc ann) -> Doc ann -> Doc ann
forall a b. (a -> b) -> a -> b
$ [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vcat
[Doc ann
"''", Doc ann
content, Doc ann
"''"]
where
content :: Doc ann
content = [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep ([Doc ann] -> Doc ann)
-> ([Antiquoted Text (NixDoc ann)] -> [Doc ann])
-> [Antiquoted Text (NixDoc ann)]
-> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Antiquoted Text (NixDoc ann)] -> Doc ann)
-> [[Antiquoted Text (NixDoc ann)]] -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Antiquoted Text (NixDoc ann)] -> Doc ann
forall ann. [Antiquoted Text (NixDoc ann)] -> Doc ann
prettyLine ([[Antiquoted Text (NixDoc ann)]] -> [Doc ann])
-> ([Antiquoted Text (NixDoc ann)]
-> [[Antiquoted Text (NixDoc ann)]])
-> [Antiquoted Text (NixDoc ann)]
-> [Doc ann]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[Antiquoted Text (NixDoc ann)]]
-> [[Antiquoted Text (NixDoc ann)]]
forall r. [[Antiquoted Text r]] -> [[Antiquoted Text r]]
stripLastIfEmpty ([[Antiquoted Text (NixDoc ann)]]
-> [[Antiquoted Text (NixDoc ann)]])
-> ([Antiquoted Text (NixDoc ann)]
-> [[Antiquoted Text (NixDoc ann)]])
-> [Antiquoted Text (NixDoc ann)]
-> [[Antiquoted Text (NixDoc ann)]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Antiquoted Text (NixDoc ann)] -> [[Antiquoted Text (NixDoc ann)]]
forall r. [Antiquoted Text r] -> [[Antiquoted Text r]]
splitLines ([Antiquoted Text (NixDoc ann)] -> Doc ann)
-> [Antiquoted Text (NixDoc ann)] -> Doc ann
forall a b. (a -> b) -> a -> b
$ [Antiquoted Text (NixDoc ann)]
parts
stripLastIfEmpty :: [[Antiquoted Text r]] -> [[Antiquoted Text r]]
stripLastIfEmpty = [[Antiquoted Text r]] -> [[Antiquoted Text r]]
forall a. [a] -> [a]
reverse ([[Antiquoted Text r]] -> [[Antiquoted Text r]])
-> ([[Antiquoted Text r]] -> [[Antiquoted Text r]])
-> [[Antiquoted Text r]]
-> [[Antiquoted Text r]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[Antiquoted Text r]] -> [[Antiquoted Text r]]
forall r. [[Antiquoted Text r]] -> [[Antiquoted Text r]]
f ([[Antiquoted Text r]] -> [[Antiquoted Text r]])
-> ([[Antiquoted Text r]] -> [[Antiquoted Text r]])
-> [[Antiquoted Text r]]
-> [[Antiquoted Text r]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[Antiquoted Text r]] -> [[Antiquoted Text r]]
forall a. [a] -> [a]
reverse where
f :: [[Antiquoted Text r]] -> [[Antiquoted Text r]]
f ([Plain Text
t] : [[Antiquoted Text r]]
xs) | Text -> Bool
Text.null (Text -> Text
strip Text
t) = [[Antiquoted Text r]]
xs
f [[Antiquoted Text r]]
xs = [[Antiquoted Text r]]
xs
prettyLine :: [Antiquoted Text (NixDoc ann)] -> Doc ann
prettyLine = [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hcat ([Doc ann] -> Doc ann)
-> ([Antiquoted Text (NixDoc ann)] -> [Doc ann])
-> [Antiquoted Text (NixDoc ann)]
-> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Antiquoted Text (NixDoc ann) -> Doc ann)
-> [Antiquoted Text (NixDoc ann)] -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Antiquoted Text (NixDoc ann) -> Doc ann
forall ann. Antiquoted Text (NixDoc ann) -> Doc ann
prettyPart
prettyPart :: Antiquoted Text (NixDoc ann) -> Doc ann
prettyPart (Plain Text
t) =
Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Text -> Doc ann) -> (Text -> Text) -> Text -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text -> Text -> Text
replace Text
"${" Text
"''${" (Text -> Text) -> (Text -> Text) -> Text -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text -> Text -> Text
replace Text
"''" Text
"'''" (Text -> Doc ann) -> Text -> Doc ann
forall a b. (a -> b) -> a -> b
$ Text
t
prettyPart Antiquoted Text (NixDoc ann)
EscapedNewline = Doc ann
"\\n"
prettyPart (Antiquoted NixDoc ann
r) = Doc ann
"${" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> NixDoc ann -> Doc ann
forall ann. NixDoc ann -> Doc ann
withoutParens NixDoc ann
r Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"}"
prettyParams :: Params (NixDoc ann) -> Doc ann
prettyParams :: Params (NixDoc ann) -> Doc ann
prettyParams (Param Text
n ) = Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Text
n
prettyParams (ParamSet ParamSet (NixDoc ann)
s Bool
v Maybe Text
mname) = ParamSet (NixDoc ann) -> Bool -> Doc ann
forall ann. ParamSet (NixDoc ann) -> Bool -> Doc ann
prettyParamSet ParamSet (NixDoc ann)
s Bool
v Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<>
Doc ann -> (Text -> Doc ann) -> Maybe Text -> Doc ann
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
Doc ann
forall a. Monoid a => a
mempty
(\ Text
name ->
Doc ann -> Doc ann -> Bool -> Doc ann
forall a. a -> a -> Bool -> a
bool
Doc ann
forall a. Monoid a => a
mempty
(Doc ann
"@" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Text
name)
(Bool -> Bool
not (Text -> Bool
Text.null Text
name))
)
Maybe Text
mname
prettyParamSet :: ParamSet (NixDoc ann) -> Bool -> Doc ann
prettyParamSet :: ParamSet (NixDoc ann) -> Bool -> Doc ann
prettyParamSet ParamSet (NixDoc ann)
args Bool
var =
Doc ann -> Doc ann -> Doc ann -> [Doc ann] -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann -> [Doc ann] -> Doc ann
encloseSep
Doc ann
"{ "
(Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
align Doc ann
" }")
Doc ann
forall ann. Doc ann
sep
(((Text, Maybe (NixDoc ann)) -> Doc ann)
-> ParamSet (NixDoc ann) -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Text, Maybe (NixDoc ann)) -> Doc ann
forall a ann. Pretty a => (a, Maybe (NixDoc ann)) -> Doc ann
prettySetArg ParamSet (NixDoc ann)
args [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Doc ann]
prettyVariadic)
where
prettySetArg :: (a, Maybe (NixDoc ann)) -> Doc ann
prettySetArg (a
n, Maybe (NixDoc ann)
maybeDef) =
Doc ann -> (NixDoc ann -> Doc ann) -> Maybe (NixDoc ann) -> Doc ann
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
(a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty a
n)
(\NixDoc ann
x -> a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty a
n Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
" ? " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> NixDoc ann -> Doc ann
forall ann. NixDoc ann -> Doc ann
withoutParens NixDoc ann
x)
Maybe (NixDoc ann)
maybeDef
prettyVariadic :: [Doc ann]
prettyVariadic = [ Doc ann
"..." | Bool
var ]
sep :: Doc ann
sep = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
align Doc ann
", "
prettyBind :: Binding (NixDoc ann) -> Doc ann
prettyBind :: Binding (NixDoc ann) -> Doc ann
prettyBind (NamedVar NAttrPath (NixDoc ann)
n NixDoc ann
v SourcePos
_p) =
NAttrPath (NixDoc ann) -> Doc ann
forall ann. NAttrPath (NixDoc ann) -> Doc ann
prettySelector NAttrPath (NixDoc ann)
n Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
" = " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> NixDoc ann -> Doc ann
forall ann. NixDoc ann -> Doc ann
withoutParens NixDoc ann
v Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
";"
prettyBind (Inherit Maybe (NixDoc ann)
s [NKeyName (NixDoc ann)]
ns SourcePos
_p) =
Doc ann
"inherit " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
scope Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
align ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
fillSep ([Doc ann] -> Doc ann) -> [Doc ann] -> Doc ann
forall a b. (a -> b) -> a -> b
$ NKeyName (NixDoc ann) -> Doc ann
forall ann. NKeyName (NixDoc ann) -> Doc ann
prettyKeyName (NKeyName (NixDoc ann) -> Doc ann)
-> [NKeyName (NixDoc ann)] -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [NKeyName (NixDoc ann)]
ns) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
";"
where
scope :: Doc ann
scope =
Doc ann -> (NixDoc ann -> Doc ann) -> Maybe (NixDoc ann) -> Doc ann
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
Doc ann
forall a. Monoid a => a
mempty
((Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
" ") (Doc ann -> Doc ann)
-> (NixDoc ann -> Doc ann) -> NixDoc ann -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Doc ann -> Doc ann)
-> (NixDoc ann -> Doc ann) -> NixDoc ann -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NixDoc ann -> Doc ann
forall ann. NixDoc ann -> Doc ann
withoutParens)
Maybe (NixDoc ann)
s
prettyKeyName :: NKeyName (NixDoc ann) -> Doc ann
prettyKeyName :: NKeyName (NixDoc ann) -> Doc ann
prettyKeyName (StaticKey Text
"") = Doc ann
"\"\""
prettyKeyName (StaticKey Text
key) | Text -> HashSet Text -> Bool
forall a. (Eq a, Hashable a) => a -> HashSet a -> Bool
HashSet.member Text
key HashSet Text
reservedNames = Doc ann
"\"" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Text
key Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"\""
prettyKeyName (StaticKey Text
key) = Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Text
key
prettyKeyName (DynamicKey Antiquoted (NString (NixDoc ann)) (NixDoc ann)
key) =
NString (NixDoc ann)
-> (NString (NixDoc ann) -> Doc ann)
-> (NixDoc ann -> Doc ann)
-> Antiquoted (NString (NixDoc ann)) (NixDoc ann)
-> Doc ann
forall v a r. v -> (v -> a) -> (r -> a) -> Antiquoted v r -> a
runAntiquoted
([Antiquoted Text (NixDoc ann)] -> NString (NixDoc ann)
forall r. [Antiquoted Text r] -> NString r
DoubleQuoted [Text -> Antiquoted Text (NixDoc ann)
forall v r. v -> Antiquoted v r
Plain Text
"\n"])
NString (NixDoc ann) -> Doc ann
forall ann. NString (NixDoc ann) -> Doc ann
prettyString
(\ NixDoc ann
x -> Doc ann
"${" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> NixDoc ann -> Doc ann
forall ann. NixDoc ann -> Doc ann
withoutParens NixDoc ann
x Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"}")
Antiquoted (NString (NixDoc ann)) (NixDoc ann)
key
prettySelector :: NAttrPath (NixDoc ann) -> Doc ann
prettySelector :: NAttrPath (NixDoc ann) -> Doc ann
prettySelector = [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hcat ([Doc ann] -> Doc ann)
-> (NAttrPath (NixDoc ann) -> [Doc ann])
-> NAttrPath (NixDoc ann)
-> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
"." ([Doc ann] -> [Doc ann])
-> (NAttrPath (NixDoc ann) -> [Doc ann])
-> NAttrPath (NixDoc ann)
-> [Doc ann]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (NKeyName (NixDoc ann) -> Doc ann)
-> [NKeyName (NixDoc ann)] -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap NKeyName (NixDoc ann) -> Doc ann
forall ann. NKeyName (NixDoc ann) -> Doc ann
prettyKeyName ([NKeyName (NixDoc ann)] -> [Doc ann])
-> (NAttrPath (NixDoc ann) -> [NKeyName (NixDoc ann)])
-> NAttrPath (NixDoc ann)
-> [Doc ann]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NAttrPath (NixDoc ann) -> [NKeyName (NixDoc ann)]
forall a. NonEmpty a -> [a]
NE.toList
prettyAtom :: NAtom -> NixDoc ann
prettyAtom :: NAtom -> NixDoc ann
prettyAtom NAtom
atom = Doc ann -> NixDoc ann
forall ann. Doc ann -> NixDoc ann
simpleExpr (Doc ann -> NixDoc ann) -> Doc ann -> NixDoc ann
forall a b. (a -> b) -> a -> b
$ Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Text -> Doc ann) -> Text -> Doc ann
forall a b. (a -> b) -> a -> b
$ NAtom -> Text
atomText NAtom
atom
prettyNix :: NExpr -> Doc ann
prettyNix :: NExpr -> Doc ann
prettyNix = NixDoc ann -> Doc ann
forall ann. NixDoc ann -> Doc ann
withoutParens (NixDoc ann -> Doc ann)
-> (NExpr -> NixDoc ann) -> NExpr -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (NExprF (NixDoc ann) -> NixDoc ann) -> NExpr -> NixDoc ann
forall (f :: * -> *) a. Functor f => (f a -> a) -> Fix f -> a
foldFix NExprF (NixDoc ann) -> NixDoc ann
forall ann. NExprF (NixDoc ann) -> NixDoc ann
exprFNixDoc
prettyOriginExpr
:: forall t f m ann
. HasCitations1 m (NValue t f m) f
=> NExprLocF (Maybe (NValue t f m))
-> Doc ann
prettyOriginExpr :: NExprLocF (Maybe (NValue t f m)) -> Doc ann
prettyOriginExpr = NixDoc ann -> Doc ann
forall ann. NixDoc ann -> Doc ann
withoutParens (NixDoc ann -> Doc ann)
-> (NExprLocF (Maybe (NValue t f m)) -> NixDoc ann)
-> NExprLocF (Maybe (NValue t f m))
-> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NExprLocF (Maybe (NValue t f m)) -> NixDoc ann
forall ann.
Compose (Ann ann) NExprF (Maybe (NValue t f m)) -> NixDoc ann
go
where
go :: Compose (Ann ann) NExprF (Maybe (NValue t f m)) -> NixDoc ann
go = NExprF (NixDoc ann) -> NixDoc ann
forall ann. NExprF (NixDoc ann) -> NixDoc ann
exprFNixDoc (NExprF (NixDoc ann) -> NixDoc ann)
-> (Compose (Ann ann) NExprF (Maybe (NValue t f m))
-> NExprF (NixDoc ann))
-> Compose (Ann ann) NExprF (Maybe (NValue t f m))
-> NixDoc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AnnF ann NExprF (NixDoc ann) -> NExprF (NixDoc ann)
forall ann (f :: * -> *) r. AnnF ann f r -> f r
stripAnn (AnnF ann NExprF (NixDoc ann) -> NExprF (NixDoc ann))
-> (Compose (Ann ann) NExprF (Maybe (NValue t f m))
-> AnnF ann NExprF (NixDoc ann))
-> Compose (Ann ann) NExprF (Maybe (NValue t f m))
-> NExprF (NixDoc ann)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Maybe (NValue t f m) -> NixDoc ann)
-> Compose (Ann ann) NExprF (Maybe (NValue t f m))
-> AnnF ann NExprF (NixDoc ann)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Maybe (NValue t f m) -> NixDoc ann
render
render :: Maybe (NValue t f m) -> NixDoc ann
render :: Maybe (NValue t f m) -> NixDoc ann
render Maybe (NValue t f m)
Nothing = Doc ann -> NixDoc ann
forall ann. Doc ann -> NixDoc ann
simpleExpr Doc ann
"_"
render (Just (Free ([Provenance m (NValue t f m)] -> [Provenance m (NValue t f m)]
forall a. [a] -> [a]
reverse ([Provenance m (NValue t f m)] -> [Provenance m (NValue t f m)])
-> (NValue' t f m (NValue t f m) -> [Provenance m (NValue t f m)])
-> NValue' t f m (NValue t f m)
-> [Provenance m (NValue t f m)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall v a. HasCitations m v a => a -> [Provenance m v]
forall (m :: * -> *) v a.
HasCitations m v a =>
a -> [Provenance m v]
citations @m -> Provenance m (NValue t f m)
p:[Provenance m (NValue t f m)]
_))) = NExprLocF (Maybe (NValue t f m)) -> NixDoc ann
forall ann.
Compose (Ann ann) NExprF (Maybe (NValue t f m)) -> NixDoc ann
go (Provenance m (NValue t f m) -> NExprLocF (Maybe (NValue t f m))
forall (m :: * -> *) v. Provenance m v -> NExprLocF (Maybe v)
_originExpr Provenance m (NValue t f m)
p)
render Maybe (NValue t f m)
_ = Doc ann -> NixDoc ann
forall ann. Doc ann -> NixDoc ann
simpleExpr Doc ann
"?"
exprFNixDoc :: NExprF (NixDoc ann) -> NixDoc ann
exprFNixDoc :: NExprF (NixDoc ann) -> NixDoc ann
exprFNixDoc = \case
NConstant NAtom
atom -> NAtom -> NixDoc ann
forall ann. NAtom -> NixDoc ann
prettyAtom NAtom
atom
NStr NString (NixDoc ann)
str -> Doc ann -> NixDoc ann
forall ann. Doc ann -> NixDoc ann
simpleExpr (Doc ann -> NixDoc ann) -> Doc ann -> NixDoc ann
forall a b. (a -> b) -> a -> b
$ NString (NixDoc ann) -> Doc ann
forall ann. NString (NixDoc ann) -> Doc ann
prettyString NString (NixDoc ann)
str
NList [NixDoc ann]
xs ->
Doc ann
-> (NixDoc ann -> Doc ann) -> Doc ann -> [NixDoc ann] -> NixDoc ann
forall ann a.
Doc ann -> (a -> Doc ann) -> Doc ann -> [a] -> NixDoc ann
prettyContainer Doc ann
"[" (OperatorInfo -> NixDoc ann -> Doc ann
forall ann. OperatorInfo -> NixDoc ann -> Doc ann
wrapParens OperatorInfo
appOpNonAssoc) Doc ann
"]" [NixDoc ann]
xs
NSet NRecordType
NNonRecursive [Binding (NixDoc ann)]
xs ->
Doc ann
-> (Binding (NixDoc ann) -> Doc ann)
-> Doc ann
-> [Binding (NixDoc ann)]
-> NixDoc ann
forall ann a.
Doc ann -> (a -> Doc ann) -> Doc ann -> [a] -> NixDoc ann
prettyContainer Doc ann
"{" Binding (NixDoc ann) -> Doc ann
forall ann. Binding (NixDoc ann) -> Doc ann
prettyBind Doc ann
"}" [Binding (NixDoc ann)]
xs
NSet NRecordType
NRecursive [Binding (NixDoc ann)]
xs ->
Doc ann
-> (Binding (NixDoc ann) -> Doc ann)
-> Doc ann
-> [Binding (NixDoc ann)]
-> NixDoc ann
forall ann a.
Doc ann -> (a -> Doc ann) -> Doc ann -> [a] -> NixDoc ann
prettyContainer Doc ann
"rec {" Binding (NixDoc ann) -> Doc ann
forall ann. Binding (NixDoc ann) -> Doc ann
prettyBind Doc ann
"}" [Binding (NixDoc ann)]
xs
NAbs Params (NixDoc ann)
args NixDoc ann
body ->
Doc ann -> NixDoc ann
forall ann. Doc ann -> NixDoc ann
leastPrecedence (Doc ann -> NixDoc ann) -> Doc ann -> NixDoc ann
forall a b. (a -> b) -> a -> b
$
Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
nest Int
2 (Doc ann -> Doc ann) -> Doc ann -> Doc ann
forall a b. (a -> b) -> a -> b
$
[Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep
[ Params (NixDoc ann) -> Doc ann
forall ann. Params (NixDoc ann) -> Doc ann
prettyParams Params (NixDoc ann)
args Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
":"
, NixDoc ann -> Doc ann
forall ann. NixDoc ann -> Doc ann
withoutParens NixDoc ann
body
]
NBinary NBinaryOp
NApp NixDoc ann
fun NixDoc ann
arg ->
OperatorInfo -> Doc ann -> NixDoc ann
forall ann. OperatorInfo -> Doc ann -> NixDoc ann
mkNixDoc OperatorInfo
appOp (OperatorInfo -> NixDoc ann -> Doc ann
forall ann. OperatorInfo -> NixDoc ann -> Doc ann
wrapParens OperatorInfo
appOp NixDoc ann
fun Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
" " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> OperatorInfo -> NixDoc ann -> Doc ann
forall ann. OperatorInfo -> NixDoc ann -> Doc ann
wrapParens OperatorInfo
appOpNonAssoc NixDoc ann
arg)
NBinary NBinaryOp
op NixDoc ann
r1 NixDoc ann
r2 ->
OperatorInfo -> Doc ann -> NixDoc ann
forall ann. OperatorInfo -> Doc ann -> NixDoc ann
mkNixDoc
OperatorInfo
opInfo (Doc ann -> NixDoc ann) -> Doc ann -> NixDoc ann
forall a b. (a -> b) -> a -> b
$
[Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep
[ OperatorInfo -> NixDoc ann -> Doc ann
forall ann. OperatorInfo -> NixDoc ann -> Doc ann
wrapParens (NAssoc -> OperatorInfo
f NAssoc
NAssocLeft) NixDoc ann
r1
, Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Text -> Doc ann) -> Text -> Doc ann
forall a b. (a -> b) -> a -> b
$ OperatorInfo -> Text
operatorName OperatorInfo
opInfo
, OperatorInfo -> NixDoc ann -> Doc ann
forall ann. OperatorInfo -> NixDoc ann -> Doc ann
wrapParens (NAssoc -> OperatorInfo
f NAssoc
NAssocRight) NixDoc ann
r2
]
where
opInfo :: OperatorInfo
opInfo = NBinaryOp -> OperatorInfo
getBinaryOperator NBinaryOp
op
f :: NAssoc -> OperatorInfo
f NAssoc
x =
OperatorInfo -> OperatorInfo -> Bool -> OperatorInfo
forall a. a -> a -> Bool -> a
bool
OperatorInfo
opInfo
(OperatorInfo
opInfo { associativity :: NAssoc
associativity = NAssoc
NAssocNone })
(OperatorInfo -> NAssoc
associativity OperatorInfo
opInfo NAssoc -> NAssoc -> Bool
forall a. Eq a => a -> a -> Bool
/= NAssoc
x)
NUnary NUnaryOp
op NixDoc ann
r1 ->
OperatorInfo -> Doc ann -> NixDoc ann
forall ann. OperatorInfo -> Doc ann -> NixDoc ann
mkNixDoc
OperatorInfo
opInfo
(Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (OperatorInfo -> Text
operatorName OperatorInfo
opInfo) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> OperatorInfo -> NixDoc ann -> Doc ann
forall ann. OperatorInfo -> NixDoc ann -> Doc ann
wrapParens OperatorInfo
opInfo NixDoc ann
r1)
where opInfo :: OperatorInfo
opInfo = NUnaryOp -> OperatorInfo
getUnaryOperator NUnaryOp
op
NSelect NixDoc ann
r' NAttrPath (NixDoc ann)
attr Maybe (NixDoc ann)
o ->
(Doc ann -> NixDoc ann)
-> (NixDoc ann -> Doc ann -> NixDoc ann)
-> Maybe (NixDoc ann)
-> Doc ann
-> NixDoc ann
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
(OperatorInfo -> Doc ann -> NixDoc ann
forall ann. OperatorInfo -> Doc ann -> NixDoc ann
mkNixDoc OperatorInfo
selectOp)
((Doc ann -> NixDoc ann) -> NixDoc ann -> Doc ann -> NixDoc ann
forall a b. a -> b -> a
const Doc ann -> NixDoc ann
forall ann. Doc ann -> NixDoc ann
leastPrecedence)
Maybe (NixDoc ann)
o
(Doc ann -> NixDoc ann) -> Doc ann -> NixDoc ann
forall a b. (a -> b) -> a -> b
$ OperatorInfo -> NixDoc ann -> Doc ann
forall ann. OperatorInfo -> NixDoc ann -> Doc ann
wrapPath OperatorInfo
selectOp NixDoc ann
r Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"." Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> NAttrPath (NixDoc ann) -> Doc ann
forall ann. NAttrPath (NixDoc ann) -> Doc ann
prettySelector NAttrPath (NixDoc ann)
attr Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
ordoc
where
r :: NixDoc ann
r = OperatorInfo -> Doc ann -> NixDoc ann
forall ann. OperatorInfo -> Doc ann -> NixDoc ann
mkNixDoc OperatorInfo
selectOp (OperatorInfo -> NixDoc ann -> Doc ann
forall ann. OperatorInfo -> NixDoc ann -> Doc ann
wrapParens OperatorInfo
appOpNonAssoc NixDoc ann
r')
ordoc :: Doc ann
ordoc =
Doc ann -> (NixDoc ann -> Doc ann) -> Maybe (NixDoc ann) -> Doc ann
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
Doc ann
forall a. Monoid a => a
mempty
((Doc ann
" or " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<>) (Doc ann -> Doc ann)
-> (NixDoc ann -> Doc ann) -> NixDoc ann -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OperatorInfo -> NixDoc ann -> Doc ann
forall ann. OperatorInfo -> NixDoc ann -> Doc ann
wrapParens OperatorInfo
appOpNonAssoc)
Maybe (NixDoc ann)
o
NHasAttr NixDoc ann
r NAttrPath (NixDoc ann)
attr ->
OperatorInfo -> Doc ann -> NixDoc ann
forall ann. OperatorInfo -> Doc ann -> NixDoc ann
mkNixDoc OperatorInfo
hasAttrOp (OperatorInfo -> NixDoc ann -> Doc ann
forall ann. OperatorInfo -> NixDoc ann -> Doc ann
wrapParens OperatorInfo
hasAttrOp NixDoc ann
r Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
" ? " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> NAttrPath (NixDoc ann) -> Doc ann
forall ann. NAttrPath (NixDoc ann) -> Doc ann
prettySelector NAttrPath (NixDoc ann)
attr)
NEnvPath [Char]
p -> Doc ann -> NixDoc ann
forall ann. Doc ann -> NixDoc ann
simpleExpr (Doc ann -> NixDoc ann) -> Doc ann -> NixDoc ann
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty ([Char]
"<" [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
p [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
">")
NLiteralPath [Char]
p ->
Doc ann -> NixDoc ann
forall ann. Doc ann -> NixDoc ann
pathExpr (Doc ann -> NixDoc ann) -> Doc ann -> NixDoc ann
forall a b. (a -> b) -> a -> b
$
[Char] -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty ([Char] -> Doc ann) -> [Char] -> Doc ann
forall a b. (a -> b) -> a -> b
$
case [Char]
p of
[Char]
"./" -> [Char]
"./."
[Char]
"../" -> [Char]
"../."
[Char]
".." -> [Char]
"../."
[Char]
_txt ->
[Char] -> [Char] -> Bool -> [Char]
forall a. a -> a -> Bool -> a
bool
([Char]
"./" [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
_txt)
[Char]
_txt
(([Char] -> Bool) -> [[Char]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any ([Char] -> [Char] -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` [Char]
_txt) [[Char]
"/", [Char]
"~/", [Char]
"./", [Char]
"../"])
NSym Text
name -> Doc ann -> NixDoc ann
forall ann. Doc ann -> NixDoc ann
simpleExpr (Doc ann -> NixDoc ann) -> Doc ann -> NixDoc ann
forall a b. (a -> b) -> a -> b
$ Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Text
name
NLet [Binding (NixDoc ann)]
binds NixDoc ann
body ->
Doc ann -> NixDoc ann
forall ann. Doc ann -> NixDoc ann
leastPrecedence (Doc ann -> NixDoc ann) -> Doc ann -> NixDoc ann
forall a b. (a -> b) -> a -> b
$
Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
group (Doc ann -> Doc ann) -> Doc ann -> Doc ann
forall a b. (a -> b) -> a -> b
$
[Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep
[ Doc ann
"let"
, Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
2 ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep ((Binding (NixDoc ann) -> Doc ann)
-> [Binding (NixDoc ann)] -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Binding (NixDoc ann) -> Doc ann
forall ann. Binding (NixDoc ann) -> Doc ann
prettyBind [Binding (NixDoc ann)]
binds))
, Doc ann
"in " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> NixDoc ann -> Doc ann
forall ann. NixDoc ann -> Doc ann
withoutParens NixDoc ann
body
]
NIf NixDoc ann
cond NixDoc ann
trueBody NixDoc ann
falseBody ->
Doc ann -> NixDoc ann
forall ann. Doc ann -> NixDoc ann
leastPrecedence (Doc ann -> NixDoc ann) -> Doc ann -> NixDoc ann
forall a b. (a -> b) -> a -> b
$
Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
group (Doc ann -> Doc ann) -> Doc ann -> Doc ann
forall a b. (a -> b) -> a -> b
$
Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
nest Int
2 (Doc ann -> Doc ann) -> Doc ann -> Doc ann
forall a b. (a -> b) -> a -> b
$
[Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
sep
[ Doc ann
"if " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> NixDoc ann -> Doc ann
forall ann. NixDoc ann -> Doc ann
withoutParens NixDoc ann
cond
, Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
align (Doc ann
"then " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> NixDoc ann -> Doc ann
forall ann. NixDoc ann -> Doc ann
withoutParens NixDoc ann
trueBody)
, Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
align (Doc ann
"else " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> NixDoc ann -> Doc ann
forall ann. NixDoc ann -> Doc ann
withoutParens NixDoc ann
falseBody)
]
NWith NixDoc ann
scope NixDoc ann
body ->
Doc ann -> NixDoc ann -> NixDoc ann -> NixDoc ann
forall ann. Doc ann -> NixDoc ann -> NixDoc ann -> NixDoc ann
prettyAddScope Doc ann
"with " NixDoc ann
scope NixDoc ann
body
NAssert NixDoc ann
cond NixDoc ann
body ->
Doc ann -> NixDoc ann -> NixDoc ann -> NixDoc ann
forall ann. Doc ann -> NixDoc ann -> NixDoc ann -> NixDoc ann
prettyAddScope Doc ann
"assert " NixDoc ann
cond NixDoc ann
body
NSynHole Text
name -> Doc ann -> NixDoc ann
forall ann. Doc ann -> NixDoc ann
simpleExpr (Doc ann -> NixDoc ann) -> Doc ann -> NixDoc ann
forall a b. (a -> b) -> a -> b
$ Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Text
"^" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
name)
where
prettyContainer :: Doc ann -> (a -> Doc ann) -> Doc ann -> [a] -> NixDoc ann
prettyContainer Doc ann
h a -> Doc ann
f Doc ann
t [a]
c =
NixDoc ann -> ([a] -> NixDoc ann) -> [a] -> NixDoc ann
forall (t :: * -> *) b a. Foldable t => b -> (t a -> b) -> t a -> b
list
(Doc ann -> NixDoc ann
forall ann. Doc ann -> NixDoc ann
simpleExpr (Doc ann
h Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
t))
(NixDoc ann -> [a] -> NixDoc ann
forall a b. a -> b -> a
const (NixDoc ann -> [a] -> NixDoc ann)
-> NixDoc ann -> [a] -> NixDoc ann
forall a b. (a -> b) -> a -> b
$ Doc ann -> NixDoc ann
forall ann. Doc ann -> NixDoc ann
simpleExpr (Doc ann -> NixDoc ann) -> Doc ann -> NixDoc ann
forall a b. (a -> b) -> a -> b
$ Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
group (Doc ann -> Doc ann) -> Doc ann -> Doc ann
forall a b. (a -> b) -> a -> b
$ Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
nest Int
2 (Doc ann -> Doc ann) -> Doc ann -> Doc ann
forall a b. (a -> b) -> a -> b
$ [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep ([Doc ann] -> Doc ann) -> [Doc ann] -> Doc ann
forall a b. (a -> b) -> a -> b
$ [Doc ann
h] [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> (a -> Doc ann
f (a -> Doc ann) -> [a] -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [a]
c) [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. Semigroup a => a -> a -> a
<> [Doc ann
t])
[a]
c
prettyAddScope :: Doc ann -> NixDoc ann -> NixDoc ann -> NixDoc ann
prettyAddScope Doc ann
h NixDoc ann
c NixDoc ann
b =
Doc ann -> NixDoc ann
forall ann. Doc ann -> NixDoc ann
leastPrecedence (Doc ann -> NixDoc ann) -> Doc ann -> NixDoc ann
forall a b. (a -> b) -> a -> b
$
[Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep
[Doc ann
h Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> NixDoc ann -> Doc ann
forall ann. NixDoc ann -> Doc ann
withoutParens NixDoc ann
c Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
";", Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
align (Doc ann -> Doc ann) -> Doc ann -> Doc ann
forall a b. (a -> b) -> a -> b
$ NixDoc ann -> Doc ann
forall ann. NixDoc ann -> Doc ann
withoutParens NixDoc ann
b]
valueToExpr :: forall t f m . MonadDataContext f m => NValue t f m -> NExpr
valueToExpr :: NValue t f m -> NExpr
valueToExpr = NExpr -> (NValue' t f m NExpr -> NExpr) -> NValue t f m -> NExpr
forall (f :: * -> *) (m :: * -> *) r t.
MonadDataContext f m =>
r -> (NValue' t f m r -> r) -> Free (NValue' t f m) t -> r
iterNValueByDiscardWith NExpr
thk (NExprF NExpr -> NExpr
forall (f :: * -> *). f (Fix f) -> Fix f
Fix (NExprF NExpr -> NExpr)
-> (NValue' t f m NExpr -> NExprF NExpr)
-> NValue' t f m NExpr
-> NExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NValue' t f m NExpr -> NExprF NExpr
phi)
where
thk :: NExpr
thk = NExprF NExpr -> NExpr
forall (f :: * -> *). f (Fix f) -> Fix f
Fix (NExprF NExpr -> NExpr) -> (Text -> NExprF NExpr) -> Text -> NExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> NExprF NExpr
forall r. Text -> NExprF r
NSym (Text -> NExpr) -> Text -> NExpr
forall a b. (a -> b) -> a -> b
$ Text
"<expr>"
phi :: NValue' t f m NExpr -> NExprF NExpr
phi :: NValue' t f m NExpr -> NExprF NExpr
phi (NVConstant' NAtom
a ) = NAtom -> NExprF NExpr
forall r. NAtom -> NExprF r
NConstant NAtom
a
phi (NVStr' NixString
ns ) = NString NExpr -> NExprF NExpr
forall r. NString r -> NExprF r
NStr (NString NExpr -> NExprF NExpr) -> NString NExpr -> NExprF NExpr
forall a b. (a -> b) -> a -> b
$ [Antiquoted Text NExpr] -> NString NExpr
forall r. [Antiquoted Text r] -> NString r
DoubleQuoted [Text -> Antiquoted Text NExpr
forall v r. v -> Antiquoted v r
Plain (NixString -> Text
stringIgnoreContext NixString
ns)]
phi (NVList' [NExpr]
l ) = [NExpr] -> NExprF NExpr
forall r. [r] -> NExprF r
NList [NExpr]
l
phi (NVSet' AttrSet NExpr
s AttrSet SourcePos
p) = NRecordType -> [Binding NExpr] -> NExprF NExpr
forall r. NRecordType -> [Binding r] -> NExprF r
NSet NRecordType
NNonRecursive
[ NAttrPath NExpr -> NExpr -> SourcePos -> Binding NExpr
forall r. NAttrPath r -> r -> SourcePos -> Binding r
NamedVar (Text -> NKeyName NExpr
forall r. Text -> NKeyName r
StaticKey Text
k NKeyName NExpr -> [NKeyName NExpr] -> NAttrPath NExpr
forall a. a -> [a] -> NonEmpty a
:| [NKeyName NExpr]
forall a. Monoid a => a
mempty) NExpr
v (SourcePos -> Maybe SourcePos -> SourcePos
forall a. a -> Maybe a -> a
fromMaybe SourcePos
nullPos (Text -> AttrSet SourcePos -> Maybe SourcePos
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
M.lookup Text
k AttrSet SourcePos
p))
| (Text
k, NExpr
v) <- AttrSet NExpr -> [(Text, NExpr)]
forall k v. HashMap k v -> [(k, v)]
toList AttrSet NExpr
s
]
phi (NVClosure' Params ()
_ NValue t f m -> m NExpr
_) = Text -> NExprF NExpr
forall r. Text -> NExprF r
NSym Text
"<closure>"
phi (NVPath' [Char]
p ) = [Char] -> NExprF NExpr
forall r. [Char] -> NExprF r
NLiteralPath [Char]
p
phi (NVBuiltin' Text
name NValue t f m -> m NExpr
_) = Text -> NExprF NExpr
forall r. Text -> NExprF r
NSym (Text -> NExprF NExpr) -> Text -> NExprF NExpr
forall a b. (a -> b) -> a -> b
$ Text
"builtins." Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
name
prettyNValue
:: forall t f m ann . MonadDataContext f m => NValue t f m -> Doc ann
prettyNValue :: NValue t f m -> Doc ann
prettyNValue = NExpr -> Doc ann
forall ann. NExpr -> Doc ann
prettyNix (NExpr -> Doc ann)
-> (NValue t f m -> NExpr) -> NValue t f m -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NValue t f m -> NExpr
forall t (f :: * -> *) (m :: * -> *).
MonadDataContext f m =>
NValue t f m -> NExpr
valueToExpr
prettyNValueProv
:: forall t f m ann
. ( HasCitations m (NValue t f m) t
, HasCitations1 m (NValue t f m) f
, MonadThunk t m (NValue t f m)
, MonadDataContext f m
)
=> NValue t f m
-> Doc ann
prettyNValueProv :: NValue t f m -> Doc ann
prettyNValueProv NValue t f m
v =
Doc ann
-> ([Provenance m (NValue t f m)] -> Doc ann)
-> [Provenance m (NValue t f m)]
-> Doc ann
forall (t :: * -> *) b a. Foldable t => b -> (t a -> b) -> t a -> b
list
Doc ann
forall ann. Doc ann
prettyNVal
(\ [Provenance m (NValue t f m)]
ps ->
[Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
fillSep
[ Doc ann
forall ann. Doc ann
prettyNVal
, Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
2 (Doc ann -> Doc ann) -> Doc ann -> Doc ann
forall a b. (a -> b) -> a -> b
$
Doc ann
"(" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> [Doc ann] -> Doc ann
forall a. Monoid a => [a] -> a
mconcat (Doc ann
"from: " Doc ann -> [Doc ann] -> [Doc ann]
forall a. a -> [a] -> [a]
: (NExprLocF (Maybe (NValue t f m)) -> Doc ann
forall t (f :: * -> *) (m :: * -> *) ann.
HasCitations1 m (NValue t f m) f =>
NExprLocF (Maybe (NValue t f m)) -> Doc ann
prettyOriginExpr (NExprLocF (Maybe (NValue t f m)) -> Doc ann)
-> (Provenance m (NValue t f m)
-> NExprLocF (Maybe (NValue t f m)))
-> Provenance m (NValue t f m)
-> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Provenance m (NValue t f m) -> NExprLocF (Maybe (NValue t f m))
forall (m :: * -> *) v. Provenance m v -> NExprLocF (Maybe v)
_originExpr (Provenance m (NValue t f m) -> Doc ann)
-> [Provenance m (NValue t f m)] -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Provenance m (NValue t f m)]
ps)) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
")"
]
)
(NValue t f m -> [Provenance m (NValue t f m)]
forall (m :: * -> *) v a.
HasCitations m v a =>
a -> [Provenance m v]
citations @m @(NValue t f m) NValue t f m
v)
where
prettyNVal :: Doc ann
prettyNVal = NValue t f m -> Doc ann
forall t (f :: * -> *) (m :: * -> *) ann.
MonadDataContext f m =>
NValue t f m -> Doc ann
prettyNValue NValue t f m
v
prettyNThunk
:: forall t f m ann
. ( HasCitations m (NValue t f m) t
, HasCitations1 m (NValue t f m) f
, MonadThunk t m (NValue t f m)
, MonadDataContext f m
)
=> t
-> m (Doc ann)
prettyNThunk :: t -> m (Doc ann)
prettyNThunk t
t =
do
let ps :: [Provenance m (NValue t f m)]
ps = t -> [Provenance m (NValue t f m)]
forall (m :: * -> *) v a.
HasCitations m v a =>
a -> [Provenance m v]
citations @m @(NValue t f m) @t t
t
Doc ann
v' <- NValue t f m -> Doc ann
forall t (f :: * -> *) (m :: * -> *) ann.
MonadDataContext f m =>
NValue t f m -> Doc ann
prettyNValue (NValue t f m -> Doc ann) -> m (NValue t f m) -> m (Doc ann)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> t -> m (NValue t f m)
forall t (m :: * -> *) (f :: * -> *).
(MonadThunk t m (NValue t f m), MonadDataContext f m) =>
t -> m (NValue t f m)
dethunk t
t
pure $
[Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
fillSep
[ Doc ann
v'
, Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
2 (Doc ann -> Doc ann) -> Doc ann -> Doc ann
forall a b. (a -> b) -> a -> b
$
Doc ann
"(" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> [Doc ann] -> Doc ann
forall a. Monoid a => [a] -> a
mconcat ( Doc ann
"thunk from: " Doc ann -> [Doc ann] -> [Doc ann]
forall a. a -> [a] -> [a]
: (NExprLocF (Maybe (NValue t f m)) -> Doc ann
forall t (f :: * -> *) (m :: * -> *) ann.
HasCitations1 m (NValue t f m) f =>
NExprLocF (Maybe (NValue t f m)) -> Doc ann
prettyOriginExpr (NExprLocF (Maybe (NValue t f m)) -> Doc ann)
-> (Provenance m (NValue t f m)
-> NExprLocF (Maybe (NValue t f m)))
-> Provenance m (NValue t f m)
-> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Provenance m (NValue t f m) -> NExprLocF (Maybe (NValue t f m))
forall (m :: * -> *) v. Provenance m v -> NExprLocF (Maybe v)
_originExpr (Provenance m (NValue t f m) -> Doc ann)
-> [Provenance m (NValue t f m)] -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Provenance m (NValue t f m)]
ps)) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
")"
]
printNix :: forall t f m . MonadDataContext f m => NValue t f m -> String
printNix :: NValue t f m -> [Char]
printNix = [Char]
-> (NValue' t f m [Char] -> [Char]) -> NValue t f m -> [Char]
forall (f :: * -> *) (m :: * -> *) r t.
MonadDataContext f m =>
r -> (NValue' t f m r -> r) -> Free (NValue' t f m) t -> r
iterNValueByDiscardWith [Char]
thk NValue' t f m [Char] -> [Char]
phi
where
thk :: [Char]
thk = Text -> [Char]
forall a. ToString a => a -> [Char]
toString Text
thunkStubText
phi :: NValue' t f m String -> String
phi :: NValue' t f m [Char] -> [Char]
phi (NVConstant' NAtom
a ) = Text -> [Char]
forall a. ToString a => a -> [Char]
toString (Text -> [Char]) -> Text -> [Char]
forall a b. (a -> b) -> a -> b
$ NAtom -> Text
atomText NAtom
a
phi (NVStr' NixString
ns) = Text -> [Char]
forall b a. (Show a, IsString b) => a -> b
show (Text -> [Char]) -> Text -> [Char]
forall a b. (a -> b) -> a -> b
$ NixString -> Text
stringIgnoreContext NixString
ns
phi (NVList' [[Char]]
l ) = Text -> [Char]
forall a. ToString a => a -> [Char]
toString (Text -> [Char]) -> Text -> [Char]
forall a b. (a -> b) -> a -> b
$ Text
"[ " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> [Text] -> Text
forall t. IsText t "unwords" => [t] -> t
unwords (([Char] -> Text) -> [[Char]] -> [Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Char] -> Text
forall a. ToText a => a -> Text
toText [[Char]]
l) Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
" ]"
phi (NVSet' AttrSet [Char]
s AttrSet SourcePos
_) =
[Char]
"{ " [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<>
[[Char]] -> [Char]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ [Char] -> [Char]
check (Text -> [Char]
forall a. ToString a => a -> [Char]
toString Text
k) [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
" = " [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
v [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
"; "
| (Text
k, [Char]
v) <- [(Text, [Char])] -> [(Text, [Char])]
forall a. Ord a => [a] -> [a]
sort ([(Text, [Char])] -> [(Text, [Char])])
-> [(Text, [Char])] -> [(Text, [Char])]
forall a b. (a -> b) -> a -> b
$ AttrSet [Char] -> [(Text, [Char])]
forall k v. HashMap k v -> [(k, v)]
toList AttrSet [Char]
s
] [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
"}"
where
check :: [Char] -> [Char]
check :: [Char] -> [Char]
check [Char]
v =
[Char] -> Maybe [Char] -> [Char]
forall a. a -> Maybe a -> a
fromMaybe
[Char]
v
((Int -> [Char]) -> Maybe Int -> Maybe [Char]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([Char] -> [Char]
forall a. (Semigroup a, IsString a) => a -> a
surround ([Char] -> [Char]) -> (Int -> [Char]) -> Int -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [Char]
forall b a. (Show a, IsString b) => a -> b
show) ([Char] -> Maybe Int
forall a. Read a => [Char] -> Maybe a
readMaybe [Char]
v :: Maybe Int)
Maybe [Char] -> Maybe [Char] -> Maybe [Char]
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Float -> [Char]) -> Maybe Float -> Maybe [Char]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([Char] -> [Char]
forall a. (Semigroup a, IsString a) => a -> a
surround ([Char] -> [Char]) -> (Float -> [Char]) -> Float -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> [Char]
forall b a. (Show a, IsString b) => a -> b
show) ([Char] -> Maybe Float
forall a. Read a => [Char] -> Maybe a
readMaybe [Char]
v :: Maybe Float)
)
where surround :: a -> a
surround a
s = a
"\"" a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
s a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
"\""
phi NVClosure'{} = [Char]
"<<lambda>>"
phi (NVPath' [Char]
fp ) = [Char]
fp
phi (NVBuiltin' Text
name NValue t f m -> m [Char]
_) = Text -> [Char]
forall a. ToString a => a -> [Char]
toString (Text -> [Char]) -> Text -> [Char]
forall a b. (a -> b) -> a -> b
$ Text
"<<builtin " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
name Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
">>"