From 10ce71bb79cf9f6ab47ac9dfef503529c41bef00 Mon Sep 17 00:00:00 2001 From: Jasper Van der Jeugt Date: Wed, 7 Oct 2020 12:55:32 +0200 Subject: ModuleHeader: Add separate_lists option See #320 --- data/stylish-haskell.yaml | 3 +++ lib/Language/Haskell/Stylish/Config.hs | 7 +++++-- lib/Language/Haskell/Stylish/Step/ModuleHeader.hs | 18 ++++++++++-------- .../Haskell/Stylish/Step/ModuleHeader/Tests.hs | 12 ++++++++++++ 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/data/stylish-haskell.yaml b/data/stylish-haskell.yaml index 0a2e21a..e0a739c 100644 --- a/data/stylish-haskell.yaml +++ b/data/stylish-haskell.yaml @@ -27,6 +27,9 @@ steps: # # Should export lists be sorted? Sorting is only performed within the # # export section, as delineated by Haddock comments. # sort: true + # + # # See `separate_lists` for the `imports` step. + # separate_lists: true # Format record definitions. This is disabled by default. # diff --git a/lib/Language/Haskell/Stylish/Config.hs b/lib/Language/Haskell/Stylish/Config.hs index 68638a6..36688a5 100644 --- a/lib/Language/Haskell/Stylish/Config.hs +++ b/lib/Language/Haskell/Stylish/Config.hs @@ -195,8 +195,11 @@ parseEnum strs _ (Just k) = case lookup k strs of -------------------------------------------------------------------------------- parseModuleHeader :: Config -> A.Object -> A.Parser Step parseModuleHeader _ o = fmap ModuleHeader.step $ ModuleHeader.Config - <$> o A..:? "indent" A..!= (ModuleHeader.indent ModuleHeader.defaultConfig) - <*> o A..:? "sort" A..!= (ModuleHeader.sort ModuleHeader.defaultConfig) + <$> o A..:? "indent" A..!= ModuleHeader.indent def + <*> o A..:? "sort" A..!= ModuleHeader.sort def + <*> o A..:? "separate_lists" A..!= ModuleHeader.separateLists def + where + def = ModuleHeader.defaultConfig -------------------------------------------------------------------------------- parseSimpleAlign :: Config -> A.Object -> A.Parser Step diff --git a/lib/Language/Haskell/Stylish/Step/ModuleHeader.hs b/lib/Language/Haskell/Stylish/Step/ModuleHeader.hs index 90f3478..0c33298 100644 --- a/lib/Language/Haskell/Stylish/Step/ModuleHeader.hs +++ b/lib/Language/Haskell/Stylish/Step/ModuleHeader.hs @@ -40,16 +40,16 @@ import Language.Haskell.Stylish.Step data Config = Config - -- TODO(jaspervdj): Use the same sorting as in `Imports`? - -- TODO: make sorting optional? - { indent :: Int - , sort :: Bool + { indent :: Int + , sort :: Bool + , separateLists :: Bool } defaultConfig :: Config defaultConfig = Config - { indent = 4 - , sort = True + { indent = 4 + , sort = True + , separateLists = True } step :: Config -> Step @@ -218,13 +218,15 @@ printExportList conf (L srcLoc exports) = do printExportsGroupTail (x : xs) = printExportsTail [([], x :| xs)] printExportsGroupTail [] = pure () + -- NOTE(jaspervdj): This code is almost the same as the import printing + -- in 'Imports' and should be merged. printExport :: GHC.LIE GhcPs -> P () printExport (L _ export) = case export of IEVar _ name -> putOutputable name IEThingAbs _ name -> putOutputable name IEThingAll _ name -> do putOutputable name - space + when (separateLists conf) space putText "(..)" IEModuleContents _ (L _ m) -> do putText "module" @@ -232,7 +234,7 @@ printExportList conf (L srcLoc exports) = do putText (showOutputable m) IEThingWith _ name _wildcard imps _ -> do putOutputable name - space + when (separateLists conf) space putText "(" sep (comma >> space) $ fmap putOutputable $ L.sortBy (compareWrappedName `on` unLoc) imps diff --git a/tests/Language/Haskell/Stylish/Step/ModuleHeader/Tests.hs b/tests/Language/Haskell/Stylish/Step/ModuleHeader/Tests.hs index b6d6b89..002be7c 100644 --- a/tests/Language/Haskell/Stylish/Step/ModuleHeader/Tests.hs +++ b/tests/Language/Haskell/Stylish/Step/ModuleHeader/Tests.hs @@ -34,6 +34,7 @@ tests = testGroup "Language.Haskell.Stylish.Printer.ModuleHeader" , testCase "Indents with 2 spaces" ex14 , testCase "Group doc with 2 spaces" ex15 , testCase "Does not sort" ex16 + , testCase "Repects separate_lists" ex17 ] -------------------------------------------------------------------------------- @@ -299,3 +300,14 @@ ex16 = assertSnippet (step defaultConfig {sort = False}) input input , " , no" , " ) where" ] + +ex17 :: Assertion +ex17 = assertSnippet (step defaultConfig {separateLists = False}) + [ "module Foo" + , " ( Bar (..)" + , " ) where" + ] + [ "module Foo" + , " ( Bar(..)" + , " ) where" + ] -- cgit v1.2.3