Skip to content

Commit

Permalink
Always preserve expanded inherits
Browse files Browse the repository at this point in the history
This changes the formatting to take into account whether inherits
are expanded onto multiple lines already, and if so, preserves that.

This is desirable because if a user writes an inherit over
multiple lines, there's most likely an intention to add more,
which would become harder when formatted.

An example of this is inheriting from `lib`, which usually starts out
with just a single value, but usually gets more later. This would've been
contracted onto a single line before this change:

    inherit (lib)
      foo
      ;

This change conforms to the standard due to this line:

> The formatter may take the input formatting into account in some cases in order to preserve multi-line syntax elements (which would otherwise have been contracted by the rules).
  • Loading branch information
infinisil committed Jul 19, 2024
1 parent dee9c7a commit 5862780
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 5 deletions.
14 changes: 10 additions & 4 deletions src/Nixfmt/Pretty.hs
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,11 @@ instance Pretty Binder where
pretty inherit
<> ( if null ids
then pretty semicolon
else line <> nest (sepBy (if length ids < 4 then line else hardline) ids <> line' <> pretty semicolon)
else sep <> nest (sepBy sep ids <> nosep <> pretty semicolon)
)
where
-- Only allow a single line if it's already on a single line and has few enough elements
(sep, nosep) = if sourceLine inherit == sourceLine semicolon && length ids < 4 then (line, line') else (hardline, hardline)
-- `inherit (foo) bar` statement
pretty (Inherit inherit (Just source) ids semicolon) =
group $
Expand All @@ -140,11 +143,14 @@ instance Pretty Binder where
<> if null ids
then pretty semicolon
else
line
<> sepBy (if length ids < 4 then line else hardline) ids
<> line'
sep
<> sepBy sep ids
<> nosep
<> pretty semicolon
)
where
-- Only allow a single line if it's already on a single line and has few enough elements
(sep, nosep) = if sourceLine inherit == sourceLine semicolon && length ids < 4 then (line, line') else (hardline, hardline)
-- `foo = bar`
pretty (Assignment selectors assign expr semicolon) =
group $
Expand Down
10 changes: 10 additions & 0 deletions test/diff/inherit/in.nix
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,14 @@
h
;
}

{
inherit
;
inherit
a;

inherit a
;
}
]
15 changes: 14 additions & 1 deletion test/diff/inherit/out.nix
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@
;
}
{
inherit aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
inherit
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
;
}
{ inherit b d; }
{
Expand Down Expand Up @@ -79,4 +81,15 @@
h
;
}

{
inherit;
inherit
a
;

inherit
a
;
}
]

0 comments on commit 5862780

Please sign in to comment.