@@ -61,6 +61,7 @@ module Bootstrap.Nix.Expr
6161 writeExprForTerminal ,
6262 -- | `writeBinding` writes out a `Binding` without formatting it.
6363 writeBinding ,
64+ CommentsPolicy (.. ),
6465
6566 -- * Validation
6667
@@ -109,7 +110,6 @@ import Text.Megaparsec
109110 )
110111import Text.Megaparsec.Char (alphaNumChar , char , letterChar , space , space1 , string )
111112import qualified Text.Megaparsec.Char.Lexer as L
112- import Text.Regex (mkRegex , subRegex )
113113
114114type Parser = Parsec Void Text
115115
@@ -178,31 +178,34 @@ infixl 7 |++
178178(|++) :: Expr -> Expr -> Expr
179179(|++) e1 = (e1 |* EListConcatOperator |* )
180180
181+ -- | Whether to include comments when formatting
182+ data CommentsPolicy = ShowComments | HideComments
183+
181184-- | Writes out an `Expr` as Nix code
182- writeExpr :: Expr -> Text
183- writeExpr =
185+ writeExpr :: CommentsPolicy -> Expr -> Text
186+ writeExpr cp =
184187 \ case
185- EApplication e1 e2 -> writeExpr e1 <> " " <> writeExpr e2
186- EFunc args e -> writeFunctionArgs args <> writeExpr e
187- EGrouping e -> " (" <> writeExpr e <> " )"
188+ EApplication e1 e2 -> writeExpr cp e1 <> " " <> writeExpr cp e2
189+ EFunc args e -> writeFunctionArgs args <> writeExpr cp e
190+ EGrouping e -> " (" <> writeExpr cp e <> " )"
188191 EIdent (Identifier i) -> i
189192 EImport -> " import"
190- ELetIn bindings e -> " let " <> sconcat (writeBinding <$> bindings) <> " in " <> writeExpr e
193+ ELetIn bindings e -> " let " <> sconcat (writeBinding cp <$> bindings) <> " in " <> writeExpr cp e
191194 EList exprs ->
192195 " ["
193196 <> (if length exprs > 2 then " \n " else " " )
194- <> T. concat (intersperse " " (writeExpr <$> exprs))
197+ <> T. concat (intersperse " " (writeExpr cp <$> exprs))
195198 <> " ]"
196199 EListConcatOperator -> " ++"
197200 ELit l -> writeLiteral l
198- EPropertyAccess e1 p -> writeExpr e1 <> " ." <> writeProperty p
201+ EPropertyAccess e1 p -> writeExpr cp e1 <> " ." <> writeProperty cp p
199202 ESet isRec bindings ->
200203 (if isRec then " rec " else " " )
201204 <> " {"
202205 <> (if length bindings > 2 then " \n " else " " )
203- <> mconcat (writeBinding <$> bindings)
206+ <> mconcat (writeBinding cp <$> bindings)
204207 <> " }"
205- EWith additionalScope e -> " with " <> writeExpr additionalScope <> " ; " <> writeExpr e
208+ EWith additionalScope e -> " with " <> writeExpr cp additionalScope <> " ; " <> writeExpr cp e
206209 . mergeNestedLetExprs
207210
208211-- | Recursively merges nested let expressions into a single let in block
@@ -236,19 +239,15 @@ mergeNestedLetExprs = \case
236239 PCons p1 p2 -> PCons (mergeNestedLetExprsP p1) (mergeNestedLetExprsP p2)
237240
238241-- | Writes out an `Expr` as Nix code, formatting it with alejandra
239- writeExprFormatted :: MonadIO m => Expr -> m (Either IOException Text )
240- writeExprFormatted = runExceptT . (fmap toText <$> alejandra . toString . writeExpr)
242+ writeExprFormatted :: MonadIO m => CommentsPolicy -> Expr -> m (Either IOException Text )
243+ writeExprFormatted cp = runExceptT . (fmap toText <$> alejandra . toString . writeExpr cp )
241244
242245-- | Like writeExpr, but strips out line comments,
243246-- replaces whitespace groups with a single space,
244247-- and escapes dollar symbols.
245248writeExprForTerminal :: Expr -> Text
246249writeExprForTerminal e =
247- unwords . words . toText $
248- subRegex
249- (mkRegex " \n #[^\n ]*\n " )
250- (toString . T. replace " $" " \\ $" $ writeExpr e)
251- " "
250+ unwords . words . T. replace " $" " \\ $" $ writeExpr HideComments e
252251
253252-- | Runs `parseE`, parsing a Nix expression
254253parseExpr :: Text -> Either Text Expr
@@ -386,12 +385,14 @@ infixr 4 |=
386385(|=) = BNameValue
387386
388387-- | Writes out a `Binding` as Nix code
389- writeBinding :: Binding -> Text
390- writeBinding = \ case
388+ writeBinding :: CommentsPolicy -> Binding -> Text
389+ writeBinding cp = \ case
391390 BInherit xs -> " inherit " <> writeIdentifiers " " xs <> " ;\n "
392- BInheritFrom from xs -> " inherit (" <> writeExpr from <> " ) " <> writeIdentifiers " " xs <> " ;\n "
393- BLineComment c -> " # " <> c <> " \n "
394- BNameValue p v -> writeProperty p <> " = " <> writeExpr v <> " ;\n "
391+ BInheritFrom from xs -> " inherit (" <> writeExpr cp from <> " ) " <> writeIdentifiers " " xs <> " ;\n "
392+ BLineComment c -> case cp of
393+ ShowComments -> " # " <> c <> " \n "
394+ HideComments -> " "
395+ BNameValue p v -> writeProperty cp p <> " = " <> writeExpr cp v <> " ;\n "
395396 where
396397 writeIdentifiers :: Text -> NonEmpty Identifier -> Text
397398 writeIdentifiers sep = T. concat . intersperse sep . fmap unIdentifier . toList
@@ -605,11 +606,11 @@ parseProperty requireDot = do
605606 Nothing -> pure p
606607
607608-- | Writes out a `Property` as Nix code
608- writeProperty :: Property -> Text
609- writeProperty = \ case
609+ writeProperty :: CommentsPolicy -> Property -> Text
610+ writeProperty cp = \ case
610611 PIdent (Identifier i) -> i
611- PAntiquote e -> " ${" <> writeExpr e <> " }"
612- PCons p1 p2 -> writeProperty p1 <> " ." <> writeProperty p2
612+ PAntiquote e -> " ${" <> writeExpr cp e <> " }"
613+ PCons p1 p2 -> writeProperty cp p1 <> " ." <> writeProperty cp p2
613614
614615-- | Parses an `ESet`
615616parseSet ::
0 commit comments