From f060a9dccecf816b0665c474667fb5a68c620caa Mon Sep 17 00:00:00 2001 From: Silvan Mosberger Date: Fri, 19 Jul 2024 03:44:45 +0200 Subject: [PATCH] Always preserve expanded attribute parameters This changes the formatting to take into account whether attribute parameters are expanded onto multiple lines already, and if so, preserves that. This is desirable because if a user writes an attribute parameter over multiple lines, there's most likely an intention to add more attributes, which would become harder when formatted. An example of this is package recipes, which usually start out with just a single attribute argument, but usually get more later. This would've been contracted onto a single line before this change: { stdenv, }: 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). --- src/Nixfmt/Pretty.hs | 25 ++++++++++++++++--------- test/diff/idioms_lib_3/out.nix | 23 +++++++++++++++++------ test/diff/key_value/out.nix | 7 ++++++- test/diff/lambda/in.nix | 7 +++++++ test/diff/lambda/out-pure.nix | 9 +++++++++ test/diff/lambda/out.nix | 24 ++++++++++++++++++++++-- 6 files changed, 77 insertions(+), 18 deletions(-) diff --git a/src/Nixfmt/Pretty.hs b/src/Nixfmt/Pretty.hs index 929209d8..d4a2497c 100644 --- a/src/Nixfmt/Pretty.hs +++ b/src/Nixfmt/Pretty.hs @@ -315,7 +315,10 @@ instance Pretty Parameter where pretty (IDParameter i) = pretty i -- {}: pretty (SetParameter bopen [] bclose) = - group $ pretty (moveTrailingCommentUp bopen) <> hardspace <> pretty bclose + group $ pretty (moveTrailingCommentUp bopen) <> sep <> pretty bclose + where + -- If the braces are on different lines, keep them like that + sep = if sourceLine bopen /= sourceLine bclose then hardline else hardspace -- { stuff }: pretty (SetParameter bopen attrs bclose) = group $ @@ -332,14 +335,18 @@ instance Pretty Parameter where [pretty (ParamAttr name maybeDefault Nothing) <> trailing ","] handleTrailingComma (x : xs) = pretty x : handleTrailingComma xs - sep = case attrs of - [ParamEllipsis _] -> line - -- Attributes must be without default - [ParamAttr _ Nothing _] -> line - [ParamAttr _ Nothing _, ParamEllipsis _] -> line - [ParamAttr _ Nothing _, ParamAttr _ Nothing _] -> line - [ParamAttr _ Nothing _, ParamAttr _ Nothing _, ParamEllipsis _] -> line - _ -> hardline + sep = + -- If the braces are on different lines, keep them like that + if sourceLine bopen /= sourceLine bclose + then hardline + else case attrs of + [ParamEllipsis _] -> line + -- Attributes must be without default + [ParamAttr _ Nothing _] -> line + [ParamAttr _ Nothing _, ParamEllipsis _] -> line + [ParamAttr _ Nothing _, ParamAttr _ Nothing _] -> line + [ParamAttr _ Nothing _, ParamAttr _ Nothing _, ParamEllipsis _] -> line + _ -> hardline pretty (ContextParameter param1 at param2) = pretty param1 <> pretty at <> pretty param2 diff --git a/test/diff/idioms_lib_3/out.nix b/test/diff/idioms_lib_3/out.nix index 74813d4f..4a1b2843 100644 --- a/test/diff/idioms_lib_3/out.nix +++ b/test/diff/idioms_lib_3/out.nix @@ -12,7 +12,9 @@ # # Tests can be found in ./tests/misc.nix # Documentation in the manual, #sec-generators -{ lib }: +{ + lib, +}: with (lib).trivial; let libStr = lib.strings; @@ -29,7 +31,8 @@ rec { # The builtin `toString` function has some strange defaults, # suitable for bash scripts but not much else. mkValueStringDefault = - { }: + { + }: v: with builtins; let @@ -203,7 +206,10 @@ rec { # allow lists as values for duplicate keys listsAsDuplicateKeys ? false, }: - { globalSection, sections }: + { + globalSection, + sections, + }: ( if globalSection == { } then "" @@ -279,7 +285,10 @@ rec { # Generates JSON from an arbitrary (non-function) value. # For more information see the documentation of the builtin. - toJSON = { }: builtins.toJSON; + toJSON = + { + }: + builtins.toJSON; # YAML has been a strict superset of JSON since 1.2, so we # use toJSON. Before it only had a few differences referring @@ -465,7 +474,8 @@ rec { # PLIST handling toPlist = - { }: + { + }: v: let isFloat = builtins.isFloat or (x: false); @@ -546,7 +556,8 @@ rec { # Note that integers are translated to Integer and never # the Natural type. toDhall = - { }@args: + { + }@args: v: with builtins; let diff --git a/test/diff/key_value/out.nix b/test/diff/key_value/out.nix index 1d93de5b..0ced3361 100644 --- a/test/diff/key_value/out.nix +++ b/test/diff/key_value/out.nix @@ -56,7 +56,12 @@ rec { c = 2; }; n = pkgs: { }; - o = { pkgs, ... }: { }; + o = + { + pkgs, + ... + }: + { }; a # b diff --git a/test/diff/lambda/in.nix b/test/diff/lambda/in.nix index 12d30655..0f7f7a5c 100644 --- a/test/diff/lambda/in.nix +++ b/test/diff/lambda/in.nix @@ -2,6 +2,13 @@ let inherit lib; in [ + ({}: null) + ({ + }: null) + ({ + + }: null) + ( { lib, }: let diff --git a/test/diff/lambda/out-pure.nix b/test/diff/lambda/out-pure.nix index 64078167..5d888163 100644 --- a/test/diff/lambda/out-pure.nix +++ b/test/diff/lambda/out-pure.nix @@ -2,6 +2,15 @@ let inherit lib; in [ + ({ }: null) + ({ }: null) + ( + { + + }: + null + ) + ( { lib }: let diff --git a/test/diff/lambda/out.nix b/test/diff/lambda/out.nix index 64078167..16eb44de 100644 --- a/test/diff/lambda/out.nix +++ b/test/diff/lambda/out.nix @@ -2,6 +2,19 @@ let inherit lib; in [ + ({ }: null) + ( + { + }: + null + ) + ( + { + + }: + null + ) + ( { lib }: let @@ -81,7 +94,10 @@ in ( a: - { b, ... }: + { + b, + ... + }: c: { # Stuff } @@ -89,7 +105,11 @@ in ( a: - { b, c, ... }: + { + b, + c, + ... + }: d: { # Stuff }