Skip to content

Commit c159307

Browse files
Merge #968: upd Recurcivity data type
2 parents c71e1d9 + 5f38bd2 commit c159307

File tree

11 files changed

+92
-75
lines changed

11 files changed

+92
-75
lines changed

src/Nix/Eval.hs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,14 +147,14 @@ eval (NList l ) =
147147
lst <- traverse (defer @v @m . withScopes @v scope) l
148148
toValue lst
149149

150-
eval (NSet NNonRecursive binds) =
150+
eval (NSet NonRecursive binds) =
151151
do
152-
attrSet <- evalBinds False $ desugarBinds (eval . NSet NNonRecursive) binds
152+
attrSet <- evalBinds False $ desugarBinds (eval . NSet NonRecursive) binds
153153
toValue attrSet
154154

155-
eval (NSet NRecursive binds) =
155+
eval (NSet Recursive binds) =
156156
do
157-
attrSet <- evalBinds True $ desugarBinds (eval . NSet NNonRecursive) binds
157+
attrSet <- evalBinds True $ desugarBinds (eval . NSet NonRecursive) binds
158158
toValue attrSet
159159

160160
eval (NLet binds body ) =

src/Nix/Expr/Shorthands.hs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,10 @@ mkParamset :: [(Text, Maybe NExpr)] -> Bool -> Params NExpr
9898
mkParamset params variadic = ParamSet params variadic mempty
9999

100100
mkRecSet :: [Binding NExpr] -> NExpr
101-
mkRecSet = Fix . NSet NRecursive
101+
mkRecSet = Fix . NSet Recursive
102102

103103
mkNonRecSet :: [Binding NExpr] -> NExpr
104-
mkNonRecSet = Fix . NSet NNonRecursive
104+
mkNonRecSet = Fix . NSet NonRecursive
105105

106106
mkLets :: [Binding NExpr] -> NExpr -> NExpr
107107
mkLets bindings = Fix . NLet bindings
@@ -177,11 +177,11 @@ letE varName varExpr = letsE [(varName, varExpr)]
177177

178178
-- | Make an attribute set (non-recursive).
179179
attrsE :: [(Text, NExpr)] -> NExpr
180-
attrsE pairs = Fix $ NSet NNonRecursive $ uncurry bindTo <$> pairs
180+
attrsE pairs = Fix $ NSet NonRecursive $ uncurry bindTo <$> pairs
181181

182182
-- | Make an attribute set (recursive).
183183
recAttrsE :: [(Text, NExpr)] -> NExpr
184-
recAttrsE pairs = Fix $ NSet NRecursive $ uncurry bindTo <$> pairs
184+
recAttrsE pairs = Fix $ NSet Recursive $ uncurry bindTo <$> pairs
185185

186186
-- | Logical negation.
187187
mkNot :: NExpr -> NExpr

src/Nix/Expr/Types.hs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -399,13 +399,13 @@ $(deriveOrd1 ''Binding)
399399
$(makeTraversals ''Binding)
400400

401401

402-
-- ** @NRecordType@
402+
-- ** @Recursivity@
403403

404-
-- | 'NRecordType' distinguishes between recursive and non-recursive attribute
404+
-- | Distinguishes between recursive and non-recursive. Mainly for attribute
405405
-- sets.
406-
data NRecordType
407-
= NNonRecursive -- ^ > { ... }
408-
| NRecursive -- ^ > rec { ... }
406+
data Recursivity
407+
= NonRecursive -- ^ > { ... }
408+
| Recursive -- ^ > rec { ... }
409409
deriving
410410
( Eq, Ord, Enum, Bounded, Generic
411411
, Typeable, Data, NFData, Serialise, Binary, ToJSON, FromJSON
@@ -483,11 +483,11 @@ data NExprF r
483483
-- ^ A list literal.
484484
--
485485
-- > NList [x,y] ~ [ x y ]
486-
| NSet !NRecordType ![Binding r]
486+
| NSet !Recursivity ![Binding r]
487487
-- ^ An attribute set literal
488488
--
489-
-- > NSet NRecursive [NamedVar x y _] ~ rec { x = y; }
490-
-- > NSet NNonRecursive [Inherit Nothing [x] _] ~ { inherit x; }
489+
-- > NSet Recursive [NamedVar x y _] ~ rec { x = y; }
490+
-- > NSet NonRecursive [Inherit Nothing [x] _] ~ { inherit x; }
491491
| NLiteralPath !FilePath
492492
-- ^ A path expression, which is evaluated to a store path. The path here
493493
-- can be relative, in which case it's evaluated relative to the file in
@@ -652,7 +652,7 @@ ekey
652652
=> NonEmpty Text
653653
-> SourcePos
654654
-> Lens' (Fix g) (Maybe (Fix g))
655-
ekey keys pos f e@(Fix x) | (NSet NNonRecursive xs, ann) <- fromNExpr x =
655+
ekey keys pos f e@(Fix x) | (NSet NonRecursive xs, ann) <- fromNExpr x =
656656
case go xs of
657657
((v, [] ) : _) -> fromMaybe e <$> f (pure v)
658658
((v, r : rest) : _) -> ekey (r :| rest) pos f v
@@ -662,7 +662,7 @@ ekey keys pos f e@(Fix x) | (NSet NNonRecursive xs, ann) <- fromNExpr x =
662662
e
663663
(\ v ->
664664
let entry = NamedVar (StaticKey <$> keys) v pos in
665-
Fix $ toNExpr ( NSet NNonRecursive $ [entry] <> xs, ann )
665+
Fix $ toNExpr ( NSet NonRecursive $ [entry] <> xs, ann )
666666
)
667667
<$>
668668
f Nothing

src/Nix/Expr/Types/Annotated.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ pattern NSym_ ann x = AnnFP ann (NSym x)
206206
pattern NList_ :: SrcSpan -> [r] -> NExprLocF r
207207
pattern NList_ ann x = AnnFP ann (NList x)
208208

209-
pattern NSet_ :: SrcSpan -> NRecordType -> [Binding r] -> NExprLocF r
209+
pattern NSet_ :: SrcSpan -> Recursivity -> [Binding r] -> NExprLocF r
210210
pattern NSet_ ann recur x = AnnFP ann (NSet recur x)
211211

212212
pattern NLiteralPath_ :: SrcSpan -> FilePath -> NExprLocF r

src/Nix/Parser.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ nixLet = annotateLocation1
265265
-- Let expressions `let {..., body = ...}' are just desugared
266266
-- into `(rec {..., body = ...}).body'.
267267
letBody = (\x -> NSelect x (StaticKey "body" :| mempty) Nothing) <$> aset
268-
aset = annotateLocation1 $ NSet NRecursive <$> braces nixBinders
268+
aset = annotateLocation1 $ NSet Recursive <$> braces nixBinders
269269

270270
nixIf :: Parser NExprLoc
271271
nixIf = annotateLocation1
@@ -472,7 +472,7 @@ keyName = dynamicKey <+> staticKey
472472
nixSet :: Parser NExprLoc
473473
nixSet = annotateLocation1 ((isRec <*> braces nixBinders) <?> "set")
474474
where
475-
isRec = (reserved "rec" $> NSet NRecursive <?> "recursive set") <+> pure (NSet NNonRecursive)
475+
isRec = (reserved "rec" $> NSet Recursive <?> "recursive set") <+> pure (NSet NonRecursive)
476476

477477
parseNixFile :: MonadFile m => FilePath -> m (Result NExpr)
478478
parseNixFile =

src/Nix/Pretty.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -212,9 +212,9 @@ exprFNixDoc = \case
212212
NStr str -> simpleExpr $ prettyString str
213213
NList xs ->
214214
prettyContainer "[" (wrapParens appOpNonAssoc) "]" xs
215-
NSet NNonRecursive xs ->
215+
NSet NonRecursive xs ->
216216
prettyContainer "{" prettyBind "}" xs
217-
NSet NRecursive xs ->
217+
NSet Recursive xs ->
218218
prettyContainer "rec {" prettyBind "}" xs
219219
NAbs args body ->
220220
leastPrecedence $
@@ -318,7 +318,7 @@ valueToExpr = iterNValueByDiscardWith thk (Fix . phi)
318318
phi (NVConstant' a ) = NConstant a
319319
phi (NVStr' ns ) = NStr $ DoubleQuoted [Plain (stringIgnoreContext ns)]
320320
phi (NVList' l ) = NList l
321-
phi (NVSet' s p) = NSet NNonRecursive
321+
phi (NVSet' s p) = NSet NonRecursive
322322
[ NamedVar (StaticKey k :| mempty) v (fromMaybe nullPos (M.lookup k p))
323323
| (k, v) <- toList s
324324
]

src/Nix/Reduce.hs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ reduce base@(NSelect_ _ _ attrs _)
220220
n@(NamedVar (a' :| _) _ _) | a' == a -> pure n
221221
_ -> findBind xs attrs
222222
-- Follow the attrpath recursively in sets.
223-
inspectSet (NSet_ _ NNonRecursive binds) attrs = case findBind binds attrs of
223+
inspectSet (NSet_ _ NonRecursive binds) attrs = case findBind binds attrs of
224224
Just (NamedVar _ e _) -> case NE.uncons attrs of
225225
(_, Just attrs) -> inspectSet (unFix e) attrs
226226
_ -> pure e
@@ -231,7 +231,7 @@ reduce base@(NSelect_ _ _ attrs _)
231231

232232
-- | Reduce a set by inlining its binds outside of the set
233233
-- if none of the binds inherit the super set.
234-
reduce e@(NSet_ ann NNonRecursive binds) =
234+
reduce e@(NSet_ ann NonRecursive binds) =
235235
do
236236
let
237237
usesInherit =
@@ -244,13 +244,13 @@ reduce e@(NSet_ ann NNonRecursive binds) =
244244

245245
bool
246246
(Fix <$> sequence e)
247-
(clearScopes @NExprLoc $ Fix . NSet_ ann NNonRecursive <$> traverse sequence binds)
247+
(clearScopes @NExprLoc $ Fix . NSet_ ann NonRecursive <$> traverse sequence binds)
248248
usesInherit
249249

250250
-- Encountering a 'rec set' construction eliminates any hope of inlining
251251
-- definitions.
252-
reduce (NSet_ ann NRecursive binds) =
253-
clearScopes @NExprLoc $ Fix . NSet_ ann NRecursive <$> traverse sequence binds
252+
reduce (NSet_ ann Recursive binds) =
253+
clearScopes @NExprLoc $ Fix . NSet_ ann Recursive <$> traverse sequence binds
254254

255255
-- Encountering a 'with' construction eliminates any hope of inlining
256256
-- definitions.

src/Nix/TH.hs

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,38 +17,51 @@ import Nix.Parser
1717

1818
quoteExprExp :: String -> ExpQ
1919
quoteExprExp s = do
20-
expr <-
21-
either
22-
(fail . show)
23-
pure
24-
(parseNixText $ toText s)
20+
expr <- parseExpr s
2521
dataToExpQ
26-
(const Nothing `extQ` metaExp (freeVars expr) `extQ` (pure . (TH.lift :: Text -> Q Exp)))
22+
(extQOnFreeVars metaExp expr `extQ` (pure . (TH.lift :: Text -> Q Exp)))
2723
expr
2824

2925
quoteExprPat :: String -> PatQ
3026
quoteExprPat s = do
31-
expr <-
32-
either
33-
(fail . show)
34-
pure
35-
(parseNixText $ toText s)
27+
expr <- parseExpr s
3628
dataToPatQ
37-
(const Nothing `extQ` metaPat (freeVars expr))
29+
(extQOnFreeVars metaPat expr)
3830
expr
3931

32+
-- | Helper function.
33+
extQOnFreeVars
34+
:: ( Typeable b
35+
, Typeable loc
36+
)
37+
=> ( Set VarName
38+
-> loc
39+
-> Maybe q
40+
)
41+
-> NExpr
42+
-> b
43+
-> Maybe q
44+
extQOnFreeVars f e = extQ (const Nothing) (f $ freeVars e)
45+
46+
parseExpr :: (MonadFail m, ToText a) => a -> m NExpr
47+
parseExpr s =
48+
either
49+
(fail . show)
50+
pure
51+
(parseNixText $ toText s)
52+
4053
freeVars :: NExpr -> Set VarName
4154
freeVars e = case unFix e of
4255
(NConstant _ ) -> mempty
4356
(NStr string ) -> mapFreeVars string
4457
(NSym var ) -> one var
4558
(NList list ) -> mapFreeVars list
46-
(NSet NNonRecursive bindings) -> bindFreeVars bindings
47-
(NSet NRecursive bindings) -> Set.difference (bindFreeVars bindings) (bindDefs bindings)
59+
(NSet NonRecursive bindings) -> bindFreeVars bindings
60+
(NSet Recursive bindings) -> diffBetween bindFreeVars bindDefs bindings
4861
(NLiteralPath _ ) -> mempty
4962
(NEnvPath _ ) -> mempty
5063
(NUnary _ expr ) -> freeVars expr
51-
(NBinary _ left right ) -> ((<>) `on` freeVars) left right
64+
(NBinary _ left right ) -> collectFreeVars left right
5265
(NSelect expr path orExpr) ->
5366
Set.unions
5467
[ freeVars expr
@@ -69,18 +82,22 @@ freeVars e = case unFix e of
6982
)
7083
(NLet bindings expr ) ->
7184
freeVars expr <>
72-
Set.difference
73-
(bindFreeVars bindings)
74-
(bindDefs bindings)
85+
diffBetween bindFreeVars bindDefs bindings
7586
(NIf cond th el ) -> Set.unions $ freeVars <$> [cond, th, el]
7687
-- Evaluation is needed to find out whether x is a "real" free variable in `with y; x`, we just include it
7788
-- This also makes sense because its value can be overridden by `x: with y; x`
78-
(NWith set expr ) -> ((<>) `on` freeVars) set expr
79-
(NAssert assertion expr ) -> ((<>) `on` freeVars) assertion expr
89+
(NWith set expr ) -> collectFreeVars set expr
90+
(NAssert assertion expr ) -> collectFreeVars assertion expr
8091
(NSynHole _ ) -> mempty
8192

8293
where
8394

95+
diffBetween :: (a -> Set VarName) -> (a -> Set VarName) -> a -> Set VarName
96+
diffBetween g f b = Set.difference (g b) (f b)
97+
98+
collectFreeVars :: NExpr -> NExpr -> Set VarName
99+
collectFreeVars = (<>) `on` freeVars
100+
84101
bindDefs :: Foldable t => t (Binding NExpr) -> Set VarName
85102
bindDefs = foldMap bind1Def
86103
where

tests/NixLanguageTests.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,14 +77,14 @@ genTests = do
7777
<$> globDir1 (compile "*-*-*.*") "data/nix/tests/lang"
7878
let testsByName = groupBy (takeFileName . dropExtensions) testFiles
7979
let testsByType = groupBy testType (Map.toList testsByName)
80-
let testGroups = fmap mkTestGroup (Map.toList testsByType)
80+
let testGroups = mkTestGroup <$> Map.toList testsByType
8181
pure $ localOption (mkTimeout 2000000) $ testGroup
8282
"Nix (upstream) language tests"
8383
testGroups
8484
where
8585
testType (fullpath, _files) = take 2 $ splitOn "-" $ takeFileName fullpath
8686
mkTestGroup (kind, tests) =
87-
testGroup (String.unwords kind) $ fmap (mkTestCase kind) tests
87+
testGroup (String.unwords kind) $ mkTestCase kind <$> tests
8888
mkTestCase kind (basename, files) = testCase (takeFileName basename) $ do
8989
time <- liftIO getCurrentTime
9090
let opts = defaultOptions time

0 commit comments

Comments
 (0)