From 0036dbf41086030083ba9aec3f0165c06fe62f30 Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Mon, 11 Dec 2017 17:13:33 +0100 Subject: [PATCH 01/32] Add some documentation for `layoutPat` --- .../Brittany/Internal/Layouters/Pattern.hs | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs index 3f66932..ebdd91d 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs @@ -24,12 +24,26 @@ import Language.Haskell.Brittany.Internal.Layouters.Type +-- | layouts patterns (inside function bindings, case alternatives, let +-- bindings or do notation). E.g. for input +-- > case computation of +-- > (warnings, Success a b) -> .. +-- This part ^^^^^^^^^^^^^^^^^^^^^^^ of the syntax tree is layouted by +-- 'layoutPat'. Similarly for +-- > func abc True 0 = [] +-- ^^^^^^^^^^ this part +-- We will use `case .. of` as the imagined prefix to the examples used in +-- the different cases below. layoutPat :: ToBriDocC (Pat RdrName) (Seq BriDocNumbered) layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of WildPat _ -> fmap Seq.singleton $ docLit $ Text.pack "_" + -- _ -> expr VarPat n -> fmap Seq.singleton $ docLit $ lrdrNameToText n + -- abc -> expr LitPat lit -> fmap Seq.singleton $ allocateNode $ litBriDoc lit + -- 0 -> expr ParPat inner -> do + -- (nestedpat) -> expr left <- docLit $ Text.pack "(" right <- docLit $ Text.pack ")" innerDocs <- colsWrapPat =<< layoutPat inner @@ -49,6 +63,7 @@ layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of -- xN' <- docSeq [return xN, docLit $ Text.pack ")"] -- return $ (x1' Seq.<| middle) Seq.|> xN' ConPatIn lname (PrefixCon args) -> do + -- Abc a b c -> expr let nameDoc = lrdrNameToText lname argDocs <- layoutPat `mapM` args if null argDocs @@ -61,15 +76,19 @@ layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of $ fmap colsWrapPat argDocs return $ x1 Seq.<| xR ConPatIn lname (InfixCon left right) -> do + -- a :< b -> expr let nameDoc = lrdrNameToText lname leftDoc <- colsWrapPat =<< layoutPat left rightDoc <- colsWrapPat =<< layoutPat right middle <- docLit nameDoc return $ Seq.empty Seq.|> leftDoc Seq.|> middle Seq.|> rightDoc ConPatIn lname (RecCon (HsRecFields [] Nothing)) -> do + -- Abc{} -> expr let t = lrdrNameToText lname fmap Seq.singleton $ docLit $ t <> Text.pack "{}" ConPatIn lname (RecCon (HsRecFields fs@(_:_) Nothing)) -> do + -- Abc { a = locA, b = locB, c = locC } -> expr1 + -- Abc { a, b, c } -> expr2 let t = lrdrNameToText lname fds <- fs `forM` \(L _ (HsRecField (L _ (FieldOcc lnameF _)) fPat pun)) -> do fExpDoc <- if pun @@ -91,12 +110,14 @@ layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of , docLit $ Text.pack "}" ] ConPatIn lname (RecCon (HsRecFields [] (Just 0))) -> do + -- Abc { .. } -> expr let t = lrdrNameToText lname fmap Seq.singleton $ docSeq [ appSep $ docLit t , docLit $ Text.pack "{..}" ] ConPatIn lname (RecCon (HsRecFields fs@(_:_) (Just dotdoti))) | dotdoti == length fs -> do + -- Abc { a = locA, .. } let t = lrdrNameToText lname fds <- fs `forM` \(L _ (HsRecField (L _ (FieldOcc lnameF _)) fPat pun)) -> do fExpDoc <- if pun @@ -117,16 +138,20 @@ layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of , docLit $ Text.pack "..}" ] TuplePat args boxity _ -> do + -- (nestedpat1, nestedpat2, nestedpat3) -> expr + -- (#nestedpat1, nestedpat2, nestedpat3#) -> expr case boxity of Boxed -> wrapPatListy args "(" ")" Unboxed -> wrapPatListy args "(#" "#)" AsPat asName asPat -> do + -- bind@nestedpat -> expr wrapPatPrepend asPat (docLit $ lrdrNameToText asName <> Text.pack "@") #if MIN_VERSION_ghc(8,2,0) /* ghc-8.2 */ SigPatIn pat1 (HsWC _ (HsIB _ ty1 _)) -> do #else /* ghc-8.0 */ SigPatIn pat1 (HsIB _ (HsWC _ _ ty1)) -> do #endif + -- i :: Int -> expr patDocs <- layoutPat pat1 tyDoc <- docSharedWrapper layoutType ty1 case Seq.viewr patDocs of @@ -146,12 +171,17 @@ layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of ] return $ xR Seq.|> xN' ListPat elems _ _ -> + -- [] -> expr1 + -- [nestedpat1, nestedpat2, nestedpat3] -> expr2 wrapPatListy elems "[" "]" BangPat pat1 -> do + -- !nestedpat -> expr wrapPatPrepend pat1 (docLit $ Text.pack "!") LazyPat pat1 -> do + -- ~nestedpat -> expr wrapPatPrepend pat1 (docLit $ Text.pack "~") NPat llit@(L _ (OverLit olit _ _ _)) mNegative _ _ -> do + -- -13 -> expr litDoc <- docWrapNode llit $ allocateNode $ overLitValBriDoc olit negDoc <- docLit $ Text.pack "-" pure $ case mNegative of From b731cd15e7e69fb3d793af906d9c05ca76c3879a Mon Sep 17 00:00:00 2001 From: Matthew Piziak Date: Thu, 14 Dec 2017 16:17:39 -0500 Subject: [PATCH 02/32] capture starting layout --- src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs index 0ed8a31..2eb1863 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs @@ -341,9 +341,9 @@ layoutExpr lexpr@(L _ expr) = do opDoc <- docSharedWrapper layoutExpr op rightDoc <- docSharedWrapper layoutExpr right docSeq [opDoc, docSeparator, rightDoc] - ExplicitTuple args boxity - | Just argExprs <- args `forM` (\case (L _ (Present e)) -> Just e; _ -> Nothing) -> do - argDocs <- docSharedWrapper layoutExpr `mapM` argExprs + ExplicitTuple args boxity -> do + let argExprs = fmap (\case (L _ (Present e)) -> Just e; (L _ (Missing PlaceHolder)) -> Nothing) args + argDocs <- docSharedWrapper (maybe docEmpty layoutExpr) `mapM` argExprs hasComments <- hasAnyCommentsBelow lexpr let (openLit, closeLit) = case boxity of Boxed -> (docLit $ Text.pack "(", docLit $ Text.pack ")") @@ -385,8 +385,6 @@ layoutExpr lexpr@(L _ expr) = do end = closeLit in docSetBaseY $ docLines $ [start] ++ linesM ++ [lineN] ++ [end] ] - ExplicitTuple{} -> - unknownNodeError "ExplicitTuple|.." lexpr HsCase cExp (MG lmatches@(L _ matches) _ _ _) -> do cExpDoc <- docSharedWrapper layoutExpr cExp binderDoc <- docLit $ Text.pack "->" From 9704fc34908bba3a6e6c4e1ccd04ca0382b19e92 Mon Sep 17 00:00:00 2001 From: Matthew Piziak Date: Thu, 14 Dec 2017 18:15:07 -0500 Subject: [PATCH 03/32] add tuple section tests --- src-literatetests/10-tests.blt | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src-literatetests/10-tests.blt b/src-literatetests/10-tests.blt index c6d4203..a3d8591 100644 --- a/src-literatetests/10-tests.blt +++ b/src-literatetests/10-tests.blt @@ -476,9 +476,23 @@ func = (`abc` 1) #group tuples ### -#test 1 +#test pair func = (abc, def) +#test pair section left +func = (abc, ) + +#test pair section right +func = (, abc) + +#test quintuple section long +myTupleSection = + ( verylaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaargefirstelement + , + , verylaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaargethirdelement + , + ) + #test 2 #pending func = (lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd From a24f092aac34accb41cce889e2a0f3b655637faa Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Fri, 15 Dec 2017 20:55:31 +0100 Subject: [PATCH 04/32] Update doc-svg-gen.cabal to prevent new-configure annoyance --- doc-svg-gen/doc-svg-gen.cabal | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc-svg-gen/doc-svg-gen.cabal b/doc-svg-gen/doc-svg-gen.cabal index cb093c9..424b841 100644 --- a/doc-svg-gen/doc-svg-gen.cabal +++ b/doc-svg-gen/doc-svg-gen.cabal @@ -5,12 +5,12 @@ extra-source-files: ChangeLog.md cabal-version: >=1.10 executable doc-svg-gen - buildable: True + buildable: False main-is: Main.hs -- other-modules: -- other-extensions: build-depends: - { base >=4.9 && <4.10 + { base >=4.9 && <4.11 , text , graphviz >=2999.19.0.0 } From d8097f2862b7c2149fe9fda482bd60a6e624906c Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Sun, 17 Dec 2017 15:45:08 +0100 Subject: [PATCH 05/32] Add mask_ to prevent "ghc panic" when using timeout on brittany --- src/Language/Haskell/Brittany/Internal.hs | 5 +++++ .../Haskell/Brittany/Internal/ExactPrintUtils.hs | 11 ++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Language/Haskell/Brittany/Internal.hs b/src/Language/Haskell/Brittany/Internal.hs index e6256ec..b6987b5 100644 --- a/src/Language/Haskell/Brittany/Internal.hs +++ b/src/Language/Haskell/Brittany/Internal.hs @@ -61,6 +61,11 @@ import qualified GHC.LanguageExtensions.Type as GHC -- -- Note that this function ignores/resets all config values regarding -- debugging, i.e. it will never use `trace`/write to stderr. +-- +-- Note that the ghc parsing function used internally currently is wrapped in +-- `mask_`, so cannot be killed easily. If you don't control the input, you +-- may wish to put some proper upper bound on the input's size as a timeout +-- won't do. parsePrintModule :: Config -> Text -> IO (Either [BrittanyError] Text) parsePrintModule configRaw inputText = runExceptT $ do let config = configRaw { _conf_debug = _conf_debug staticDefaultConfig } diff --git a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs index 081032d..d0f481c 100644 --- a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs +++ b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs @@ -37,6 +37,8 @@ import qualified Language.Haskell.GHC.ExactPrint.Preprocess as ExactPrint import qualified Language.Haskell.GHC.ExactPrint.Delta as ExactPrint import qualified Data.Generics as SYB + +import Control.Exception -- import Data.Generics.Schemes @@ -85,7 +87,14 @@ parseModuleFromString -> String -> IO (Either String (ExactPrint.Anns, GHC.ParsedSource, a)) parseModuleFromString args fp dynCheck str = - ExactPrint.ghcWrapper $ ExceptT.runExceptT $ do + -- We mask here because otherwise using `throwTo` (i.e. for a timeout) will + -- produce nasty looking errors ("ghc panic"). The `mask_` makes it so we + -- cannot kill the parsing thread - not very nice. But i'll + -- optimistically assume that most of the time brittany uses noticable or + -- longer time, the majority of the time is not spend in parsing, but in + -- bridoc transformation stuff. + -- (reminder to update note on `parsePrintModule` if this changes.) + mask_ $ ExactPrint.ghcWrapper $ ExceptT.runExceptT $ do dflags0 <- lift $ ExactPrint.initDynFlagsPure fp str (dflags1, leftover, warnings) <- lift $ GHC.parseDynamicFlagsCmdLine dflags0 (GHC.noLoc <$> args) From 5dac6dd7f214d3281f66bdcdefcf6da54bd9cd9f Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Tue, 19 Dec 2017 17:25:34 +0100 Subject: [PATCH 06/32] Add ghc-option -Werror to all builds in .travis.yml --- .travis.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 58a0f33..dbe5dfc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -250,6 +250,8 @@ install: cabal --version travis_retry cabal update -v echo 'packages: .' > cabal.project + echo 'package brittany' > cabal.project.local + echo ' ghc-options: -Werror' >> cabal.project.local rm -f cabal.project.freeze cabal new-build -j$JOBS --enable-test --enable-benchmarks --dep cabal new-build -j$JOBS --disable-tests --disable-benchmarks --dep @@ -262,12 +264,12 @@ script: set -ex case "$BUILD" in stack) - better_wait stack --no-terminal $ARGS test --bench --no-run-benchmarks --haddock --no-haddock-deps --ghc-options="-j1 +RTS -M500M -RTS" + better_wait stack --no-terminal $ARGS test --bench --no-run-benchmarks --haddock --no-haddock-deps --ghc-options="-j1 +RTS -M500M -RTS -Werror" ;; cabal) if [ -f configure.ac ]; then autoreconf -i; fi cabal configure --enable-tests --enable-benchmarks -v # -v2 provides useful information for debugging - better_wait cabal build -j$JOBS --ghc-options="-j1 +RTS -M500M -RTS" # this builds all libraries and executables (including tests/benchmarks) + better_wait cabal build -j$JOBS --ghc-options="-j1 +RTS -M500M -RTS -Werror" # this builds all libraries and executables (including tests/benchmarks) cabal test ;; cabaldist) From ac10b903af3d6814dc52e78e8ad52a81a20d3ee1 Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Tue, 19 Dec 2017 20:05:55 +0100 Subject: [PATCH 07/32] travis.yml: Set jobs to 1, Pass to stack --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index dbe5dfc..e1c64bf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -178,7 +178,7 @@ before_install: # echo 'jobs: $ncpus' >> $HOME/.cabal/config #fi - PKGNAME='brittany' -- JOBS='2' +- JOBS='1' - | function better_wait() { date @@ -209,7 +209,7 @@ install: set -ex case "$BUILD" in stack) - stack --no-terminal --install-ghc $ARGS test --bench --only-dependencies + stack -j$JOBS --no-terminal --install-ghc $ARGS test --bench --only-dependencies ;; cabal*) cabal --version @@ -264,7 +264,7 @@ script: set -ex case "$BUILD" in stack) - better_wait stack --no-terminal $ARGS test --bench --no-run-benchmarks --haddock --no-haddock-deps --ghc-options="-j1 +RTS -M500M -RTS -Werror" + better_wait stack -j$JOBS --no-terminal $ARGS test --bench --no-run-benchmarks --haddock --no-haddock-deps --ghc-options="-j1 +RTS -M500M -RTS -Werror" ;; cabal) if [ -f configure.ac ]; then autoreconf -i; fi From f920f4714d976cef33b3557fc098e152879f9991 Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Thu, 21 Dec 2017 21:45:29 +0100 Subject: [PATCH 08/32] Fix maximum on empty list, fixes #88 --- src/Language/Haskell/Brittany/Internal/Backend.hs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Language/Haskell/Brittany/Internal/Backend.hs b/src/Language/Haskell/Brittany/Internal/Backend.hs index 44264d4..c121eaf 100644 --- a/src/Language/Haskell/Brittany/Internal/Backend.hs +++ b/src/Language/Haskell/Brittany/Internal/Backend.hs @@ -352,7 +352,11 @@ alignColsLines bridocs = do -- colInfos `forM_` \colInfo -> do -- maxZipper xs [] = xs -- maxZipper (x:xr) (y:yr) = max x y : maxZipper xr yr colAggregation :: [Int] -> Int - colAggregation xs = maximum [ x | x <- xs, x < minimum xs + alignMax ] + colAggregation [] = 0 -- this probably cannot happen the way we call + -- this function, because _cbs_map only ever + -- contains nonempty Seqs. + colAggregation xs = maximum [ x | x <- xs, x <= minimum xs + alignMax' ] + where alignMax' = max 0 alignMax processedMap :: ColMap2 processedMap = From 0f3ee76944d041c5c36bff828f5e1553d4e198cd Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Wed, 27 Dec 2017 23:26:18 +0100 Subject: [PATCH 09/32] Fix shebang handling with stdin input Fixes #92 probably should update upstream (ghc-exactprint) --- brittany.cabal | 2 +- .../Brittany/Internal/ExactPrintUtils.hs | 51 +++++++++++++++++-- .../Haskell/Brittany/Internal/PreludeUtils.hs | 3 ++ 3 files changed, 51 insertions(+), 5 deletions(-) diff --git a/brittany.cabal b/brittany.cabal index bfba1dc..42277ad 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -82,7 +82,7 @@ library { { base >=4.9 && <4.11 , ghc >=8.0.1 && <8.3 , ghc-paths >=0.1.0.9 && <0.2 - , ghc-exactprint >=0.5.3.0 && <0.6 + , ghc-exactprint >=0.5.3.0 && <0.5.6 , transformers >=0.5.2.0 && <0.6 , containers >=0.5.7.1 && <0.6 , mtl >=2.2.1 && <2.3 diff --git a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs index d0f481c..7494d9e 100644 --- a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs +++ b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs @@ -24,11 +24,17 @@ import qualified DynFlags as GHC import qualified GHC as GHC hiding (parseModule) import qualified Parser as GHC import qualified SrcLoc as GHC +import qualified FastString as GHC +import qualified GHC as GHC hiding (parseModule) +import qualified Lexer as GHC +import qualified StringBuffer as GHC +import qualified Outputable as GHC import RdrName ( RdrName(..) ) import HsSyn import SrcLoc ( SrcSpan, Located ) import RdrName ( RdrName(..) ) + import qualified Language.Haskell.GHC.ExactPrint as ExactPrint import qualified Language.Haskell.GHC.ExactPrint.Annotate as ExactPrint import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint @@ -106,10 +112,47 @@ parseModuleFromString args fp dynCheck str = $ ExceptT.throwE $ "when parsing ghc flags: encountered warnings: " ++ show (warnings <&> \(L _ s) -> s) - x <- ExceptT.ExceptT $ liftIO $ dynCheck dflags1 - either (\(span, err) -> ExceptT.throwE $ show span ++ ": " ++ err) - (\(a, m) -> pure (a, m, x)) - $ ExactPrint.parseWith dflags1 fp GHC.parseModule str + dynCheckRes <- ExceptT.ExceptT $ liftIO $ dynCheck dflags1 + let res = parseModulePure dflags1 fp str + case res of + Left (span, err) -> ExceptT.throwE $ show span ++ ": " ++ err + Right (a , m ) -> pure (a, m, dynCheckRes) + +----------- + +-- this function should move to ghc-exactprint. btw, we can deprecate/remove +-- the `parseModuleFromString` function that I added initially to +-- ghc-exactprint. +parseModulePure + :: GHC.DynFlags + -> System.IO.FilePath + -> String + -> Either (SrcSpan, String) (ExactPrint.Anns, GHC.ParsedSource) +parseModulePure dflags fileName str = + let (str1, lp) = ExactPrint.stripLinePragmas str + res = case runParser GHC.parseModule dflags fileName str1 of + GHC.PFailed ss m -> Left (ss, GHC.showSDoc dflags m) + GHC.POk x pmod -> Right $ (mkApiAnns x, lp, dflags, pmod) + in ExactPrint.postParseTransform res ExactPrint.normalLayout + +-- copied from exactprint until exactprint exposes a proper interface. +runParser + :: GHC.P a + -> GHC.DynFlags + -> System.IO.FilePath + -> String + -> GHC.ParseResult a +runParser parser flags filename str = GHC.unP parser parseState + where + location = GHC.mkRealSrcLoc (GHC.mkFastString filename) 1 1 + buffer = GHC.stringToStringBuffer str + parseState = GHC.mkPState flags buffer location +mkApiAnns :: GHC.PState -> GHC.ApiAnns +mkApiAnns pstate = + ( Map.fromListWith (++) . GHC.annotations $ pstate + , Map.fromList + ((GHC.noSrcSpan, GHC.comment_q pstate) : GHC.annotations_comments pstate) + ) ----------- diff --git a/src/Language/Haskell/Brittany/Internal/PreludeUtils.hs b/src/Language/Haskell/Brittany/Internal/PreludeUtils.hs index d34690c..88f2894 100644 --- a/src/Language/Haskell/Brittany/Internal/PreludeUtils.hs +++ b/src/Language/Haskell/Brittany/Internal/PreludeUtils.hs @@ -46,6 +46,9 @@ traceFunctionWith name s1 s2 f x = putStrErrLn :: String -> IO () putStrErrLn s = hPutStrLn stderr s +putStrErr :: String -> IO () +putStrErr s = hPutStr stderr s + printErr :: Show a => a -> IO () printErr = putStrErrLn . show From 292bd3d216f679613c33b8a0d568af95c9f01f75 Mon Sep 17 00:00:00 2001 From: Tuncer Ayaz Date: Sat, 23 Dec 2017 00:12:51 +0000 Subject: [PATCH 10/32] stack.yaml: update to lts-10.0 --- stack.yaml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/stack.yaml b/stack.yaml index 539cd6d..74e27d2 100644 --- a/stack.yaml +++ b/stack.yaml @@ -1,11 +1,4 @@ -resolver: lts-9.0 - -extra-deps: - - monad-memo-0.4.1 - - czipwith-1.0.0.0 - - butcher-1.2.0.0 - - data-tree-print-0.1.0.0 - - deque-0.2 +resolver: lts-10.0 packages: - . From 8137035ac2e6144200bec6903489904350fa5a44 Mon Sep 17 00:00:00 2001 From: Tuncer Ayaz Date: Sat, 23 Dec 2017 01:59:49 +0000 Subject: [PATCH 11/32] Resurrect old stack.yaml for lts-9.0 ci job --- .travis.yml | 2 +- stack-lts-9.0.yaml | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 stack-lts-9.0.yaml diff --git a/.travis.yml b/.travis.yml index e1c64bf..6577274 100644 --- a/.travis.yml +++ b/.travis.yml @@ -115,7 +115,7 @@ matrix: #- env: BUILD=stack ARGS="--resolver lts-7" # compiler: ": #stack 8.0.1" # addons: {apt: {packages: [libgmp-dev]}} - - env: BUILD=stack ARGS="--resolver lts-8" + - env: BUILD=stack ARGS="--stack-yaml stack-lts-9.0.yaml" compiler: ": #stack 8.0.2" addons: {apt: {packages: [libgmp-dev]}} diff --git a/stack-lts-9.0.yaml b/stack-lts-9.0.yaml new file mode 100644 index 0000000..539cd6d --- /dev/null +++ b/stack-lts-9.0.yaml @@ -0,0 +1,11 @@ +resolver: lts-9.0 + +extra-deps: + - monad-memo-0.4.1 + - czipwith-1.0.0.0 + - butcher-1.2.0.0 + - data-tree-print-0.1.0.0 + - deque-0.2 + +packages: + - . From ac9d505334204de5e0833c045b83c29868ccc2c5 Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Thu, 28 Dec 2017 17:30:26 +0100 Subject: [PATCH 12/32] Rename the ghc-8.0.2 stack yaml --- .travis.yml | 2 +- stack-lts-9.0.yaml => stack-8.0.2.yaml | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename stack-lts-9.0.yaml => stack-8.0.2.yaml (100%) diff --git a/.travis.yml b/.travis.yml index 6577274..50a0a71 100644 --- a/.travis.yml +++ b/.travis.yml @@ -115,7 +115,7 @@ matrix: #- env: BUILD=stack ARGS="--resolver lts-7" # compiler: ": #stack 8.0.1" # addons: {apt: {packages: [libgmp-dev]}} - - env: BUILD=stack ARGS="--stack-yaml stack-lts-9.0.yaml" + - env: BUILD=stack ARGS="--stack-yaml stack-8.0.2.yaml" compiler: ": #stack 8.0.2" addons: {apt: {packages: [libgmp-dev]}} diff --git a/stack-lts-9.0.yaml b/stack-8.0.2.yaml similarity index 100% rename from stack-lts-9.0.yaml rename to stack-8.0.2.yaml From 43abab2dd2c87c7e9547e2e2b43270dde0da178e Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Thu, 28 Dec 2017 20:46:03 +0100 Subject: [PATCH 13/32] Remove space after opening parenthesis (fixes #87) --- src-literatetests/15-regressions.blt | 2 +- src-literatetests/tests-context-free.blt | 4 ++-- src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src-literatetests/15-regressions.blt b/src-literatetests/15-regressions.blt index c2290ba..0fbc830 100644 --- a/src-literatetests/15-regressions.blt +++ b/src-literatetests/15-regressions.blt @@ -219,7 +219,7 @@ showPackageDetailedInfo pkginfo = , entry "Versions installed" installedVersions - ( altText + (altText null (if hasLib pkginfo then "[ Not installed ]" else "[ Unknown ]") ) diff --git a/src-literatetests/tests-context-free.blt b/src-literatetests/tests-context-free.blt index 7700adb..0918e60 100644 --- a/src-literatetests/tests-context-free.blt +++ b/src-literatetests/tests-context-free.blt @@ -714,7 +714,7 @@ func #test some indentation thingy func = - ( lkjadljasldjalskdjaldjalsdjkalsdjlaksdjlasjdlajsaldskj + (lkjadljasldjalskdjaldjalsdjkalsdjlaksdjlasjdlajsaldskj $ abc $ def $ ghi @@ -840,7 +840,7 @@ showPackageDetailedInfo pkginfo = , entry "Versions installed" installedVersions - ( altText + (altText null (if hasLib pkginfo then "[ Not installed ]" else "[ Unknown ]") ) diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs index 2eb1863..1462c56 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs @@ -327,7 +327,7 @@ layoutExpr lexpr@(L _ expr) = do ] , docSetBaseY $ docLines [ docCols ColOpPrefix - [ docParenLSep + [ docLit $ Text.pack "(" , docAddBaseY (BrIndentSpecial 2) innerExpDoc ] , docLit $ Text.pack ")" From 37e355fea57133302f0fc4b27cc358b5b3745466 Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Thu, 28 Dec 2017 21:38:31 +0100 Subject: [PATCH 14/32] Support hanging type signature config option --- src-literatetests/Main.hs | 1 + src-unittests/TestUtils.hs | 1 + .../Haskell/Brittany/Internal/Config.hs | 2 + .../Haskell/Brittany/Internal/Config/Types.hs | 11 +++++ .../Brittany/Internal/Layouters/Decl.hs | 48 ++++++++++++------- 5 files changed, 47 insertions(+), 16 deletions(-) diff --git a/src-literatetests/Main.hs b/src-literatetests/Main.hs index 938aca6..5567e68 100644 --- a/src-literatetests/Main.hs +++ b/src-literatetests/Main.hs @@ -173,6 +173,7 @@ defaultTestConfig = Config , _lconfig_columnAlignMode = coerce (ColumnAlignModeMajority 0.7) , _lconfig_alignmentLimit = coerce (30 :: Int) , _lconfig_alignmentBreakOnMultiline = coerce True + , _lconfig_hangingTypeSignature = coerce False } , _conf_errorHandling = (_conf_errorHandling staticDefaultConfig) { _econf_omit_output_valid_check = coerce True diff --git a/src-unittests/TestUtils.hs b/src-unittests/TestUtils.hs index 30eac3e..1ee5203 100644 --- a/src-unittests/TestUtils.hs +++ b/src-unittests/TestUtils.hs @@ -55,6 +55,7 @@ defaultTestConfig = Config , _lconfig_columnAlignMode = coerce (ColumnAlignModeMajority 0.7) , _lconfig_alignmentLimit = coerce (30 :: Int) , _lconfig_alignmentBreakOnMultiline = coerce True + , _lconfig_hangingTypeSignature = coerce False } , _conf_errorHandling = (_conf_errorHandling staticDefaultConfig) { _econf_ExactPrintFallback = coerce ExactPrintFallbackModeNever diff --git a/src/Language/Haskell/Brittany/Internal/Config.hs b/src/Language/Haskell/Brittany/Internal/Config.hs index baaca1f..f225545 100644 --- a/src/Language/Haskell/Brittany/Internal/Config.hs +++ b/src/Language/Haskell/Brittany/Internal/Config.hs @@ -63,6 +63,7 @@ staticDefaultConfig = Config , _lconfig_columnAlignMode = coerce (ColumnAlignModeMajority 0.7) , _lconfig_alignmentLimit = coerce (30 :: Int) , _lconfig_alignmentBreakOnMultiline = coerce True + , _lconfig_hangingTypeSignature = coerce False } , _conf_errorHandling = ErrorHandlingConfig { _econf_produceOutputOnErrors = coerce False @@ -156,6 +157,7 @@ configParser = do , _lconfig_columnAlignMode = mempty , _lconfig_alignmentLimit = mempty , _lconfig_alignmentBreakOnMultiline = mempty + , _lconfig_hangingTypeSignature = mempty } , _conf_errorHandling = ErrorHandlingConfig { _econf_produceOutputOnErrors = wrapLast $ falseToNothing outputOnErrors diff --git a/src/Language/Haskell/Brittany/Internal/Config/Types.hs b/src/Language/Haskell/Brittany/Internal/Config/Types.hs index d726d8a..f2530b0 100644 --- a/src/Language/Haskell/Brittany/Internal/Config/Types.hs +++ b/src/Language/Haskell/Brittany/Internal/Config/Types.hs @@ -73,6 +73,17 @@ data CLayoutConfig f = LayoutConfig -- short <- some more stuff -- that requires two lines -- loooooooong <- stuff + , _lconfig_hangingTypeSignature :: f (Last Bool) + -- Do not put "::" in a new line, and use hanging indentation for the + -- signature, i.e.: + -- func :: SomeLongStuff + -- -> SomeLongStuff + -- instead of the usual + -- func + -- :: SomeLongStuff + -- -> SomeLongStuff + -- As usual for hanging indentation, the result will be + -- context-sensitive (in the function name). } deriving (Generic) diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs index 30e26c2..8724291 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs @@ -52,23 +52,39 @@ layoutSig lsig@(L _loc sig) = case sig of let nameStr = Text.intercalate (Text.pack ", ") $ nameStrs typeDoc <- docSharedWrapper layoutType typ hasComments <- hasAnyCommentsBelow lsig - docAlt - $ [ docSeq - [ appSep $ docWrapNodeRest lsig $ docLit nameStr - , appSep $ docLit $ Text.pack "::" - , docForceSingleline typeDoc - ] - | not hasComments - ] - ++ [ docAddBaseY BrIndentRegular $ docPar - (docWrapNodeRest lsig $ docLit nameStr) - ( docCols - ColTyOpPrefix - [ docLit $ Text.pack ":: " - , docAddBaseY (BrIndentSpecial 3) $ typeDoc + shouldBeHanging <- mAsk + <&> _conf_layout + .> _lconfig_hangingTypeSignature + .> confUnpack + if shouldBeHanging + then docSeq + [ appSep $ docWrapNodeRest lsig $ docLit nameStr + , docSetBaseY $ docLines + [ docCols + ColTyOpPrefix + [ docLit $ Text.pack ":: " + , docAddBaseY (BrIndentSpecial 3) $ typeDoc + ] + ] + ] + else + docAlt + $ [ docSeq + [ appSep $ docWrapNodeRest lsig $ docLit nameStr + , appSep $ docLit $ Text.pack "::" + , docForceSingleline typeDoc + ] + | not hasComments + ] + ++ [ docAddBaseY BrIndentRegular $ docPar + (docWrapNodeRest lsig $ docLit nameStr) + ( docCols + ColTyOpPrefix + [ docLit $ Text.pack ":: " + , docAddBaseY (BrIndentSpecial 3) $ typeDoc + ] + ) ] - ) - ] InlineSig name (InlinePragma _ spec _arity phaseAct conlike) -> docWrapNode lsig $ do nameStr <- lrdrNameToTextAnn name From f1b49b082fec2e4ca1c2dc4de7773546daf13763 Mon Sep 17 00:00:00 2001 From: Evan Rutledge Borden Date: Sun, 31 Dec 2017 00:04:53 -0500 Subject: [PATCH 15/32] Format let and in on a single line if they fit The following is wasteful of vertical space: ``` _ = let longIdentifierForShortValue = 1 in longIdentifierForShortValue + longIdentifierForShortValue ``` We should format it on two lines if possible. ``` _ = let longIdentifierForShortValue = 1 in longIdentifierForShortValue + longIdentifierForShortValue ``` This commit also allows for a mix of variations: ``` _ = let longIdentifierForShortValue = 1 in longIdentifierForShortValue + longIdentifierForShortValue _ = let longIdentifierForShortValue = 1 in longIdentifierForShortValue + longIdentifierForShortValue ``` --- src-literatetests/tests-context-free.blt | 5 ++ .../Brittany/Internal/Layouters/Expr.hs | 54 +++++++++---------- 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/src-literatetests/tests-context-free.blt b/src-literatetests/tests-context-free.blt index 0918e60..e8303cd 100644 --- a/src-literatetests/tests-context-free.blt +++ b/src-literatetests/tests-context-free.blt @@ -510,6 +510,11 @@ func = (abc, def) func = (lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd , lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd) +#test let in on single line +foo = + let longIdentifierForShortValue = 1 + in longIdentifierForShortValue + longIdentifierForShortValue + ############################################################################### diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs index 1462c56..6e6929f 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs @@ -531,6 +531,9 @@ layoutExpr lexpr@(L _ expr) = do HsLet binds exp1 -> do expDoc1 <- docSharedWrapper layoutExpr exp1 mBindDocs <- layoutLocalBinds binds + let + whenIndentLeftOr x y = + if indentPolicy == IndentPolicyLeft then x else y -- this `docSetIndentLevel` might seem out of place, but is here due to -- ghc-exactprint's DP handling of "let" in particular. -- Just pushing another indentation level is a straightforward approach @@ -538,39 +541,36 @@ layoutExpr lexpr@(L _ expr) = do -- if "let" is moved horizontally as part of the transformation, as the -- comments before the first let item are moved horizontally with it. docSetIndentLevel $ case mBindDocs of - Just [bindDoc] -> docAltFilter - [ ( True - , docSeq + Just [bindDoc] -> docAlt + [ docSeq [ appSep $ docLit $ Text.pack "let" , appSep $ docForceSingleline $ return bindDoc , appSep $ docLit $ Text.pack "in" , docForceSingleline $ expDoc1 ] - ) - , ( indentPolicy /= IndentPolicyLeft - , docLines - [ docSeq - [ appSep $ docLit $ Text.pack "let" - , docSetBaseAndIndent $ return bindDoc - ] - , docSeq - [ appSep $ docLit $ Text.pack "in " - , docSetBaseY $ expDoc1 - ] + , docLines + [ docAlt + [ docSeq + [ appSep $ docLit $ Text.pack "let" + , whenIndentLeftOr docForceSingleline docSetBaseAndIndent + $ return bindDoc + ] + , docAddBaseY BrIndentRegular + $ docPar + (appSep $ docLit $ Text.pack "let") + (docSetBaseAndIndent $ return bindDoc) + ] + , docAlt + [ docSeq + [ whenIndentLeftOr id appSep $ docLit $ Text.pack "in " + , whenIndentLeftOr docForceSingleline docSetBaseAndIndent expDoc1 + ] + , docAddBaseY BrIndentRegular + $ docPar + (appSep $ docLit $ Text.pack "in") + (docSetBaseY $ expDoc1) + ] ] - ) - , ( True - , docLines - [ docAddBaseY BrIndentRegular - $ docPar - (appSep $ docLit $ Text.pack "let") - (docSetBaseAndIndent $ return bindDoc) - , docAddBaseY BrIndentRegular - $ docPar - (appSep $ docLit $ Text.pack "in") - (docSetBaseY $ expDoc1) - ] - ) ] Just bindDocs@(_:_) -> docAltFilter --either From cab12975851076e568c839471ce46830a3948dfc Mon Sep 17 00:00:00 2001 From: Evan Rutledge Borden Date: Sun, 31 Dec 2017 00:11:10 -0500 Subject: [PATCH 16/32] Change function name to if/else --- src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs index 6e6929f..fcf69b4 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs @@ -532,7 +532,7 @@ layoutExpr lexpr@(L _ expr) = do expDoc1 <- docSharedWrapper layoutExpr exp1 mBindDocs <- layoutLocalBinds binds let - whenIndentLeftOr x y = + ifIndentLeftElse x y = if indentPolicy == IndentPolicyLeft then x else y -- this `docSetIndentLevel` might seem out of place, but is here due to -- ghc-exactprint's DP handling of "let" in particular. @@ -552,7 +552,7 @@ layoutExpr lexpr@(L _ expr) = do [ docAlt [ docSeq [ appSep $ docLit $ Text.pack "let" - , whenIndentLeftOr docForceSingleline docSetBaseAndIndent + , ifIndentLeftElse docForceSingleline docSetBaseAndIndent $ return bindDoc ] , docAddBaseY BrIndentRegular @@ -562,8 +562,8 @@ layoutExpr lexpr@(L _ expr) = do ] , docAlt [ docSeq - [ whenIndentLeftOr id appSep $ docLit $ Text.pack "in " - , whenIndentLeftOr docForceSingleline docSetBaseAndIndent expDoc1 + [ ifIndentLeftElse id appSep $ docLit $ Text.pack "in " + , ifIndentLeftElse docForceSingleline docSetBaseAndIndent expDoc1 ] , docAddBaseY BrIndentRegular $ docPar From e788ac9afdc7210aecf1e24d698859cf785458b5 Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Sat, 13 Jan 2018 18:31:39 +0100 Subject: [PATCH 17/32] Minor fixup in Main.hs for next butcher release --- src-brittany/Main.hs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src-brittany/Main.hs b/src-brittany/Main.hs index 046c830..56aa928 100644 --- a/src-brittany/Main.hs +++ b/src-brittany/Main.hs @@ -140,16 +140,16 @@ mainCmdParser helpDesc = do "" ["write-mode"] "(display|inplace)" - Flag - { _flag_help = Just $ PP.vcat + ( flagHelp + ( PP.vcat [ PP.text "display: output for any input(s) goes to stdout" , PP.text "inplace: override respective input file (without backup!)" ] - , _flag_default = Just Display - } + ) + <> flagDefault Display + ) inputParams <- addParamNoFlagStrings "PATH" (paramHelpStr "paths to input haskell source files") reorderStop - desc <- peekCmdDesc addCmdImpl $ void $ do when printLicense $ do print licenseDoc @@ -161,7 +161,7 @@ mainCmdParser helpDesc = do putStrLn $ "There is NO WARRANTY, to the extent permitted by law." System.Exit.exitSuccess when printHelp $ do - liftIO $ print $ ppHelpShallow desc + liftIO $ print $ ppHelpShallow helpDesc System.Exit.exitSuccess let inputPaths = if null inputParams then [Nothing] else map Just inputParams From 399e2f4f43a4fad1ddf68da6f065d0d16ea08991 Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Sat, 13 Jan 2018 18:41:51 +0100 Subject: [PATCH 18/32] Minor cleanups --- src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs index fcf69b4..8d90148 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs @@ -532,6 +532,7 @@ layoutExpr lexpr@(L _ expr) = do expDoc1 <- docSharedWrapper layoutExpr exp1 mBindDocs <- layoutLocalBinds binds let + ifIndentLeftElse :: a -> a -> a ifIndentLeftElse x y = if indentPolicy == IndentPolicyLeft then x else y -- this `docSetIndentLevel` might seem out of place, but is here due to @@ -557,17 +558,17 @@ layoutExpr lexpr@(L _ expr) = do ] , docAddBaseY BrIndentRegular $ docPar - (appSep $ docLit $ Text.pack "let") + (docLit $ Text.pack "let") (docSetBaseAndIndent $ return bindDoc) ] , docAlt [ docSeq - [ ifIndentLeftElse id appSep $ docLit $ Text.pack "in " + [ appSep $ docLit $ Text.pack $ ifIndentLeftElse "in" "in " , ifIndentLeftElse docForceSingleline docSetBaseAndIndent expDoc1 ] , docAddBaseY BrIndentRegular $ docPar - (appSep $ docLit $ Text.pack "in") + (docLit $ Text.pack "in") (docSetBaseY $ expDoc1) ] ] From b46f9dd23b29f71a34896a6e52d0f3ce855414eb Mon Sep 17 00:00:00 2001 From: Erik Schnetter Date: Mon, 15 Jan 2018 18:11:50 -0500 Subject: [PATCH 19/32] Correct wording of warning message "certain" -> "some" --- src-brittany/Main.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-brittany/Main.hs b/src-brittany/Main.hs index 56aa928..bcb8a3f 100644 --- a/src-brittany/Main.hs +++ b/src-brittany/Main.hs @@ -281,7 +281,7 @@ coreIO putErrorLnIO config suppressOutput inputPathM outputPathM = ExceptT.runEx putErrorLn $ "Error: detected unprocessed comments." ++ " The transformation output will most likely" - ++ " not contain certain of the comments" + ++ " not contain some of the comments" ++ " present in the input haskell source file." putErrorLn $ "Affected are the following comments:" unused `forM_` \case From 18b3cfaf88d44ba6d2e1bfc27a3d43eb8381314b Mon Sep 17 00:00:00 2001 From: Evan Rutledge Borden Date: Mon, 15 Jan 2018 16:02:14 -0500 Subject: [PATCH 20/32] Fix infix constructor pattern matching for normal constructors Brittany was previously only support symbol based infix constructors. It is common in some libraries (for example Esqueleto) to pattern match on normal constructors as infix. Brittany was failing in this case by not wrapping the constructor name in back ticks/spaces. Backticks and spaces have been added in the case where the constructor contains any alpha characters. --- src-literatetests/10-tests.blt | 3 +++ src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src-literatetests/10-tests.blt b/src-literatetests/10-tests.blt index a3d8591..6659847 100644 --- a/src-literatetests/10-tests.blt +++ b/src-literatetests/10-tests.blt @@ -355,6 +355,9 @@ func (x:xr) = x #pending func (x:+:xr) = x +#test normal infix constructor +func (x `Foo` xr) = x + ############################################################################### ############################################################################### diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs index ebdd91d..2f881a0 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs @@ -13,6 +13,7 @@ where import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics +import Data.Char (isAlpha) import RdrName ( RdrName(..) ) import GHC ( Located, runGhc, GenLocated(L), moduleNameString ) import HsSyn @@ -80,7 +81,9 @@ layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of let nameDoc = lrdrNameToText lname leftDoc <- colsWrapPat =<< layoutPat left rightDoc <- colsWrapPat =<< layoutPat right - middle <- docLit nameDoc + middle <- docLit $ if Text.any isAlpha nameDoc + then Text.pack " `" <> nameDoc <> Text.pack "` " + else nameDoc return $ Seq.empty Seq.|> leftDoc Seq.|> middle Seq.|> rightDoc ConPatIn lname (RecCon (HsRecFields [] Nothing)) -> do -- Abc{} -> expr From 019d47bf7e7a4c4d7cca18b41f9319c6f518ff6e Mon Sep 17 00:00:00 2001 From: Evan Rutledge Borden Date: Mon, 15 Jan 2018 19:11:25 -0500 Subject: [PATCH 21/32] Change infix patterns to include spaces This commit changes infix patterns to utilize `lrdrNameToTextAnn`. This function allows the logic to avoid introspecting on the constructor name. Additionally this adds spaces to all infix operator pattern matches. Previously infix symbols did not include spaces: ``` foo (x:xs) = _ ``` Now they include a space ``` foo (x : xs) = _ ``` --- src-literatetests/10-tests.blt | 4 ++-- src-literatetests/15-regressions.blt | 4 ++-- src-literatetests/tests-context-free.blt | 6 +++--- .../Haskell/Brittany/Internal/Layouters/Pattern.hs | 8 +++----- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src-literatetests/10-tests.blt b/src-literatetests/10-tests.blt index 6659847..af873df 100644 --- a/src-literatetests/10-tests.blt +++ b/src-literatetests/10-tests.blt @@ -349,11 +349,11 @@ func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable func (A a) = a #test list constructor -func (x:xr) = x +func (x : xr) = x #test some other constructor symbol #pending -func (x:+:xr) = x +func (x :+: xr) = x #test normal infix constructor func (x `Foo` xr) = x diff --git a/src-literatetests/15-regressions.blt b/src-literatetests/15-regressions.blt index 0fbc830..5c31ab6 100644 --- a/src-literatetests/15-regressions.blt +++ b/src-literatetests/15-regressions.blt @@ -123,8 +123,8 @@ func = do #test list comprehension comment placement func = [ (thing, take 10 alts) --TODO: select best ones - | (thing, _got, alts@(_:_)) <- nosuchFooThing - , gast <- award + | (thing, _got, alts@(_ : _)) <- nosuchFooThing + , gast <- award ] #test if-then-else comment placement diff --git a/src-literatetests/tests-context-free.blt b/src-literatetests/tests-context-free.blt index e8303cd..0d3d8cf 100644 --- a/src-literatetests/tests-context-free.blt +++ b/src-literatetests/tests-context-free.blt @@ -366,11 +366,11 @@ func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable func (A a) = a #test list constructor -func (x:xr) = x +func (x : xr) = x #test some other constructor symbol #pending -func (x:+:xr) = x +func (x :+: xr) = x ############################################################################### @@ -748,7 +748,7 @@ func = do #test list comprehension comment placement func = [ (thing, take 10 alts) --TODO: select best ones - | (thing, _got, alts@(_:_)) <- nosuchFooThing + | (thing, _got, alts@(_ : _)) <- nosuchFooThing , gast <- award ] diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs index 2f881a0..317fbe2 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs @@ -78,12 +78,10 @@ layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of return $ x1 Seq.<| xR ConPatIn lname (InfixCon left right) -> do -- a :< b -> expr - let nameDoc = lrdrNameToText lname - leftDoc <- colsWrapPat =<< layoutPat left + let nameDoc = lrdrNameToTextAnn lname + leftDoc <- appSep . colsWrapPat =<< layoutPat left rightDoc <- colsWrapPat =<< layoutPat right - middle <- docLit $ if Text.any isAlpha nameDoc - then Text.pack " `" <> nameDoc <> Text.pack "` " - else nameDoc + middle <- appSep . docLit =<< nameDoc return $ Seq.empty Seq.|> leftDoc Seq.|> middle Seq.|> rightDoc ConPatIn lname (RecCon (HsRecFields [] Nothing)) -> do -- Abc{} -> expr From eb8f0de6c3b04505f2350137ce41308c25149c54 Mon Sep 17 00:00:00 2001 From: Evan Rutledge Borden Date: Mon, 15 Jan 2018 19:15:51 -0500 Subject: [PATCH 22/32] Remove redundant import. --- src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs index 317fbe2..c04790d 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs @@ -13,7 +13,6 @@ where import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics -import Data.Char (isAlpha) import RdrName ( RdrName(..) ) import GHC ( Located, runGhc, GenLocated(L), moduleNameString ) import HsSyn From 077b93db016123ba58aed9568fef05bfeb0dd7f8 Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Fri, 9 Feb 2018 16:50:57 +0100 Subject: [PATCH 23/32] Minor refactor --- src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs index c04790d..51bb03a 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs @@ -77,10 +77,10 @@ layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of return $ x1 Seq.<| xR ConPatIn lname (InfixCon left right) -> do -- a :< b -> expr - let nameDoc = lrdrNameToTextAnn lname - leftDoc <- appSep . colsWrapPat =<< layoutPat left + nameDoc <- lrdrNameToTextAnn lname + leftDoc <- appSep . colsWrapPat =<< layoutPat left rightDoc <- colsWrapPat =<< layoutPat right - middle <- appSep . docLit =<< nameDoc + middle <- appSep $ docLit nameDoc return $ Seq.empty Seq.|> leftDoc Seq.|> middle Seq.|> rightDoc ConPatIn lname (RecCon (HsRecFields [] Nothing)) -> do -- Abc{} -> expr From 8430b74b1ad77835f755a821bd32635879bc13f5 Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Tue, 13 Feb 2018 20:05:48 +0100 Subject: [PATCH 24/32] Switch to butcher-1.3, Improve help layout, fixes #103 --- brittany.cabal | 2 +- src-brittany/Main.hs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/brittany.cabal b/brittany.cabal index 42277ad..ae71fde 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -94,7 +94,7 @@ library { , pretty >=1.1.3.3 && <1.2 , bytestring >=0.10.8.1 && <0.11 , directory >=1.2.6.2 && <1.4 - , butcher >=1.2 && <1.3 + , butcher >=1.3 && <1.4 , yaml >=0.8.18 && <0.9 , aeson >=1.0.1.0 && <1.3 , extra >=1.4.10 && <1.7 diff --git a/src-brittany/Main.hs b/src-brittany/Main.hs index bcb8a3f..cc721d2 100644 --- a/src-brittany/Main.hs +++ b/src-brittany/Main.hs @@ -161,7 +161,7 @@ mainCmdParser helpDesc = do putStrLn $ "There is NO WARRANTY, to the extent permitted by law." System.Exit.exitSuccess when printHelp $ do - liftIO $ print $ ppHelpShallow helpDesc + liftIO $ putStrLn $ PP.renderStyle PP.style { PP.ribbonsPerLine = 1.0 } $ ppHelpShallow helpDesc System.Exit.exitSuccess let inputPaths = if null inputParams then [Nothing] else map Just inputParams From d749c0da2715f0d0678644ab95429a8715827a50 Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Tue, 13 Feb 2018 20:06:31 +0100 Subject: [PATCH 25/32] Prevent crash if ~/.config does not exist (fixes #115) --- src-brittany/Main.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-brittany/Main.hs b/src-brittany/Main.hs index cc721d2..324a7a3 100644 --- a/src-brittany/Main.hs +++ b/src-brittany/Main.hs @@ -346,7 +346,7 @@ readConfigs cmdlineConfig configPaths = do userConfigXdg <- readConfig userConfigPathXdg let userConfig = userConfigSimple <|> userConfigXdg when (Data.Maybe.isNothing userConfig) $ do - liftIO $ Directory.createDirectoryIfMissing False userBritPathXdg + liftIO $ Directory.createDirectoryIfMissing True userBritPathXdg writeDefaultConfig userConfigPathXdg -- rightmost has highest priority pure $ [userConfig, localConfig] From 91de1ca08cc7e95c072a85fd98d11926ba4c0689 Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Tue, 13 Feb 2018 23:48:00 +0100 Subject: [PATCH 26/32] Fix bang deletion on ghc-8.2, Add testcase (fixes #116) --- src-literatetests/15-regressions.blt | 6 ++++ .../Brittany/Internal/Layouters/Decl.hs | 31 ++++++++++++++++--- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src-literatetests/15-regressions.blt b/src-literatetests/15-regressions.blt index 5c31ab6..dda42a0 100644 --- a/src-literatetests/15-regressions.blt +++ b/src-literatetests/15-regressions.blt @@ -513,3 +513,9 @@ cs0 = 0 : [ c / Interval n | c <- cs | n <- [1..] ] #test issue 70 {-# LANGUAGE TemplateHaskell #-} deriveFromJSON (unPrefix "assignPost") ''AssignmentPost + +#test issue 116 +{-# LANGUAGE BangPatterns #-} +func = do + let !forced = some + pure () diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs index 8724291..c6ff4e0 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs @@ -192,16 +192,17 @@ layoutPatternBind -> BriDocNumbered -> LMatch RdrName (LHsExpr RdrName) -> ToBriDocM BriDocNumbered -layoutPatternBind mIdStr binderDoc lmatch@(L _ match@(Match _ pats _ (GRHSs grhss whereBinds))) = do +layoutPatternBind mIdStr binderDoc lmatch@(L _ match@(Match fixityOrCtx pats _ (GRHSs grhss whereBinds))) = do patDocs <- pats `forM` \p -> fmap return $ colsWrapPat =<< layoutPat p let isInfix = isInfixMatch match - patDoc <- docWrapNodePrior lmatch $ case (mIdStr, patDocs) of - (Just idStr, p1:pr) | isInfix -> docCols + let mIdStr' = fixPatternBindIdentifier fixityOrCtx <$> mIdStr + patDoc <- docWrapNodePrior lmatch $ case (mIdStr', patDocs) of + (Just idStr, p1 : pr) | isInfix -> docCols ColPatternsFuncInfix ( [appSep $ docForceSingleline p1, appSep $ docLit idStr] ++ (spacifyDocs $ docForceSingleline <$> pr) ) - (Just idStr, [] ) -> docLit idStr + (Just idStr, []) -> docLit idStr (Just idStr, ps) -> docCols ColPatternsFuncPrefix $ appSep (docLit $ idStr) @@ -220,6 +221,28 @@ layoutPatternBind mIdStr binderDoc lmatch@(L _ match@(Match _ pats _ (GRHSs grhs mWhereDocs hasComments +#if MIN_VERSION_ghc(8,2,0) /* ghc-8.2 */ +fixPatternBindIdentifier + :: HsMatchContext (NameOrRdrName RdrName) -> Text -> Text +fixPatternBindIdentifier ctx idStr = case ctx of + (FunRhs _ _ SrcLazy ) -> Text.cons '~' idStr + (FunRhs _ _ SrcStrict ) -> Text.cons '!' idStr + (FunRhs _ _ NoSrcStrict) -> idStr + (StmtCtxt ctx1 ) -> fixPatternBindIdentifier' ctx1 + _ -> idStr + where + -- I have really no idea if this path ever occurs, but better safe than + -- risking another "drop bangpatterns" bugs. + fixPatternBindIdentifier' = \case + (PatGuard ctx1) -> fixPatternBindIdentifier ctx1 idStr + (ParStmtCtxt ctx1) -> fixPatternBindIdentifier' ctx1 + (TransStmtCtxt ctx1) -> fixPatternBindIdentifier' ctx1 + _ -> idStr +#else /* ghc-8.0 */ +fixPatternBindIdentifier :: MatchFixity RdrName -> Text -> Text +fixPatternBindIdentifier _ x = x +#endif + layoutPatternBindFinal :: Maybe Text -> BriDocNumbered From 55b1c71bf3da03eab9a722d7143871fe079c4f9d Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Wed, 14 Feb 2018 01:00:01 +0100 Subject: [PATCH 27/32] Fix a layouting mistake that went unnoticed so far --- src-literatetests/15-regressions.blt | 6 ++++++ src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs | 7 +++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src-literatetests/15-regressions.blt b/src-literatetests/15-regressions.blt index dda42a0..7654285 100644 --- a/src-literatetests/15-regressions.blt +++ b/src-literatetests/15-regressions.blt @@ -519,3 +519,9 @@ deriveFromJSON (unPrefix "assignPost") ''AssignmentPost func = do let !forced = some pure () + +#test let-in-hanging +spanKey p q = case minViewWithKey q of + Just ((k, _), q') | p k -> + let (kas, q'') = spanKey p q' in ((k, a) : kas, q'') + _ -> ([], q) diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs index c6ff4e0..9681453 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs @@ -300,10 +300,13 @@ layoutPatternBindFinal alignmentToken binderDoc mPatDoc clauseDocs mWhereDocs ha ] let singleLineGuardsDoc guards = appSep $ case guards of [] -> docEmpty - [g] -> docSeq [appSep $ docLit $ Text.pack "|", return g] + [g] -> docSeq + [appSep $ docLit $ Text.pack "|", docForceSingleline $ return g] gs -> docSeq $ [appSep $ docLit $ Text.pack "|"] - ++ List.intersperse docCommaSep (return <$> gs) + ++ (List.intersperse docCommaSep + (docForceSingleline . return <$> gs) + ) indentPolicy <- mAsk <&> _conf_layout From 81928ea59715508d6d2b931bbed82f205fa9ac7d Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Wed, 14 Feb 2018 01:14:24 +0100 Subject: [PATCH 28/32] Switch to ghc-exactprint-0.5.6.0, Remove code duplication --- brittany.cabal | 2 +- .../Brittany/Internal/ExactPrintUtils.hs | 39 +------------------ 2 files changed, 2 insertions(+), 39 deletions(-) diff --git a/brittany.cabal b/brittany.cabal index ae71fde..d0059f1 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -82,7 +82,7 @@ library { { base >=4.9 && <4.11 , ghc >=8.0.1 && <8.3 , ghc-paths >=0.1.0.9 && <0.2 - , ghc-exactprint >=0.5.3.0 && <0.5.6 + , ghc-exactprint >=0.5.6.0 && <0.5.7 , transformers >=0.5.2.0 && <0.6 , containers >=0.5.7.1 && <0.6 , mtl >=2.2.1 && <2.3 diff --git a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs index 7494d9e..749804c 100644 --- a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs +++ b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs @@ -113,48 +113,11 @@ parseModuleFromString args fp dynCheck str = $ "when parsing ghc flags: encountered warnings: " ++ show (warnings <&> \(L _ s) -> s) dynCheckRes <- ExceptT.ExceptT $ liftIO $ dynCheck dflags1 - let res = parseModulePure dflags1 fp str + let res = ExactPrint.parseModuleFromStringInternal dflags1 fp str case res of Left (span, err) -> ExceptT.throwE $ show span ++ ": " ++ err Right (a , m ) -> pure (a, m, dynCheckRes) ------------ - --- this function should move to ghc-exactprint. btw, we can deprecate/remove --- the `parseModuleFromString` function that I added initially to --- ghc-exactprint. -parseModulePure - :: GHC.DynFlags - -> System.IO.FilePath - -> String - -> Either (SrcSpan, String) (ExactPrint.Anns, GHC.ParsedSource) -parseModulePure dflags fileName str = - let (str1, lp) = ExactPrint.stripLinePragmas str - res = case runParser GHC.parseModule dflags fileName str1 of - GHC.PFailed ss m -> Left (ss, GHC.showSDoc dflags m) - GHC.POk x pmod -> Right $ (mkApiAnns x, lp, dflags, pmod) - in ExactPrint.postParseTransform res ExactPrint.normalLayout - --- copied from exactprint until exactprint exposes a proper interface. -runParser - :: GHC.P a - -> GHC.DynFlags - -> System.IO.FilePath - -> String - -> GHC.ParseResult a -runParser parser flags filename str = GHC.unP parser parseState - where - location = GHC.mkRealSrcLoc (GHC.mkFastString filename) 1 1 - buffer = GHC.stringToStringBuffer str - parseState = GHC.mkPState flags buffer location -mkApiAnns :: GHC.PState -> GHC.ApiAnns -mkApiAnns pstate = - ( Map.fromListWith (++) . GHC.annotations $ pstate - , Map.fromList - ((GHC.noSrcSpan, GHC.comment_q pstate) : GHC.annotations_comments pstate) - ) - ------------ commentAnnFixTransformGlob :: SYB.Data ast => ast -> ExactPrint.Transform () commentAnnFixTransformGlob ast = do From c28ec4cfdfe33e222a76053bb49dbee87c476382 Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Wed, 14 Feb 2018 14:42:26 +0100 Subject: [PATCH 29/32] Bump butcher version in stack-8.0.2.yaml --- stack-8.0.2.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stack-8.0.2.yaml b/stack-8.0.2.yaml index 539cd6d..51c6004 100644 --- a/stack-8.0.2.yaml +++ b/stack-8.0.2.yaml @@ -3,7 +3,7 @@ resolver: lts-9.0 extra-deps: - monad-memo-0.4.1 - czipwith-1.0.0.0 - - butcher-1.2.0.0 + - butcher-1.3.0.0 - data-tree-print-0.1.0.0 - deque-0.2 From c28636adca522713ceebf51854162dd11f548828 Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Wed, 14 Feb 2018 15:20:22 +0100 Subject: [PATCH 30/32] Add ghc-exactprint-0.5.6.0 to extra-deps in stack.yaml --- stack-8.0.2.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/stack-8.0.2.yaml b/stack-8.0.2.yaml index 51c6004..ca6ad6a 100644 --- a/stack-8.0.2.yaml +++ b/stack-8.0.2.yaml @@ -6,6 +6,7 @@ extra-deps: - butcher-1.3.0.0 - data-tree-print-0.1.0.0 - deque-0.2 + - ghc-exactprint-0.5.6.0 packages: - . From 4b53072ccdfa348d107044c624afaf4a1e973544 Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Wed, 14 Feb 2018 17:18:15 +0100 Subject: [PATCH 31/32] Correct some commandline help output --- src-brittany/Main.hs | 9 +++++---- src/Language/Haskell/Brittany/Internal/Config.hs | 6 +++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src-brittany/Main.hs b/src-brittany/Main.hs index 324a7a3..f986ad9 100644 --- a/src-brittany/Main.hs +++ b/src-brittany/Main.hs @@ -82,9 +82,10 @@ helpDoc = PP.vcat $ List.intersperse ] , parDocW [ "This program is written carefully and contains safeguards to ensure" - , "the transformation does not change semantics (or the syntax tree at all)" - , "and that no comments are removed." - , "Nonetheless, this is a young project, and there will always be bugs." + , "the output is syntactically valid and that no comments are removed." + , "Nonetheless, this is a young project, and there will always be bugs," + , "and ensuring that the transformation never changes semantics of the" + , "transformed source is currently not possible." , "Please do check the output and do not let brittany override your large" , "codebase without having backups." ] @@ -148,7 +149,7 @@ mainCmdParser helpDesc = do ) <> flagDefault Display ) - inputParams <- addParamNoFlagStrings "PATH" (paramHelpStr "paths to input haskell source files") + inputParams <- addParamNoFlagStrings "PATH" (paramHelpStr "paths to input/inout haskell source files") reorderStop addCmdImpl $ void $ do when printLicense $ do diff --git a/src/Language/Haskell/Brittany/Internal/Config.hs b/src/Language/Haskell/Brittany/Internal/Config.hs index f225545..ad991b5 100644 --- a/src/Language/Haskell/Brittany/Internal/Config.hs +++ b/src/Language/Haskell/Brittany/Internal/Config.hs @@ -105,7 +105,7 @@ configParser = do cols <- addFlagReadParams "" ["columns"] "AMOUNT" (flagHelpStr "target max columns (80 is an old default for this)") importCol <- addFlagReadParams "" ["import-col"] "N" (flagHelpStr "column to align import lists at") - dumpConfig <- addSimpleBoolFlag "" ["dump-config"] (flagHelp $ parDoc "dump the programs full config (commandline + file + defaults)") + dumpConfig <- addSimpleBoolFlag "" ["dump-config"] (flagHelp $ parDoc "dump the programs full config (merged commandline + file + defaults)") dumpAnnotations <- addSimpleBoolFlag "" ["dump-annotations"] (flagHelp $ parDoc "dump the full annotations returned by ghc-exactprint") dumpUnknownAST <- addSimpleBoolFlag "" ["dump-ast-unknown"] (flagHelp $ parDoc "dump the ast for any nodes not transformed, but copied as-is by brittany") dumpCompleteAST <- addSimpleBoolFlag "" ["dump-ast-full"] (flagHelp $ parDoc "dump the full ast") @@ -119,9 +119,9 @@ configParser = do dumpBriDocIndent <- addSimpleBoolFlag "" ["dump-bridoc-indent"] (flagHelp $ parDoc "dump the partially transformed bridoc: after transformation: indent") dumpBriDocFinal <- addSimpleBoolFlag "" ["dump-bridoc-final"] (flagHelp $ parDoc "dump the post-transformation bridoc") - outputOnErrors <- addSimpleBoolFlag "" ["output-on-errors"] (flagHelp $ parDoc "even when there are errors, produce output (or try to to the degree possible") + outputOnErrors <- addSimpleBoolFlag "" ["output-on-errors"] (flagHelp $ parDoc "even when there are errors, produce output (or try to to the degree possible)") wError <- addSimpleBoolFlag "" ["werror"] (flagHelp $ parDoc "treat warnings as errors") - omitValidCheck <- addSimpleBoolFlag "" ["omit-output-check"] (flagHelp $ parDoc "omit checking if the output is syntactically valid; for dev on brittany") + omitValidCheck <- addSimpleBoolFlag "" ["omit-output-check"] (flagHelp $ parDoc "omit checking if the output is syntactically valid (debugging)") roundtripOnly <- addSimpleBoolFlag "" ["exactprint-only"] (flagHelp $ parDoc "do not reformat, but exclusively use exactprint to roundtrip (debugging)") From bac69ba54f3988f4f2999366a038c973bedb8a11 Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Wed, 14 Feb 2018 17:18:22 +0100 Subject: [PATCH 32/32] Bump to 0.9.0.1, Add changelog --- ChangeLog.md | 16 ++++++++++++++++ brittany.cabal | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 05a7ea2..1b23e1e 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,5 +1,21 @@ # Revision history for brittany +## 0.9.0.1 -- February 2018 + +* Support `TupleSections` (thanks to Matthew Piziak) +* Bugfixes: + - Fix Shebang handling with stdin input (#92) + - Fix bug that effectively deleted strict/lazy matches (BangPatterns) (#116) + - Fix infix operator whitespace bug (#101, #114) + - Fix help command output and its layouting (#103) + - Fix crash when config dir does not exist yet (#115) +* Layouting changes: + - no space after opening non-tuple parenthesis even for multi-line case + - use spaces around infix operators (applies to sections and in pattern + matches) + - Let-in is layouted more flexibly in fewer lines, if possible + (thanks to Evan Borden) + ## 0.9.0.0 -- December 2017 * Change default global config path (use XDG spec) diff --git a/brittany.cabal b/brittany.cabal index d0059f1..b6ecf52 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -1,5 +1,5 @@ name: brittany -version: 0.9.0.0 +version: 0.9.0.1 synopsis: Haskell source code formatter description: { See .